✠ The Chronicle

✠ ENTRY VII


The day the loop found out its own numbers were lying to it

A 33-agent combat audit landed, an owner oversight session promoted the whole engagement-overhaul roadmap (8 phases) and killed an 8-run recurring critique blocker for good, and Phase 26 shipped the fix the audit called for: the engine now enforces one dice-turn per threat phase. Phase 27's re-baseline under that law is the headline — mid-stage win rate was read at 94%, it is honestly 3%; late was read at 3%, it is honestly 0% flat across every enemy and policy. Also: four passes at getting the equipment dock's layout right, a card-face honesty fix for 15 mislabeled cards, the axio-query MCP surface shipped and got its permission-gated wiring human-applied, and critique pass 12 (now unblocked) filed 6 fresh findings. Breadth check: all five e2e suites pass (Playwright's browser installed by hand again — the audit row for this is still open, third digest running).

MECHANICS

The Turn Law — one dice-turn per threat phase, and the honest baseline it revealed (phases 26-27)

What changed

startTurn now refuses a second dice tray within the same threat phase (a turnTakenThisPhase flag, cleared when processBetweenPhases opens the next phase); sim policies, the auto CLI, and the live mobile-map auto-runner all stopped farming endTurn/startTurn cycles for extra Conviction and instead spend down the rest of the hand via FREE (dieless) top plays. A companion fix clamps damage attribution to the enemy's actual remaining HP so a long DoT chain can't log more damage than the enemy could ever take. Phase 27 then re-ran the full stage × policy matrix (144 cells, 8,640 fights) under the new law: mid-stage win rate was previously read at 94% (farm-inflated), honestly it's 3%; late was read at 3%, honestly 0% flat across all 6 enemies × 8 policies. Early holds close to doctrine (75% vs ~80% target) with no farming needed.

Why it changed

the 2026-07-10 combat-engagement audit (33-agent fan-out: 10 theme playthrough auditors, 5 cross-cutting lenses, adversarial skeptics, a completeness critic) found the engine had no round-turn law at all — every pre-2026-07-10 balance number in plan/tuning/ was measured against sims that farmed ~4.7 dice-turns per enemy phase. Phase 26 closes the exploit; Phase 27 proves what the game actually plays like without it, so the repricing phases (28-33) tune against real numbers instead of farmed ones.

stagewin rate (farmed baseline)win rate (honest, phase 27)doctrine target
early99%75%~80%
mid94%3%~50%
late3%0%25–35%

commits f849c5a2 · ae · 26 · 30e43eb2 · ae · 27

BALANCE

Combat engagement audit — 33-agent fan-out, EA-1..EA-8 roadmap, owner ratifications

What changed

a 33-agent audit of deck combat (10 theme playthrough auditors, 5 cross-cutting lenses, adversarial skeptics, a completeness critic) produced seven plan/tuning/2026-07-10-*.md work-plan docs plus raw evidence. Owner ratified four design decisions same day: FREE lines stay a constrained theme-currency fork (weak deposits may add a DRAW 1 kicker, FREE damage banned); the momentum wheel goes global and engine-native; TICK is killed from the registry entirely; DoT clocks get distinct trigger conditions per family. The 8 resulting candidates (EA-1..EA-8) were promoted into the build plan as Phases 26-33 in their ratified gating order.

Why it changed

the audit's keystone finding (the missing turn-law) blocks all numeric tuning until fixed — Gate 0. Rather than let the roadmap sit in PHASE_CANDIDATES.md awaiting a future /oversight pass, the owner reviewed and promoted the whole sequence in one session so Phase 26 could start immediately.

commits 7c6fa875 · ad · dc · db4c65a5 · e · e · EA1EA8

INFRA

Critique's 8-run Playwright blocker resolved — grant fix + transport decision (phase 34 queued)

What changed

two separate fixes to one chronic failure. First, march.yml never set install_playwright: true, so when /march dispatched into /critique on its rate-limit gate, the playtester sub-agent was denied browser_navigate and critique no-oped silently every time — because the last-pass marker never advanced, every subsequent tick re-hit the same dead end. Mirrored the grant from critique.yml. Second, the owner decided (via /oversight) to stop re-diagnosing the grant-propagation mechanism entirely and instead give unattended /critique a non-Playwright-MCP transport — queued as Phase 34, noted in skills/critique.md so it isn't re-investigated as a fresh bug.

Why it changed

the block recurred across 8 consecutive critique passes (5-11) before this pass; the grant fix unblocked pass 12 same-day (6 fresh findings, 3 high/3 medium), and the transport decision closes the root cause instead of chasing a ninth identical diagnosis.

commits 9da2faa8 · (PR · 64 · ac · a · db4c65a5 · e · dec

CONTENT

Critique pass 12 — 6 fresh findings, now unblocked

What changed

first successful automated critique pass since the grant fix above. Played title screen, deck-selection, WILDS exploration, a full combat encounter, and all four tabs. Filed 6 findings to plan/CRITIQUE.md: the persistent header's MORALE meter renders the literal placeholder "v of x" (HIGH), the title wordmark crops above the mobile fold (HIGH), the combat tutorial never teaches the drag-to-play gesture — the only way to actually play a card (HIGH), the header VITAE bar freezes during combat while the in-combat HUD updates live (MED), the pre-fight enemy preview disagrees with live combat VITAE by 2x (MED), and stray "HP" copy contradicts canon VITAE in the same screens (MED).

Why it changed

first real signal from /critique in 8 passes — see the Playwright fix above for why it had been silently no-oping.

commit 3361cac7

UI

Equipment dock layout — four passes to get portrait + 5 slots right

What changed

the equipment dock collapsed 3 interchangeable accessory positions into one "TRINKET" row, so a 2nd/3rd equipped accessory was invisible (read as equip/unequip being broken). Fixed to render all 5 worn slots (Weapon, Armor, Trinket I/II/III) with the player's chosen portrait in place of the generic PaperDoll SVG (now deleted) — then three follow-up passes reflowed the layout: portrait moved left and enlarged, slot width decoupled from portrait width (growing one no longer starves the other), and finally settled on an even 50/50 split so slot names stop truncating.

Why it changed

the engine already models the full 5-piece loadout; the dock's presentation was silently hiding 2 of 5 slots. The layout took four iterations to land because each fix exposed the next constraint (portrait size fighting slot width, names truncating) rather than being scoped upfront.

commits 61e551ea · 5ca7c6f9 · 1874e98b · 93b87089

UI

Honest KEYWORD·value on every card's paid side

What changed

~11 special-mechanic families were never wired into the combat presenter's KEYWORD · value face renderer, so 15 of 70 library cards fell through to a contradictory "DEBUFF / buff yourself" placeholder (owner- reported via Curry's Conversion). Added a generic mechanic-led face kind that headlines the driving mechanic or a rider verb instead, gave two affliction-glue mechanics that had no keyword home a real one (FESTER, TRANSMUTE — a deliberate 30→32 vocabulary expansion), and added a guard test that sweeps the whole library through the real presenter so this can't silently drift back.

Why it changed

root cause was card-library/vocabulary drift accumulating faster than the presenter's mechanic table — doctrine is now "every mechanic is a keyword," enforced by the new guard test instead of by convention.

commit 5f4ada58

INFRA

axio-query MCP server shipped, then unblocked by owner-applied wiring (phase 24)

What changed

a zero-dep stdio MCP server (axio_overview / axio_cards / axio_effects / axio_keywords) over the live engine catalog — cards, enemies, effects, and the keyword atlas — sibling to the existing kb-query server. The build itself (server, exporter changes, hermetic smoke test, AGENTS.md doc) shipped clean in one tick, but the actual wiring (.mcp.json registration, the .claude/settings.json tool allowlist, and the two expert-agent frontmatter grants) is permission-gated in unattended /march ticks — an agent can't grant itself new tool access. The phase shipped "blocked" with the three exact edits documented; the owner applied them via /oversight same day, closing the loop.

Why it changed

card-expert and mechanics-expert need live engine data (current card pricing, keyword definitions) instead of stale doc snapshots; this is the same self-grant permission boundary that blocks any MCP-wiring phase from finishing unattended, not specific to this server.

commits 7a33efbc · ee · 6f4200b3 · / · PR · 66 · eaed · wiring)

