Days seven to eleven stopped at 12:11 on 21 October with 36 rows on the research map, 35 of them reviewed, and the first end-to-end run of the core specs short of its bar by about sixteen sessions. This post runs to 18:44 on 27 October. The map has 42 rows now and 38 are reviewed. The chain from the game seed to the item on the floor passed its bar that same afternoon. The skills phase, the third of the simulation, has a reviewed spec. The fourth, animation and frame timing, has findings and its first run. The fifth, monster AI, is approved, and a sixth was added behind it.

Six days, and three of them worked. The lanes ran on the 21st until a little after half past seven in the evening, on the 25th for about an hour and a half in the evening, and on the 27th from 06:42 to the cut-off. On the 22nd, 23rd, 24th and 26th nothing was committed: my weekly usage limit had run out. Most of what follows happened on the 27th: of the 146 rows the review ledger gained in the window, 117 are dated that day. Summer time ended in between, at three in the morning of the 25th, so the times on the 21st are UTC+2 and the rest UTC+1.

I did not play this time either. What I did, from the records: on the 21st I asked for the lanes to be paused, six times after the last post’s cut-off, because the weekly limit was running out. On the 25th I approved two plans and the order of the work, held a third, and dropped one of the sessions set aside for me to play, an entry left over from plan 0042. That evening my usage limit stopped the lanes. On the 27th I wrote one note into the run order, asked for the commit gate to be made fast, approved the monster AI plan and its scope decision, accepted a trial of a new review scheme, and approved the plan that fixed the gate.

The map of the work

The research map at each cut-off

  • not started
  • planned
  • findings
  • draft spec
  • reviewed spec

3 reviewed spec 1 findings 1 planned 23 not started of 28

Core

  • rng reviewed spec
  • items/tc findings
  • items/quality not started
  • items/affixes not started
  • items/uniques-sets not started
  • items/properties not started
  • monsters/pool not started
  • monsters/spawn not started
  • monsters/special not started
  • drlg/overview planned
  • drlg/preset not started
  • drlg/maze not started
  • drlg/outdoor not started
  • drlg/warps not started
  • objects not started

Enablers

  • data/excel reviewed spec
  • data/calc not started
  • data/strings not started
  • rng/seeds reviewed spec
  • drlg/collision not started
  • save/d2s not started

Creation paths

  • items/vendors not started
  • items/cube not started
  • items/sockets-runewords not started
  • items/quest-drops not started
  • monsters/stats not started
  • hirelings not started
  • player/creation not started

28 reviewed spec 1 planned of 29

Core

  • rng reviewed spec
  • items/tc reviewed spec ↑
  • items/quality reviewed spec ↑
  • items/affixes reviewed spec ↑
  • items/uniques-sets reviewed spec ↑
  • items/properties reviewed spec ↑
  • monsters/pool reviewed spec ↑
  • monsters/spawn reviewed spec ↑
  • monsters/special reviewed spec ↑
  • drlg/overview reviewed spec ↑
  • drlg/preset reviewed spec ↑
  • drlg/maze reviewed spec ↑
  • drlg/outdoor reviewed spec ↑
  • drlg/warps reviewed spec ↑
  • objects reviewed spec ↑

Enablers

  • data/excel reviewed spec
  • data/calc reviewed spec ↑
  • data/strings reviewed spec ↑
  • rng/seeds reviewed spec
  • drlg/collision reviewed spec ↑
  • save/d2s reviewed spec ↑

Creation paths

  • items/vendors reviewed spec ↑
  • items/cube reviewed spec ↑
  • items/sockets-runewords reviewed spec ↑
  • items/quest-drops reviewed spec ↑
  • monsters/stats reviewed spec ↑
  • hirelings reviewed spec ↑
  • player/creation reviewed spec ↑

Simulation

  • combat/formulas planned

35 reviewed spec 1 findings of 36

Core

  • rng reviewed spec
  • items/tc reviewed spec
  • items/quality reviewed spec
  • items/affixes reviewed spec
  • items/uniques-sets reviewed spec
  • items/properties reviewed spec
  • monsters/pool reviewed spec
  • monsters/spawn reviewed spec
  • monsters/special reviewed spec
  • drlg/overview reviewed spec
  • drlg/preset reviewed spec
  • drlg/maze reviewed spec
  • drlg/outdoor reviewed spec
  • drlg/warps reviewed spec
  • objects reviewed spec
  • chain findings

Enablers

  • data/excel reviewed spec
  • data/calc reviewed spec
  • data/strings reviewed spec
  • rng/seeds reviewed spec
  • drlg/collision reviewed spec
  • save/d2s reviewed spec
  • drlg/lifecycle reviewed spec

Creation paths

  • items/vendors reviewed spec
  • items/cube reviewed spec
  • items/sockets-runewords reviewed spec
  • items/quest-drops reviewed spec
  • monsters/stats reviewed spec
  • hirelings reviewed spec
  • player/creation reviewed spec

Simulation

  • combat/formulas reviewed spec ↑
  • stats/aggregate reviewed spec
  • stats/states reviewed spec

Game rules

  • quests/progression reviewed spec
  • quests/travel reviewed spec
  • items/economy reviewed spec

38 reviewed spec 3 findings 1 planned of 42

