85 lines
5.7 KiB
Python
85 lines
5.7 KiB
Python
# 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))
|