✠ The Chronicle

✠ ENTRY XLII


Eleven phases across two days

both remaining pre-Canon minigames (Quest Board, Gathering) are retired, a full Ally-card-to-village- goodwill arc shipped in five phases, a live card-editor data-loss bug is fixed, and the loop closed two of its own drift classes with new lints (retired-doctrine prose, four silently-drifting keyword surfaces) plus a house-voice/naming-law CI gate. Breadth is green, the baseline was stale and got refreshed — flat, byte-identical to the last read. /expand pass 9 filed no new candidates.

MECHANICS

Phase 61 — Quest Board minigame retired

What changed

Deleted World/QuestBoard/ entire (engine, CLI driver, npm script, tuning skill/workflow, harness arm) and the quest MapEventKind end-to-end across both packages. fv-15 rejoins the fishing-village encounter roster as foot-stealer rather than sitting orphaned; three Labyrinth pre-boss rooms that referenced now-dead quest-board ids narrate the Sophist's own scripted line instead, closing a latent crash. GAME_STATE_VERSION 17→18.

Why it changed

The last build-plan row still authorizing a minigame the Profane Canon rework had already made structurally redundant; quest as a word stays live elsewhere (the unrelated QuestLog/Memoir/Old Marrow system) and was untouched.

commits f674c147 · 0af78a13 · f988391f

MECHANICS

Phase 76 — Gathering minigame retired

What changed

Deleted World/Gathering/ entire, the mobile slice/screen/ components/debug button, and the dedicated CI e2e suite. The gathering MapEventKind and its 8 authored map nodes are untouched — the resolver's item grant now stands on its own and shows a toast instead of launching a session. GAME_STATE_VERSION 18→19.

Why it changed

Second and last of the two pre-Canon minigames flagged for retirement; the resolver-grant-plus-toast shape follows the existing applyFleeCost precedent rather than inventing a new emission path.

commits f18e6643 · 252b85e0

MECHANICS

Phase 62 — Ally card schema

What changed

An Ally is a cardType: 'oath' card in a new sibling registry (cards.allies.ts, mirroring the Haunt pattern) — outside the pinned 57-card library, so no reward/draft/stage pool sees one unsolicited. Ships one reference card, The Sworn Second (a capped, round-end THORNS grant reusing the existing keyword, no new mechanic kind). 16-case hermetic e2e covers exclusion, resolution, pricing, and a grant-smoke round trip.

Why it changed

Lays the card-shape foundation Phase 65's village-goodwill reward grants onto; deliberately no new CardType/keyword — "oath" already means persistent companion passive.

commits 0b78483c · fc0e88e5

MECHANICS

Phase 63 — loot cache becomes a three-way choice

What changed

New pure World/LootCacheChoice engine replaces the old dice-pool World/LootCache (deleted, with its CLI/tuning tooling): card, item, or sacrifice, each an instant-terminal offer settled at claim. Mobile's app/cache rewritten from a 544-line dice-tray renderer to a 3-button RestGate-sibling screen. New GameState.mapGoodwill: Record<string, number> — the sacrifice offer's only effect, counts (never latches) per-map help. GAME_STATE_VERSION 19→20.

Why it changed

Converts the old dice-pool minigame into the first spend site for the Ally/goodwill arc Phase 62 introduced; mapGoodwill lives directly on GameState since this phase is its only writer.

commits a7032809 · fcef4d5f · 8041496b

UI

Phase 64 — Memoir reads the goodwill tally back

What changed

New REMAINS sub-group "GOODWILL" in the Memoir: one "Helped <map> N times." line per map with a positive mapGoodwill entry, sorted count-descending.

Why it changed

Closes the loop on Phase 63's new counter — a passive tally with nowhere to read back was invisible progress.

commits 405bbab0 · a58940a5

MECHANICS

Phase 65 — village goodwill spends the counter

What changed

Three goodwill tiers now do something: Tier 1 (≥1) is a 10% BUY discount at village wares (strikethrough-priced); Tier 2 (≥2) grants The Sworn Second into knownCards via the existing dilemma-unlock bypass; Tier 3 (≥3) is a one-time +25 currency gift, idempotency-tracked by a flag. Threshold checks (>=, not ===) so saves that already crossed a tier before this phase shipped self-heal.

Why it changed

Closes the arc Phases 62-64 built toward — the goodwill counter finally buys something instead of just accumulating.

commits 045e5241 · 016ad653

INFRA

Phase 66 — lexicon lint catches retired-doctrine prose, not just retired identifiers

What changed

lexicon.json gains a type: doctrine row kind for retired design-LAW claims (not just retired identifiers), matched against the whole file with whitespace collapsed so claims wrapped across markdown line breaks are caught — the exact gap that let the same drift survive three prior sweeps in one week. Three doctrine rows ship (strike-ban, status-primacy, win-rate-objective) and the prose they flag across five files is reconciled.

Why it changed

The retired STRIKE-IS-DEAD doctrine kept resurfacing in docs because the lint only ever matched identifier mentions, not assertion-scoped claims split across lines.

commits d3b46d59 · fbaad0d4

CONTENT

Phase 67 — product title migrates to "Miserere Mei, Deus"

What changed

Store/web metadata, both CLI banners, the published DevLog/ Catalog/Tuning-Lab chrome, and every live doc now name the new title. Internal identifiers (npm workspaces, repo name, URL scheme, com.axiomancer.mobile) deliberately stay put. Collision-checked against the in-fiction rank-5 "Miserere" choir spell — no shared UI surface, no change needed. The title-screen wordmark can't move here (painted into title-embark.jpg); filed as an AUDIT row for the art pipeline.