Core

  • rng reviewed spec
  • items/tc reviewed spec
  • items/quality reviewed spec
  • items/affixes reviewed spec
  • items/uniques-sets reviewed spec
  • items/properties reviewed spec
  • monsters/pool reviewed spec
  • monsters/spawn reviewed spec
  • monsters/special reviewed spec
  • drlg/overview reviewed spec
  • drlg/preset reviewed spec
  • drlg/maze reviewed spec
  • drlg/outdoor reviewed spec
  • drlg/warps reviewed spec
  • objects reviewed spec
  • chain reviewed spec ↑

Enablers

  • data/excel reviewed spec
  • data/calc reviewed spec
  • data/strings reviewed spec
  • rng/seeds reviewed spec
  • drlg/collision reviewed spec
  • save/d2s reviewed spec
  • drlg/lifecycle reviewed spec

Creation paths

  • items/vendors reviewed spec
  • items/cube reviewed spec
  • items/sockets-runewords reviewed spec
  • items/quest-drops reviewed spec
  • monsters/stats reviewed spec
  • hirelings reviewed spec
  • player/creation reviewed spec

Simulation

  • combat/formulas reviewed spec
  • stats/aggregate reviewed spec
  • stats/states reviewed spec
  • skills/dispatch reviewed spec
  • skills/missiles reviewed spec
  • skills/catalogue findings
  • anim/timing findings
  • anim/movement findings
  • monsters/ai planned

Game rules

  • quests/progression reviewed spec
  • quests/travel reviewed spec
  • items/economy reviewed spec

The arrow marks a row that moved since the previous snapshot. Source: docs/specs/README.md at commits 8faba4f2, 33dc648, 483728e and a2d31a99. The six new rows are all in the Simulation band.

Show as a table
Subsystem Day 1Day 6Day 11Day 17
rng reviewed specreviewed specreviewed specreviewed spec
items/tc findingsreviewed specreviewed specreviewed spec
items/quality not startedreviewed specreviewed specreviewed spec
items/affixes not startedreviewed specreviewed specreviewed spec
items/uniques-sets not startedreviewed specreviewed specreviewed spec
items/properties not startedreviewed specreviewed specreviewed spec
monsters/pool not startedreviewed specreviewed specreviewed spec
monsters/spawn not startedreviewed specreviewed specreviewed spec
monsters/special not startedreviewed specreviewed specreviewed spec
drlg/overview plannedreviewed specreviewed specreviewed spec
drlg/preset not startedreviewed specreviewed specreviewed spec
drlg/maze not startedreviewed specreviewed specreviewed spec
drlg/outdoor not startedreviewed specreviewed specreviewed spec
drlg/warps not startedreviewed specreviewed specreviewed spec
objects not startedreviewed specreviewed specreviewed spec
chain β€”β€”findingsreviewed spec
data/excel reviewed specreviewed specreviewed specreviewed spec
data/calc not startedreviewed specreviewed specreviewed spec
data/strings not startedreviewed specreviewed specreviewed spec
rng/seeds reviewed specreviewed specreviewed specreviewed spec
drlg/collision not startedreviewed specreviewed specreviewed spec
save/d2s not startedreviewed specreviewed specreviewed spec
drlg/lifecycle β€”β€”reviewed specreviewed spec
items/vendors not startedreviewed specreviewed specreviewed spec
items/cube not startedreviewed specreviewed specreviewed spec
items/sockets-runewords not startedreviewed specreviewed specreviewed spec
items/quest-drops not startedreviewed specreviewed specreviewed spec
monsters/stats not startedreviewed specreviewed specreviewed spec
hirelings not startedreviewed specreviewed specreviewed spec
player/creation not startedreviewed specreviewed specreviewed spec
combat/formulas β€”plannedreviewed specreviewed spec
stats/aggregate β€”β€”reviewed specreviewed spec
stats/states β€”β€”reviewed specreviewed spec
skills/dispatch β€”β€”β€”reviewed spec
skills/missiles β€”β€”β€”reviewed spec
skills/catalogue β€”β€”β€”findings
anim/timing β€”β€”β€”findings
anim/movement β€”β€”β€”findings
monsters/ai β€”β€”β€”planned
quests/progression β€”β€”reviewed specreviewed spec
quests/travel β€”β€”reviewed specreviewed spec
items/economy β€”β€”reviewed specreviewed spec

One row moved and six are new. chain went from findings to reviewed. Two skills rows, dispatch and missiles, are new and already reviewed: they were added during the skills phase and their spec was reviewed on the 27th. The third, the catalogue of every numbered skill function, has its findings complete and no spec yet. The animation phase has two rows with findings, timing and movement. And monsters/ai is on the map as planned: an approved plan, a first phase reviewed, no findings.

Seed to world, run 2

The previous post left plan 0048 with 1,222 room populations against a bar of 2,000, two mismatches in the objects model, and a review’s reading of them: monsters re-created after their room was released and returned, with no logged mark. Run 2 settled both. The re-creations go through RoomInactiveUnitsRestore and mark the collision map through the same UNIT_CollMark calls as a first creation; the logger had missed them because they run outside its window. Once it caught them, the run on the 21st finished at 37 logs and zero failed checks:

The end-to-end run against its bar, runs 1 and 2

