20 lines
4.4 KiB
Python
20 lines
4.4 KiB
Python
from pathlib import Path
|
|
import json,hashlib,shutil
|
|
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');A=R/'artifacts/original-completion-2026-10-02';P=A/'p04-idempotency-paid-formal-prep-r01';assert not P.exists();P.mkdir();N=A/'p04-idempotency-paid-midnight-native-r01';assert json.loads((N/'execution.json').read_text())['passed'];sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest();s=(A/'p04-paid-shift-midnight-formal-prep-r01/dependency-formal.gd').read_text().replace('var _results: Array = []','var _results: Array = []\nvar _resends: Array[Dictionary] = []');needle='\t\t_load_save("before", _input(inputs["before"]))';assert s.count(needle)==1;s=s.replace(needle,needle+'\n\t\t_assert_request_resend(manifest, "loaded-before")');needle='\t\t\t_proof("replayed-" + point, _runtime.create_snapshot())';assert s.count(needle)==1;s=s.replace(needle,needle+'\n\t\t\tif point in ["paused", "after"]: _assert_request_resend(manifest, "loaded-" + point)');needle='func _finish() -> void:';s=s.replace(needle,'''func _assert_request_resend(manifest: Dictionary, label: String) -> void:
|
|
var before: Dictionary = _runtime.create_snapshot()
|
|
var guests: Array = []
|
|
for guest: String in manifest["guest_ids"]: guests.append(StringName(guest))
|
|
var result: CommandResult = _runtime.submit_command(&"create_service_request", {&"facility_id": StringName(manifest["facility_id"]), &"request_id": StringName(manifest["request_id"]), &"guest_ids": guests}, &"player", &"", 10, -1, StringName(manifest["request_key"]))
|
|
_expect(result.code == CommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY, "formal restart retains processed request idempotency " + label)
|
|
var after: Dictionary = _runtime.create_snapshot()
|
|
_expect(var_to_bytes(before) == var_to_bytes(after), "formal restart request resend preserves entire typed Runtime " + label)
|
|
_proof("duplicate-" + label + "-before", before); _proof("duplicate-" + label + "-after", after)
|
|
_resends.append({&"label": label, &"minute": _clock.absolute_minute, &"result": result.to_dictionary(), &"request_key": manifest["request_key"]})
|
|
|
|
''' +needle);s=s.replace('&"slots": _slots,','&"slots": _slots, &"resends": _resends,');Q=P/'idempotency-formal.gd';Q.write_text(s)
|
|
obs=json.loads((N/'order-evidence/observations.json').read_text());service=next(x['service']for x in obs['observations']if 'service_id'in x.get('service',{}));before=json.loads((N/'order-evidence/midnight-before.json').read_text());cafe=next(x for x in before['systems']['runtime']['facilities']['instances']if x['instance_id']==service['facility_id']);inputs={}
|
|
for point in ['before','midnight','paused','after','next']:
|
|
p=N/'order-evidence'/('midnight-'+point+'.var');inputs[point]={'path':str(p),'bytes':p.stat().st_size,'sha256':sha(p)}
|
|
M=P/'INPUT.json';M.write_text(json.dumps({'source_native':str(N),'execution_sha256':sha(N/'execution.json'),'source_refs':1338,'whole_typed_inputs':inputs,'kitchen_id':cafe['related_facility_id'],'original_price':service['price_snapshot'],'facility_id':service['facility_id'],'request_id':service['request_id'],'guest_ids':service['guest_ids'],'request_key':'p04.same-minute.service.request'},indent=2)+'\n')
|
|
w=(A/'p04-paid-shift-midnight-formal-native-r01.py').read_text().replace('p04-paid-shift-midnight-formal-native-r01','p04-idempotency-paid-formal-native-r01').replace('p04-paid-shift-midnight-formal-prep-r01','p04-idempotency-paid-formal-prep-r01').replace('/dependency-formal.gd','/idempotency-formal.gd').replace('P04-01 existing paid catalog payroll and DAY/NIGHT handover with dependency pause/resume across midnight using public formal SaveService and distinct-PID Reader','P04-01 public request resend after formal SaveService/distinct PID restoration with exact whole typed state equality in paid midnight dependency scenario');W=A/'p04-idempotency-paid-formal-native-r01.py';compile(w,str(W),'exec');W.write_text(w);floor=1024**3+Path('/Applications/Godot.app/Contents/MacOS/Godot').stat().st_size+136*1024**2;free=shutil.disk_usage(A).free;assert free>=floor;(P/'ADMISSION.json').write_text(json.dumps({'scope':'Root formal public request resend acceptance fixture, not whole-unit acceptance','probe_sha256':sha(Q),'wrapper_sha256':sha(W),'input_manifest_sha256':sha(M),'source_native':str(N),'free_before':free,'required_free':floor,'estimated_seconds':90,'whole_original_credit':0},indent=2)+'\n');print('formal idempotency Reader prepared; original processed request key retained')
|