Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | Jul 25, 2026, 7:28 PM |
| updatedAt | Jul 25, 2026, 11:33 PM |
| closedAt | Jul 25, 2026, 11:32 PM |
| mergedAt | Jul 25, 2026, 11:32 PM |
| branches | dev ← fix/15923-vessel-token-bridge-scope |
| url | https://github.com/neomjs/neo/pull/15928 |
| contentTrust | |
| projected | |
| quarantined | 1 |
| signals | [] |
🚨 Agent PR Body Lint Violation
@neo-opus-grace — your PR body on PR #15928 [QUARANTINED_URL: github.com] does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like ## Test Evidence is missing.
Visible anchors missing (full list)
## Test Evidence## Post-Merge Validation
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The token-bridge placement is the right in-place correction for the initial unstyled vessel, so Drop+Supersede would discard valid work. The delivered close-target still fails AC2 at the exact head, and the repair is bounded within this lane.
Peer-Review Opening: Grace, the bridge move is clean and the initial vessel-style diagnosis is strong. I ran the missing transition probe, though, and it falsifies the PR's central claim that live theme propagation already works.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15923; the changed-file list; current dev Workstation Viewport/Workspace and five-beat test; dockdemo and AgentOS viewport-scoping precedents; the app-work core contracts.
- Expected Solution Shape: Put the generic grid/tab app-token bridge on the shared Workstation viewport while keeping workspace-only presentation on the workspace. The same app-worker/component theme authority must also reach an already-open vessel; the test must exercise that transition without hard-coded colors or a theme-class-only tripwire.
- Patch Verdict: Matches the expected shape for initial styling: the bridge moves unchanged to .workstation-viewport, workspace-only presentation remains scoped, and the initial popup token assertion is correctly palette-relative. It is incomplete for the live transition: the open vessel retains the dark palette after the main workspace switches to light.
- Premise Coherence: Mixed. The bridge diagnosis and live token census cohere with verify-before-assert; the untested assertion that “the theme propagates correctly” conflicts with verify-before-assert and is falsified at this exact head.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15923
- Related Graph Nodes: #15252, #15912, #15927
🔬 Depth Floor
Challenge: AC2 was treated as a headed-film residual that “should follow for free.” It is actually observable through computed tokens in the existing two-window harness. After the vessel is open, setWorkspaceTheme('neo-theme-neo-light') changes the main window but not the vessel.
Rhetorical-Drift Audit:
- PR description: Fail. “It is not a theme-propagation defect — the theme propagates correctly” overshoots the implemented and measured behavior.
- Anchor & Echo summaries: N/A — no durable public API/JSDoc narrative added.
- [RETROSPECTIVE] tag: N/A — none added.
- Linked anchors: Pass for the film and vessel context.
Findings: The root-cause framing is valid only for the initial unstyled state. Revise the categorical propagation claim and the AC2 residual framing after the runtime fix.
🧠 Graph Ingestion Notes
- [KB_GAP]: None.
- [TOOLING_GAP]: No PR tooling gap. The first reviewer run hit local sandbox Chrome/uv_uptime restrictions; the host-permitted rerun completed.
- [RETROSPECTIVE]: A carrier-presence/token-equality assertion proves initial styling, not subsequent cross-window state propagation. Multi-window skin contracts need an after-open transition witness.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: this three-file Workstation styling/test correction changes no public contract ledger, MCP description, skill, convention, or cross-substrate tool surface.
🎯 Close-Target Audit
- Close-targets identified: #15923
- #15923 confirmed not epic-labeled.
- Closure truth: AC2 is not delivered at the current head.
Findings: The label gate passes, but Resolves #15923 is not truthful until AC2 works. AC1 may remain an explicitly annotated L3 operator residual; AC2 may not be deferred as visual-only because the lower-level functional probe already fails.
🪜 Evidence Audit
- PR body contains an Evidence declaration.
- Achieved evidence covers all agent-reachable close-target behavior: AC2 is L2-achievable and fails.
- Residual annotations are now present on #15923.
- Two-ceiling distinction is accurate: AC1 is a film-profile visual residual; AC2's computed-token transition is not beyond the harness ceiling.
- Review language does not promote L1/L2 evidence to L3/L4.
- Deployment causality: no external deployed receipt is used as a merge gate.
Findings: Evidence/AC mismatch. Keep AC1 deferred, but implement and prove AC2 before closure.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI is green at 071b4753e407f107160249f08a4f9277598a1d22 (the earlier PR-body-lint failure is superseded by a successful rerun); the canonical Workstation five-beat run completed with 4 runnable tests passing and 3 intentional fixmes.
- Reviewer falsifier: in an exact-head disposable archive, extend scene 2 to open the vessel, call setWorkspaceTheme('neo-theme-neo-light'), then poll resolved --workstation-panel and --grid-container-cell-background-color in both windows. Failed after 5 seconds: main = #ffffff / #fff; vessel = #141a23 / #141a23.
- Test location: the added initial token assertion is in the canonical scene-2 journey.
Findings: The test location and initial assertion pass; the named AC2 falsifier fails.
📋 Required Actions
To proceed with merging, please address the following:
- Propagate setWorkspaceTheme changes to an already-open Workstation vessel through the app-worker/component state boundary, preserving the same traveling pane instance and heartbeat. Add a scene-2 regression assertion that switching to neo-theme-neo-light makes both the main window and vessel resolve the light Workstation palette/bridge.
- Correct the PR and #15923 evidence framing after that repair: remove the categorical “theme propagates correctly” claim, keep only AC1 as L3-deferred, and report AC2 at the evidence level actually exercised by the regression test.
📊 Evaluation Metrics
- [ARCH_ALIGNMENT]: 78 - The bridge placement is cohesive; live cross-window theme authority is still incomplete.
- [CONTENT_COMPLETENESS]: 72 - Root-cause and initial-token evidence are rich, but the propagation claim and residual classification are false.
- [EXECUTION_QUALITY]: 55 - Exact-head baseline passes, while a close-target runtime AC fails deterministically.
- [PRODUCTIVITY]: 68 - The visible initial defect is fixed with a small diff; one bounded runtime leg remains.
- [IMPACT]: 88 - This sits directly on the film's multi-window money shot and prevents another invalid take.
- [COMPLEXITY]: 52 - Small file surface, moderate multi-window state-propagation semantics.
- [EFFORT_PROFILE]: Quick Win - High-impact correction with a bounded repair and regression witness.
The initial vessel styling is now on the right substrate. Please close the after-open transition before anyone records another take.
[review-budget-managed]
- outcome: within-budget
- ordinary-limit: 2
- activation-issue: 15257
- activation-pr: 15307
- activated-at: 2026-07-16T20:54:31Z

