"""Approved16 only. Read-only Web check, one reception per channel, no retries."""
import sys,json,pathlib,re,subprocess
P=pathlib.Path
ROOT=P(__file__).resolve().parent.parent
sys.path.insert(0,'/tmp/codex/ltb1021/2026-11-01_icerti-web-ssh-connect_r01')
from remote_read import powershell
ps=P('/data/codex-artifacts/contextra/field-maintenance/2026/2026-11-01_icerti-web-media-analysis_r01/helpers/db_schema.ps1').read_text()
a=ps.index('SELECT TABLE_NAME');z=ps.index('ROLLBACK;',a)
ps=ps[:a]+'SELECT camera_id,camera_name,(deleted_at_wall_ms IS NULL),assignment_state FROM CAMERA WHERE camera_id BETWEEN 6 AND 21 ORDER BY camera_id;\n'+ps[z:]
web=json.loads(powershell(ps,timeout=35));assert web['exit_code']==0
rows=[line.split('\t') for line in web['stdout'].strip().splitlines()[1:]]
names=['1-Crowding_Collapse','2-Collapse','3-Collapse','4-Collapse','5-Collapse_Intrusion','6-Crowding_Intrusion','7-Loitering_Fire','8-Fire_Fight','9-Fire_Fight','10-Collapse_Fire','11-Crowding_Collapse','12-Intrusion','13-Crowding_Collapse','14-Collapse_Fire','15-Crowding_Collapse','16-Collapse_Fire']
assert rows==[[str(i+6),n,'1','ASSIGNED'] for i,n in enumerate(names)]
(ROOT/'web_registration.json').write_text(json.dumps(web,ensure_ascii=False,indent=2))
sys.path.insert(0,'/data/codex-artifacts/contextra/action-model-eval/2026/2026-10-27_contextra-four-scenarios-prep_r01/helpers')
import batch_job as b
b.LOCAL=ROOT;b.REMOTE='/storage/contextra/experiments/action-model-eval/2026/'+ROOT.name
def command(args,sudo=False,timeout=45):
 r=b.run(args,sudo=sudo,timeout=timeout)
 if r.returncode:
  err=re.sub(r'[a-zA-Z]+://[^\s]+','<endpoint omitted>',r.stderr.decode(errors='replace'))
  raise RuntimeError(json.dumps(dict(returncode=r.returncode,stderr=err[-1000:])))
 return r.stdout
b.command=command
registry="""import json,pathlib,hashlib,yaml
rows=yaml.safe_load(pathlib.Path('/var/lib/contextra/runtime/streams_runtime.yaml').read_text())['added']
rows=list(rows.values()) if isinstance(rows,dict) else rows
out={}
for s in rows:
 cid=int(s.get('camera_id',s.get('source_id')))
 if cid not in range(6,22):continue
 assert cid not in out and isinstance(s.get('uri'),str) and s['uri'].startswith(('rtsp://','rtsps://'))
 out[cid]=hashlib.sha256(s['uri'].encode()).hexdigest()
print(json.dumps(out))
"""
reg=json.loads(command(['docker','exec',b.ANALYTICS,'python3','-c',registry],sudo=True))
assert set(reg)==set(map(str,range(6,22)))
b.TARGETS=[(i,reg[str(i)]) for i in range(6,22)]
(ROOT/'manifest.json').write_text(json.dumps(dict(targets=[dict(camera_id=i,name=names[i-6],input_sha256=h) for i,h in b.TARGETS],seconds=60),ensure_ascii=False,indent=2))
old=b.OLD;adapt=ROOT/'helpers/adapted';adapt.mkdir()
s=(old/'capture.py').read_text().replace("assert isinstance(spec.get(args.scenario), dict) and spec[args.scenario].get('enabled') is True, 'Expected scenario is not enabled'","assert hashlib.sha256(str(spec.get('uri','')).encode()).hexdigest()==args.scenario, 'Input fingerprint changed'")
s=s.replace('scenario=args.scenario,','selection_mode="registration_only",')
(adapt/'capture.py').write_text(s);(adapt/'review_video.py').write_bytes((old/'review_video.py').read_bytes());b.OLD=adapt
b.SNAPSHOT_CODE=b.SNAPSHOT_CODE.replace("targets={22:'crowd',23:'loitering',26:'intrusion',29:'fire'}",'targets='+repr(dict(b.TARGETS))).replace('config=s.get(scenario)',"config={'enabled':hashlib.sha256(str(s.get('uri','')).encode()).hexdigest()==scenario}")
src=P(b.__file__).read_text();a=src.index('def container(');z=src.index('\n\ndef main()',a)
exec(src[a:z].replace('20261027-batch-r01','20261102-approved16-r01').replace("['--seconds','120'","['--seconds','60'"),b.__dict__)
a=src.index('def main():');z=src.index('\n\nif __name__',a)
exec(src[a:z].replace('20261027-batch-r01','20261102-approved16-r01').replace('(22|23|26|29)','('+'|'.join(map(str,range(6,22)))+')'),b.__dict__)
b.main()
