2 Commits

Author SHA1 Message Date
Fredrik Johansson
5e5ed2ec7e Add real replay variety: 15 new reports, random per-day roster
All checks were successful
Docker / build-and-push (push) Successful in 49s
Same fix as Retur (which this engine is descended from): every
playthrough showed the same fixed 25 reports in the same order, with
zero randomization anywhere. Added 15 new reports (3 per day,
d26-d40) citing more of Djupet's event pool (the bridge's impossible
vibration frequency, the investigator in the grey suit whose shadow
didn't follow, a mirror showing an older version of the room),
bringing each day's pool to 8, and changed the engine to draw
PER_DAY_COUNT (5) at random per game instead of a fixed set.

Same shape as Retur's fix: buildRoster() shuffles and slices each
day's pool, GameState carries a `roster` generated once at
createState() and persisted, reportsForDay/currentReport read through
it. Save key bumped to v2 for the same reason — no backfill for old
saves, just start fresh.

Tests rewritten the same way: buildRoster() property tests plus
engine tests that either check general correctness or construct an
explicit roster when a specific report's behavior needs locking in
(d04's escalation-even-when-correct case).

Verified: 12/12 vitest, tsc clean, real browser test confirming 4
distinct first-report sources across 5 fresh games.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-28 21:12:32 +02:00
Fredrik Johansson
5faca60a12 Initial commit: Diariet
All checks were successful
Docker / build-and-push (push) Successful in 57s
A bureaucratic horror game — five shifts processing incoming tips and
incident reports for a municipal office that officially handles
nuisance complaints and unofficially exists to keep Djupet's cult off
the front page. Route each report: dismiss, file as known, flag for
follow-up, or escalate and lose visibility into what happens next.
Guidelines accumulate and contradict across shifts, same shape as
Retur's regulation stack.

Directly descended from Retur's engine (routeLetter/nextDay ->
routeReport/nextShift, same 4-route-per-item structure) but with one
real mechanical difference: escalating always costs Insyn (insight/
notice), whether or not it was the correct call — being right doesn't
make you invisible. Several reports cite real events from Djupet's
own event pool (the bleeding IKEA LACK table, Göran added to the
cult's Discord by accident, the Värnhemstorget pigeons, Turning Torso
rotating), reframed as outside tips from residents who saw a fragment
of something they don't understand. Same universe, a level further
from the truth, and the player is explicitly never given the full
picture — that's the design, not a limitation.

Shares djupet/retur's exact :root palette but its own accent (cold
institutional cyan instead of Retur's stamp-red or Djupet's eldritch
purple). Intro/win/loss screens use real generated desk photos
(rotary phone, corkboard map with red string, a ceiling water stain
shaped like a coastline that grows between screens), converted
PNG->WebP.

Verified: tsc clean, 9/9 vitest (data-integrity check that every
report has real consequence text, and a locked-in test for the
escalation-always-costs-insight mechanic), a real browser playthrough
confirming the wrong+escalate cost stacks correctly (-1 trust, +2
insight), and all three ending states screenshotted via injected game
state.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 19:50:31 +02:00