Why it changed

Completes the whole-product rename ratified earlier; the published site chrome was pulled into scope as the most public-facing title surface even though the build-plan row didn't name it.

commits fad33688 · 363a2acb

INFRA

Phase 68 — four silently-drifting keyword surfaces are gated

What changed

CARD_SPECIAL_MECHANIC_KINDS, a runtime enumeration bound to the CardSpecialMechanic['kind'] union by AssertNever, replaces mobile's hardcoded count-of-17 (the union already had 22). New scripts/content-drift.mjs also gates the mobile/catalog glyph tables against each other, the card-editor's keyword vocabulary against the live registry (caught five words for mechanics already deleted: COMPOUND, EXECUTE, SLOW, CONFUSION, SILENCE), and the keyword atlas both ways. New verify-drift.yml triggers on every path the checks read, since no single workspace's verify job covered all four.

Why it changed

These four surfaces had drifted apart with no failing test — this closes the exact drift class an earlier audit found live.

commits 25e3e3cb · d6646f1f

INFRA

Phase 69 — the card editor stops destroying card data

What changed

CardDraft claimed "full fidelity" but carried 19 of 24 fields — saving an existing card through the editor silently deleted theme, persistentEffect, paidSummary, intentionallyAsymmetric, and glyph, and dropped the // pts: pricing-arithmetic comment. All five now round-trip; a new round-trip.test.ts runs every live card through the full draft/serialize cycle as a data comparison. Also found and fixed while writing the test: synergyLines' hand-written allowlist was dropping statePredicate/rider condition riders on 5 live cards.

Why it changed

A real, live data-loss bug in the only tool used to author card content — found by finally writing the test the editor never had (no test runner existed for it before this phase).

commits 3317e337 · 7b2a0f75

INFRA

Phase 70 — house-voice lint for shipped .ts prose + naming law in CI

What changed

New scripts/check-prose.mjs lints string literals of 14 authored content surfaces against the retired-term registry plus four house-voice rules (faux-archaic, exclamation marks, scriptural weather, prestige-dark filler); check-naming-law.mjs --sweep now actually runs against shipped card/enemy names for the first time. Found and fixed 12 off-voice exclamation lines and one stale retired-term false-positive (exempted with reason); found and grandfathered one real naming-law violation ("Blank Indenture" starts with the locked word BLANK) rather than renaming shipped content after the fact.

Why it changed

THE PIPELINE LIBERATION authorized autonomous narrative shipping but the guardrail never followed — every player-facing string had been shipping un-linted since.

commits b06a4449 · e3da58e5

✠ The marginalia


Measurement freshness

The deck-matrix baseline was flagged stale at session open — 9 mechanics-source commits past the stamp (Phases 61-70, 76 above). Re-measured with the reduced-nightly pass (027c8100, 30 runs/cell): CQI and win rate unchanged, early 54.5%, mid 8.3%, late 0%, impossible 0% — byte-identical to the prior stamp (af6482ea, 2026-08-25). None of this window's commits touch the combat-playtest matrix path (world content, tooling lints, docs, a title string, an editor bugfix), so this reconfirms rather than moves the picture. Report only, per standing doctrine.

The night's watch — what ran while nobody looked
when (UTC)verboutcome
2026-08-25 13:25marchsuccess — briefed + shipped Phase 61 (Quest Board retired)
2026-08-25 19:05marchsuccess — briefed + shipped Phase 76 (Gathering retired)
2026-08-26 02:06marchsuccess — briefed + shipped Phase 62 (Ally card schema)
2026-08-26 07:16marchsuccess — no phase landed near this tick's window (other loop work, not a shipped phase)
2026-08-26 13:30marchcancelled — Phase 63 shipped ~48min later, likely a retry outside this run
2026-08-26 20:18marchsuccess — briefed + shipped Phase 64 (Memoir goodwill read-back)
2026-08-27 10:02marchsuccess — briefed + shipped Phase 65 (village goodwill spends)
2026-08-27 ~14:36-18:58oversight (attended, PR #248)shipped Phases 66-70 + ran /expand pass 9 (no candidates)
The measure — did the fighting change?

None. The baseline re-measurement above reconfirms the prior read byte-for-byte; no gate/cadence/ceiling mistuning surfaced in this window's pulse. /expand pass 9 independently reviewed all eight signal sources and filed nothing.

What is still unfinished
  • Build plan: 10 open phases ([ ]), 8 partial-with-carryovers

([-]), 3 skipped, 109 shipped — 11 more shipped than the last digest read (Phases 61, 76, 62, 63, 64, 65, 66, 67, 68, 69, 70).

  • plan/AUDIT.md: roughly 55 open rows (one freshly filed this window,

the title-screen wordmark row from Phase 67).

  • plan/CRITIQUE.md: 21 open rows; last pass 2026-08-22 (pass 29, no

new findings), now 5 days old.

  • plan/PHASE_CANDIDATES.md: unchanged pending backlog; /expand

pass 9 (2026-08-27) reviewed all eight signal sources and filed nothing new.

  • No open triage:needs-user or loop:do issues.
  • Deploy: clean — HEAD 027c8100 is a docs/plan-only commit touching

no gated path, nothing for the CI gate to check.

  • Nightly breadth (e2e:minigames): ALL PASS — hazard (both

routes), combat-encounter, encounter routing, exploration/combat round trip, upgradeable-dice flag-on, and the 10-run sandbox+live combat-round suite all completed clean.

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.