✠ The Chronicle

✠ ENTRY XV


The biggest single day the loop has logged

64 commits. The Upgradeable-Dice flag went live for every build (owner override of D7's own "not ready" finding), its missing sink mechanism landed twice over hours later (a starter-loadout fix, then D8's dice valves), and a 300-card swap pool plus two new dashboards shipped for tomorrow's balance work. A triage pass even caught its own queued phase turning redundant mid-session. Breadth check and deploy gate both green; the baseline stayed fresh, so no re-measurement ran tonight. Updated once more mid-morning: a scheduled march tick queued a new HIGH audit row (#129, Hermes queue-provenance logging).

MECHANICS

The roll ritual ships, then D7 measures the flag-on model and says "not ready"

What changed

D6f gave the four-die roll a physical tumble (Reanimated worklets choreographed to land on the engine's already-rolled faces, zero new deps, a dice-honesty invariant asserted in both animate and instant modes). D7 followed with the first flag-on win-curve matrix and ratified the dice-math/economy gates it could — while reporting, un-doctored, that the flag itself is NOT ready to flip: early-stage win rate misses its own band and sits 15 points under the flag-off model it would replace, because Press Fate — the only ◆ sink — was firing 0.000×/round.

Why it changed

D6f exists to give the roll a felt moment without touching RNG; D7 exists so the flip decision is evidence-based. Reporting the band miss as a finding instead of tuning it away is what triggered the owner override two commits later.

commits 10ffe174 · 701762bd

MECHANICS

THE FLIP — owner overrides D7, Upgradeable Dice goes live everywhere

What changed

an owner session root-caused the "broken dice" report (the owner's own build was running flag-OFF wearing PR #118's new face language) and then explicitly overrode D7's do-not-flip recommendation: isUpgradeableDiceEnabled() now defaults ON for every app build — dev, preview, store — miss faces render as a greyed empty circle, and THE STAKE mechanic is retired from every surface.

Why it changed

the owner accepted D7's measured regressions as transitional and wanted flag-on as the live game immediately, with D8 queued as the fix for the sink gap D7 found — a deliberate "ship first, tune after" call, recorded as seven drained user-calls in the same session.

commits ae51ab3d · de3761f3

MECHANICS

Press Fate gets equipped, then D8 gives every preset its own dice valve

What changed

first, a starter-loadout swap put Press Fate — the whiff valve D7 found idle — on every starting character (Gambler's Knot default-worn, Venom Sigil benched); re-measured casts/round moved 0.000 → 0.060. Hours later, D8 replaced one same-aspect card in each of the ten 15-card starter presets with a themed dice valve, promoted through the sandbox court (all ten passed, no fallback needed), and retired ten zero-play reward-only cards to hold the curated library at 70.

Why it changed

D7's F3 finding was that nothing sinks the ◆ economy without Press Fate equipped; the loadout fix proved the mechanism works, and D8 is the owner-ruled permanent sink (valves themselves, no starter grant). The curve still runs red at mid/late — called out as the next bounded tuning phase rather than papered over.

commits 7f989382 · 10ec4fe8

UI

Combat UI polish — gem dice recut, gear rail retired, tighter inspect

What changed

eight owner-playtest findings landed in one pass: the die face recut as a bevelled gem (hit = crystal, miss = empty circle, stance carried by colour not a printed glyph), the die-gear explainer rail removed from the combat board, status chips right-aligned off the signature-rune column, the inspect overlay condensed to one hairline-separated ledger, and the dice-tray gap fixed so four 54pt gems stop overflowing a 375pt viewport.

Why it changed

this is the un-gated recut that made the game read as "broken dice" before THE FLIP — it dressed the legacy model in new clothes without touching dice law. Landing the polish and the underlying flag-flip together closes that gap for good.

commit 486dbded

MECHANICS

Color-match dieBonus rider retired from 7 cards

What changed

removed the "own-stance die bonus" line from straw-mans-jab, sketch-of-a-thought, red-herring, delphic-ambiguity, soft-word, tu-quoque, and ad-nauseam, trimming each card's pricing arithmetic to match.

Why it changed

under the color law a card can only be paid by its own stance (or a wild/gold die), so an own-stance bonus fired on essentially every play — a conditional discount with no live condition. Owner directive was cut, not fold-in.

commits b3ab48c5 · 4cc22cdf

UI

MORALE header stops rendering a roman-numeral placeholder

What changed

the always-visible MORALE meter switched from "v of x" (roman numerals) to "5 / 10" (arabic), matching VITAE directly above it in the same card and the SELF-tab pools panel.

Why it changed

critique pass 12 flagged that a first-time player reads "v of x" as an unresolved template string, not a value — a regression test now locks the arabic format in.

commit 270e5f93

BALANCE

Preset metrics slate — the first per-preset doctrine measurement

What changed

a full-matrix preset:all sweep across all ten starter decks (both dice arms, two seeds) landed per-preset/stage rollups, draw telemetry (dWR, opportunity-play rate), and complexity scoring — producing the first per-preset doctrine-band report, which surfaced a mid-game cliff.

Why it changed

this is the measurement harness the D7/D8 curve numbers above read from; prior evidence was ad hoc per-card. The mid-game cliff it found is now a live AUDIT row waiting on its own tuning phase.

commits bbc20413 · 6757561e · 54aa95e4

CONTENT

A 300-card swap pool ships, gets measured once, and two dashboards go live

What changed

ten themed 30-card sandbox sets (300 cards total) landed as /deck-tuning measurement-seat candidates plus a swap-grammar CLI flag; the first measurement pass ran 31 A/B arms across all ten themes and applied zero changes, filing its promotion calls as needs-user-call items instead. Two new dashboard pages (the Card Ledger, the Swap-Pool Atlas) now expose the underlying sweep data — card text, charts, and per-card estimates — for owner review.

Why it changed

swap candidates only ship after matrix evidence, never on design judgment alone — the pool exists so future deck-tuning passes have real trial candidates instead of hand-picked ones.

commits 75c85d2a · 0ab70e6f · 86a7bede · 6050acad · 288aad19

CONTENT

Phase 37 briefed — retiring the fallacy/paradox card category

What changed

a full removal map for the Card.category field and the dead, write-only combatResources token pool was drafted and queued as Phase 37 (not yet shipped). A companion AUDIT row explicitly carves out the still-live hazard/gathering "paradox-token" reward vocabulary as out of scope for that phase.

Why it changed

category is a pre-Hazard-Pattern vestige nothing reads (the sole reader is null-guarded dead mobile code); owner scoped the cut to the field and its dead token pool only, leaving cardType/resonance/philosophicalAspect and the separate hazard/ gathering reward system untouched.

commits da05eacf · 8645fb08 · 051a698e

INFRA

Issue #132 — triage catches its own queued phase turning redundant

What changed

issue #132 was triaged and queued, re-triaged after the owner corrected the issue body same-day (docs → enhancement), and then the queued phase was dropped entirely because .github/workflows/build-devlog.yml (a deterministic devlog-build Action) landed on main out-of-band in the same window and already satisfied the acceptance criteria.

Why it changed

shows the triage loop catching a queued phase becoming redundant within the same pass rather than letting duplicate work ship — the build-plan queue never carried a stale entry into a commit.

commits 4fd332a7 · 4e6b2ddc · 4c254eed · 30c0bf3e

INFRA

Issue #129 triaged mid-day — a Hermes queue-provenance log gets queued as HIGH

What changed

the owner's #129 request (log T's provenance — actor, action, reason — for every Hermes-originated build-plan queue mutation, in the same commit as the mutation itself) was triaged and loop-queued into plan/AUDIT.md as a HIGH row (impact 6, ease 6), landing hours after this morning's digest wrote.

Why it changed

this update rewrites today's entry in place (the DevLog schema has one file per calendar date) rather than skip a real pulse event — the loop shipped one more tick after the 06:50 digest and it belongs in the ledger for today.

commit 9928a584

✠ The marginalia


The night's watch — what ran while nobody looked
Time (UTC)VerbOutcome
07-18 13:52 → 14:10march (scheduled)last cron tick before today's window — succeeded, no-op relative to the oversight session already in flight
07-18 14:21 → ~20:00human/owner oversight sessionTHE FLIP, D8 sink ruling, blacksmith re-home, FORGE identity, 7 user-calls drained
07-18 (session, various)slash-invoked skillscombat UI polish (#118), color-match rider removal (#120), preset metrics slate, MORALE fix (#117), 300-card swap pool (#130), Card Ledger dashboard
07-19 03:24 → 03:28/deck-tuning (swap-pool measurement pass)shipped, 0 applied — needs-user-call ballot filed
07-19 06:12 → 06:16/triage (#132)processed → re-processed → superseded by an out-of-band fix, no phase queued
07-19 06:20 → 06:25PR #133 (docs, concurrent with this run)deck-tuning skill absorbs the metric-slate + in-theme swap law and gains a --cross-theme-swaps dispatch flag; merged mid-digest, pulled in clean, docs-only
07-19 06:24 → 06:50digest (first run today)baseline FRESH at dc8bd79b (no re-measure needed); breadth check ALL PASS (6 suites, browser installed by hand — AUDIT [3.2] still open)
07-19 08:35 → 08:40march (scheduled)/triage ran, queued #129 (Hermes queue-provenance log) as a new HIGH AUDIT row
07-19 08:37 → nowdigest (this update)same-day refresh — no mechanics-source commits since the first run, baseline still FRESH at dc8bd79b; breadth check not re-run (nothing app-facing changed, prior ALL-PASS still stands)

64 commits landed since yesterday's digest (acc8d4de), including the concurrent PR #133 merge and this window's #129 triage. Build-plan queue (plan/steps/01_build_plan.md): 51 [x], 5 [ ] — D9, 33c, 33d, and Phase 37 remain queued; Phase D-FLIP is functionally shipped (ae51ab3d/de3761f3) but its build-plan row is still unticked, which is worth a housekeeping pass so the next queue-reader doesn't misjudge it as outstanding. plan/AUDIT.md: 33 pending (4 marked [x] resolved but not yet filed to Done — /iterate's housekeeping; two more stale HIGH rows were drained this window with no code needed, e8f1002f/5001560c; #129's Hermes-provenance-log request is the newest pending HIGH, queued at 08:37). plan/CRITIQUE.md: 32 pending (6 HIGH), last pass 2026-07-17 — two days stale. plan/ PHASE_CANDIDATES.md: 30 pending, 8 promoted. No open triage:needs-user or loop:do issues (checked again at this update). Deploy gate: HEAD (9928a584) is a plan/docs-only tick — no gated verify-* workflow triggered, nothing to check. Breadth check (SMOKE_SAMPLE=full npm run e2e:minigames, browser installed by hand again — AUDIT [3.2] still open): hazard, combat, gathering, encounter-routing, exploration-roundtrip, and upgradeable-dice — ALL PASS (2 non-blocking NOTEs: momentum chain-break not exercised this seed, Press Fate's tray refresh not visibly confirmed — both reachable-subset degradations, not failures). Not re-run at this update: the only commit since is a docs-only plan/AUDIT.md edit, so the morning's ALL-PASS result still holds.

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.