INFRA

Consolidate janitor mandate audit + CI hardening (phase 25, unattended-flags sweep)

What changed

phase 25 audited the 2026-07-09 harness re-apply and found it already fully present at HEAD (a prior tick had restored it outside phase tracking) — closed the plan gap rather than re-deriving identical files. Along the way, fixed one real stale spot: verify-mechanics.yml's cross-package impact-path array still listed the deleted src/Skills/ directory. Separately, every Claude-invoking GitHub Actions workflow (rest-tuning, ship-a-phase, triage, world-tuning, and 20 others) now declares its unattended-mode flags explicitly, and the shared skill/claude workflows run non-interactively.

Why it changed

the janitor mandate's own rule is "suspected-dead files are findings, not deletions" — a dead-walkthrough finding (two agent-e2e goal files narrating a deleted src/Skills engine surface) got filed to AUDIT.md instead of removed on the spot, per that rule.

commits f7868e2a · ae · 25 · 93380dc0 · a42b01f4 · c · ade

✠ The marginalia


The night's watch — what ran while nobody looked
Time (UTC)VerbOutcome
2026-07-10 08:07owner (direct)phase 17 (quest-board tutorial) reverted per request
2026-07-10 08:37 → 11:47owner (direct)equipment dock: 4 layout passes (5-slot render, portrait-left, width decouple, 50/50 split)
2026-07-10 09:55owner (direct)card-face honesty fix — 15/70 cards de-placeholdered
2026-07-10 12:00 → 12:07owner (direct)combat engagement audit (33 agents) + oversight: drop phase 17, promote EA-1..EA-8 as phases 26-33, resolve critique blocker via Phase 34
2026-07-10 18:07march (PR #64)ci: grant Playwright to march — unblocks 8-run critique stall
2026-07-10 19:00marchcritique pass 12 — 6 findings (3 high, 3 medium), first real signal in 8 passes
2026-07-10 20:09 → 20:39march / ownerphase 24 shipped blocked (axio-query MCP), owner-applied wiring same day (PR #66)
2026-07-10 22:44marchphase 25 shipped (consolidate janitor mandate + stale impact-path fix)
2026-07-11 00:27 → 00:30marchci: non-interactive Claude actions + unattended flags across every workflow
2026-07-11 03:57 → 04:25marchphase 26 shipped (the Turn Law — engine + tooling)
2026-07-11 08:24 → 08:29marchphase 27 shipped (re-baseline the combat matrix under the Turn Law)

Build-plan queue (plan/steps/01_build_plan.md): phases 13, 15-27 all now shipped since the last digest; 7 pending (28-34, the repricing/legibility/ theme/enemy tranche of the engagement roadmap plus the non-Playwright critique-transport phase), no [blocked:] rows. plan/AUDIT.md: 9 pending (unchanged count; row [3.2], the night-workflow Playwright-install gap, is now unaddressed for a third digest running — worked around by hand again this run). plan/CRITIQUE.md: 11 pending (8 fresh from pass 12, 3 seeded recurring patterns; the combat-fork DESIGN SIGNAL row from pass 12's predecessor was resolved to Done by the oversight session). plan/PHASE_CANDIDATES.md: 10 pending rows, 0 promoted this pass (EA-1..EA-8 promoted last pass, already reflected). No open triage:needs-user or loop:do issues. Deploy gate: STUB, no auto-deploy provider configured (EAS Build is manual; gate wiring still queued behind phase 11). Breadth check (npm run e2e:minigames, browser installed by hand): hazard, combat, gathering, encounter-routing, exploration-roundtrip — ALL PASS.

The measure — did the fighting change?

None filed by digest this pass (in scope: loop-gate mistuning only). The AUDIT [3.2] Playwright-install gap above is a standing /iterate finding, not a gate-mistuning proposal — it doesn't touch cadences, ceilings, or rules, just a missing workflow input.

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.