← DevLog2026-07-06

2026-07-06

Quiet on the loop's own dial, loud everywhere else: the autonomous march tick has been silently no-oping on almost every run for the past day and a half — a stale OAuth token masked as green — while four merged PRs shipped the Fate Engine dice layer, a 52-enemy art-driven roster rewrite, a first arena backdrop, and an art + drag-perf pass.

1 mechanics2 UI2 content3 infra
infra

March/night ticks stop swallowing auth failures

What _claude-skill.yml now fails the job when the Claude turn itself reports is_error, instead of letting GitHub Actions call it green.

Why every march run sampled across the last day and a half — 2026-07-04 21:56, 2026-07-05 00:15 / 04:26, 2026-07-06 09:13 / 11:28 / 13:01 / 16:32 UTC — came back "is_error": true, "Failed to authenticate. API Error: 401 Invalid bearer token", yet the workflow reported success the whole time. The loop looked healthy while doing nothing; the first tick after this fix landed (17:09:27) is the first one to actually show red.

b1267aae 82acf0ca 82b7b9cd

infra

Removed the claude-pr-review workflow

What Deleted claude-pr-review.yml and its README entry.

Why "automated PR review is overkill for this repo" — owner call.

30a7a173

mechanics

Fate Engine P1 — the dice get a second read

What Curated the card library 88→49 keepers and shipped the Fate Engine dice layer: Resonance tallies, Reserve/Ripening banking, Fate/X taps, Omen scouting, color-match turn extension, and a rebuilt combo registry.

Why owner call to lock in genuinely good cards first and give every keeper a real dice interaction from day one (spec 31 §9).

6b16ad16

Known-broken and flagged loudly in the commit itself: the curated pool + dice layer collapsed the challenge gradient (measured win ≈1.00 across every stage). Already filed as the URGENT candidate in plan/PHASE_CANDIDATES.md — a real /combat-tuning + /deck-tuning pass, not a constant nudge.

content

New base enemy library: 52 art-driven enemies

What Replaced the enemy roster wholesale — one enemy per painting (52 total), spread across fishing-village/northern-forest level bands in all five difficulty tiers, each with an authored escalating threat sequence.

Why ties every enemy to real art (1:1 portraitAsset key, no more random art pools) and gives long fights a per-phase damage ramp that compounds with the engine's escalation clock — solve it fast or it out-scales you.

b5c6d714

content

Temp art placed across the game

What Dropped a processed art pass (cards, enemies, player portraits, treasure) across combat, the character sheet, and the Reliquary — replacing procedural SVG placeholders with painted assets, alpha-matted to float on any dark surface.

Why first real visual pass on the curated card pool and new enemy roster landing the same day.

2bf0c94d

UI

Fixed staged-card drag lag

What Traced combat-board drag lag to full-size card art being decoded/repainted every frame; switched to pre-downscaled art, a non-remounting drag ghost, and identity-stable CombatBoard memo props.

Why the new per-card art pass made drag stutter newly visible — same commit as the art drop.

2bf0c94d

UI

Ruined-city battlefield backdrop

What Added a full-bleed raster arena backdrop behind the enemy figure on the combat board, with an opt-in hideBackdrop prop so procedural scene atmosphere doesn't fight the raster art.

Why first attempt at moving combat's backdrop off pure procedural SVG.

21211938

infra

The digest run that lost its own output

What This entry never actually shipped on its own. The night run that wrote it (17:17–17:35 UTC, CLAUDE_CODE_OAUTH_TOKEN freshly rotated) drafted this file, built the HTML, kicked off npm run verify in the background, and called ScheduleWakeup to resume and commit once verify finished — but a GitHub Actions claude-code-action invocation is one turn, one job, no resume: the runner tore down when the step ended, and the draft was lost with it. Recovered by hand from the run's own show_full_output log and landed here directly.

Why skills/digest.md never said the gate has to run synchronously in-turn; backgrounding a long command and deferring past the turn boundary is a normal pattern in an interactive session, just not a safe one in a single-shot headless run. Fixed in the same commit as this entry: the skill now says so explicitly.

While you were out

TickVerbOutcome
hourly, 2026-07-04 21:56 → 2026-07-06 16:32marchreported success, but every sampled run silently hit 401 Invalid bearer token — zero real dispatcher work done
2026-07-06 17:09marchfirst tick to fail loud, same auth error — the new check working as designed
2026-07-06 ~14:16–17:09manual (night/march debug runs)T diagnosing and fixing the auth-swallowing bug directly
ongoing4 merged PRs (#11–#14)Fate Engine P1, enemy roster rewrite, backdrop, art + drag-perf — all shipped via manual Claude Code sessions, not the autonomous loop

Build-plan queue (plan/steps/01_build_plan.md): still 0/14 phases shipped since nexus adoption on 2026-07-03 — consistent with the loop having done no real work in that window. plan/AUDIT.md (6 pending), plan/CRITIQUE.md (3 pending), plan/PHASE_CANDIDATES.md (7 pending) are all unchanged from their 2026-07-03 seed. No open triage:needs-user or loop:do issues.

Breadth check: npm run e2e:minigames (hazard, combat, gathering, encounter-routing — full runs, not sampled) — all four suites passed clean.

Needs you

Tuning proposals

None filed today — the one live proposal (Combat challenge-gradient retune, URGENT) was already filed by the shipping commit itself (plan/PHASE_CANDIDATES.md), not by this digest.