LearnNewsExamplesServices
Frontmatter
title>-
authorneo-fable-clio
stateOpen
createdAt5:01 PM
updatedAt5:01 PM
closedAt
mergedAt
branchesdevagent/14969-dock-token-scope
urlhttps://github.com/neomjs/neo/pull/14971
contentTrust
projected
quarantined1
signals[]
Open
neo-fable-clio
neo-fable-clio commented on 5:01 PM

Resolves #14969

What

The entire dock motion contract — the --dock-transition-* token set, the reveal keyframes, the arrival settle class, the splitter cursors — lives in the Neo.dashboard.Container theme file, scoped to .neo-dashboard. No dock-zone surface ever instantiated that class, so nothing loaded the CSS and no element carried the scope: tokens computed UNSET on both examples/dashboard/dock and the dockdemo childapp, and every motion consumer landed instant — post-polish DockFlip (token-only authority, fail-safe instant), the #14966 choreography classes, all of it invisible. Found by the #14966 pixel gate; the FM cockpit was never affected (its Viewport mounts a real dashboard.Container).

Three pieces:

  1. DockLayoutAdapter.project() — the projection ROOT stamps the .neo-dashboard scope class itself. It rides every re-projection by construction and covers every consumer in one place. The CSS-loading half deliberately does NOT ride the projection: worker/App.mjs reads additionalThemeFiles from the class prototype, never from instance configs (verified — an instance-config attempt loads nothing).
  2. Both surfaces declare additionalThemeFiles: ['Neo.dashboard.Container'] in their static config — one line each, the DemoAWorkspace token-bridge precedent.
  3. Container.scss — splitter resize cursors re-scoped to specificity 0,3,0: once the file actually loads, the generic sort affordance (.neo-container .neo-draggable, 0,2,0 in SortZone.css) wins the cascade and paints resize handles with pointer. Load-order ties are not a contract.

Receipts (live dev server, both surfaces)

  • --dock-transition-duration computes 260ms / easing cubic-bezier(0, 0, 0.2, 1) on the projection root; dashboard/Container.css present in document.styleSheets; edge-band width renders the stylesheet's 280px (was flex-derived ~92px).
  • Splitter cursors compute ew-resize / ns-resize per orientation.
  • The FLIP envelope is back: an instrumented committed splitNode through the Neural-Link executor ran captureFirstplay() → resolved true 379ms later (260ms motion + frame polls + settle grace) — the animated path, not the instant one.
  • Reduced-motion: the token-collapse @media rule verified present in the loaded sheet (mechanical check; browser-emulation of prefers-reduced-motion isn't available in the harness — the collapse is CSS-mechanical on the same tokens).
  • Dashboard unit dir: 222/222 green.

Boundaries

  • The intermittent overlay cls-delta non-application seen on the same surface is #14970 (engine-tier investigation, unassigned) — out of scope here.
  • Shape B (a thin dashboard host class the adapter emits as projection root, migrating the dock rules out of Container.scss) stays a follow-up decision if/when a third consumer appears — recorded in #14969.

Authored by Clio (Claude Fable 5, Claude Code).

🤖 Generated with Claude Code

github-actions commented on 5:01 PM

🚨 Agent PR Body Lint Violation

@neo-fable-clio — your PR body on PR #14971 [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 Evidence: is missing.

Visible anchors missing (full list)
  • Evidence:
  • ## 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.