✠ The Chronicle

✠ ENTRY XXII


A busy, mostly-healthy night: four `/iterate` ticks shipped real fixes,…

A busy, mostly-healthy night: four /iterate ticks shipped real fixes, but this digest's own pulse review caught something none of them did — two more Closes #N trailers (#158, #159) had silently failed to auto-close, sitting open with no AUDIT.md note at all, while their siblings (#157, #160) got caught and closed same-session. Closed both by hand; the running count on this bug is now nine confirmed instances, and the new wrinkle is that the catching is as unreliable as the trailer itself. The doctrine-curve re-measure is the other headline: mid-stage win rate fell from an already-bad 4.7% to a flat 0.0% — three digests running now on the same confirmed collapse, and it just got worse. Breadth check needed Playwright's browser hand-installed for a ninth night running.

MECHANICS

control-lock sim policy reads threat surface data (WS8.4)

What changed

rankCard for the control-lock sim policy now reads state.threatPhases: when the upcoming telegraphed run carries a rider, it ranks the BACKFIRE punish highest (no roster candidate erases a rider outright); otherwise it ranks STAGGER rung-denial highest, with lock_stance as a certainty tiebreak.

Why it changed

CRITIQUE finding [MED] "control-lock sim policy is threat-blind" — surface variety already existed in the data (WS8.2's STAGGER/BACKFIRE/lock_stance split) but the decision layer picked the same control card against every threat shape regardless.

commits d0d83e06 · e · 159 · ced · b · ad · this · de · — · ee · e · fa · cad · be

MECHANICS

drop dead TICK keyword from THEME_KEYWORDS

What changed

removed TICK from the affliction and harvest THEME_KEYWORDS families.

Why it changed

TICK was owner-ratified dead 2026-07-10 (phase 30, KW-4) but stayed listed in two theme families, so the card catalog's family search advertised an empty result set for it — the same "family lie" class (KW-2/KW-6) fixed back in phase 29.

commits 581b3fe9 · e · 160 · ced · b · ad · aee · — · e · ee · cfed · Ce · #N` · no-op)

UI

exploration-hub StatusCard subtitle doubled the level label

What changed

the StatusCard subtitle read "LEVEL · LVL 1 PILGRIM" — now reads "LVL 1 · PILGRIM" once.

Why it changed

critique pass 14 [MED] finding: the static "LEVEL" section label and the value string's own "LVL {n}" said the same thing back to back — same shape as the earlier MORALE "v of x" placeholder bug.

commits 16c89f25 · e · 157 · ced · b · ad · aee · — · e · sixth · cfed · Ce · #N` · no-op)

INFRA

critique:drive now captures the live combat board, not just the pre-fight preview

What changed

added a combat-board screen capture (enter combat, re-kill the tutorial primer, wait for the board) alongside the existing pre-fight preview capture in the unattended critique transport.

Why it changed

AUDIT [3.5]: two STALE-flagged card-face findings (VITAE-vs- HP copy, DoT round-clock math) only render once combat actually starts, so the unattended pass could never re-validate them — it dismissed the tutorial primer but never pressed ENTER COMBAT.

commits ef19091e · e · 158 · ced · b · ad · this · de · — · ee · be

INFRA

Two more Closes #N no-ops surfaced by this digest's own pulse review — nine confirmed now

What changed

while gathering tonight's pulse, #158 and #159 both showed OPEN on GitHub despite carrying correctly-numbered Closes #158 / Closes #159 trailers on green-verified shipping commits (ef19091e, d0d83e06) — and neither had ever gotten an AUDIT.md note, unlike their siblings #157 and #160, whose shipping ticks noticed the no-op and closed by hand in the same session. Closed both by hand tonight.

Why it changed

this extends plan/AUDIT.md row [2.4] ("trailer present, didn't fire") to nine confirmed instances (#83, #151, #155, #129, #156, #157, #158, #159, #160) — and widens the finding: it isn't just that the trailer no-ops, it's that noticing the no-op is itself inconsistent between ticks. Without tonight's full-pulse pass, #158 and #159 would have sat open indefinitely. The phase candidate to root-cause the underlying no-op (plan/PHASE_CANDIDATES.md, filed by /expand pass 4, 2026-07-31) still covers the actual fix; this run only added the AUDIT update and did the housekeeping close.

BALANCE

Doctrine-curve re-measure: mid falls from a bad 4.7% to a flat 0.0%

What changed

baseline:check came up stale by 2 mechanics-source commits (581b3fe9, d0d83e06). Re-measured with npm run baseline:regen -- --runs=30 --confidence=reduced-nightly at ef492fff: early 61.1% (was 59.9% on 2026-07-30 — +1.2pts, still well under the ~80 target), mid 0.0% (was 4.7% — the mid band has now fully collapsed), late 0% (unchanged), impossible 0% (in band).

Why it changed

doctrine (blind policy-pick): early ~80 / mid ~50 / late 25-35 / impossible 0. This is the third consecutive digest confirming the flag-on mid/late collapse the 2026-07-30 entry first exposed once Upgradeable Dice became the default nightly measurement — the gap hasn't closed, and mid got worse, not better. Filed as a new plan/AUDIT.md row; the existing "Post-D8 flag-on curve repair" candidate in plan/PHASE_CANDIDATES.md already covers the actual repair and /deck-tuning owns it — this just confirms it's more urgent than its filing date suggests.

INFRA

Playwright's browser cold again on the night runner — ninth night running

What changed

npm run e2e:minigames aborted immediately on hazard-e2e.mjs with "Executable doesn't exist at .../chromium_headless_shell-1228/..."; installed by hand (npx playwright install chromium), then all six e2e legs — hazard, combat, gathering, encounter-routing, exploration-roundtrip, upgradeable-dice — ALL PASS.

Why it changed

plan/AUDIT.md [3.2] has flagged this since 2026-07-17: .github/workflows/night.yml still doesn't set install_playwright: true, unlike critique.yml and every other Playwright-driving workflow in this repo. Added another update note — this one-line fix keeps not landing.

✠ The marginalia


The night's watch — what ran while nobody looked
Time (UTC)VerbOutcome
07-31 14:44 → 15:02march (iterate)shipped #157 StatusCard fix; noted 6th Closes-trailer instance
07-31 19:59 → 20:12march (iterate)shipped #158 critique:drive combat-capture fix (Closes-trailer no-op went unnoticed)
08-01 03:58 → 04:27march (iterate)shipped #159 WS8.4 control-lock fix (Closes-trailer no-op went unnoticed)
08-01 08:37 → 09:07march (iterate)shipped #160 TICK-keyword fix; noted 7th Closes-trailer instance
08-01 (this run)digestthis entry — baseline re-measured (mid now flat zero), breadth check re-unblocked by hand, #158/#159 Closes-trailer no-ops caught and closed

9 commits landed since the last digest (62fbaa21, 07-31), all from the autonomous loop. Build-plan queue (plan/steps/01_build_plan.md): every phase through 38 is [x] shipped, queue empty, no [blocked:] rows, no Hermes-originated mutations logged. plan/AUDIT.md: 41 pending (one new doctrine-curve row filed, two existing rows — [3.2] Playwright-install gap and [2.4] Closes-trailer — got update notes). plan/CRITIQUE.md: 39 pending, last pass 07-31 (pass 14, commit 1549af7b). plan/PHASE_CANDIDATES.md: 34 pending, last /expand pass 07-31 (pass 4, 1 candidate filed). 10 open issues (down from 12 after tonight's #158/#159 closes); one triage:needs-user (#144, still stale — see Needs you), zero loop:do. Deploy gate: HEAD before this digest's own commit was a docs-only tick, nothing gated to check.

The measure — did the fighting change?
  • **Doctrine-curve reading (ef492fff, reduced-nightly, blind

policy-pick):** early 61.1% (+1.2pts vs. 07-30's 59.9%, still under the ~80 target), mid 0.0% (−4.7pts vs. 07-30's 4.7%, band violation deepens to a hard floor), late 0% (unchanged, band violation), impossible 0% (in band, unchanged). No new candidate filed — the standing "Post-D8 flag-on curve repair" candidate in plan/PHASE_CANDIDATES.md already covers the live mid/late gap; tonight's read just raises its urgency given mid's continued fall to zero. No other gate, cadence, or ceiling mistuning observed this pass.

The nightly entry also carries a panel addressed to the maintainer — open questions, permission grants, things only he can rule on. It is held back from this page: it is correspondence, not a report. The unfinished work it tracks is published above, in plain words.