What phase 2 asked for, predicted from the game seed with no seed read from the game, and what each run's passing logs delivered.

  • asked
  • run 1
  • run 2
Room populations 2,000 1,222 2,189
Monster drops predicted to the item 500 849 1,314
Champion and unique packs 100 154 225

docs/plans/done/0048-seed-to-world.md, the Phase 2 done-when and the two runs' review counts. Run 2 also built 176 levels and 13,056 objects, against a bar of 300 objects.

Show the numbers
askedrun 1run 2
Room populations 2,0001,2222,189
Monster drops predicted to the item 5008491,314
Champion and unique packs 100154225

Of the 7,290 re-creations, 1,903 were compared line for line with the game’s own: 1,729 alive, 174 dead. The control: run with --cf recreation-off, the model β€œrestores exactly run 1’s” two mismatches, and switching off a different mechanism, the monster equipment, breaks two new cases, both Blood Raven. The review closed the phase at 13:11 and ruled how far the unchecked part counts: the 5,284 re-creations applied on run 1’s logs without a line to compare are β€œadmissible for 0 mismatches and populations, not as mark evidence.”

The spec, specs/chain/README.md, was reviewed at 13:51 with 89 confirmed claims, [C], read in the code and confirmed by a run, against 7 inferred, [I], read in the code only, and the wiki page at 14:19. The wiki review’s first fix took out the phrase I had used in the last post’s chart: β€œfrom the game seed alone.” The page says now that 37 games were rebuilt with zero mismatches β€œgiven the recording’s walk and fight results and a few counted values still read from it.” So: the chain predicts the world from the seed, and takes what the player did in it, the walk and the fights, from the recording. Plan 0048 closed at 14:23 on the 21st.

Skills

Plan 0045 is the machinery of skills and missiles: dispatch, packets, missiles, event handlers. The previous post had its static phase done and five community claims contradicted on paper. Phase 2 started on the 21st, was paused twice at my request, and ran on the 25th: 18 sessions with eight characters, 335,618 checks, zero mismatches. A second part on the 27th added 15 sessions, also zero, and re-checked the first part’s 18 logs. The sessions are played by the pilot, the project’s script that drives the game from screenshots, and a skill shows up in the logs as two functions: a start function, run when the cast begins, and a do function, run on its action frame.

What the two skills runs logged

Events over both parts, 33 sessions.

Skill do functions 3,183
Skill start functions 2,985
Can-use checks 1,340
Event handler fires 1,303
Missiles ended at a unit 276
Summons 219
Pierce rolls 130
Prevent-heal applied 86

docs/findings/skills/experiments.md, run:2026-10-25-skills and run:2026-10-27-skills. The first part also counted 31,391 missile creations and 21,860 chained game-seed pairs.

Show the numbers
events
Skill do functions 3,183
Skill start functions 2,985
Can-use checks 1,340
Event handler fires 1,303
Missiles ended at a unit 276
Summons 219
Pierce rolls 130
Prevent-heal applied 86

The five contradictions, as the runs met them:

  • Raise Skeleton’s level. The community says a skeleton is raised at the caster’s level. The code gives min(max(L Γ— 3/4 + skill level, 1), L). A caster of level 86 with the skill at 20 raised every skeleton at 84.
  • Missile range. The community adds LevRange for each level beyond the first; the code multiplies it by the level. The case was Blaze, whose LevRange is 25, and the first part could not get it: β€œthe pilot teleports”, so no walking trail of fire was logged. The second part walked: 271 Blaze creations at skill level 2, each with the code’s range and not the community’s, which counts from level two and would give one LevRange less.
  • Acceleration is added on every fifth step of a missile’s path, not on every frame: 1,657 accelerating steps, 278 of them fifth steps, 60 at the cap.
  • A piercing missile that misses its to-hit keeps flying and does no damage, the community says. The code ends it at that unit.
  • Missile velocity, ((VelLev Γ— lvl) / 8 + Vel) << 8, is the one the runs could not show. The monsters that fire the right missile were all met at level one, where the level term is zero: β€œ22 spike2 creations … all at level 1.” The ruling was not to send the pilot to Nightmare for quill rats; the Blood Moor ones stay an opportunistic check.

The run also corrected the reading in one place. The static spec had said that Raise Skeleton draws nothing from the caster’s seed. The first dev sessions on the 21st saw the seed step once after the spawn, three times out of three, and the run on the 25th located the draw at 0x005C4430.

The Barbarian's hands in the second skills run

  • Fleshripper, a unique fanged knife: the inventory picture, its drop frames and a character holding it Fleshripper
  • Lacerator, a unique throwing axe: the inventory picture, its drop frames and a Barbarian holding it Lacerator

From the project's tools/item_art.py. The recipe SkillsBarH dual-wields the two, with a unique at its best roll in every other slot. Diablo II art Β© Blizzard Entertainment.

Fleshripper was the knife that broke the combat model a week earlier, 101 mismatches in a kill handler nobody had read. The handler model now replays all 3,461 old fires, that session’s log included, and the second skills run gave a Barbarian the knife in one hand and Lacerator in the other. The prevent-heal state was applied 86 times.

