Files

76 lines
9.3 KiB
Python

# coding: utf-8
from pathlib import Path
import importlib.util,json,hashlib,re,shutil
R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部'); A=R/'artifacts/original-completion-2026-10-02'; D=R/'docs/plans/original-completion-2026-10-02'; O=A/'p23-02-current-phase-diagnostic-r338'; stage=A/'p23-02-native-guest-bulk-local-r315/stage'
s=importlib.util.spec_from_file_location('r',R/'tools/run_all_tests.py');r=importlib.util.module_from_spec(s);s.loader.exec_module(r)
O.mkdir(exist_ok=True);(O/'originals').mkdir(exist_ok=True);(O/'instrumented').mkdir(exist_ok=True)
def pin(p):return dict(path=str(p),bytes=p.stat().st_size,sha256=r.sha(p))
groups={
'runtime':('autoload/simulation_runtime.gd','runtime',['_advance_construction','_preflight_proxy_completions','_validate_infrastructure_crosslinks','_advance_inventory_and_logistics','_advance_facilities','_advance_staff_ai','_advance_guest_ai_decisions','_project_guest_candidates','_decide_guest_with_log','_publish_snapshot','_execute_create_logistics_request','_validate_service_start','_complete_service_transaction','_apply_service_transaction']),
'inventory':('scripts/inventory/inventory_service.gd','runtime.inventory_service',['process_expired','create_snapshot','_find_stack','reserve_item']),
'facility':('scripts/facility/facility_service.gd','runtime.facility_service',['advance_one_minute','refresh_operating_dependencies','start_next_service','_complete_service']),
'supply':('scripts/supply/supply_management_service.gd','runtime.supply_management',['advance_auto_purchases','ensure_deliveries','_connection_distance','_purchase_paid']),
'logistics':('scripts/supply/supply_logistics_bridge.gd','runtime.supply_logistics',['tick']),
'kitchen':('scripts/supply/kitchen_production_service.gd','runtime.kitchen_production',['advance_one_minute']),
'kernel_phases':('scripts/core/simulation_kernel.gd','clock',['_run_phase'])}
# Filter unavailable guessed transaction names, retaining explicit omission record.
missing=[];manifest={};declared={};targets={}
for group,(rel,target,names) in groups.items():
original=(stage/rel).read_text();text=original;wrappers=[];declared[group]=[];targets[group]=target
for name in names:
m=re.search(r'^func '+re.escape(name)+r'\((.*?)\)(?:\s*->\s*([^:]+))?:\n',original,re.M|re.S)
if not m:missing.append(group+'.'+name);continue
sig=m.group(0);params=m.group(1);typ=(m.group(2) or 'Variant').strip()
# Each selected signature has only commas between parameters; default expressions checked here.
args=[]
for p in params.split(','):
p=p.strip()
if p:args.append(p.split(':')[0].split('=')[0].strip())
assert all(re.fullmatch(r'[a-zA-Z_][a-zA-Z_0-9]*',a) for a in args),(name,args)
renamed='_p23r338_original'+name;new=sig.replace('func '+name+'(','func '+renamed+'(',1);assert text.count(sig)==1;text=text.replace(sig,new,1)
call=renamed+'('+', '.join(args)+')';key='str(phase)' if group=='kernel_phases' else json.dumps(name)
body=sig+'\tvar p23_started := Time.get_ticks_usec()\n'
body+=('\t'+call+'\n') if typ=='void' else ('\tvar p23_result: '+typ+' = '+call+'\n')
body+='\tvar p23_elapsed := Time.get_ticks_usec() - p23_started\n\tvar p23_key: String = '+key+'\n\tvar p23_row: Dictionary = _p23r338_metrics.get(p23_key, {"calls":0,"inclusive_us":0,"max_us":0})\n\tp23_row["calls"] = int(p23_row["calls"]) + 1\n\tp23_row["inclusive_us"] = int(p23_row["inclusive_us"]) + p23_elapsed\n\tp23_row["max_us"] = maxi(int(p23_row["max_us"]),p23_elapsed)\n\t_p23r338_metrics[p23_key] = p23_row\n'
if typ!='void':body+='\treturn p23_result\n'
wrappers.append(dict(name=name,signature=sig,renamed_signature=new,wrapper=body))
if group!='kernel_phases':declared[group].append(name)
if group=='kernel_phases':declared[group]=[str(i) for i in range(11)]
suffix='\n# Private r338 diagnostic fields; not persisted. Nested inclusive timings only.\nvar _p23r338_metrics: Dictionary = {}\n\n'+'\n'.join(w['wrapper'] for w in wrappers)+'\n';text+=suffix
inverse=text[:-len(suffix)]
for w in wrappers:inverse=inverse.replace(w['renamed_signature'],w['signature'],1)
assert inverse==original
for sub,content in [('originals',original),('instrumented',text)]:
p=O/sub/rel;p.parent.mkdir(parents=True,exist_ok=True);p.write_text(content)
manifest[rel]=dict(before=pin(O/'originals'/rel),after=pin(O/'instrumented'/rel),wrappers=wrappers,suffix=suffix,inverse_equal=True)
qa=(A/'p23-02-native-input-copy-whole-r336/whole.gd').read_text()
qa=qa.replace('# One sample of an adjacent hot-loop r326/library327 versus input-copy r333/library334 pair. Only the synchronous tick is timed.','# One instrumented current r333/library334 tick; nested inclusive timing only.')
qa=qa.replace('candidate not in ["baseline","candidate"]','candidate != "r333-diagnostic"')
# No added external listeners. Counters are read and frozen immediately after tick.
init='\tvar declared: Dictionary = '+json.dumps(declared)+'\n\tvar targets: Dictionary = {'+', '.join(json.dumps(k)+':'+v for k,v in targets.items())+'}\n\tfor group: String in declared:\n\t\ttargets[group]._p23r338_metrics.clear()\n\t\tfor key: String in declared[group]: targets[group]._p23r338_metrics[key] = {"calls":0,"inclusive_us":0,"max_us":0}\n'
qa=qa.replace('\tvar started := Time.get_ticks_usec()',init+'\tvar started := Time.get_ticks_usec()')
qa=qa.replace('\tcheck(clock.absolute_minute == 647','\tvar metrics: Dictionary = {}\n\tfor group: String in declared: metrics[group] = targets[group]._p23r338_metrics.duplicate(true)\n\tcheck(clock.absolute_minute == 647',1)
validation='\tvar metrics_valid := true\n\tfor group: String in declared:\n\t\tmetrics_valid = metrics_valid and metrics[group].size() == declared[group].size()\n\t\tfor key: String in declared[group]:\n\t\t\tvar row: Dictionary = metrics[group][key]\n\t\t\tmetrics_valid = metrics_valid and int(row["calls"]) >= 0 and int(row["inclusive_us"]) >= int(row["max_us"]) and int(row["max_us"]) >= 0\n\t\t\tif int(row["calls"]) == 0: metrics_valid = metrics_valid and int(row["inclusive_us"]) == 0 and int(row["max_us"]) == 0\n\tfor key: String in declared["kernel_phases"]: metrics_valid = metrics_valid and int(metrics["kernel_phases"][key]["calls"]) == 1\n\tcheck(metrics_valid, "finite nested metric schema and one call per kernel phase")\n\tvar metrics_pin := typed("metrics",metrics)\n\tvar decoded := FileAccess.open(output.path_join("metrics.json"),FileAccess.WRITE)\n\tif decoded == null: quit(98); return\n\tdecoded.store_string(JSON.stringify(metrics,"\\t")); decoded.close()\n'
qa=qa.replace('\tvar report :=',validation+'\tvar report :=',1).replace('"manual_tick_us":elapsed','"manual_tick_us":elapsed,"metrics":metrics_pin,"diagnostic_only":true')
qa=qa.replace('SDK whole647:', 'Phase diagnostic whole647:')
qa=qa.replace('One sample from an adjacent baseline hot-loop r326/library327 versus input-copy r333/library334 pair; fixed cold restored646. Only exploratory pair observation, no stable speedup, percentile or budget acceptance.','One instrumented r333/library334 cold646 tick; nested inclusive metrics, no sums or subtraction as pure CPU, no uninstrumented speed comparison or acceptance.')
(O/'diagnostic.gd').write_text(qa)
wrapper=(A/'p23-02-native-input-copy-whole-r336/guarded-candidate.gd').read_text() if (A/'p23-02-native-input-copy-whole-r336/guarded-candidate.gd').exists() else ''
if not wrapper:
x=r.read(A/'p23-02-native-input-copy-whole-r336/input.json');wrapper=Path(x['pins']['starter_candidate']['path']).read_text()
wrapper=re.sub(r'^extends .*$', lambda m: 'extends '+json.dumps(str(O/'diagnostic.gd')),wrapper,count=1,flags=re.M)
(O/'guarded.gd').write_text(wrapper)
old=r.read(A/'p23-02-native-input-copy-whole-r336/input.json');fixed={k:v for k,v in old['pins'].items() if k in ['engine','fixture','oracle','modified_budget','original_path']}
fixed.update(starter=pin(O/'guarded.gd'),qa=pin(O/'diagnostic.gd'),extension=pin(A/'p23-02-native-input-copy-local-r335/candidate.gdextension'))
for line in Path(fixed['extension']['path']).read_text().splitlines():
if line.startswith('macos.arm64'):
lib=Path(line.split('=',1)[1].strip().strip('"'));fixed['library']=pin(lib)
expected=r.inventory(stage,stage=True);patched=dict(expected)
for rel,row in manifest.items():
# inventory values include SHA/bytes shape; inspect and preserve value layout.
v=expected[rel];patched[rel]={**v,'bytes':row['after']['bytes'],'sha256':row['after']['sha256']} if isinstance(v,dict) else row['after']['sha256']
patched['scripts/core/performance_budget.gd']=old['patched_stage']['scripts/core/performance_budget.gd']
plan=dict(plan_id='P23-02',purpose='one current r333/library334 phase/submethod diagnostic; no new implementation or acceptance',stage=str(stage),pins=fixed,source_before=r.source_refs(R),default_before=r.default_player(R),doc4_before={n:r.sha(D/n) for n in ['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json']},support_inventory=r.inventory(r.SUPPORT),expected_stage=expected,patched_stage=patched,manifest=manifest,declared=declared,targets=targets,missing_methods=missing,capacity_floor_bytes=528*1048576,measurement_cap_bytes=16*1048576,owned_deadline_seconds=90,estimated_seconds=15,stage_clone_count=0,compile_count=0,unit_accepted=False,performance_accepted=False)
r.write(O/'input.json',plan)
print(json.dumps(dict(output=str(O),missing=missing,stage_files=len(manifest),free_bytes=shutil.disk_usage(A).free,inventory_example=next(iter(expected.items())))))