Files

18 lines
5.7 KiB
Python

from pathlib import Path
import json,hashlib,shutil
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');A=R/'artifacts/original-completion-2026-10-02';E=R/'docs/plans/original-completion-2026-10-02/execution/p04-01-current-recheck-20261015';N=A/'p04-idempotency-paid-midnight-native-r01';F=A/'p04-idempotency-paid-formal-native-r01';load=lambda p:json.loads(p.read_bytes());sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();n=load(N/'execution.json');f=load(F/'execution.json');assert n['passed']and f['passed']and f['formal_unchanged']and f['formal_before']==f['formal_after'];assert all(z['engine_ended']for x in [n,f]for z in x['cleanup']);assert all(x[k]for x in [n,f]for k in ['all_source_unchanged','all_default_player_unchanged','doc4_unchanged']);obs=load(N/'order-evidence/observations.json');w=load(F/'restart-evidence/writer.json');d=load(F/'restart-evidence/reader.json');assert w['pid']!=d['pid']and w['profile']!=d['profile']and w['failures']==d['failures']==0;duplicates=[]
for row in obs['duplicate_results']:
result=row['command_result'];assert result['code']=='DUPLICATE_IDEMPOTENCY_KEY'and result['details']['processed'];original=result['details']['original_result'];assert original['code']=='OK';prefix='midnight-duplicate-'+row['label'];before=N/'order-evidence'/(prefix+'-before.var');after=N/'order-evidence'/(prefix+'-after.var');assert sha(before)==sha(after);duplicates.append({'scope':'original native','label':row['label'],'minute':row['minute'],'code':result['code'],'original_command_id':result['details']['original_command_id'],'before':str(before),'after':str(after),'identical_whole_typed_sha256':sha(before)})
for row in d['resends']:
result=row['result'];assert result['code']=='DUPLICATE_IDEMPOTENCY_KEY'and result['details']['processed'];prefix='reader-duplicate-'+row['label'];before=F/'restart-evidence'/(prefix+'-before.var');after=F/'restart-evidence'/(prefix+'-after.var');assert sha(before)==sha(after);duplicates.append({'scope':'formal Reader','label':row['label'],'minute':row['minute'],'code':result['code'],'original_command_id':result['details']['original_command_id'],'before':str(before),'after':str(after),'identical_whole_typed_sha256':sha(before)})
assert len(duplicates)==6 and len({x['original_command_id']for x in duplicates})==1;inputs=load(A/'p04-idempotency-paid-formal-prep-r01/INPUT.json');typed=[];members=[]
for point,z in inputs['whole_typed_inputs'].items():
for name in ['writer-'+point+'-persisted','reader-'+point+'-loaded']+(['reader-replayed-'+point]if point!='before'else[]):
p=F/'restart-evidence'/(name+'.var');assert sha(p)==z['sha256'];typed.append({'path':str(p),'original':z['path'],'sha256':sha(p)})
wp=Path(w['slots'][point]);rp=Path(d['slots'][point]);expected={'journal.log','manifest.json','thumbnail.png','world.bin'};assert {z.name for z in wp.iterdir()}==expected=={z.name for z in rp.iterdir()}
for name in sorted(expected):assert sha(wp/name)==sha(rp/name);members.append({'point':point,'name':name,'writer':str(wp/name),'reader':str(rp/name),'sha256':sha(wp/name)})
assert len(typed)==14 and len(members)==20;state=load(N/'order-evidence/midnight-next.json')['systems']['runtime'];sales=[x for x in state['economy']['entries']if x['category']=='SERVICE_SALE'and x['credit_account']=='GUEST_WALLET:p04.order.midnight.guest'];wage=[x for x in state['economy']['entries']if x['category']=='WAGE'];assert len(sales)==len(wage)==1 and sales[0]['amount']==25 and wage[0]['amount']==255
record={'plan_id':'P04-01','production_commit':'f3f23cac8822da19ab6912bacd759a94d084c0c0','scope':'Same-minute public create_service_request retransmission before admission/during dependency pause/after completion, including formal SaveService and distinct-PID Reader. All typed state preserved. Existing payroll values remain observed test inputs, not newly approved product balance.','source_files':1338,'actual_owned_pids':n['actual_captured_PIDs']+f['actual_captured_PIDs'],'all_owned_ended':True,'duplicate_attempts':duplicates,'typed_saved_loaded_replayed_14':typed,'formal_members_original_and_copied_20':members,'original_packages_unchanged':True,'writer_pid':w['pid'],'reader_pid':d['pid'],'one_target_sale':sales,'one_payroll':wage,'source_default_profile_doc4_unchanged':True,'native_execution_sha256':sha(N/'execution.json'),'formal_execution_sha256':sha(F/'execution.json'),'observations_sha256':sha(N/'order-evidence/observations.json'),'reader_receipt_sha256':sha(F/'restart-evidence/reader.json'),'formal_original_credit':0,'independent_whole_review':'pending'};(E/'ROOT_SAME_MINUTE_RESEND_FORMAL_RESULT.json').write_text(json.dumps(record,ensure_ascii=False,indent=2)+'\n')
for src,name in [(A/'p04-idempotency-paid-midnight-prep-r01/idempotency-paid-midnight.gd','idempotency-paid-midnight-r01.gd'),(A/'p04-idempotency-paid-midnight-prep-r01/ADMISSION.json','ROOT_SAME_MINUTE_RESEND_NATIVE_ADMISSION.json'),(A/'p04-idempotency-paid-midnight-native-r01.py','p04-idempotency-paid-midnight-native-r01.py'),(A/'p04-idempotency-paid-formal-prep-r01/idempotency-formal.gd','idempotency-paid-formal-r01.gd'),(A/'p04-idempotency-paid-formal-prep-r01/ADMISSION.json','ROOT_SAME_MINUTE_RESEND_FORMAL_ADMISSION.json'),(A/'p04-idempotency-paid-formal-prep-r01/INPUT.json','ROOT_SAME_MINUTE_RESEND_FORMAL_INPUT.json'),(A/'p04-idempotency-paid-formal-native-r01.py','p04-idempotency-paid-formal-native-r01.py'),(Path('/private/tmp/thetree-p04-idempotency-native-prepare-r01.py'),'p04-idempotency-native-prepare-r01.py'),(Path('/private/tmp/thetree-p04-idempotency-formal-prepare-r01.py'),'p04-idempotency-formal-prepare-r01.py')]:shutil.copyfile(src,E/name)
print({'same_key_duplicate_attempts':6,'whole_typed_state_pairs_byte_identical':6,'formal_typed_states_match_original':14,'target_sales':1,'payroll_rows':1,'all_owned_ended':True,'original_credit':0})