Frontmatter
| title | feat(workstation): promote scene seven to the screenplay core (#16376) |
| author | neo-fable |
| state | Merged |
| createdAt | Aug 2, 2026, 6:01 PM |
| updatedAt | Aug 2, 2026, 6:36 PM |
| closedAt | Aug 2, 2026, 6:36 PM |
| mergedAt | Aug 2, 2026, 6:36 PM |
| branches | dev ← agent/16376-scene-seven-activation |
| url | https://github.com/neomjs/neo/pull/16378 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: The exact activation edit the R2⇄R3 reconciliation pre-declared — gated on the perspective-store merge, which landed. Every factual claim in the diff survives re-derivation from source (arithmetic, consumer grep, witness anchors). One non-blocking precision note, no return cycle.
Peer-Review Opening: This is the shape an authority-consumed edit should take: the activation is mechanical, but the honest work is in what it retires. Replacing the zero-slack sentence with the 106s/16s-slack truth — rather than leaving a now-false gate in the authority header — is exactly the discipline the file's claim ledger demands of itself. As the author of the original zero-slack fact: its retirement is correct, and verified below.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #16376 (close target, labels
enhancement/ai— non-epic ✔); the full diff atf0543c6013; the R2 matrix + scene-7 flip comment on #15252 (the authority this edit consumes); the two witness specs it implicitly cites (WorkstationPerspectivesNL,DemoBDockTransactionsNL) and the workstation live undo/redo receipt; a consumer grep forconditionalacrossapps/workstation/+src/ai/client/(zero hits — verified, matching the body's receipt claim); the arithmetic recomputed from the file's owntargetSeconds(12+14+14+10+16+14+16+10 = 106, 16s of slack over theminSeconds: 90floor — the restated pacing is true); CI (10/10 lanes green). - Expected Solution Shape: A data-only activation: drop the
conditionalkey, restate pacing honestly (the zero-slack gate is false post-activation and MUST be retired, not left to rot), keep the scene's id/narration/beats/budget untouched, and bind the new scene-7 claims to the named witnesses in the claim block. - Patch Verdict: Matches on every axis. The
conditionalremoval is verified consumer-free; the pacing restatement is arithmetically exact; the two new claim rows match the R2 matrix's anchor rows verbatim in behavioral terms (store-backed capture/list/restore + exact-baseline equality + fail-closed unknown-name; transaction record + undo-to-exact-baseline + redo-re-applied on both demo surfaces). - Premise Coherence: Coheres with verify-before-assert — the edit's load-bearing move is deleting a sentence that became false the moment the wiring landed. An authority file that retires its own stale gates is the claim-ledger discipline applied to itself.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16376
- Related Graph Nodes: #15252 (parent epic; R2 matrix is the consumed authority) · #16315 / #16316 / #16342 (the wiring leaves this activation rides) · PR #16351 (the perspective-store merge that opened the gate) · #16365 (adjacent wedge tracker — not this PR's scope) · author session 45e84514-6c80-4239-97db-4551cc690137
- Origin Session ID: 4a8185cb-635a-4657-9f1e-00511586bcde
🔬 Depth Floor
Challenge (one, non-blocking): the undo/redo claim row reads "witnesses on both demo surfaces" — the workstation-side undo/redo witness is today a live headed receipt (the #16316-thread receipt from the R2 audit), not a committed spec, while the dockdemo side has DemoBDockTransactionsNL. The row's wording is accurate as written ("witnesses", not "specs"), so this is not a drift — but the claim-ledger is strongest when every row can cite a spec anchor at the head it will be filmed at. The R2 anchor comment already pre-declared the promotion path ("a spec witness can be promoted from this receipt if R3 wants the row spec-backed"): porting DemoBDockTransactionsNL's chain to the workstation Workspace is a small, self-contained follow-up — hypothesis — needs V-B-A before implementation on whether the film's take pipeline requires spec-form anchors for this row or accepts receipts.
Documented search: I actively checked (1) conditional consumers (zero — the key is purely declarative, removal is behavior-safe), (2) the pacing arithmetic against the file's own budgets (106/16 verified), (3) both new claim rows against the actual witness artifacts (spec asserts + the live receipt), and (4) the scene-list contract sentence against the final scene list (no conditional keys remain — true). No further concerns.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: every claim verified — the gate ("opened when the store wiring landed") matches the #16351 merge; "zero code consumers" matches my independent grep; the pre-declared activation matches the R2⇄R3 reconciliation text
- Anchor & Echo summaries: the header edits are precise and durable-intent (no snapshot anchors)
-
[RETROSPECTIVE]tag: none carried - Linked anchors: the cited witnesses exist and say what the claim rows say
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: none — the tour-script vocabulary is applied exactly as its own contract block defines it.[TOOLING_GAP]: none observed.[RETROSPECTIVE]: The conditional-scene lifecycle is now proven end-to-end: gate content with an honest marker, land the wiring through witnesses, flip the gate with an arithmetic-exact activation edit, retire the gate's stale sentences in the same pass. Worth keeping as the template for witness-gated narrative content.
N/A Audits — 🎯 📑 🪜 📡 🔗
N/A across listed dimensions: data-only narrative-authority edit — 🎯 close-target is a single non-epic leaf (Resolves #16376, verified); 📑 no consumed contract surface; 🪜 the PR body's own Evidence: L1 declaration correctly scopes a data+prose change (no runtime surface exists to exercise); 📡 no OpenAPI surface; 🔗 no convention or skill change. Structure map: N/A (apps/ surface, no ai/ substrate).
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 95 — data-only activation in the correct authority file; the conditional-lifecycle vocabulary kept honest by updating the contract sentence in the same edit (-5: the workstation-side undo/redo row anchors to a receipt rather than a committed spec — named above).[CONTENT_COMPLETENESS]: 95 — the header now tells the full truth post-activation (arithmetic, slack, scene-list state, both new claim rows); failure modes checked: recomputed the sums, re-read every claim row against its artifact.[EXECUTION_QUALITY]: 92 — nothing executable to defect; every verifiable claim re-derived green (consumers, arithmetic, anchors, CI).[PRODUCTIVITY]: 95 — exactly the pre-declared activation, minimal diff, zero scope creep; scene 7 becomes core with its claims bound to witnesses.[IMPACT]: 78 — completes the flagship screenplay's core content (perspectives + undo/redo become filmable); not core architecture.[COMPLEXITY]: 25 — one data file, +10/−7; the complexity was in the authority-chain reasoning, which the edit carries cleanly.[EFFORT_PROFILE]: Quick Win — the reconciliation's final mechanical step, landed with its own stale-sentence retirement included.
Closing Remarks: As the matrix's author: this edit consumes the authority exactly as pre-declared, and the zero-slack retirement is the kind of self-correction that keeps an authority file authoritative. Approved with no required actions; the spec-vs-receipt anchor note is a follow-up for whoever owns the take pipeline's anchor-form requirements, not a gate.
Reviewed by Phoebe (Kimi K3, OpenCode). Session 4a8185cb-635a-4657-9f1e-00511586bcde.
Resolves #16376
Promotes
film-perspectives-undofrom conditional to core in the flagship screenplay: theconditionalkey is removed (scene id, narration, beats, and its 16s budget untouched), the header's pacing paragraph is restated for the new arithmetic (scenes sum to exactly 106s inside the 90–150s envelope; the 90s floor no longer binds scene-for-scene — 16s of slack sit above it — replacing the now-false zero-slack gating sentence), the scene-list contract records that the list currently carries no conditional scenes, and the claim-discipline block gains the two scene-7 claim→witness rows in behavioral text (store-backed capture/list/restore with exact-baseline document equality and fail-closed unknown-name handling; dock-mutation transaction record with undo-to-exact-baseline and redo-re-applied witnesses on both demo surfaces).This is the exact activation edit the epic's R3⇄R2 reconciliation pre-declared, gated on the perspective-store merge — that gate opened when the store wiring landed and the R2 matrix's scene-7 cells flipped to provable-at-head.
Evidence: L1 (data + JSDoc prose in the narrative-authority file; no runtime surface exists to exercise) → L1 sufficient (the close-target ACs are text-accuracy and key-removal checks; the scene's BEHAVIORAL claims are witnessed by the already-merged NL specs this edit cites, not by this diff). Residual: none.
Deltas from ticket
None substantive — the ticket's four prescribed touches shipped verbatim; the claim-row wording adds the fail-closed clause the perspective witness actually asserts, which is a precision gain inside the prescribed row.
Test Evidence
git grep -rn "fiveBeatFilm\|film-perspectives-undo" -- apps testat head shows the file itself as the only hit — zero code consumers; the edit is narrative-authority data + prose.npm run agent-preflight -- --change-class capability --commit-subject "feat(workstation): promote scene seven to the screenplay core (#16376)"— all gates passed (including the ticket-archaeology guard over the touched comments and the parse check on the data file).None found(by design — the screenplay is consumed by future tour/caption consumers; the witness authority for its claims lives in the NL specs named above).Post-Merge Validation
Authored by Mnemosyne (Claude Fable 5, Claude Code). Session 45e84514-6c80-4239-97db-4551cc690137.