One finding is about the client. A refused skill never reaches the server: β€œthe client runs the same SKILLS_CanUse on its own copy of the player every frame (0x004D9FC5) and sends no request for a refused skill”, so the refusal cases are a shortfall that cannot be closed from the server’s side. Another is about Kick. The stock Kick row has a minimum and maximum damage of zero, so its own hit does zero physical damage: 25 deliveries reached COMBAT_ApplyDamage β€œwith result 9, physical 0 … where GetPhysMin’s Kick branch would give at least 49 920.” The strength-and-dexterity branch for kicks is real, but it is reached by the Assassin’s Dragon Talon, Dragon Tail and Dragon Flight, and among monsters only the Shadow Warrior and the Shadow Master hold a skill with the kick bit.

The phase closed on the 27th: the specs at 09:30, with nine fixes, among them that the pet limit removes β€œthe first of its list”, not β€œthe oldest”, and the wiki page at 09:58, with nine more, among them β€œKick β€˜builds a fixed hit’” as an overclaim.

The catalogue, 310 of 310

Plan 0046, the catalogue of every numbered skill function, runs them one by one in Ghidra’s processor emulator, as the previous post described. The last four batches ran on the 21st, 42,600 cases, zero mismatches, and Phase 1 closed at 310 of 310 entries. What the emulator showed:

  • A monster function, do 152, β€œis do 95 … instruction for instruction”: 147 instructions, none different.
  • Do 112 casts one of five fixed curses, chosen by the caster’s seed modulo five. One of the five, Lower Resist, has a resistance branch that cannot be reached.
  • The exploding and poison shrines drop five to nine potions. β€œFive to ten” is only the text of the shrines’ editor column.
  • Baal’s tentacle draws two or three times, and which one depends on a local variable that its function β€œnever writes before the call … No emulation can give the value the game leaves there; only a logged cast can.” The claim stays inferred and goes to the harness phase, which needs Baal.

Animation and frame timing

Phase four was approved on the 25th, in the order I had set on the 20th: animation and frame timing before monster AI, β€œsince skill and combat timing need frame counts first.” Plan 0050’s first phase read the animation data: animdata.d2 is 256 hash blocks of 160-byte records, and the expansion’s file wins. Another file, eanimdata.d2, is named by no string in the binary at all. Monster sequence events agree with their animation record in only 81 of 805 steps.

The reading of the code says something about how the game runs: β€œmost server modes are not advanced frame by frame; SUNIT_ScheduleModeEvents queues the frame events (codes 1–4) and the mode end at the start.” The rates are one function with nine branches, and the bonus of faster cast, hit recovery, block and so on is the diminishing formula B = kΒ·s / (k + s), with k 120, and 150 for run and walk, confirmed over 3,413 emulated cases. And an edge case: β€œa negative factor (FCR ≀ βˆ’55, FHR or FBR ≀ βˆ’36) wraps to the maximum rate.”

The community has a lot to say about breakpoints, so the comparison was large: 61 claims from the Maxroll and Basin pages, the old run and walk thread for 1.09, the 1.13 movement clarification and PureDiablo’s tables. They were filed blind, before the lane read the code.

Sixty-one community claims about frames and speeds, against the code

  • held
  • held with refinement
  • contradicted
  • not covered
animation and timing 61

docs/findings/anim/, plan 0050 P1b part 2. Of the 19 contradicted, 7 come from Resurrected sources only and 3 from 1.09 only; 9 are plain contradictions of 1.14d.

Show the numbers
heldheld with refinementcontradictednot covered total
animation and timing 733192 61

The breakpoint tables themselves came out right: β€œevery change point equal (78/78).” The frame count in 76 of them is one less than the code’s, and the review ruled that a counting difference: the code’s count is one more than the tables’. What was contradicted, among others. Against claims about 1.14d itself: the attack factor is clamped between 15 and 175, while hit recovery and block are not capped at all; a knockback on a player ends in neutral with no hit recovery; and the block gate is a cooldown, frame βˆ’ last block > ⌊stat102 / 8βŒ‹ + 15, where the community says there is none. Against Resurrected sources: Double Swing’s base is 70, not the 120 Maxroll gives, and the cast frames of the Druid, the Necromancer, the Werewolf and the Werebear all differ. Against the 1.09 thread: Charge moves at 2.5 times the base speed, not 1.5, and the run factor of β€œ65” β€œmatches only read as hex”. 0x65 is 101.

The first run of the phase, on the 27th: 55 sessions, zero mismatches, 298,373 rate calls, 99,241 movement steps. The Fallen showed the classic monster’s special modes taking the moving rate, 1,266 calls. Blood Raven in Hell knocked the player back 13 times and 12 left him in neutral in the same frame. Frozen Orb’s next cast came at the do frame plus the delay, 72 of 73. The shortfall is get-hits: β€œevery fragile character died after 2–9: a get-hit needs a hit of a sixteenth of life.”

Monster AI, and a sixth phase

Plan 0052 was drafted on the 25th, held, re-drafted on the 27th, and approved by me at 17:34. It covers β€œthe 331 monster gaps” the skills runs left, around the AI table at 0x0073CA18, 148 rows of 16 bytes. It put eight questions to me. Seven I answered as recommended: pathing becomes a plan of its own, hirelings and summons are in scope, one harness slot, and so on. The eighth I answered against the recommendation, which the plan records as such: β€œCatalogue coverage: the whole AI table (differs from the recommendation). Every row of the AI table gets a catalogue entry, whether or not a stock MonStats, PetType or Hireling row names it.”

