The 0xBBE heat-sink BANK was built as a plain HeatSink, so the numeric-R cockpit gauge binding HeatSink/AmbientTemperature (L4GAUGE.CFG:4552) had no publisher -> the LAST unresolved config attribute. Reconstruct AggregateHeatSink : HeatSink (ctor @4ae8d0, own GUID 0x50e590), byte-exact + static_assert-locked (heatSinkCount@0x1D0, ambientTemperature @0x1D4=300, helper@0x1D8 0xC link node, sizeof 0x1E4 == factory alloc @9993). Publish HeatSinkCount + AmbientTemperature via a dense-prefix attribute table chained to HeatSink::NextAttributeID (shared HeatSink table unchanged, so CoolantMass/CoolantCapacity keep resolving). Move CreateHeatSinkBankSubsystem into heatfamily_reslice.cpp (needs the class def) and build the real class at factory case 0xBBE; mech.cpp unchanged. DELIBERATE DEVIATION (documented in the class): keep the base HeatSinkSimulation the HeatSink ctor installs; do NOT reimplement the authentic Performance @4ae73c -- it derefs a raw self+0xE0 -> [+0x158] that does not map in our compiled layout (AV/NaN, and runs for EVERY mech), and ambientTemperature is a frozen constant so the gauge reads 300 either way. Authentic relaxation model deferred. Verified: [attr] HeatSink/AmbientTemperature OK; all 50 config attribute bindings resolve (0 NULL); no every-mech crash; combat TARGET DESTROYED, FIRED #41+, un-regressed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
28 lines
1.4 KiB
Python
28 lines
1.4 KiB
Python
import json, sys
|
|
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
p=r"C:\Users\epilectrik\.claude\projects\C--git-bt411\09bf24bb-f92d-423a-b815-1eb662736f58\subagents\workflows\wf_93c95bcc-09a\journal.jsonl"
|
|
for line in open(p,encoding='utf-8'):
|
|
try: o=json.loads(line)
|
|
except: continue
|
|
if o.get('type')!='result': continue
|
|
r=o.get('result')
|
|
if not isinstance(r,dict): continue
|
|
if 'widget' in r:
|
|
print('\n'+'='*70)
|
|
print('WIDGET:', r.get('widget'), '| keyword:', r.get('configKeyword'))
|
|
print('confidence:', (r.get('confidence') or '')[:400])
|
|
fns=r.get('functions') or []
|
|
print('functions:', ', '.join(f.get('name','?')+'@'+(f.get('address','?')[:20]) for f in fns))
|
|
print('attrTableAdditions:', (r.get('attributeTableAdditions') or 'none')[:500])
|
|
sd=r.get('stubbedDependencies') or []
|
|
print('stubbedDeps:', json.dumps(sd)[:600])
|
|
print('integrationNotes:', (r.get('integrationNotes') or '')[:600])
|
|
if 'verdict' in r and 'implementationOrder' in r:
|
|
print('\n'+'#'*70)
|
|
print('VERIFY VERDICT:', (r.get('verdict') or '')[:800])
|
|
for k in ['implementationOrder','blockers','forceTrapRisks','perWidgetVerdict']:
|
|
v=r.get(k)
|
|
if not v: continue
|
|
print('\n['+k+']')
|
|
for i,x in enumerate(v): print(' %d. %s'%(i+1,str(x)[:400]))
|