Files
digital-drosophila/models/male-cns-lif/apl-pn-scope-audit-v1/finalize.py
T

52 lines
4.0 KiB
Python

"""Seal only this newly created audit and copy small evidence into Git registry."""
import json
from pathlib import Path
import shutil
import time
from audit import save,digest,seal,immutable_check
ROOT=Path('/data/digital-drosophila');MODEL=ROOT/'models/male-cns-lif/apl-pn-scope-audit-v1';EXP=ROOT/'experiments/phase4aa-apl-pn-scope'
def main():
assert not (EXP/'manifest.json').exists() and not (MODEL/'manifest.json').exists(),'Already sealed'
static=json.loads((EXP/'audit/results.json').read_text())
local=json.loads((EXP/'localization/summary.json').read_text())
pairs=json.loads((EXP/'localization/complete-pair-set-validation.json').read_text())
gpu=json.loads((EXP/'retry-with-correct-PATH/gpu-frozen-regression/summary.json').read_text())
external=json.loads((EXP/'external-resources/synaptic-partners/download-verification.json').read_text())
assert static['frozen_integrity_pass'] and local['pass'] and pairs['pass'] and gpu['pass'] and external['pass']
post=immutable_check(ROOT,ROOT/'registry/snapshots/bootstrap-20260929',4)
save(EXP/'regression/final-old-files-integrity.json',post);assert post['pass']
result={'phase':'4AA','status':'PASS-APL-PN-ANATOMICAL-LOCALIZATION / NO-DYNAMICS-CANDIDATE',
'candidate':False,'previous_static_spatial_block_resolved_by_user_authorized_reference_data':True,
'old_static_audit_retained_without_overwrite':True,'canonical_neurons':166700,'canonical_edges':25582938,
'APL_PN_edges':268,'APL_target_PNs':259,'APL_PN_contacts':4600,'calyx_contacts':3820,
'calyx_fraction':3820/4600,'ROI_unspecified_contacts':731,'other_ROI_contacts':49,
'watched_PN_contacts':247,'watched_calyx_contacts':228,'watched_unspecified_contacts':19,
'complete_pair_checks':pairs,'frozen_trials_pass':gpu['pass'],'frozen_trials_count':len(gpu['trials']),
'old_scientific_files_verified':post['checked'],'old_file_integrity_pass':post['pass'],
'external_MD5_pass':external['pass'],'external_SHA256':external['sha256'],
'brain_dynamics_changed':False,'training':False,'receptor_or_terminal_gain_calibrated':False,
'bouton_identity_confirmed':False,'ComfyUI_stopped_or_unloaded':False,'top_level_gate_fraction':'5/10',
'failures_preserved':['initial experiment-directory permission before any output','first GPU build lookup of Ninja failed before simulation','first aria2 checksum argument invalid before download'],
'finalized_utc':time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())}
save(EXP/'audit/final-summary.json',result)
with (MODEL/'REPORT.md').open('rb') as src,(EXP/'REPORT.md').open('xb') as dst:shutil.copyfileobj(src,dst)
model_count=seal(MODEL);experiment_count=seal(EXP)
verified=[]
for base in (MODEL,EXP):
manifest=json.loads((base/'manifest.json').read_text());bad=[r['path'] for r in manifest['files'] if digest(base/r['path'])!=r['sha256']]
assert not bad;verified.append({'path':str(base),'files':len(manifest['files']),'pass':not bad})
registry=ROOT/'registry/phase4aa-apl-pn-scope';registry.mkdir(exist_ok=False)
records=[]
for p in sorted(EXP.rglob('*')):
if not p.is_file() or p.suffix not in ('.json','.csv','.md','.sha256') or p.stat().st_size>2*1024**2:continue
dst=registry/'evidence'/p.relative_to(EXP);dst.parent.mkdir(parents=True,exist_ok=True)
with p.open('rb') as src,dst.open('xb') as out:shutil.copyfileobj(src,out)
records.append({'original_path':str(p.relative_to(ROOT)),'copy_path':str(dst.relative_to(registry)),'sha256':digest(p),'bytes':p.stat().st_size})
save(registry/'evidence-index.json',records);save(registry/'seal-verification.json',verified)
doc=ROOT/'docs/progress/phase4aa-apl-pn-scope.md';doc.parent.mkdir(parents=True,exist_ok=True)
with (MODEL/'REPORT.md').open('rb') as src,doc.open('xb') as dst:shutil.copyfileobj(src,dst)
print(json.dumps({'result':result['status'],'model_files':model_count,'experiment_files':experiment_count,'evidence_copies':len(records),'all_seals_pass':True}),flush=True)
if __name__=='__main__':main()