Master map of everything in the vault.
Last updated: 2026-08-30 — full dated history in logs/CHANGELOG.md.
md → video; homes the generator list per the standing 2026-05-29 ask, and extends career-slides’ working md→Marp→PNG→ffmpeg spine rather than rebuilding it. Thesis from three 2026 specimens (Genspark’s Lemonade OS, Pezzza’s training dashboard, Stefan 3D AI’s Unreal-MCP stack): output quality tracks harness quality more than model quality — plus the boundary discipline of naming what the AI does badly and keeping a human theredist/<fork>/ generated so there is no drift. Deliberately not part of the game-annotation series (active)ghcr.io/chrisaacson69/animation-studio-pod:1.2.0)game-annotation monorepo. Indexed by arc, not console: both arcs are cross-system by design, so filing them under a system would sever the comparison, which is the deliverable. Arc 1 hardware-capability (Adventure/2600 ↔ Mappy/NES); Arc 2 mechanical-complexity (Utopia/Intellivision-CP1610 ↔ M.U.L.E./Atari-800). Key M.U.L.E. finding — the mechanism-vs-equilibrium gap (the auction enables specialization; spoilage + zero-sum incentives may pull equilibrium back to self-sufficiency) — is the seed of the Dead-Verb Test (active)
koei-nes (the koeivm/ package — cpu6502, dream, the CFG/stack-audit gates, decompile_all — plus data_xref, disasm6502, games.toml, RECORD_SCHEMAS.md) and koei-snes (vm_disasm/vm_walk/vm_opcodes/syscall_probe/native_floor + data_walk/gen_mlb/gen_source/vm_lift/vm_struct). A new title is a profile in games.toml, not a new toolchain — which is why the walk skills bind here. Carries the cross-console proof: VM opcodes byte-for-byte identical (NES 219 / SNES 218), province record stride 25 on both, the SNES a faithful port + facelift (active)nes-render (generic) → koei-nes (family engine) → seven per-title decompilers. Repo names are decompiler-project numbering, not series order, and “game 6/7/8” is decompile order, not release order (active)
nes-render (the generic render core that graduated out of NA1 when Mappy needed it) + Mesen emulator integration. Records a live duplication: “emit emulator labels from the symbol table” exists in three homes (game-annotation/tools/, koei-nes/tools/, koei-snes’s gen_mlb) — flagged, not fixed, so the next person finds all three instead of writing a fourth../na1-decompiler/nobunaga/ (sibling of the vault, one dir up) — read/reuse from there, start at its CONTEXT.md/ROADMAP.md; the GitHub URL is private/unbrowsable. Koei’s 256 KB MMC1 strategy cart; solo deep-dive on familiar NES; 13 chapters done — kernel boot + 23-entry dispatcher (ch 1); ZP map (ch 2); NMI pipeline + PPU/audio/palette pipelines (ch 3); The Syscall API — 23-entry table reframed as OS-style syscall surface (PHP+JMP($FFFE) faking BRK, 22-byte param block, return via $66/$67), all 23 slots characterized (19 active + 4 RTS placeholders), fixes 4 chapter-1-to-3 errata (ch 4); The Bytecode VM — orchestration question answered: bank 15’s $E823-$F225 region implements a stack-based 256-opcode VM, game logic (banks 0-14) is VM bytecode not native 6502, the 23 kernel syscalls exposed via host-call opcode $E9, ptr1 is the VM frame pointer and IS the syscall struct, structural analog of Infocom Z-machine on a 1989 strategy cart (ch 5); The VM Disassembler — vm-disasm.py reads bytecode + opcode-format TOML + labels and emits annotated VM-assembly; auto-classified all 256 opcodes by operand format; host_call targets revealed as bytecode subroutines (not just native code); the disassembler is the first project tool whose payoff scales across the Koei MMC1 catalog (ch 6); The SRAM Save Layer — 8 KB battery-backed PRG-RAM at $6000-$7FFF fully mapped: 17-fief province table at $601A (17×26-byte records with base-koku header, 11 16-bit BE stats, footer), 17-fief daimyo table at $752F (17×7-byte records: age + H/D/L/Ch/IQ + status), parallel name tables at $77A8 (daimyos) and $78XX (provinces), map data at $7C00, transient UI cache at $7F00+ (frame counter at $7FE9, zeroed-on-boot flags); ROM defaults tables at $9258 (17-fief) and $B0BE (50-fief) confirmed identical format with LE/BE byte-swap during init; methodology shift: Mesen Memory Viewer + diff-after-controlled-change replaces hours of static disassembly for finding data structures (ch 7); erratum applied to ch 7 — in-game observation showed the daimyo/province tables have NO neutral “special” leading record; index 0 is just the weakest clan (Hatakeyama/Noto, Kakizaki/Ezo), all four ROM tables anchored one record too late, now corrected and all 17 daimyo↔province pairings verified historically accurate; The VM Instruction Set — hand-decoded the core opcodes: the VM is a register machine (regA=$08/$09, regB=$0C/$0D, frame ptr2, PC ptr3), $00-$3F is a 4×16 frame-local load/store matrix, full ALU at $B0-$DC (add/sub/mul/div/mod/shifts/bitwise/compares, compares leave 0/1 booleans), control flow at $D8/$E3-$EA, vm_return at $CF; located the recurring “big number” — 9999 ($270F) appears 17× ROM-wide, 13 of them as loadB_imm_word 9999 / cmp_sgt / branch_z clamp-to-max patterns in bytecode banks, confirming 9999 is the gold/koku stockpile ceiling and that the clamp sites are the tails of the economic update routines; fixed $8A/$8C (word immediates, classifier mis-tagged) (ch 8); The Command System — walked a menu pick end-to-end: an $EB7A call-graph trace found the command driver table at bank 1 $B9B2 (34 entries, menu item N == index N-1, verified by picking in-game item 7 “Grow” landing on index 6 $9D3D); decoded the VM calling convention (vm_entry sets ptr2=ptr1-9, so a caller’s negative frame locals ARE the callee’s positive arg slots); found the province-access idiom ($6F5F = selected-province index, $7001 = 26-byte-record province table, the 10-byte idiom appears 81x); fully traced Grow — driver $9D3D + effect $87F0 — and surfaced its hidden mechanics: cost is koku from the province’s own header field (not gold, and it caps the input), benefit follows sqrt(rice+amount) diminishing returns ($CBCD = integer square root), a silent precondition can block it, and the effect redistributes by subtracting percentages from other fields ($D70D = percentage operator); found $B7 is an extended-opcode prefix (~47-op secondary instruction set for 32-bit math); corrected 11 mis-sized opcodes ($D6/$D7/$D8/$8E/$A4/$A5/$A6/$A9 etc. — the $EFBF/$EFD5 conditional-fetch family); upgraded vm-disasm.py to follow control flow (ch 9); The Command Families — diffed the 7 handlers the $B9B2 table grouped with Grow; the “family” splits on one fact (does it call $D5E9, the number-input prompt): prompt-and-apply (idx 4,6,12,14 — one parameterized template: precondition pair, gold cost, $CBCD sqrt of field+amount, $D70D cross-field redistribution; Grow grows output, idx12 grows town, idx4/14 are compound) vs immediate-action (idx 5,10,13,15 — no prompt, byte-level field edits, not a single template); a $E510/$879F/$804C call cluster is shared by idx 5+14; SRAM dump resolved the chapter-7 reconciliation — $7001 is the sole live province table (gold@0…header@24, little-endian), $6000 is not a parallel table, chapter 7 erratum’d; grounded word[$6D63]=2 and found the daimyo turn order is a stored 17-element permutation re-randomized each turn (ch 10); The Strategic Engine, Complete — cracked the text system (in-game strings are plain ASCII; op_8E carries direct string pointers; vm-disasm.py now auto-resolves them) and found the master UI string table in bank 15 ($F840 menu, $F8AE pointer table → stat labels — confirms the $7001 layout from the ROM, not hand-keyed); walked all 13 remaining menu commands — strings narrate the mechanics — completing the full 21-command action space in 5 functional groups (military/development/diplomacy/economy/info-admin); mechanics review: gold is the master resource, Tax is the only generator (vs a loyalty cost), development is deliberately lossy (√ curve + cross-field drain + header ceiling), all 21 commands are thin orchestration over one shared UI widget set (ch 11); The Daimyo AI — static walk from the AI’s effect-call sites (it reuses the player’s effect handlers with AI-chosen args) up through the $B94C 6-way command switch to the decision cascade in $B8A0; the AI is a cascade of weighted coin-flips — $CA52 = a guarded random roll (score<1 → 0, else RNG()%divisor; RNG via $CA46→syscall_dispatch), rolled against state-derived thresholds (e.g. 55 − config*5), outcomes accumulated as bits in decision byte $6DA1, which selects 1 of 6 executor subs; no search/lookahead/minimax — reactive, state-biased randomness, the same era-appropriate “probability budget” shape found in Utopia and M.U.L.E.; found the province adjacency table (bank 4 $8300, 8-byte slots, 17/17 verified) — appendix (ch 12)Lowering Atlas — sibling tooling for the Nobunaga decompiler: compile known C control-flow constructs through GCC -O0 (-fdump-tree-cfg) and catalog the CFG signature each leaves, sourcing the finite inverse-lowering (“atom”) table forward instead of reverse-engineering each sub as its own exception; v1 corpus (27 functions across if/loop/break-continue/switch/&&- |
) confirms NA1 atoms 1 (continue=multi-latch, GCC’s own latch-finder returns None), 2 (multi-level break=goto), the guard/shared-return family, and reproduces the atom-4 shared-switch-exit shape (M=post-dom(S) broken by a guard edge, = $9C84); flags for≡while and ?:≡if/else as graph-indistinguishable; cc65 (real 6502) planned as v2 (active) |
ro3k-decompiler; design clock 1985. Combat strategy (0): no abstraction — every War runs the full 30-day loop run_30_day_battle_turn_loop $8F06. Holds the lineage’s only explicit AI combat handicap (province_strength_score +(players−1)<<4); every later title moves the edge to the economy and keeps the visible battle symmetricgk-decompiler; design clock 1987. Combat strategy (2): cheap round simulation — resolve_battle $947C day-budget loop, casualties quadratic in the loser’s share (muldiv(swing, e², s²+e²)). Sits between two one-shot titles, which is the core evidence the off-screen model alternates rather than climbsrot3k2-decompiler; design clock 1989, MMC5. ✅ fully decompiled (18 bytecode banks + native floor + data-walk + memory map). Combat strategy (2): simulate_field_battle $B0BB, up to 6 rounds. The NES half of the portable-VM proof — KOEI shipped ROTK2 on both consoles, so this repo is the SNES twin’s oraclebk-decompiler, game 6. 988 bytecode subs + native floor + sound engine (first family member where audio was reversed alongside the strategic core); 8-chapter walkthroughGemFire-decompiler, game 7. ✅ 521/521 bytecode subs named; 8-chapter walkthrough. Second cross-console pair after ROTK2, so the portable-VM finding is checked twice. ⚠️ repo capitalizes GemFire- while the SNES sibling is Gemfire-snes-LEmp-decompiler, game 8. ✅ all 18 code banks named, 0 errors; engine = NA2-era VM but GemFire-era syscalls. Headline finding: the $E2E3 native-call trampoline (a native ABI callable from bytecode). The country→province two-tier turn (15 countries via $6FF2→sub_8039, then 46 cities via $7002→sub_80C0; AI mirrors it in ai_run_country_turn) is the shape the 16-bit titles keep — hence “design hinge”. 1790 base yearkoei-nes (active)
snes-decompiler — target-agnostic teardown substrate: verified header_parse.py (mapping auto-detect + header + RESET) and mapper.py (LoROM/HiROM/ExHiROM address↔offset, .smc stripping), grounded in the SNESdev wiki. ⚠️ highest-risk item in the ecosystem — not on GitHub at all, local working copy only, so it has no remote to recover fromrot3k2-snes-decompiler; LoROM 1 MiB, 32 KiB SRAM. ✅ re-walked & complete: ~1,316 routines across 26 modules incl. the hex tactical engine + 13 sub-overlays never decompiled before. The re-walk was forced by an offset-0 walker bug the Gemfire pass exposed (each routine’s 5-byte JSR $23E6 trampoline decoded as bytecode, mis-shifting names; damage severe→none, comroot/AI took 110 corrections) — a clean specimen of the second target being a check on the first. Yielded a C lift + a DREAM-style structurer (65–75% goto-less)Gemfire-snes-decompiler; LoROM 1 MiB, 8 KiB SRAM, RESET $800F. ✅ all 591 bytecode routines named across 11 WRAM overlay modules + data-walk; 218+48 opcodes, 82 syscalls, 88 native routines. Key finding = the per-routine native JSR $3287 trampoline (body at +5), profile-driven — the discovery that invalidated and fixed the ROTK2 SNES walkelite-decompiler — (not a KOEI title) the wireframe-3D-on-a-tilemap question, answered: the cart ships CHR-RAM, PPUCTRL=#$10 puts background patterns at $1000, and the blitter’s base $e0 is set to #$10 — the pattern table IS the framebuffer. Then the part that makes it work: 256 patterns can’t cover 960 screen cells, so LOIN does sparse, on-demand tile allocation (find the tile a pixel lands in; reuse its pattern or grab the next free one), monochrome at 1 bit/pixel. Scaffolded 2026-08-05 with 1,142 RAM + 917 code labels converted from Mark Moxon’s annotated source — legitimate because its NTSC build is byte-identical across all 131,072 PRG bytes (tools/verify_rom.py is the gate). The vault’s cleanest create-then-check target: the substrate was derived blind, the allocator was notsnes-decompiler header/mapper tools$E2E3), the full data model, and the strategic AI. Independently walking it caught a systematic offset-0 bug in the ROTK2-SNES decompiler — accumulated state as the verification layer.MUL = 118-133 clocks, ~25 adds), absent entirely on the 6502. Real-time 3D is the workload that can’t route around it, so games became the forcing function. Four strategies — buy the math (Battlezone) / compute it anyway (Stellar 7, Elite) / constrain the geometry (Doom, Wolf3D) / precompute at art time (Ultima, Wing Commander’s 38 views per ship) — with the thesis that the choice is predicted by which resource was cheapest for that team, not which was technically best. Counted head-to-head from Elite’s own two builds: MULT1 shift-add ~170 cyc vs FMLTU log-table ~61 cyc — 2.8× for 1 KB of tables — against Stellar 7’s polar trick, which halves the multiply count for 0 bytes. They’re orthogonal factors of N × C, and nobody stacked them. Two deeper results: strategies 2/3/4 are one idea — memoize and index — cut at four pipeline depths, where deeper = bigger saving and more visible error (sprite popping is just caching too far down); and the coprocessor cycle never ended (EAE → 8087 → GPU → NPU, discrete-then-integrated, with local inference as the current phase-A and quantization/sparsity/KV-cache as the same three moves). Wing Commander traverses the whole taxonomy by itself in six yearsDivide16 and a fully-unrolled 181-byte Multiply16_8 — at ~2,000 cycles/vertex vs Battlezone’s counted ~220. Headline: vertices are stored in polar (distance, angle, Y), so the entire model rotation is a single ADC — two multiplies for the polar→Cartesian conversion where the math box does four; vertical edges share a transform, so a cube costs 4 not 8. Forced a taxonomy refinement: strategy 2 does not preserve geometric freedom, it constrains the representation — so 2/3/4 are one idea at three layers and only “buy the math” escapesMB_SCREEN_X = rotate+translate+perspective-divide from one store, cull-before-transform pipeline reordering, quarter-wave sine + octant-folded arctan tables, and the errors deliberately absorbed into the art (X/Z pre-doubled to cancel an off-by-one shift). Counted cost ≈ 220 cycles/vertex vs a ~5-8k software estimate. Corrects two premises: the 8086 did have MUL/DIV, and Star Wars (1983) used a different, non-2901 math box-ING at 100% for lengths 7–9), because the indifference set of an equilibrium is bounded by the substrate’s structure — Z cannot be made to do S’s job. Two methods, one parameter of disagreement: confidence in the word list (exact tree = optimal-but-undefined off-list; entropy = suboptimal-but-graceful, which is why it “wastes” guesses on impossible words). Headline: the compression built for human legibility (the alphabet tier list) is also the model-error-hardened policy. Plus tractability ≠ size (branching + path reconvergence), state-space collapse used as the adversary’s weapon, certified α-cap bounds plotted in red, and a rules-design result — the fair miss allowance is 1–8 except 6E[S] = A − (2387/2797)·D by a martingale argument, and sd ≈ 1.447·√D — spread grows as √D while force grows linearly, so big battles are proportionally more predictable. Strategic half: no tactical deterrence exists (matched stacks of 12+ favour the attacker; the defensive premium to hold shrinks from 1.90× to 1.31× as borders grow — a big border is an offensive asset), but winning costs ~85% of the force, so in a symmetric 3-player standoff the winner falls to 13.6% of board force while the bystander rises to 86.4%; the price of attacking without falling behind is (1+c) = 1.853× the defender’s stack. Stability decays as players are eliminated (the required border rises from ~nothing at 3 equal players to 117% of the attacker’s stack once only 2 remain — the endgame knife fight is B → 0, not a change in mood). Two pieces of table advice corrected: matching an escalating border is the most expensive way to stay unprotected, and interior garrisons should be 2, never 3 — the 2nd army buys the defender’s second die at 1.65× value, the 3rd buys nothing. Four independent oracles agree to 1e-15MP/DV; the F-14 CADC’s separate PMU/PDU chips in 1970, classified to 1998) while the 8-bit micros regressed to nothing. Then the console era made it literal: the SNES exposes its multiplier as MMIO using Battlezone’s exact protocol (write operands, last write triggers, wait a known bound — 8 cycles vs ~80 in software), and Nintendo sold the DSP-1/Super FX inside the cartridge, pricing arithmetic per game. Two timescale-only findings: the request interface barely changed in sixty years, and capability regresses every time a cheaper substrate appears — making the NPU moment the fifth iteration, not a noveltySessionStart (no PreToolUse guardrail); request-vs-rule (CLAUDE.md line vs hook); “outsource thinking, not understanding”%20 paths as broken until it was retooledWHY: / TODO(TICKET) / AGENT: so swarm-coordination chatter is mechanically evictable at the production gate — the sanctioned-channel experiment substrate-as-governance asked forCLAUDE.md, the raw/ hook, regen-guard, the kernel’s verification-independence rule). The genuine addition: verification independence splits into artifact and reader — the artifact must be lower (a causal trace of the real system), the reader may be an LLM, which is why “a model watches a recording of the live login flow” is sound and “a second agent reviews the first agent’s diff” is not. Strongest specimen: hundreds of tests written only to pass = oracle collapse, generator-authored oracle at distance zero. Diagnosis critiqued: “next-token predictor, therefore plausible-not-correct” proves too much — Spiro’s error rotated (typist vs. model architecture; neither names the oracle). Vault is behind him on two things: a per-delivery proof gate for knowledge pages, and the human-owned/agent-owned partition. Two extensions from the discussion: (1) the floor is a chosen standard, not the truth — an oracle that could certify the answer could also produce it, so every oracle in use is partial by construction; method = adopt / hold / retire, and only the first two clauses have mechanisms (“but it passed all the tests” = a standard that stopped discriminating with nothing watching), the vault’s universal incompleteness pattern applied to oracles; (2) say what the result should be — the cheapest contract slot and the most skipped; an unstated intended result is an absent oracle at the front of the task, which is what turns a session into working-through rather than understanding.CLAUDE.md rule = slow and invisible) and treat all-pass as the decay signal. Proposal, not yet measured$5205/$5206 with combinational, next-cycle readback (no trigger-and-wait, unlike every other entry in Arithmetic as a Purchase); and a PRG-only ROM scan of all five KOEI MMC5 titles shows it is the busiest register on the chip — more traffic than PRG/CHR bank switching, at a near-1:1 write:read ratio (the signature of real use) — because base + index × stride is the hot path for a records-and-formulas strategy engine. NA2 backs a VM opcode with it, L’Empereur builds a 32-bit MAC on it, while divide stayed in software (a hardware multiply and a software divide side by side in one instruction set). KOEI took the multiplier, banking, vertical split, ExRAM and fill mode (all confirmed writing runtime-computed values, not constants) but not the expansion audio and not the scanline IRQ — $5203 is never written in any of the five. Also records two corrected errors that each looked like a finding: grepping the bytecode-only repos measured the corpus rather than the ROMs, and a first scan included CHR-ROM (33-50% of each file, pure graphics), manufacturing a spurious audio-growth trenddiscussion: pending)discussion: pending — not a debate: two hosts in agreement explaining Triffin’s dilemma to a right-wing audience mid-firestorm (Magness’s 33-second Vance clip → 10M views). Popularizes the same argument the vault already engaged at seven levels in Lyn Alden, and lands on the vault’s own thermometer-not-fire ordering (deal with the fiat currency; reserve status is downstream). Chris’s harvest — the story is diffusion, not novelty: ideas the vault worked out in May 2026 are now being argued by the Vice President, which is a signal that the vault’s topic selection was load-bearing. The hook is the DSA converting the diagnosis into revolutionary policy. Chris’s portable move: framing in differentials rather than absolutes is itself the pathology — who has more than me has a blame answer and therefore an enemy; is the problem being fixed has a policy answer and therefore a task. And the demotion that unifies the page — Christian’s people break before the system does and the eurodollar mechanism are both horn-selections inside All of the Above, not rival framesdiscussion: pending — Chris’s own call-in (1:17:45) to Mullally’s Natural Law chillstream, 2026-07-20. Blocked on transcript by design, not thin: the stream has no captions of any kind (only live_chat), and local Whisper is unavailable (WDAC blocks ctranslate2; no torch fallback) — so nothing is written rather than reconstructed. Mullally’s third vault appearance (cf. birthright, Lance Bush metaethics). Unblock path recorded on the page; the perishable asset is Chris’s own recollection of what he was attempting.Workflow already enforces (pipeline() = rule 4; schema = rule 2 + the governance move) and the one gap it doesn’t close (no shared workspace). Ends with the local A/B measurement that would turn the prediction into a number. Rule 8 is never spoken in the video — logged as a gap, not inventedmaster (single author, no PR flow; review’s safeguards live in the hooks and derive-tools) and what that costs when two machines diverge on the same branch with no reviewer in between. Records the 2026-08-26 state as the shape of the trap — origin at 2026-08-18, this machine +21/-0, the other machine’s heartbeat work also unpushed, i.e. mutual non-publishing; the cheap fix is to push the strictly-ahead machine first so the other faces a one-sided merge. Conflict taxonomy resolved by class, not file by file: derived (tags/*.md) regenerated never hand-merged, append-only (CHANGELOG.md) via merge=union, authored-append (INDEX.md) keep both hunks, raw/ cannot conflict by construction. Plus the regeneration order and post-merge acceptance test. Two gaps named: memory/ lives outside the repo and does not sync at all (git won’t merge it or warn), and line endings were unguarded until .gitattributes (repo verified all-LF, so pinning text=auto renormalized nothing). The ongoing sibling to the one-way migration runbookMEMORY.md seed to author the memory subsystem from zero on a fresh instance (the cold-start path the migration runbook’s transfer doesn’t cover)./raw/debates/ — debate and panel transcripts (125 files)./raw/lectures/ — HoP Peikoff lecture transcripts (14 files)./raw/videos/ — other video transcripts (50 files)./raw/articles/ — Web Clipper drops and article content./raw/assets/ — locally saved imageslogs/index-drift.log · logs/heartbeat-cron.log — machine-written; the soft gate’s firing rate is the health metric, not any single entry.raw/, and significant sessions are written up as notes/ pages.