# Lab Report — §DEATH-01: Death, Loot & the Grave **Design lock:** 2026-07-12 · **Shipped:** `a52f9cd`, same day, Inc A/B/C in one commit. **Verified against `play.html` @ HEAD (38,712 lines):** 2026-08-18 (§DOC-02cc), 37 days after ship. **Parent build for all pre-edit citations:** `a52f9cd^` (37,166 lines). The report has exactly one commit and it *is* the ship commit, so `git show a52f9cd^:play.html` was pinned before any line number was scored (instrument 108); `git diff a52f9cd HEAD -- ` is empty — never amended. --- ## Abstract §DEATH-01 is face **F** of the §PLAY-01 *"Honest Floor"* review. It addresses a single class of defect — **the engine knew things about the player's death that it refused to transmit** — across three surfaces: the respawn message (which stated a falsehood), the whereabouts of the corpse (which had no persistent signal), and New Game+ (which deleted an unrecovered corpse silently). Three increments shipped; a fourth (Inc D, gold-loss tuning) was deleted by the design calls before build. All three increments are present and functionally intact at HEAD. The acceptance suite is **4/4 green**, and every deferral the author declared is still honestly deferred. Re-verification produced **three corrections and two new defects**: the ground-truth section is a **mixed-build citation set** (most citations resolve at the parent build, three resolve at the *post-edit* build, same paragraph); the atomicity argument for finding #5 names the **wrong mechanism** while reaching the **right conclusion** — which this pass upgrades from an assertion to a proof; the light/dark CSS labels are **inverted**; the ship commit's claim to have *"wired the long-dead `.corpse-chip` CSS"* is **false** (→ §DX-02dc); and the Local-grid grave marker has **two undocumented blind spots and zero test coverage**, despite the verification plan naming it (→ §DX-02dd). --- ## I. Intent, inspiration, and what it buys the player The §PLAY-01 thesis is one sentence: ***"the floor will be honest."*** A roguelike death is a contract, and the player can only agree to a contract they can read. This report is that contract written down. **The inspiration is a lie the game was telling.** On a failed death save the engine printed: > *"A rusted dagger is all you carry. Find your body."* It was not true. The three equipped slots — `equippedMainWeapon` / `equippedWeapon` / `equippedShield` — are **top-level `S_story` fields, not inventory entries**, and the death routine never touches them. **The engine was frightening the player with a loss it was not going to inflict** — the worst kind of dishonest floor, because it taxes play without taking anything and the tax is invisible in every metric. **Three playability gains, in order of size.** 1. **Risk becomes legible, so the player can price it.** Death costs *loose bag items and 100% of carried gold*, both recoverable from the body; equipped gear and Codex Shards are never at risk. Stated, the player makes the real decision — *"can I afford to walk back?"* — instead of the imaginary one, *"will I lose my sword?"* Difficulty the player can reason about reads as **tension**; the same difficulty unstated reads as **arbitrariness**. 2. **A death becomes an errand instead of a hole in the map.** All gold going to the corpse is a large stake, playable only if the corpse can be found. Before Inc B both signals were *arrival-gated* — the node card's 🦴 **Remains** section renders only while you stand on the grave, the journal's ☠ **Fallen Hero** list only while the journal is open. Neither helps you *decide to go*. The chip **names the place from anywhere** and turns a loss into a corpse-run. 3. **The one irreversible moment gets a door instead of a trapdoor.** NG+ resets `corpsesQuests` and clears the autosave; a player who begins it with a body still out there loses it permanently and is never told. Inc C is the file's only guard against a *silent* loss of persisted player property. **What it deliberately does not buy.** The chip opens a *view*, never a route. §CELL-13 — **no jump travel, ever** — is not negotiable, so the honest move is to make the map cost information rather than distance: the chip carries the place-name in its own text precisely *because* the map cannot centre on it. --- ## II. Method `stat`-ordered §DOC-02 pass. (1) Pin the parent build and diff the report against HEAD. (2) Score every ground-truth line citation at the parent build *and* the ship build. (3) Brace-depth walk each named function at both builds rather than trusting a regex. (4) `git log -S "" --all` with no pathspec on every symbol the census marks dead, to separate RETIRED from NEVER SHIPPED. (5) Run the report's own acceptance test. (6) Re-run the specified surfaces **in a real browser** — a throwaway Playwright probe driving `_renderMapGrid()` against three planted corpse geometries — because a read of the source cannot tell a painted marker from an unreached branch. --- ## III. Ground-truth citation audit (scored at `a52f9cd^`) | Ground-truth claim | Cited | Actual @ parent | Verdict | |---|---|---|---| | `_storyDeathSaveFall()` | L25221 | 25221 | ✅ exact | | `"…rusted dagger is all you carry"` | L25287 | 25287 | ✅ exact | | equipped-slot defaults | L22426/22439/22440 | 22426 `equippedShield` · 22439 `equippedWeapon` · 22440 `equippedMainWeapon` | ✅ set exact; **order inverted** vs the names as written | | `storyNewGamePlus()` | L23302 | 23302 | ✅ exact | | `#story-location-hd-card` | L4237–4253 | 4237–4254 | ✅ (end −1) | | `_renderObjectiveChip()` call in `storyUpdateStatus()` | L34899 | 34899 (call site; decl 34905) | ✅ exact | | `storyMapToggle()` | L35388 | 35388 | ✅ exact | | `_renderMapGrid()` | L35401 | 35401 | ✅ exact | | `.corpse-chip` CSS pair | L1317 **light** / L2891 **dark** | 1317 / 2891 | ⚠ lines exact, **labels swapped** — L2874 heads the block as *"Info Chips (light theme)"* | | node-card 🦴 Remains | L33250 | 33250 (`if` guard) / 33251 (`_mkSection`) | ✅ | | journal ☠ Fallen Hero | L29853 | **29956** | ✗ points 103 lines high, into `storyRenderQuests()`'s head — right subsystem, wrong line | | victory-close → NG+ | L36776 | 36775 listener / 36777 call | ⚠ off by one either way | | `storyRender` decl | L30491 | **30445** | ✗ at parent (see below) | | `storyRender` span end | ~L34852 | **34805** | ✗ at parent (see below) | | terminal `storyAutoSave()` | L34843 | **34797** | ✗ at parent (see below) | | no `window.confirm` in the file | 0 | 0 | ✅ exact | **Correction #1 — the ground truth is a mixed-build citation set.** The last three rows do not resolve at the parent build. They resolve at the **ship** build: `storyRender` spans **30492–34852** at `a52f9cd` and its `storyAutoSave()` sits at **34844** — the span *end* is byte-exact and the other two are off by one, against a tree the other thirteen citations predate by 78 lines. So the author re-measured this trio **after** editing and left the rest at the pre-edit tree, in the same paragraph, under one heading marked *"verified 2026-07-12."* *This refines instrument 108.* A shared offset across several citations is a build boundary — but the boundary can fall **inside a single paragraph**, and the tell is not that the offsets are large; it is that they are **inconsistent in sign** with the rest of the block. Two citations off by −103 and −46 are two errors. Three citations off by +46, +47, +46 are one *build*. --- ## IV. As-built inventory @ HEAD **Death path (Inc A).** `` `function _storyDeathSaveFall()@25950` `` — protects `` `const critTypes = new Set(['shard', 'key']);@25965` ``, bags the remainder plus `` `goldDropped: S_story.gold@25974` `` into a corpse record and `` `S_story.corpsesQuests.push(corpseQuest);@25976` ``, writes the death tattoo with its `corpseQuestId` back-link, zeroes gold, reduces inventory to `critItems + STARTER_DAGGER`, respawns at `checkpointNode || 'LHR'` at 1 HP, and renders the honest message at `` `storyRender(NODE_MAP[S_story.currentCode],@26023` ``. The equipped slots (`` `equippedMainWeapon: null,@23049` `` and siblings) appear in the routine exactly once — inside the sentence `` `stayed with you@26022` `` that tells the player they survived. **Signal (Inc B).** `` `