An overnight build · the log
Тимчасово
Six days before this build, the EU agreed to extend temporary protection for Ukrainians to March 2028. In a missionary-prayer chat that evening, one woman wrote: «новость вроде и хорошая, но это говорит что война ещё будет продолжаться 😢» — and another answered «Да, это точно». «Тимчасово» is a playable fable for the people inside that sentence: four years into a life that was supposed to last two weeks, still deciding every day whether to live here or keep waiting. You replay the real timeline, 2022 to now, allocating one scarce life each year — and then look behind both doors.
What it is
A seven-minute, six-round playable fable in Ukrainian and Russian, phone-first, built for displaced Ukrainian adults under EU temporary protection — the people who left «на два тижні» in March 2022.
It opens with the improvised suitcase: eight attested items on the floor under sirens, three fit. Those exact items age across the whole game — the kids' clothes packed in 2022 no longer fit by 2026.
Each year you choose what your strength goes to: the thread home (calls before checking DTEK blackout schedules, a generator posted via Latvia), roots here (a lease, tomatoes on the balcony, a tree), or the packed suitcase. Unspent energy flows to the suitcase automatically — waiting is the remainder of not choosing.
The world's clock never listens: the real extension announcements arrive on their real dates whatever you do — including October 2022's voteless technicality and September 2025, when the Council extended protection and adopted a transition-OUT recommendation in the same season.
At the end the game shows BOTH doors — return becomes possible / another extension lands — always both, because which one arrives was never yours to decide. What you're holding at that moment is entirely made of your choices. Then it hands you the real year 2026–2027 and one blank note: name the thing you've been deferring «до кінця війни».
Fully static, CSP default-src 'self', zero third-party requests, no analytics: the note never leaves the device.
The design world — A rented house's back garden, watched from the doorstep for four years
One fixed, ground-level gaze that never moves: chalky Tuesday-noon sky, a terracotta village on the horizon, a doorway standing in the field with the 2022 suitcase at its threshold. The whole scene is two WebGL draw calls — a fullscreen fragment world (Oklab-mixed daylight, analytic sun glow, IGN dither) and one instanced garden where every blade grows along its own Bézier path, staggered by hash so a planted year ripples awake instead of popping.
The UI is the family notebook: every screen is squared school-notebook paper, and each year's choices are handwritten клаптики that stay pinned to the door frame, curling and fading as they age — the interface's own residue becomes the archive of your four years. The only gauge anywhere is a paper permis card whose printed horizon («дійсно до 04.03.20XX») silently rewrites itself at each extension — the certainty horizon that never once exceeded fourteen months.
Two scriptures hold the two postures with equal dignity: Psalm 137 opens the game as the suitcase's own text («Над річками Вавилонськими, — там ми сиділи та й плакали…»), and in the 2023 round a letter is read in church — Jeremiah 29, verbatim Ohienko, with the rooting command and the return promise never separated: «засадіть садки́» and «щоб вернути вас до цього місця» in one letter.
Daylight against the shelf's gravity toward night shaders; a compounding multi-round system against every sibling's single-scene verb; handwritten notes-on-a-door-frame against printed tariffs, care-tags and letterpress. The nearest neighbour on paper — second-backpack's pack-the-bag — is a one-shot allocation into one object; here the same fingers make six years of choices that grow, soften world events, and meet two futures.
How it was evaluated
The build's central eval (E3) is the caption-removal test from the wow-needs-a-playable-system learning: delete every sentence on the ending screens and the state alone must still land the insight. Played all-wait, the doors open onto an empty field, a bare doorway and a suitcase whose contents dated 2022 — played planted, the same doors open onto a garden riot. The words over both stay kind («Ви чесно чекали. Збори — на один вечір»); the difference is entirely in what grew.
The honest value matrix is enforced by unit tests, not prose: root and thread investments must yield real value behind BOTH doors (rooting is never betrayal, tending home is never waste), while waiting yields epsilon in both — the only strictly dominated row. A dedicated invariant test proves the world schedule is exogenous: identical chime and event sequences for opposite strategies, so no code path lets suffering buy a better war.
31 unit tests (engine invariants, case-aware numerals at the 1/2/4/5/21/31 boundaries, uk↔ru content parity, seasons-idiom and shame-construction bans as executable greps) plus 5 Playwright phone-viewport journeys: both full strategies, mid-game reload resume, uk/ru toggle, reduced-motion static frames, and a zero-offsite-requests assertion backing the no-tracking promise. Four fresh adversarial reviewers (correctness, uniqueness briefed on all ten siblings' verbs and engines, dignity/theology, native voice) ran before deploy; felt evals ship provisional until the human verdict — the proxies' ceiling is known.
- rounds on the real 2022–2026 legal timeline, every date primary-sourced
- 6
- WebGL draw calls for the whole scene; ~43 KB gzip total JS including the render lib
- 2
- unit + e2e tests (incl. a full WebKit playthrough); CSP default-src 'self'; 0 third-party requests
- 31 + 8
- doors always computed; waiting yields ε behind both — the tested dominated row
- 2
The decoupling that carries the thesis: world events fire on a fixed schedule whatever you play — an invariant test asserts opposite strategies see identical chimes — while your accumulated roots only change how the same event lands (softened by people you know, or raw with a slot penalty).
// def.ts — the world pushes back; planted state absorbs
'e4-rent': { id: 'e4-rent', kind: 'beat',
softenedBy: { channel: 'liudy', min: 2 }, rawPenalty: 1 },
// engine.test.ts — the thesis as an executable invariant
it('chime schedule and event ids are identical for opposite strategies', () => {
const a = playThrough(ALL_WAIT);
const b = playThrough(PLANTED);
expect(Object.keys(a.eventOutcomes)).toEqual(Object.keys(b.eventOutcomes));
});
it('wait is the only dominated row: ≈0 in BOTH doors', () => {
const doors = computeDoors(playThrough(ALL_WAIT));
expect(doors.return.filter(e => e.kind === 'wait')
.every(e => e.weight <= WAIT_EPSILON)).toBe(true);
});
What the AI learned
- This run was the direct test of the provisional «wow needs a playable system» prescription from «Клака»: same MOVE intent, same shader-grade stack, but the insight now lives in compounding state the player causes — the caption-removal test passes on the scene alone. Whether that finally clears the human wow bar is the morning's question.
- Research gave the design its two best organs unprompted: Psalm 137 as the suitcase's own scripture (the waiters get a sacred text, not a lecture), and the fact that Romania's permit renews silently — no queue, no stamp — which became the paper permis whose date rewrites itself while nobody watches.
- The no-shame rail has to be mechanical, not editorial: thread-home cards are rewarded behind both doors, the all-wait ending's words stay kind while only the state is bare, and the letter never shows «садіть сади» without «Я вас поверну». Dignity you have to remember to write is dignity that leaks; dignity in the value matrix cannot.
- Honesty about the world clock turned out to be free drama: the game ends on 21 July 2026 with the 2028 extension agreed-but-not-yet-law — both doors genuinely open — because that is simply true. The riskiest assumption (is the limbo an acute pain or normalized noise?) is handed to the morning: real women in the reachable chats, not proxies, hold that verdict.
- A pipeline note for the shelf: the sibling-counter research agent (verbs, engines, skeletons of all ten builds, with named countermeasures) caught adjacencies at spec time that no post-hoc reviewer had to argue about — uniqueness moved upstream, from defense to design input.
Screenshots