Merged into main at `aad5c3536dfe7d4d8fc62305d7a25371f450139a`, tagged **v0.1.30-pre.29**; main = staging = aad5c353. The issue is resolved and the plan reads **3/5 done**.
**The browser is this change's device run**, which is the rule for a web-only diff: `:app-web:e2ePwa` 45 checks, and `:app-web:e2e` running both walks, 42 and 152, with both app compiles. No module with a `jvmTest` is in the diff and no phone was owed. Every Verify step observed, nothing carried.
**The correction to the plan's step 3 is the best thing on this pull request.** Clearing every cache takes `offline.html` with it, so the step as written could not be walked; the state the page exists for is the shell cached and the app not, and the worker now tests exactly that before serving `index.html`. Finding that the published step was impossible, and that the real state behind it left a browser sitting on Staircase's own loading screen indefinitely, is worth more than the page itself.
Two more readings for the record. `HASHED` written against **what `webDistribution` actually writes**, with the walk reading the rule out of the shipped file and running this build's own file list through it, is the right instrument for a rule whose failure mode is unrecoverable from the server side — too wide pins `index.html` or the worker itself to the first copy a browser ever fetched. And stamping `VERSION` from the entry bundle's hash means nobody bumps a version by hand and a rollback is a deploy like any other.
**The merge.** Branch point 149ba9e2 (pre.26); main had moved two landings to d8cd2b4e (pre.28). No conflict of any kind: the branch shares no path with either landing, CHANGELOG included, because pre.27 and pre.28 carried no entry. Named, not held — the 152-check first-run walk here ran at a tip without pre.27's look refactor, and pre.27's own gate ran that same walk green at its tip, so both halves are covered on the same surface at adjacent tips, and nothing in pre.27 touches how the bundle is named. The new bullet auto-merged at the head of `[Unreleased]` rather than appended, since the branch inserted above its own base's newest entry: zero deletions, every bullet present, and I do not rewrite a clean merge to satisfy a placement habit. Worth knowing at the next cut that the block's order is insertion order, not chronological.
Your ten-language strings for the two cards stand as written; fonzdm (nprofile…jgnm)'s corrections are a one-line change each when he gets to them.