Files
BT411/scratchpad/dumpcluster.py
T
arcattackandClaude Opus 4.8 16f5f545ce gauge-complete P4b: AggregateHeatSink 0xBBE -> HeatSink/AmbientTemperature bound (last config NULL cleared)
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>
2026-07-07 20:10:11 -05:00

28 lines
1.4 KiB
Python

import json, sys
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
want = sys.argv[1] if len(sys.argv)>1 else 'aggregate'
p=r"C:\Users\epilectrik\.claude\projects\C--git-bt411\09bf24bb-f92d-423a-b815-1eb662736f58\subagents\workflows\wf_1f336584-654\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) or 'cluster' not in r: continue
if want.lower() not in r.get('cluster','').lower(): continue
print('CLUSTER:', r.get('cluster'))
print('CONF:', r.get('confidence'))
for it in (r.get('items') or []):
print('\n'+'='*66)
print('ITEM:', it.get('item'))
if it.get('classLayout'): print('\n--- LAYOUT ---\n', it.get('classLayout'))
if it.get('methodDescription'): print('\n--- METHODDESC/REG ---\n', it.get('methodDescription'))
if it.get('attributeTable'): print('\n--- ATTR TABLE ---\n', it.get('attributeTable'))
if it.get('factoryWiring'): print('\n--- FACTORY ---\n', it.get('factoryWiring'))
for f in (it.get('functions') or []):
print('\n--- FN:', f.get('name'), '@', f.get('address'), '---')
print(f.get('cpp'))
if it.get('checklist'):
print('\n--- CHECKLIST ---')
for x in it.get('checklist'): print(' -', x)
print('\nOPEN:', r.get('openQuestions'))