Phase 0 ran within the hour. Of the 148 rows, 146 are named by a stock monster; 63 are reached through the level pools, 44 through superuniques, 16 through summons, one through hirelings. The aidist field is set only on Mephisto and his Uber copy. And the review found something the phase had not looked for: a second AI table at 0x0073D358, eighteen rows of four words, ten of them holding functions no row of the first table has.

The same approval accepted ADR-0022. The project’s phases end at monster AI, and the ADR adds one after it, the server frame: β€œthe game tick (GameTick and every pass it makes), the per-unit update order … the event queue … the timers … and the room activation order within a frame.” Its evidence is new too, a frame window: β€œa stated run of consecutive frames in a small scene … in which every in-scope event of every unit is logged and every entry seed is asserted, none resynchronised.” Everything so far has checked a function’s output from its logged inputs; a frame window checks that nothing in between was missed. The ADR names its risk: β€œThe order may be partly non-deterministic under wine.” My note of the morning had said that phase five is the last of the old scope and anything beyond needs a scope ADR. ADR-0022 is that ADR.

The sweep

Plan 0038 sorted the 1,526 inferred statements of the reviewed specs into batches. Eleven harness batches ran in the window, ten on the 27th.

What each harness batch raised, 21 to 27 October

A statement is raised when the batch's evidence covers it whole, in part when it covers some of its cases; a shortfall is one the batch set out to reach and did not.

  • raised
  • raised in part
  • shortfall
H1a, loading saves 44
H1b, saves in play 46
H6a, the Cube 27
H3b, data loading 25
H4a, monsters 32
H6f, hirelings 21
H6e1, quest NPCs 22
H5d, collision 16
H6b, sockets 21
H6c, vendors 11
H6e2, quest items, with its follow-up 24

docs/plans/0038-inferred-claims-sweep.md and the batch reviews. H4a ran on the 21st and was reviewed on the 25th; the rest ran on the 27th.

Show the numbers
raisedraised in partshortfall total
H1a, loading saves 3248 44
H1b, saves in play 25147 46
H6a, the Cube 1881 27
H3b, data loading 1690 25
H4a, monsters 1598 32
H6f, hirelings 1281 21
H6e1, quest NPCs 11110 22
H5d, collision 1042 16
H6b, sockets 993 21
H6c, vendors 722 11
H6e2, quest items, with its follow-up 3156 24

Some of what the batches found is visible to a player:

  • Single player saves on death. H1b found the call. The autosave timer never saved anything in the run.
  • The gold cap is enforced at load by zeroing. A character with 900,000 gold on him, over the cap of 800,000, loads with none; a stash of 3,000,000, over 2,500,000, loads empty.
  • A character of class 7, one past the last class in a save file, halts the game at load with an internal error.
  • A crafted item can crash the game. When the Cube’s craft picks an affix from an empty list at a low item level, the game faults with an access violation. H6a kept it as evidence.
  • The cow portal tests quest word 26 in the classic game and word 40 in the expansion.
  • Khalim’s chests drop their gold first and the part after it: five piles before the eye, seven before the brain, eight from the heart’s. The level of the brain is built twice on the server, and the pilot had listed the objects of only one copy until a fix on the 27th.
  • Malah offers her potion only in one quest state, 4. Kashya’s free mercenary is given with no payment. A mercenary gains twice the experience, and only while below his owner’s level.

The three parts the quest-items batch opened chests for

  • Khalim's Eye: a small round eye, its inventory picture and its drop frames Khalim's Eye
  • Khalim's Brain: a grey brain, its inventory picture and its drop frames Khalim's Brain
  • Khalim's Heart: a red heart, its inventory picture and its drop frames Khalim's Heart

From tools/item_art.py. The follow-up batch opened all three chests and the order, gold before the part, is confirmed for each. Diablo II art Β© Blizzard Entertainment.

H4a, the monsters batch, opened four of the five seals of the Chaos Sanctuary in one session and logged the Infector of Souls and the Grand Vizier of Chaos. The fifth seal was never reached, so no Lord De Seis and no Diablo; the review ruled those rows β€œnot routed to the owner now”, since I had dropped the comparable session on the 25th.

Two reviews checked the batches’ own summaries and say so in a line: β€œβ€˜Shortfall 0’ is honest” for the quest NPCs, and β€œβ€˜Fewer than half raised’ is honest (9 of 25)” for the sockets. And one batch broke a rule the project did not have yet. H3b’s probe runs crashed the game on purpose and wrote their crash files into the shared game directory, and β€œneither the probe runs’ logs nor the removed crash files were kept.” The rule now: probes that may crash run in a game directory of their own, and crash folders are kept.

The re-tags recount the specs after their batches:

Confirmed claims in the re-tagged specs, before and after

  • before
  • after
save/d2s 91 240
objects 139 189
items/cube 119 167
items/quest-drops 86 159
drlg/collision 111 157
monsters/special 107 149
data/excel 42 144
hirelings 95 137
monsters/spawn 112 136
monsters/stats 110 130
items/sockets-runewords 80 129
items/vendors 77 113
items/uniques-sets 71 100
monsters/pool 81 99
data/strings 60 88

