77 lines
7.7 KiB
Python
77 lines
7.7 KiB
Python
import pathlib, json, hashlib
|
|
R = pathlib.Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部')
|
|
E = R / 'docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015'
|
|
B = pathlib.Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build')
|
|
O = B / 'p04-s3-native-r01'
|
|
def read(p): return json.loads(p.read_text())
|
|
def pin(p):
|
|
p = pathlib.Path(p); data = p.read_bytes()
|
|
return dict(path=str(p), bytes=len(data), sha256=hashlib.sha256(data).hexdigest())
|
|
def raw(ref):
|
|
for fmt in ['var', 'json']:
|
|
assert pin(ref[fmt]['path'])['sha256'] == ref[fmt]['sha256']
|
|
return read(pathlib.Path(ref['json']['path']))
|
|
def pair(a,b):
|
|
pa, pb = pin(a['var']['path']), pin(b['var']['path'])
|
|
assert (pa['bytes'],pa['sha256']) == (pb['bytes'],pb['sha256'])
|
|
return dict(writer=pa,reader=pb)
|
|
x=read(O/'execution.json'); w=read(O/'raw/writer.json'); r=read(O/'raw/reader.json')
|
|
assert x['passed'] and not x['guard_errors'] and not x['cleanup_errors']
|
|
assert len(x['actual_captured_PIDs'])==4 and len(set(x['actual_captured_PIDs']))==4
|
|
assert all(p['engine_ended'] for p in x['cleanup']) and len(x['phases'])==4 and all(p['passed'] for p in x['phases'])
|
|
assert w['failures']==r['failures']==0 and w['pid']!=r['pid'] and w['profile']!=r['profile']
|
|
assert set(w['slots'])==set(r['slots']) and len(w['slots'])==22
|
|
cases={}; packages=[]; phases=[]; replay=[]
|
|
for case in ['B1','B2a','B2b','B3','B4a','B4b']:
|
|
wc=raw(w['branches'][case]); rc=raw(r['branches'][case]); points={k:raw(v) for k,v in wc['points'].items()}
|
|
assert set(points)==set(rc['restored']) and set(rc['replay'])==set(points)-{'before'}
|
|
for label, point in points.items():
|
|
restored=raw(rc['restored'][label]); assert restored['snapshot']==point['snapshot']
|
|
assert restored['actual_coordinator_absent'] and not restored['operations_enabled'] and restored['saved_coordinator']=={} and not restored['unrelated_getters_called']
|
|
key=case+'-'+label; orig=pathlib.Path(w['slots'][key]); copy=pathlib.Path(r['slots'][key])
|
|
assert sorted(p.name for p in orig.iterdir())==sorted(p.name for p in copy.iterdir())==['journal.log','manifest.json','thumbnail.png','world.bin']
|
|
members=[]
|
|
for p in sorted(orig.iterdir()):
|
|
a,b=pin(p),pin(copy/p.name); assert (a['bytes'],a['sha256'])==(b['bytes'],b['sha256'])
|
|
history=rc['member_hashes'][key]['members'][p.name]
|
|
assert set(history.values())=={a['sha256']}
|
|
members.append(dict(original=a,reader_copy=b))
|
|
packages.append(dict(case=case,label=label,members=members,all_Runtime_fields_typed_equal_native_assertion=True,restored_raw=rc['restored'][label]))
|
|
if label!='before':
|
|
assert raw(rc['replay'][label])==point
|
|
replay.append(dict(case=case,label=label,**pair(wc['points'][label],rc['replay'][label])))
|
|
assert len(wc['phases'])==len(rc['phases'])
|
|
for a,b in zip(wc['phases'],rc['phases']):
|
|
v=raw(a); assert raw(b)==v
|
|
phases.append(dict(case=case,minute=v['minute'],phase=v['phase'],**pair(a,b)))
|
|
before=points['before']; price=before['inputs']['price']; assert price==25 and before['inputs']['duration']==45
|
|
summary=[]
|
|
for label,d in sorted(points.items(),key=lambda z:z[1]['minute']):
|
|
paid=label!='before' and (case in ['B2a','B4a'] or (case=='B1' and d['minute']>=962))
|
|
assert d['wallets']['p04.s3.guest.a']==price*(1 if paid else 2)
|
|
assert len(d['receipts'])==(1 if paid else 0) if label!='before' else len(d['receipts'])==0
|
|
if label!='before':
|
|
assert d['player_cash']==before['player_cash']+(price if paid else 0)
|
|
if not paid: assert d['ledger']==before['ledger']
|
|
summary.append(dict(label=label,minute=d['minute'],service=d['service'],wallets=d['wallets'],available_meals=d['available_meals'],reservation_states=[dict(id=q['reservation_id'],state=q['state'],terminal_at=q['terminal_at']) for q in d['reservations']],receipt_count=len(d['receipts']),raw=wc['points'][label]))
|
|
if case=='B1':
|
|
for label in ['after','next']:
|
|
d=points[label]; assert d['service']['state']=='PAUSED' and d['service']['elapsed_minutes']==44 and d['service']['service_id']==before['service']['service_id'] and d['reservations'][0]==before['reservations'][0]
|
|
for label in ['after','next','recovered','duplicate_guard']:
|
|
d=points[label]; assert not d['facility']['operator_open'] and d['available_meals']==1 and d['reservations'][1]['state']=='RELEASED' and d['reservations'][1]['terminal_at']==960 and d['wallets']['p04.s3.guest.b']==50
|
|
assert points['after']['guests']['p04.s3.guest.b']['patience_remaining']==before['guests']['p04.s3.guest.b']['patience_remaining']==45
|
|
assert points['recovered']['service']['completed_at']==962 and points['duplicate_guard']['ledger']==points['recovered']['ledger']
|
|
elif case=='B3':
|
|
assert before['inputs']['patience']==45 and before['guests']['p04.s3.guest.a']['patience_remaining']==1
|
|
assert points['after']['minute']==766 and points['after']['guests']['p04.s3.guest.a']['patience_remaining']==0
|
|
assert points['despawn']['guests']['p04.s3.guest.a']=={}
|
|
elif case=='B4a': assert points['after']['event']['state']=='COMPLETED' and points['after']['facility']['durability']==0 and points['after']['service']['completed_at']==960
|
|
elif case=='B4b': assert points['after']['service']['state']=='ACTIVE' and points['next']['service']['state']=='FAILED' and points['next']['available_meals']==1
|
|
cases[case]=dict(points=summary,phase_count=len(wc['phases']),original_command_raw=wc['commands'],reader_commands=rc['recovery_commands'])
|
|
assert len(replay)==16 and len(phases)==176 and len(packages)==22
|
|
out=dict(plan_id='P04-01',submitted='accd07c91d4e34d9b7c7fc20e389df2424b167e1',passed=True,scope='S3 five frozen condition gaps exercised with six native cases; not whole P04 acceptance.',native_root=str(O),source_files=len(read(O/'source_before.json')),actual_owned_pids=x['actual_captured_PIDs'],all_owned_ended=True,guard_errors=[],cleanup_errors=[],cases=cases,formal_packages=packages,formal_slots=22,formal_member_files_original_and_copy=176,phase_full_typed_byte_pairs=phases,phase_pair_count=176,ordinary_clock_replay_full_point_byte_pairs=replay,replay_point_pair_count=16,formal_all_Runtime_typed_equality='Native Save/inspect/load/restore var_to_bytes assertions pass for all22 points; JSON compared only as additional root audit.',premises=['Original physically placed FLEX kitchen fixture; not natural hiring/unlock acceptance.','Original price25, duration45, traveler patience45; no manual progress/patience changes.','Operations disabled and actual coordinator nil; absence retained without unrelated getter or invented financial summary.','Power interruption reason is actual RELATED_FACILITY_INACTIVE, not rewritten NO_POWER.','Event destruction after completed service permits its prior payment; unfinished case fails next facility tick with no payment.'],original_unit_completion_credit=0,remaining=['Whole dynamic raw collector and all15+EV applicability','A actual candidate HEAD/tree/filesystem binding and negative fixtures','required whole validation','separate independent whole review','ordinary integration and final acceptance'],pins=[pin(O/'execution.json'),pin(O/'runner-input.json'),pin(O/'raw/writer.json'),pin(O/'raw/reader.json')])
|
|
target=E/'ROOT_S3_NATIVE_R01_RESULT.json'; target.write_text(json.dumps(out,ensure_ascii=False,indent=2)+'\n')
|
|
(E/'p04-s3-root-audit-r01.py').write_bytes(pathlib.Path(__file__).read_bytes())
|
|
(B/'audit-support/p04-whole-closure-r01'/target.name).write_bytes(target.read_bytes())
|
|
print(json.dumps(dict(report=str(target),passed=True,formal_slots=22,phase_pairs=176,replay_pairs=16,original_unit_credit=0)))
|