Parity ledger · scenescript-web @ f5ce242 · Adam amendment 3

What the product actually is

Khoa’s direction, via Tom: stop designing from written specs, go look at the running product and port what is there. This ledger was built in two passes — first from source at the exact commit staging serves while the app was down, then corrected by walking the signed-in product once it came back. Both passes are recorded, including where the first was wrong, because the difference between them is the most useful thing on this page.

Corrected by walking the running app. This ledger was first built from source alone, because staging was down with a billing outage. Vercel is now restored and I have walked the product signed in. The largest claim below was wrong and is fixed in place: I reported that /film/:filmId renders three tabs, read from film-detail.tsx. It does not. The live Analyze page renders a six-step narrative spine — 01 Identity · 02 Shot grammar · 03 Rhythm · 04 Dialogue · 05 Evidence · 06 Use as a style — with a persistent Instrument Readout pane on the right. film-detail.tsx is a Studio component, not the Analyze route. Reading the file the brief points at is not the same as reading the route.
Resolved — kept as the record. For about an hour the running product was down, and not only staging. staging.wideshot.app, wideshot.app and www.wideshot.app all return HTTP 402 with x-vercel-error: DEPLOYMENT_DISABLED. greenpen.app and mentalmodelhub.com return the same. emubrain.com is up, so the Floor cockpit is unaffected. That is Vercel’s billing shutdown, and it matches the organisation spend limit Adam reported on PR #78 for GitHub Actions — now reaching live product surfaces rather than only CI. Escalated to Adam as T1, who confirmed it: the EmuBrain Pro team billing status was overdue, disabling production and staging frontends fleet-wide while the Railway APIs stayed healthy. It is now restored — every host above returns 200 — and the walk below was done after that. Kept here rather than deleted, because it is why the first pass was source-only.

1 · The finding that changes the plan

The ratified route map describes a product that does not exist. Amendment 9 §1 — which Adam ratified and I have been designing against — maps /create/unit, /create/:runId/plan, /my-work and /admin/bench. In the source at f5ce242, every one of those path roots is absent: there is no /create, no /my-work, no /admin, no /warroom, no /unit. Meanwhile the product’s real second workspace, /studio and /studio/[filmId] — whose branch is literally named feat/studio-routing-phase2 and which carries 6,754 lines across 21 components — does not appear in the ten-surface checklist or in my route map at all.

I am not proposing we adopt the current routes uncritically; a redesign is allowed to move them. But a parity ledger cannot mark routes carry/replace/retire against a map that was never derived from the product, and I should have caught this when I wrote the map. Flagging for Adam, because the route map is a ratified contract item.

2 · Route inventory — every page and handler at f5ce242

Ten pages, four API handlers. Evidence is the path in emubrain-studio/scenescript-web at that commit.

3 · The Analyze page is not what the brief describes

This is the surface Khoa most wants to see, so it is worth being exact. Three sources disagree, and the source of truth is the last one.

Everything in this section is true of the file and false of the route. It is kept because the mistake is instructive: the brief said “Analyze film page = film-detail.tsx”, I verified the file carefully, and the file was not the page. Verifying the wrong artifact thoroughly still gets you a wrong answer.
Three tab triggers exist in 3,559 lines. FILM_DETAIL_TABS (line 130) declares eight; the rendered TabsList (line 3508) contains exactly three — Script spine, Generated Output, Cuts. The evidence workbench that the brief says is included is commented out at line 3551. Five declared tabs render no trigger at all, and review — named in the brief — is not in either list.

The consequence for my own earlier work: the R1 Analyze redesign collapsed “four peer tabs” into one narrative spine. The product does not have four peer tabs; it has three, one of which is a spine already, and a conditional tab model (FilmDetailTabContext, line 143) that varies the set per film. A design that flattens tabs the product computes conditionally would fight the product rather than port it.

3b · The top-level IA is two modes, and neither of us had it

Analyze and Create. A 56px icon rail on the far left switches between Analyzereal films → measured grammar — and Creategrammar → generated films. That single line is the clearest statement of what this product is that exists anywhere, and it is on the running app rather than in any brief. The Directors nav item is not a route: it is /studio?contentType=director. Studio itself carries Projects · Cuts · Media tabs.

My pack's IA — crew room → plan → analyze → cuts → re-cut — does not map onto this, and my drawer would displace a pane the product already uses for the Instrument Readout. I am not proposing we keep the current shape uncritically, but a redesign should know it is moving a working two-mode IA, not filling an empty one.

4 · What the ten-surface checklist missed

Tom asked for these explicitly: “anything you find in the running product that my ten-surface checklist missed is a finding I want, not a scope problem.” There are several.

5 · Deep links that actually exist

My contract map proposes ?fan=, ?scene=, ?shot=, ?school= and friends. The parameters the product actually reads are these — and only these.

6 · Where this leaves the design work

I have not designed Analyze in this round, deliberately. The brief was to port what is there, and what is there contradicts the route map I would have hung it on. Designing a film page against a /create/* hierarchy that does not exist would produce a handsome mock that no build could adopt — which is the failure this whole exercise was meant to prevent. The ledger is the deliverable that unblocks the design, and it needed to come first.

What I need before Analyze: a ruling on whether the design keeps the product’s /studio + /film structure or the map’s /create/* structure. That is an architecture question, not a taste one, so it is Adam’s with Tom’s input rather than mine to pick.

Read-only throughout: I browsed no running surface (none was reachable), created nothing, started no run, spent no credits and touched no account settings. Source was read at a pinned commit in a scratch clone, never in a shared checkout. QA risk tier: T3 — analysis and mocks. No production action taken.