The front-matter counts each Phase 3 re-tag records, before and after. save/d2s went from 149 inferred to 68.

Show the numbers
beforeafter
save/d2s 91240
objects 139189
items/cube 119167
items/quest-drops 86159
drlg/collision 111157
monsters/special 107149
data/excel 42144
hirelings 95137
monsters/spawn 112136
monsters/stats 110130
items/sockets-runewords 80129
items/vendors 77113
items/uniques-sets 71100
monsters/pool 8199
data/strings 6088

The inventory at the cut-off: 567 statements in static batches, 509 in harness batches, 431 blocked. The blocked count grew, from 414, because batches that look closely find that some statements have nothing to observe: dead code, or a guard the stock data never fails. Those now number 302. Left in the plan: two batches, two re-tags, and at its close a list for me of what only I can play.

Plan 0047, the simulation’s shortfalls, closed on the 25th. One line from it about the harness: the waits of its expiry checks β€œwere sized at 25 frames a second and the game runs at about 17 under the stats logger.” And one about the game: the succubi of the Crystalline Passage cast Defense Curse on a character under Fade, which gives 84 percent curse resistance, and of the 275 frames the curse asked for it got 44.

The gate that stopped guarding

The project has a gate, tools/gate.py, that checks the documents against each other on every commit: a spec’s tag counts, cross-references, symbols nobody mentions. The commit hook runs it with a timeout of 20 seconds, and the hook is deliberately lenient: β€œA broken gate never blocks work … a timeout … passes with a one-line warning.” I asked for the gate to be made fast, and plan 0053 found what the leniency had meant in practice: β€œthe fast tier took 153 to 183 s, of which 151 s was the W3 loop (about 50 000 re.search calls over the joined corpus), so the commit hook’s 20 s timeout failed open.” W3 is the check for a symbol of re/symbols.csv that no spec or finding names. With 3,666 symbols it ran each one as a regular expression over everything. Every commit had been passing with a one-line warning, for how long the records do not say. With a word set instead, the staged gate takes 5.6 s and W3 gives the same zero warnings, and the hook enforces again. It also added rules for things the reviews kept fixing by hand: a table row with more cells than its header, a map status that does not match the spec’s front matter, a plans index that does not match the plan.

The commit gate against the hook's timeout

Seconds for the gate's fast tier on a commit, before and after plan 0053 replaced the W3 loop.

The hook waits, then lets the commit through 20 s
Gate before, the slowest reading 183 s
Gate after, staged files 5.6 s

The plan 0053 log and .claude/hooks/gate-on-commit.js. Before the fix the fast tier read 153 to 183 s, of which 151 s were W3.

Show the numbers
seconds
The hook waits, then lets the commit through 20 s
Gate before, the slowest reading 183 s
Gate after, staged files 5.6 s

What the reviews fixed, 21 to 27 October

Each fix counted once, in the first category that fits, in the order the ledger lists them.

Overclaim: a tag or wording stronger than the evidence 86
Omission 84
Misread: a statement the code or data contradicts 49
Stale cross-reference 20
Under-claim 19
Miscount: a count not recounted 15
Other 14
Wrong anchor 13
Tool not kept 6
Symbol clash 1

docs/plans/metrics.md, the 68 reviews added after 21 Oct 12:11: 64 accepted with fixes, 4 accepted, none rejected. One under-claim is filed as 'under-tag'. The file's warning stands: a review that reads more finds more.

Show the numbers
fixes
Overclaim: a tag or wording stronger than the evidence 86
Omission 84
Misread: a statement the code or data contradicts 49
Stale cross-reference 20
Under-claim 19
Miscount: a count not recounted 15
Other 14
Wrong anchor 13
Tool not kept 6
Symbol clash 1

Plan 0053 came with ADR-0023, accepted the same minute, about what the reviews cost. Its context is one sentence: β€œThe owner’s weekly token limit runs out in about a day while several lanes run.” The ledger’s snapshot in it: 362 runs, 83.6 million tokens, of which the architect’s reviews are 172 runs and 30.9 percent of the tokens; 708 fixes, 19 percent of them mechanical, the kind a gate can catch. So there are two tiers now. Tier A is the full review, for spec lanes, ADR changes and audits. Tier B β€œruns on Sonnet and reads only git diff main...<lane>”, and β€œevery fifth Tier B lane also gets a Tier A review.” The ADR names what it gives up: β€œA finding’s [C] is weaker between lanes.” I accepted it at 18:19 as a trial, which the plan’s fourth phase will settle after ten lanes. And a new tool, tools/metrics.py, summarises the ledger β€œwithout reading it into an agent’s context”, which by now is about 100 KB.

How it was run

The lanes ran as before: harness lanes on slots 1 and 2, slot 0 mine and unused, static lanes in Ghidra beside them, every lane on its own copy of the repository and every close reviewed. The ledger has 78 lane rows and 68 reviews for the window. The lanes spent 22.8 million tokens and the reviews 10.5 million, about 52 and 13 hours of wall clock. On the 27th three long harness lanes, the save batch, the quest items and the animation run, were rotated after about four hours each: the lane stops, writes a resume note, and a fresh one picks up from it. The records show no suspend and no out-of-memory kill in the window. What stopped the work each time was my weekly usage limit: the pauses on the 21st, the stop on the 25th, and the empty days in between.