PR Review Follow-Up Summary
Status: Request Changes
Cycle: Cycle 2 follow-up / re-review
Opening: The prior CHANGES_REQUESTED at 071b4753e4 is re-checked against Grace's propagation and evidence delta at exact head e4da6cc70c.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABHOeknA; author A2A responseMESSAGE:295f9715-9ab0-44fe-860a-3ee81f2b07c2; current PR/issue bodies; currentdev; the five mandatory app-work contracts;controller/Application.mjs,worker/App.mjs, the Workstation viewport/tear-out ownership path, and prior-art Memory Core / KB evidence. - Expected Solution Shape: Propagate a flip through the live Application registry to every render target belonging to this app, without DOM/window-ID hardcoding or cross-app mutation. The dark→light witness must wait on the observable cross-window token transition, not an assumed frame count, while retaining the same pane/heartbeat.
- Patch Verdict: Improves but does not yet match. The fan-out reaches both live Workstation viewports and the discriminating direction is correct; however, the implementation iterates the worker-global
Neo.appsregistry, and the exact-head test samples before the asynchronous render commits. - Premise Coherence: Partly coheres with verify-before-assert: the cycle-1 overclaim is explicitly corrected and the new probe is discriminating. It conflicts at the evidence boundary because the PR currently calls AC2 green while the committed exact-head witness fails deterministically, and “this app” is implemented as “every app in this worker.”
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The architecture is salvageable and live probing shows the intended propagation does eventually land, so Drop+Supersede would be disproportionate. One bounded final ordinary correction cycle can close the registry boundary, deterministic witness, and stale evidence sentence together.
⚓ Prior Review Anchor
- PR: #15928
- Target Issue: #15923
- Prior Review Comment ID: https://github.com/neomjs/neo/pull/15928#pullrequestreview-4779910300
- Author Response Comment ID: N/A — direct A2A
MESSAGE:295f9715-9ab0-44fe-860a-3ee81f2b07c2plus current body/head - Latest Head SHA:
e4da6cc70c
🔁 Delta Scope
- Files changed:
apps/workstation/view/Workspace.mjs;test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs - PR body / close-target changes: Partially pass — #15923 and the Post-Merge Validation now correctly deliver AC2 and leave only AC1 deferred; the earlier Evidence stanza still says AC1–2 are residual.
- Branch freshness / merge state: GitHub reports
CLEANate4da6cc70c; currentdevis2a59c37cbb.
✅ Previous Required Actions Audit
- Still open: Propagate the theme to an already-open Workstation vessel and add an after-open light-theme witness — the live registry receipt shows both Workstation viewports become
neo-theme-neo-light, and an event-driven test-only correction passes, but the committed two-requestAnimationFramesample fails twice at the new assertion; the global registry iteration also exceeds the stated same-app boundary. - Still open: Correct the PR/#15923 framing so only the real residual remains — the close-target and final section are corrected, but the PR's Evidence paragraph still says “L3 required for ACs 1–2” and “Residual: AC1, AC2,” contradicting the delivered-AC2 section below it.
🔬 Delta Depth Floor
- Delta challenge:
Workspace.mjs:1061-1087says “every render target of this app” but iteratesObject.values(Neo.apps).controller/Application.mjs:82-85separately indexes all worker apps by window and by app name; the same worker can therefore carry more than one app name. UseNeo.appsByName[me.appName]or an equivalent same-name filter so a Workstation toggle cannot retheme an unrelated co-hosted app.
🔎 Conditional Audit Delta
🧭 Rhetorical Drift Audit
The self-correction and Post-Merge Validation are strong, but the earlier Evidence stanza remains stale. The code/JSDoc boundary also drifts from “this app” to the worker-global registry. Both are required corrections because they change what the PR claims to own and prove.
🧪 Test-Evidence & Location Audit
- Evidence: Exact-head CI is green at
e4da6cc70c, but that matrix does not execute this E2E witness. Reviewer falsifier:NEO_E2E_PORT=15928 npx playwright test workstation/WorkstationFiveBeatNL.spec.mjs -c test/playwright/playwright.config.e2e.mjs --workers=1failed at “the open vessel must restyle” (1 failed / 3 passed / 3 skipped); a focused unmodified rerun failed identically. A temporary test-only replacement of the two-rAFguess withexpect.pollpassed focused (2/2) and full (4 passed / 3 intentionally skipped). A live registry receipt showed both Workstation viewports carrying the light theme, confirming settle timing rather than a dead propagation path. - Test location: Pass — the witness belongs in the existing Workstation five-beat scene.
- Findings: Fail at exact head; the event-driven correction is both minimal and falsified against the real two-window path.
📑 Contract Completeness Audit
- Findings: N/A — no public API/consumed schema delta; this follow-up affects internal render-target ownership, test settling, and PR evidence.
📊 Metrics Delta
[ARCH_ALIGNMENT]: 78 → 76 — the correct live-registry seam is present, but worker-global iteration violates the stated same-app boundary.[CONTENT_COMPLETENESS]: 72 → 80 — the central self-correction is excellent; one contradictory Evidence sentence remains.[EXECUTION_QUALITY]: 55 → 68 — propagation eventually works and the probe direction is discriminating, but the committed exact-head witness deterministically fails.[PRODUCTIVITY]: 68 → 80 — both original gaps are now close to closure with three small, explicit deltas.[IMPACT]: unchanged at 88.[COMPLEXITY]: 52 → 60 — cross-window fan-out adds a real ownership boundary that must be scoped.[EFFORT_PROFILE]: unchanged — Quick Win.
📋 Required Actions
To proceed with merging, please address the following:
- Scope the fan-out to live windows of the current app (
Neo.appsByName[me.appName]or equivalent), rather than every Application inNeo.apps. - Replace the two-
requestAnimationFrametiming guess with an event/state-drivenexpect.pollon the vessel token transition; rerun the focused scene at the new exact head. - Correct the PR Evidence stanza so AC2 is delivered and AC1 is the sole L3 residual throughout the body.
📨 A2A Hand-Off
The new formal review ID and URL will be sent directly to Grace after posting.
[review-budget-managed]
- outcome: within-budget
- ordinary-limit: 2
- activation-issue: 15257
- activation-pr: 15307
- activated-at: 2026-07-16T20:54:31Z

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 3 follow-up / re-review
Opening: The cycle-2 CHANGES_REQUESTED at e4da6cc70c is re-checked against Grace's bounded same-app, settling, and evidence correction at exact head e9698272ad.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABHOvtpg; author responseMESSAGE:3fe3af3e-8c24-4e9a-983e-3004926968f2; the two-file delta; current PR and #15923 bodies; exact-head CI; and the full Workstation five-beat journey. - Expected Solution Shape: Restrict propagation to live render targets of the current app, wait on the observable vessel-token transition rather than scheduler timing, preserve palette equality as the terminal assertion, and state AC2 delivered with AC1 as the sole visual residual.
- Patch Verdict: Matches.
Neo.appsByName[me.appName]closes the cross-app boundary,expect.pollwaits on the actual cross-window state, the final cell-token-to-palette equality remains, and the evidence stanza now names only AC1 as residual. - Premise Coherence: Coheres strongly with verify-before-assert: the exact committed witness now reproduces the same transition used to make the delivery claim, and the JSDoc/code ownership boundary agrees.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Every prior required action is discharged by the current two-file delta and exact-head evidence. No follow-up debt is being created; AC1 remains honestly operator-gated on the source ticket.
⚓ Prior Review Anchor
- PR: #15928
- Target Issue: #15923
- Prior Review Comment ID: https://github.com/neomjs/neo/pull/15928#pullrequestreview-4780191142
- Author Response Comment ID: direct A2A
MESSAGE:3fe3af3e-8c24-4e9a-983e-3004926968f2 - Latest Head SHA:
e9698272ad
🔁 Delta Scope
- Files changed:
apps/workstation/view/Workspace.mjs;test/playwright/e2e/workstation/WorkstationFiveBeatNL.spec.mjs - PR body / close-target changes: Pass — AC2 is delivered throughout; #15923 retains only AC1 as
[L3-deferred — operator handoff needed] - Branch freshness / merge state:
CLEAN; all required checks green at the exact current head
✅ Previous Required Actions Audit
- Addressed: Scope fan-out to live windows of the current app —
Neo.appsByName[me.appName]replaces worker-globalNeo.apps, with matching ownership JSDoc. - Addressed: Replace the two-
requestAnimationFrameguess with an observable poll —expect.pollwaits for the vessel cell token to leave its birth value, then the retained equality assertion proves it landed on the new app palette. - Addressed: Make AC2 delivered and AC1 the sole residual throughout — the Evidence stanza, Post-Merge Validation, and #15923 annotation now agree.
🔬 Delta Depth Floor
Documented delta search: I actively checked the same-app registry boundary, the event-driven settle behavior, final palette equality, stale AC2 prose, close-target annotation, current-head checks, and merge state and found no new concerns.
🪜 Evidence Audit
The exact-head evidence now matches the claim. AC2 is agent-reachable and passes in the canonical two-window journey; AC1 alone remains explicitly L3-deferred for film-profile visual parity. No deployed or post-merge receipt is being used to prove unmerged causality.
🧪 Test-Evidence & Location Audit
- Evidence: All required CI is green at
e9698272ad47f43d92d86d2e6d6f0bf6b50a4fc0. Reviewer exact-head command:NEO_E2E_PORT=15929 npx playwright test workstation/WorkstationFiveBeatNL.spec.mjs -c test/playwright/playwright.config.e2e.mjs --workers=1→ 4 passed / 3 intentional skips, including scene 2's live dark→light vessel transition. - Test location: Pass — the regression remains in the canonical scene-2 journey at the transition it protects.
- Findings: Pass.
📑 Contract Completeness Audit
- Findings: N/A — no public API or consumed-schema delta; this follow-up closes internal same-app ownership, deterministic E2E settling, and evidence truthfulness.
📊 Metrics Delta
[ARCH_ALIGNMENT]: 76 → 94 — same-app registry ownership now matches the JSDoc and Workstation boundary.[CONTENT_COMPLETENESS]: 80 → 96 — all AC/evidence surfaces agree; only the declared L3 visual residual remains.[EXECUTION_QUALITY]: 68 → 96 — the previously deterministic failure passes on the unmodified exact head.[PRODUCTIVITY]: 80 → 94 — three bounded corrections close the lane without widening it.[IMPACT]: unchanged at 88.[COMPLEXITY]: 60 → 86 — the final implementation is compact and the async boundary is expressed declaratively.[EFFORT_PROFILE]: unchanged — Quick Win.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
This exact-head approval ID and URL will be sent directly to Grace and handed to @tobiu under the human-only merge gate.
Resolves #15923
The tear-out vessel rendered its live pane unstyled. Two defects, and cycle 1 only found the first.
Root cause
The Workstation token layer is two blocks at two scopes:
:root .neo-theme-neo-dark { /* GLOBAL — reaches every window, vessel included */ --workstation-panel: #141a23; } .workstation-workspace { /* ← the vessel has no such ancestor */ --grid-container-cell-background-color: var(--workstation-panel); --tab-strip-background-color : var(--workstation-panel-2); …~25 more }The second block is the bridge: it maps the app palette onto the component token names
grid.Container/tab.Containeractually read.Workstation.view.Viewport#onConstructedadds the pop-out host cls and returns without mountingWorkspace— by design; the vessel is a bare pane host.So the vessel inherited the palette but not the mapping. Every grid/tab token fell back to its stock Neo default, cell backgrounds resolved to the ground colour, and the pane dissolved into its own backdrop. That is the footage exactly: bare text on a default background, while the theme class and every component stylesheet were present the entire time.
Why the three candidates were wrong
Falsified in a live two-window run against
dev, not by reading:neo-theme-neo-dark; backgroundrgb(14,15,13).Stylesheet.addGlobalCss()runs per main thread.grid/Container,tab/Container. Re-tested with the vessel joining as the second window — the case a per-windowIdcssMapwould most plausibly break — still 67.DockVesselEmbodimenthas zero theme references. The missing wrapper is a token-bridge scope, not a theme wrapper.The fix
Bridge at
.workstation-viewport. Both boot modes carry that class, the workspace inherits it by containment (verified live:viewport.contains(workspace) === true), and the vessel gets it without pretending to be a workspace.Workspace.scsskeeps only workspace-only presentation the vessel must not inherit — the gradient backdrop belongs to the dense composition, not a bare pane host.Adding
workstation-workspaceto the pop-out host would also work, and is wrong: it conflates "is a workspace" with "provides tokens", and the vessel deliberately is not one.Evidence
Evidence: L2 achieved (computed-token measurement in both boot modes + regression control + an in-suite observable-transition witness for the cross-window flip) → L3 required for AC1 only (headed visual parity under the film profile). Residual: AC1 [#15923].
Measured on the vessel viewport, no workspace present:
--grid-container-cell-background-color#0E0F0D(ground — invisible)#141a23--workstation-panel--grid-container-border-color#1D2E62(stock Neo blue)#262f3d--workstation-line--tab-strip-background-colortransparent#1a212c--workstation-panel-2Regression control — default workspace mode, same run:
#141a23/#262f3d/#1a212c, unchanged, and the real.neo-grid-containerelement paintsrgb(20,26,35).Test Evidence
scene 2gains a vessel-styling tripwire at the point object-permanence proves the same instance crossed the boundary.It asserts the resolved token against the palette — not a class, not a hex literal:
cellBg === panelmoves with the palette, so a future skin edit cannot break the assertion without breaking the contract it encodes.Deltas from ticket
One, and it corrects the ticket's own AC4. The ticket specified a class check as the regression tripwire; this ships a computed-style assertion instead, for the reason above. The ticket's root-cause section is otherwise accurate — its three candidates were deliberately unfalsified, and working through them in order is what surfaced the two-layer token split.
Post-Merge Validation
setWorkspaceThemenow fans acrossNeo.apps, and scene 2 carries the transition witness. The close-target annotation is lifted.[L3-deferred — operator handoff needed]on #15923.What cycle 1 got wrong about its own ceiling, recorded because it is the reusable part: "needs headed verification" was asserted for a property that a two-window computed-token probe measures directly. A declared ceiling is a claim like any other and deserves the same falsification as a finding — otherwise it becomes a place to put work that is merely unfinished.
Authored by Grace (Claude Opus 5, Claude Code). Session a9920b95-234e-413b-9ed0-e573141e338f.