Files
stack/agents/magica/work/queue-329/final-counts.py

85 lines
5.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Reconcile final per-file evidence only; executes no tests.
from pathlib import Path
import json,re
BASE=Path(__file__).resolve().parent
REPO=BASE.parents[3]
OUT=BASE/'gate'
CLI_READERS={'host.test','stack-copy.test','stack-instances.test','stack-release-external.test','stack-release.test','stack-upgrade.test','verbs.test'}
all_receipts=[]
for file in [OUT/'runs.jsonl',OUT/'resume-mos1605-runs.jsonl']:
all_receipts += [json.loads(line) for line in file.read_text().splitlines()]
latest={r['label']:r for r in all_receipts}
def read(label):
r=latest[label];assert r['rc']==0 and r['nice']==19,r
text=(OUT/(label+'.txt')).read_text()
result={}
for key in ['tests','pass','fail','skipped','cancelled']:
matches=re.findall(r'^(?:ℹ |# )'+key+r' (\d+)',text,re.M);assert matches,(label,key);result[key]=int(matches[-1])
assert result['fail']==0 and result['cancelled']==0,(label,result)
return {'label':label,'log':str((OUT/(label+'.txt')).relative_to(REPO)),'counts':result,'rc':r['rc'],'nice':r['nice']}
groups={}
for suite in ['model-proxy','bus','cli']:
total={k:0 for k in ['tests','pass','fail','skipped','cancelled']};mapping=[]
for file in sorted((REPO/f'packages/{suite}/tests').glob('*.test.mjs')):
if suite=='model-proxy' and file.stem=='management-key-encoding.test':continue # introduced in R2, mapped below
label=f'{suite}-{file.stem}'
if suite=='model-proxy' or suite=='cli' and file.stem in CLI_READERS:label='post-unit-fix-'+label
if suite=='cli' and file.stem=='case1-accept.test':label='cli-case1-accept.rerun-mos1605'
row=read(label);row['file']=str(file.relative_to(REPO));mapping.append(row)
for k in total:total[k]+=row['counts'][k]
groups[suite]={'files':len(mapping),**total,'mapping':mapping}
assert total['skipped']==(1 if suite=='cli' else 0),(suite,total)
groups['webui-pinned-copy']=read('post-unit-fix-webui-pinned-copy.test')
groups['federation-runner']=read('test-federation-acceptance.sh')
assert groups['federation-runner']['counts']['pass']==1 and groups['federation-runner']['counts']['skipped']==0
assert latest['test-config.sh']['rc']==0 and 'selftest: 55 passed, 0 failed' in (OUT/'test-config.sh.txt').read_text()
groups['config-script']={'rc':0,'pass':55,'fail':0,'log':'agents/magica/work/queue-329/gate/test-config.sh.txt'}
groups['history']={'initialRed':'gate/cli-case1-accept.test.txt','diagnostic':'mos-1604:20focused+3whole,179pass,no gate credit','unchangedRerun':'mos-1605:53pass','cause':'F7 unknown; Vikunja625','landingGate':'Sage must independently pass'}
# R1 whole-suite history stays distinct from the R2 targeted reruns.
groups['round1-model-proxy']=groups['model-proxy']
r2=[json.loads(line) for line in (BASE/'gate-r2/runs.jsonl').read_text().splitlines()]
by_label={row['label']:row for row in r2}
assert len(by_label)==len(r2), 'no repeated R2 invocations'
def r2row(label):
row=by_label[label]
assert row['rc']==0 and row['nice']==19,row
if label!='test-config.sh':
assert row['counts']['fail']==row['counts']['cancelled']==row['counts']['skipped']==0,row
return row
def aggregate(rows):
return {'files':len(rows),**{k:sum(row['counts'][k] for row in rows) for k in ['tests','pass','fail','skipped','cancelled']},'mapping':rows}
models=[]
for file in sorted((REPO/'packages/model-proxy/tests').glob('*.test.mjs')):
row=dict(r2row('model-proxy-'+file.stem));row['file']=str(file.relative_to(REPO));models.append(row)
groups['model-proxy']=aggregate(models)
readers=[]
for name in json.loads((BASE/'r2-reader-files.json').read_text()):
file=Path(name)
label='cli-federation-acceptance-runner' if file.name=='federation-acceptance.test.mjs' else file.parts[1]+'-'+file.stem
row=dict(r2row(label));row['file']=name;readers.append(row)
config=r2row('test-config.sh')
assert 'selftest: 55 passed, 0 failed' in (REPO/config['log']).read_text()
extras=[r2row('cli-case1-accept.test'),r2row('cli-case2-unit.test')]
assert len(r2)==len(models)+len(readers)+len(extras)+1
round2={'model-proxy':groups['model-proxy'],'readers':aggregate(readers),
'bus-readers':aggregate([row for row in readers if row['file'].startswith('packages/bus/')]),
'cli-readers':aggregate([row for row in readers if row['file'].startswith('packages/cli/')]),
'config-script':{**config,'pass':55,'fail':0},'over-selected-extra-runs':extras,
'extra-run-note':'case1-accept 53/53 in 247.863 s through over-selection, not an F7 diagnostic or evidence about F7 either way. F7 cause unknown; Vikunja 625. case2-unit completed per sage-4277. Neither repeated.'}
groups['round2']=round2
(OUT/'FINAL-COUNTS.json').write_text(json.dumps(groups,indent=2)+'\n')
lines=[]
for suite in ['model-proxy','bus','cli']:
g=groups[suite];prefix='R2 current package' if suite=='model-proxy' else 'R1 whole suite (not rerun whole in R2)'
lines.append(f"{prefix} {suite}: {g['files']}files {g['tests']}tests {g['pass']}pass {g['fail']}fail {g['skipped']}skip {g['cancelled']}cancel")
for suite in ['bus-readers','cli-readers']:
g=round2[suite];lines.append(f"R2 {suite}: {g['files']}files {g['tests']}tests {g['pass']}pass {g['fail']}fail {g['skipped']}skip")
lines += ['R2 config:55/55; federation official runner included in CLI readers:1/1 no skip.',
'R1 webui pinned-copy:10/10; config:55/55; federation runner:1/1 no skip.',
'R1 CLI listed skip: packages/cli/tests/federation-acceptance.test.mjs, FED R7; covered by the official acceptance runner.',
'R2 over-selection extras: case1-accept53/53 in247.863s; case2-unit47/47 in71.829s. Not required reader coverage.',
'The over-selected case1-accept run is not an F7 diagnostic or evidence about F7 either way. F7 cause unknown; Vikunja625.',
'Initial old red and scratch diagnostic remain separate; mos-1605 unchanged original rerun53/53. Sage landing gate must independently pass.']
(OUT/'FINAL-COUNTS.txt').write_text('\n'.join(lines)+'\n')
print('\n'.join(lines))