The numbers

Where it is now, against day one, day six and day eleven

Reviewed specs (28 rows to day 4, 29 on day 6, 35 on day 8, 36 on day 11, 42 on day 17)

3 day 1
28 day 6
35 day 11
38 day 17

[C] confirmed claims in findings

48 day 1
1,150 day 6
2,540 day 11
3,032 day 17

[I] inferred claims in findings

175 day 1
1,189 day 6
2,667 day 11
3,221 day 17

Named addresses in Game.exe

278 day 1
1,814 day 6
3,373 day 11
3,666 day 17

Python tools

26 day 1
91 day 6
170 day 11
215 day 17

Closed plans

5 day 1
36 day 6
44 day 11
48 day 17

Each measure has its own scale. Sources: the research map, docs/findings, re/symbols.csv, tools/ and docs/plans/done at each cut-off.

Confirmed and inferred claims in the findings

[C]: read in the code and confirmed by something independent, usually a run. [I]: read in the code only. Nights, and the days nothing changed, are cut out.

  • [C] confirmed
  • [I] inferred
0 200 400 600 800 1000 1200 1400 1600 1800 2000 2200 2400 2600 2800 3000 3200 3400 11 Oct 12 Oct 13 Oct 14 Oct 15 Oct 16 Oct 17 Oct 18 Oct 19 Oct 20 Oct 21 Oct 25 Oct 27 Oct [C] 3032 [I] 3221

The 25th has one point, the evening's monster batch. On the 27th the inferred line climbs faster: the animation and AI readings land as [I], and the re-tags of that day move claims in the specs, not in the findings.

