from pathlib import Path import json,hashlib R=Path(__file__).resolve().parent.parent;P=R/'storage/app/private/investmoz-v2/portal-audit';O=R/'outputs/investmoz-internal-designation-20261011' sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();m=json.loads((O/'manifesto.json').read_text(encoding='utf-8')) assert sha(O/m['package'])==m['package_sha256'] baseline={x['path']:x['before_sha256'] for x in m['files']} for relative,value in baseline.items():assert (sha(R/relative) if (R/relative).is_file() else None)==value scope={'code_revision':m['delta_sha256'],'active_base_hashes':baseline,'production_manifest_sha256':m['production_manifest_sha256'], 'candidate':{'revision':m['delta_sha256'],'zip_sha256':m['package_sha256'],'manifest_sha256':sha(O/'manifesto.json')}} (P/'internal-designation-backup-scope.json').write_text(json.dumps(scope,indent=2),encoding='utf-8') t=(R/'tools/portal-onboarding-release-target-backup.php').read_text(encoding='utf-8') t=t.replace('onboarding-release','internal-designation').replace('onboarding_release_target_','internal_designation_target_') (R/'tools/portal-internal-designation-target-backup.php').write_text(t,encoding='utf-8') t=(R/'tools/portal-onboarding-release-rehearsal.py').read_text(encoding='utf-8') t=t.replace('investmoz-operational-onboarding-20261011','investmoz-internal-designation-20261011') t=t.replace('onboarding-governance-plan.json','internal-designation-plan.json').replace('onboarding-release','internal-designation') (R/'tools/portal-internal-designation-rehearsal.py').write_text(t,encoding='utf-8') print(json.dumps({'result':'read_only_backup_and_QA_reversal_prepared','revision':m['delta_sha256'][:12],'active_writes':0}))