✠ The Chronicle

✠ ENTRY XIV


A marathon single day: the whole Upgradeable-Dice rework (spec 33,…

A marathon single day: the whole Upgradeable-Dice rework (spec 33, phases D1-D6e) landed engine-to-UI, a self-found HIGH regression that would have blocked its own D7 flip got fixed same-day, and two balance phases (enemy archetypes, alt-win/tempo pricing) shipped alongside it. The one sour note: a fresh reduced-nightly re-measure says none of it touched the mid/late win-rate collapse the loop has been tracking for a week. Breadth check and deploy gate both green.

MECHANICS

Upgradeable-Dice spec lands + engine core + economy sim (D1-D3)

What changed

the spec-33 dice-as-equipment rework got its pre-code review (die gear replaces face-swapping, STAKE retired, momentum null-reset, surge-until-spent), then shipped flagged: four fixed dice with a die-gear interface, stance-from-cards, honest Press Fate, and a Monte-Carlo sim harness that derived the D3 economy gates (E[usable]≈1.83, whiff≈8.3%, ◆ income 1.21 — all in band).

Why it changed

the shipped Phase 31 momentum wheel and 2026-07-09 dice law were both slated for supersession by spec 33; D1 settled every open spec question before D2 wrote a line of engine code, so the whole D-series builds on ratified ground instead of guesses.

commits 4adf7266 · 18cf5e3b · 61bbc8ca

MECHANICS

Die gear pricing + blacksmith engine (D4-D5)

What changed

re-fit cards.pricing.ts for the new dice model, re-authored Forge's die-cards plus a special-amplifier enchant, then built the pure blacksmith engine (HONE/TEMPER/SWAP, cap enforcement, a GAME_STATE_VERSION 14→15 migration) as a new blacksmith MapEvent kind.

Why it changed

D1's owner call put all dice progression on four dedicated gear slots instead of face-swapping; D4/D5 build the pricing and the selling surface that model needs before any UI can render it.

commits 0e3bd2bb · a25373be

UI

Upgradeable-Dice combat UI + blacksmith screen (D6a-D6c)

What changed

the flag-on combat render core (dice-tray face rework, Press Fate control, keyword glosses), momentum/stance chips with a live stance-check telegraph, the 4-slot die-gear rail, and a full blacksmith encounter screen (gate, slice, route, forge UI) shipped back to back — flag-off stays byte-identical throughout.

Why it changed

D2/D5 built the engine and gear model with zero mobile consumer; a scope scout confirmed the render was greenfield, so D6 was split into these three sub-phases rather than shipped as one unrealistic mega-phase.

commits 311e2c3c · 4cf7b752 · 7c315d5f

INFRA

D6d flag-on e2e finds — and same-day fixes — a D7-blocking regression

What changed

the seeded flag-on browser e2e (mirroring the existing combat/hazard e2e harnesses) booted the spec-33 surface for real and caught a HIGH bug: powering a card with a legal die spent the die but never committed the play — the card bounced back to hand. A follow-up fix landed the same day.

Why it changed

resolveApplyRouting was still draft-model-shaped; a fresh tray die returned draftFirst:true and routed through draftStanceDie, a flag-on no-op, so playCombatCard got no die at all. This is a hard D7 blocker — D7 recommends the flag-flip, and a broken paid-play commit can't ship. Root-caused and fixed same session so the D-series finale stays unblocked; the fix also hid the stale flag-on STAKE affordance (retired in D2).

commits 7af8dbc8 · 04d38409

MECHANICS

Enemy stanceCheck telegraphs light the dark yield lever (D6e)

What changed

every threat phase now backfills a defaultStanceCheck (punishes the enemy's own stance ×1.5, yields to the momentum-chain successor ×0.5 +1◆) at the single getThreatSequence choke point, covering both generated and hand-authored sequences.

Why it changed

D2 shipped resolveStanceCheck and D4 priced the synergy, but zero enemies authored the field — D3's sim caught realized yield income sitting at 0.000 across 900 encounters, meaning D7's win-curve read couldn't exercise the steer-into-yields loop the design leans on. Yield income moved 0.000 → 0.329◆ after this shipped.

commit 0b29ff42

BALANCE

Enemy archetypes + variable-rung telegraphs (Phase 33b)

What changed

AuthoredThreatPhase now carries enemyCleanse/ swayCleanse/premiseShed directly (previously only one hardcoded branch case could ever set enemyCleanse), six mid/late enemies got CAUTERIZE / Premise-shed / SWAY-cleanse counterplay hooks, and threat phases can now override the flat rung default per-phase — with the rung count finally rendered in the mobile intent readout.

Why it changed

closes the authoring gap Phase 33a deliberately left open, so STAGGER reads as a sized answer to a sized threat rather than a one-way dial, and the counterplay hooks aren't locked to one branch case anymore.

commit 8ceb86e5

BALANCE

Alt-win-aware + tempo-aware card pricing (Phases 36a/36b)

What changed

swayPerStack 0.8→0.9 (derived from CAPITULATE's win-parity math) and a +3 CONCEDE capstone on peroration cards that declare a win condition (was priced at exactly 0), then a tempo-aware repricing pass against the DoT card-played clock.

Why it changed

the price-experiment session found scoreCard ranking alt-win decks backwards (enchant/disenchant scored 0, SWAY/CONCEDE engines underpriced) and blind to tempo — both promoted the same day as structural fixes ahead of the larger enchant/disenchant pricing remainder (deferred as Phase 36c).

commits 7d26bebd · 1927b15e

INFRA

Phase-close now actively closes the mirror issue via the GitHub API (Phase 35)

What changed

scripts/loop-issue.mjs phase-close now calls gh issue close --reason completed directly instead of relying solely on the commit's Closes #N trailer.

Why it changed

GitHub only honors closing keywords for commits pushed directly to the default branch — phases shipped on cross-session branches reach main via merge reconciliation, where the trailer is inert. Nine phase mirrors had already leaked open from this gap.

commit 59cf9e6e

✠ The marginalia


The night's watch — what ran while nobody looked
Time (UTC)VerbOutcome
07-17 11:39 → 13:37human/owner sessionPhases 36a/36b (alt-win + tempo pricing) shipped
07-17 14:32 → 14:42march (scheduled)tick succeeded — Phase 33b (enemy archetypes + rung telegraphs) shipped
07-17 14:54 → 22:17human/owner sessionUpgradeable-Dice D1-D5 shipped back to back; Phase 35 (reliable phase-close) shipped
07-17 23:12 → 23:27march (scheduled, PR #107)tick succeeded — D6e (enemy stanceCheck telegraphs) shipped
07-18 02:38 → 05:09oversight sessiondrained 3 needs-user-call items; filed FORGE-identity + blacksmith-cadence + Expo-decouple residue
07-18 01:13 → 05:04march (scheduled)tick succeeded — D6a, D6b, D6c, D6d (partial) shipped in sequence
07-18 05:24fix sessionHIGH D7-blocker (flag-on paid-play commit) root-caused and fixed
07-18 08:11 → 09:27march (scheduled)tick succeeded — D6d finished landing via a second branch, merged clean
07-18 10:04 → nowdigest (this run)baseline was STALE by 12 commits → re-measured (reduced-nightly) → FRESH at 31f62c1e; breadth check ALL PASS incl. new upgradeable-dice-e2e suite

56 commits landed since yesterday's digest (df759d13). Build-plan queue (plan/steps/01_build_plan.md): D1 through D6e all [x]; D6f (the roll-ritual animation) and D7 (tuning + ratification) remain queued, plus the pre-existing 33c/33d — none blocked. plan/AUDIT.md: 26 pending (was 25; filed one new row this run — see Tuning proposals). plan/CRITIQUE.md: 30 pending (one, the D7-blocker, is [x] RESOLVED today but not yet filed to Done — that's /iterate's housekeeping). plan/PHASE_CANDIDATES.md: 18 pending, untouched this window. No open triage:needs-user or loop:do issues. Deploy gate: HEAD (31f62c1e) CI-green (verify-mobile success). Breadth check (SMOKE_SAMPLE=full npm run e2e:minigames, browser installed by hand again — plan/AUDIT.md [3.2] still open): hazard, combat, gathering, encounter-routing, exploration-roundtrip, and the new upgradeable-dice suite — ALL PASS, including a live regression check that the D7-blocker fix holds ("paid Soft Word COMMITTED — SWAY 0 → 4, card left hand").

The measure — did the fighting change?

Reduced-nightly re-measure (blind policy-pick, doctrine early ~80 / mid ~50 / late 25-35 / impossible 0), at 31f62c1e vs. the last digest's bf0d3712:

StageTodayLast digestBandVerdict
early84.4%80.2%~80%in band
mid7.3%8.7%~50%far under, unchanged
late0%0.14%25-35%far under, unchanged
impossible0%0%0%in band

Two full days of engine and balance work (Phase 33b's enemy counterplay hooks, the whole D1-D6e Upgradeable-Dice rework, 36a/36b's alt-win/tempo pricing) landed on top of the last measurement and moved the mid/late bands by noise only — none of it targeted the collapse directly, so this is not a surprise, but it is now confirmed twice running. Filed as a new plan/AUDIT.md row (evidence trail, not a new ask) since the existing CRITIQUE.md HIGH row's "unmeasured" framing is stale — it's measured, repeatedly, and the answer is "no better." Phase D7 ("Tuning, ratification + honest re-baseline") is already queued and scoped to read this curve; nothing here changes that plan, it just sharpens the evidence D7 will act on.

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.