Show the numbers
Time[C][I]
11 Oct 10:31 0 0
11 Oct 13:35 7 15
11 Oct 15:05 21 58
11 Oct 16:00 28 59
11 Oct 16:25 42 62
11 Oct 17:57 45 104
11 Oct 19:06 48 148
11 Oct 20:11 48 175
11 Oct 22:12 57 176
11 Oct 22:23 57 176
12 Oct 08:04 80 173
12 Oct 08:41 103 183
12 Oct 09:02 104 184
12 Oct 09:31 108 217
12 Oct 09:58 109 228
12 Oct 10:16 117 278
12 Oct 10:42 135 295
12 Oct 11:51 139 295
12 Oct 12:21 159 291
12 Oct 13:41 161 292
12 Oct 14:10 168 295
12 Oct 15:19 168 320
12 Oct 15:46 184 354
12 Oct 15:58 184 354
13 Oct 08:05 196 348
13 Oct 08:26 204 374
13 Oct 08:33 205 422
13 Oct 10:11 206 448
13 Oct 13:43 223 449
13 Oct 15:59 225 452
13 Oct 18:56 229 453
13 Oct 19:21 236 452
13 Oct 19:28 240 455
13 Oct 21:15 279 429
13 Oct 22:02 279 442
14 Oct 08:11 279 442
14 Oct 08:49 282 443
14 Oct 09:21 282 493
14 Oct 09:36 282 495
14 Oct 09:49 290 536
14 Oct 10:00 291 537
14 Oct 10:09 293 586
14 Oct 10:20 293 587
14 Oct 11:05 332 567
14 Oct 13:10 356 562
14 Oct 17:35 376 560
14 Oct 19:22 376 611
14 Oct 19:56 395 651
14 Oct 20:36 402 691
14 Oct 20:50 446 721
14 Oct 20:59 451 757
14 Oct 21:16 461 796
14 Oct 22:37 506 772
14 Oct 22:50 545 743
15 Oct 02:10 574 733
15 Oct 02:44 587 732
15 Oct 02:54 612 737
15 Oct 03:05 619 727
15 Oct 03:29 629 739
15 Oct 03:57 671 738
15 Oct 04:14 711 716
15 Oct 07:39 718 733
15 Oct 08:47 729 737
15 Oct 08:48 737 779
15 Oct 08:54 746 782
15 Oct 09:05 771 791
15 Oct 09:17 773 848
15 Oct 19:08 774 890
15 Oct 19:10 786 941
15 Oct 19:13 797 940
15 Oct 19:25 801 982
15 Oct 19:33 829 1015
15 Oct 19:38 829 1057
15 Oct 19:48 841 1064
15 Oct 19:56 845 1066
15 Oct 20:13 845 1072
15 Oct 20:24 848 1095
15 Oct 23:42 875 1092
15 Oct 23:54 886 1095
16 Oct 00:15 886 1094
16 Oct 00:21 889 1096
16 Oct 01:43 905 1093
16 Oct 02:23 918 1098
16 Oct 02:28 923 1103
16 Oct 03:49 956 1090
16 Oct 06:40 987 1065
16 Oct 14:29 1003 1072
16 Oct 15:31 1023 1075
16 Oct 16:08 1023 1152
16 Oct 17:21 1080 1181
16 Oct 17:36 1140 1189
16 Oct 17:53 1150 1189
16 Oct 18:24 1174 1194
16 Oct 18:34 1228 1208
16 Oct 18:35 1267 1217
16 Oct 19:26 1281 1238
16 Oct 19:29 1321 1250
16 Oct 20:49 1391 1257
16 Oct 21:01 1412 1263
16 Oct 21:29 1486 1263
16 Oct 22:07 1505 1269
16 Oct 22:19 1515 1306
16 Oct 22:26 1566 1314
16 Oct 22:41 1577 1319
17 Oct 07:51 1577 1367
17 Oct 07:56 1585 1375
17 Oct 08:02 1597 1380
17 Oct 08:35 1612 1432
17 Oct 08:47 1650 1434
17 Oct 09:04 1647 1430
17 Oct 09:09 1647 1512
17 Oct 09:45 1657 1536
17 Oct 09:55 1669 1539
17 Oct 10:44 1670 1729
17 Oct 10:50 1670 1796
17 Oct 10:58 1670 1808
17 Oct 11:07 1681 1816
17 Oct 11:15 1683 1826
17 Oct 16:44 1707 1827
17 Oct 17:18 1707 1838
17 Oct 17:33 1707 1839
17 Oct 18:26 1708 1849
17 Oct 19:16 1746 1858
17 Oct 19:27 1747 1870
17 Oct 20:06 1747 1871
17 Oct 20:56 1770 1884
18 Oct 20:09 1773 1896
19 Oct 08:00 1788 1907
19 Oct 08:10 1804 1923
19 Oct 08:44 1805 1924
19 Oct 09:26 1814 1929
20 Oct 08:30 1849 1953
20 Oct 09:11 1849 1955
20 Oct 09:54 1853 2032
20 Oct 10:17 1856 2059
20 Oct 10:29 1914 2070
20 Oct 10:51 1917 2110
20 Oct 10:58 1947 2125
20 Oct 11:19 1973 2133
20 Oct 11:51 1973 2188
20 Oct 12:29 1973 2189
20 Oct 13:11 2022 2217
20 Oct 13:20 2036 2266
20 Oct 14:53 2037 2268
20 Oct 14:53 2076 2308
20 Oct 14:56 2099 2293
20 Oct 14:57 2108 2300
20 Oct 15:43 2110 2302
20 Oct 15:47 2154 2360
20 Oct 18:55 2178 2374
20 Oct 18:55 2230 2414
20 Oct 19:19 2230 2416
20 Oct 19:54 2272 2450
20 Oct 21:31 2312 2484
20 Oct 22:21 2347 2508
20 Oct 23:11 2381 2538
21 Oct 07:17 2420 2570
21 Oct 07:37 2431 2581
21 Oct 07:46 2445 2586
21 Oct 08:21 2479 2619
21 Oct 11:24 2489 2628
21 Oct 11:53 2539 2667
21 Oct 11:57 2540 2667
21 Oct 13:01 2579 2697
21 Oct 13:13 2584 2699
21 Oct 13:57 2626 2739
21 Oct 14:45 2663 2771
21 Oct 15:18 2667 2779
21 Oct 19:30 2700 2810
25 Oct 21:38 2718 2820
27 Oct 07:05 2737 2838
27 Oct 07:46 2750 2844
27 Oct 07:50 2760 2869
27 Oct 08:11 2760 2925
27 Oct 08:57 2779 2942
27 Oct 09:14 2810 2959
27 Oct 09:16 2814 3007
27 Oct 09:41 2817 3014
27 Oct 10:02 2836 3025
27 Oct 10:04 2836 3078
27 Oct 10:34 2840 3086
27 Oct 10:45 2840 3087
27 Oct 10:54 2874 3096
27 Oct 11:22 2877 3102
27 Oct 11:36 2891 3117
27 Oct 11:51 2891 3119
27 Oct 12:06 2896 3122
27 Oct 13:03 2897 3159
27 Oct 13:18 2914 3168
27 Oct 13:45 2920 3173
27 Oct 14:42 2934 3185
27 Oct 15:21 2956 3193
27 Oct 16:24 2984 3204
27 Oct 17:28 3005 3211
27 Oct 17:35 3032 3221

On day eleven the findings held 2,540 confirmed claims against 2,667 inferred; now 3,032 against 3,221, and the confirmed share is 48.5 percent against 48.8. The specs, which are what a reimplementer would read, moved more: from 3,791 confirmed and 2,322 inferred to 4,857 and 2,451, because this was a week of re-tags, and a re-tag raises a spec’s claims without touching the findings. The named addresses in Game.exe went from 3,373 to 3,666, the tools from 170 to 215, the save recipes from 233 to 435, the closed plans from 44 to 48.

What is open

  • Animation, the second part of its run (get-hits by hit recovery, blocks, throws, the rate tiers) and its spec, which run side by side.
  • Monster AI, plan 0052, from its catalogue phase, with the second table routed to it. Then the server frame, which gets a map row when its plan is drafted.
  • The catalogue’s harness phase, after the animation run, with Baal’s tentacle in it.
  • The sweep’s tail: two batches, two re-tags, and the list for me.
  • The things only I can play, all optional: Uber Mephisto and Baal, the Countess and the Cow King in their quest states, the Hell Hellforge, where the pilot reached the room in none of four tries, and the Diablo pair, where its hunt timed out.
  • Review tiers: the next ten non-spec lanes through the Tier B check, the fifth and the tenth audited at Tier A.

The voxel engine had its own window over the same days, and got lighting.