18 lines
5.9 KiB
Python
18 lines
5.9 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-paid-shift-midnight-native-r01';F=A/'p04-paid-shift-midnight-formal-native-r01';sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();load=lambda p:json.loads(p.read_bytes());n=load(N/'execution.json');f=load(F/'execution.json');assert n['passed']and f['passed']and f['formal_unchanged'];assert all(x[k]for x in [n,f]for k in ['all_source_unchanged','all_default_player_unchanged','doc4_unchanged']);assert all(z['engine_ended']for x in [n,f]for z in x['cleanup']);catalog=load(R/'data/characters/mvp_staff_candidates.json');amounts={x['id']:x['daily_wage']for x in catalog['entries']if x['id']in ['staff_akane','staff_bardo']};wages=sum(amounts.values());assert wages>0;obs=load(N/'order-evidence/observations.json');summary=obs['first_summary'];assert summary['closed_at']==1440 and summary['settlement']['paid_total']==summary['settlement']['new_wages_total']==wages;assert obs['first_receipts']==obs['replay_receipts'];handover=[x for x in obs['observations']if 'paid_reception'in x and 'handover'in x['label']];assert [x['paid_reception']['active_staff_ids']for x in handover]==[['staff_akane'],['staff_akane'],['staff_bardo']];states={};pin={}
|
|
for point in ['before','midnight','paused','after','next']:
|
|
p=N/'order-evidence'/('midnight-'+point+'.json');v=load(p);econ=v['systems']['runtime']['economy'];rows=[x for x in econ['entries']if x['category']=='WAGE'];assert len(rows)==(0 if point=='before'else 1)
|
|
if rows:assert rows[0]['amount']==wages and rows[0]['absolute_minute']==1440 and rows[0]['credit_account']=='PLAYER_CASH'
|
|
states[point]={'wage_rows':len(rows),'total_wages':sum(x['amount']for x in rows),'sha256':sha(p)};pin[str(p.relative_to(N))]=sha(p)
|
|
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;inputs=load(A/'p04-paid-shift-midnight-formal-prep-r01/INPUT.json');typed=[];members=[]
|
|
for point,row 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)==row['sha256'];typed.append({'file':str(p),'sha256':sha(p),'original':row['path']})
|
|
wp=Path(w['slots'][point]);rp=Path(d['slots'][point]);names={'journal.log','manifest.json','thumbnail.png','world.bin'};assert {p.name for p in wp.iterdir()}==names=={p.name for p in rp.iterdir()}
|
|
for name in sorted(names):assert sha(wp/name)==sha(rp/name);members.append({'point':point,'member':name,'sha256':sha(wp/name),'writer':str(wp/name),'reader':str(rp/name)})
|
|
assert len(typed)==14 and len(members)==20;reader_wage=[z for receipt in d['results'][0]['receipts']for z in receipt['rows']if z['category']=='WAGE'];assert len(reader_wage)==1 and reader_wage[0]['amount']==wages and reader_wage[0]['absolute_minute']==1440
|
|
record={'plan_id':'P04-01','production_commit':'54e81e576f5fe24b23c52f890e774a3b927b4fe2','scope':'Existing catalog public hires, physical DAY/NIGHT reception handover, actual nonzero payroll across approved dependency pause/resume midnight, formal SaveService/distinct PID. Catalog input use is not approval of final production balance. Not whole-unit acceptance.','catalog_pin':sha(R/'data/characters/mvp_staff_candidates.json'),'existing_wages':amounts,'observed_daily_paid_total':wages,'handover':[(x['label'],x['paid_reception']['active_staff_ids'])for x in handover],'five_native_state_wage_counts':states,'typed_outputs_14_sha_match_native':typed,'formal_original_and_reader_20_members_match':members,'original_packages_unchanged':True,'writer_pid':w['pid'],'reader_pid':d['pid'],'reader_payroll_rows':reader_wage,'actual_owned_pids':n['actual_captured_PIDs']+f['actual_captured_PIDs'],'all_owned_ended':True,'source_default_profile_doc4_unchanged':True,'native_execution_pin':sha(N/'execution.json'),'formal_execution_pin':sha(F/'execution.json'),'native_observations_pin':sha(N/'order-evidence/observations.json'),'writer_receipt_pin':sha(F/'restart-evidence/writer.json'),'reader_receipt_pin':sha(F/'restart-evidence/reader.json'),'formal_credit':0,'independent_whole_review':'pending','remaining':['native raw checker binding and whole seven-domain applicability','command resend, EV and other unproven boundaries','independent whole review and ordinary integration/final','applicable Windows final acceptance']};(E/'ROOT_PAID_SHIFT_MIDNIGHT_FORMAL_RESULT.json').write_text(json.dumps(record,ensure_ascii=False,indent=2)+'\n')
|
|
for source,name in [(A/'p04-paid-shift-midnight-native-r01.py','p04-paid-shift-midnight-native-r01.py'),(A/'p04-paid-shift-midnight-prep-r01/paid-shift-midnight.gd','paid-shift-midnight-r01.gd'),(A/'p04-paid-shift-midnight-prep-r01/ADMISSION.json','ROOT_PAID_SHIFT_MIDNIGHT_ADMISSION.json'),(A/'p04-paid-shift-midnight-formal-native-r01.py','p04-paid-shift-midnight-formal-native-r01.py'),(A/'p04-paid-shift-midnight-formal-prep-r01/ADMISSION.json','ROOT_PAID_SHIFT_MIDNIGHT_FORMAL_ADMISSION.json'),(A/'p04-paid-shift-midnight-formal-prep-r01/INPUT.json','ROOT_PAID_SHIFT_MIDNIGHT_FORMAL_INPUT.json'),(A/'p04-paid-shift-midnight-formal-prep-r01/dependency-formal.gd','paid-shift-midnight-formal-r01.gd'),(Path('/private/tmp/thetree-p04-paid-shift-midnight-prepare-r01.py'),'p04-paid-shift-midnight-prepare-r01.py'),(Path('/private/tmp/thetree-p04-paid-shift-midnight-formal-prepare-r01.py'),'p04-paid-shift-midnight-formal-prepare-r01.py')]:shutil.copyfile(source,E/name)
|
|
print({'paid_wages':wages,'handover_original_day_before_completion':True,'formal_writer_pid':w['pid'],'formal_reader_pid':d['pid'],'typed_hash_matches':14,'wage_rows_at_next':states['next']['wage_rows'],'whole_original_credit':0})
|