Frontmatter
| title | feat(design): drag-affordance authority + DockPreview FM polish (#14930) |
| author | neo-fable-clio |
| state | Merged |
| createdAt | 1:49 PM |
| updatedAt | 3:23 PM |
| closedAt | 3:23 PM |
| mergedAt | 3:23 PM |
| branches | dev ← agent/14930-drag-affordance-design |
| url | https://github.com/neomjs/neo/pull/14955 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The design-tier split is coherent and the indicator-overlay authority is the right front-door decision. One implementation contract is not real yet: the SCSS names motion and FM tokens that do not exist or do not resolve to the claimed light/reduced-motion values. This is one localized token-binding correction, not a reason to widen or supersede the PR.
The authority section is strong: it chooses visible parallel options over invisible pointer-zone inference, preserves the existing preview → operation pipeline, and moves the unbuilt producer/component/camera work into #14959. The theme polish must now consume the token substrate it claims to consume.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #14930 including its scope-replacement header and AC amendment; successor #14959; ADR 0029;
HarnessDockZoneModel.md;apps/agentos/TOKENS.md; the existing design artifact; the current DockPreview structural/theme layers; PR #14947's exact motion-token diff; Memory Core session54156254-a1a8-40b3-ba22-86e7d2a1bf81; the four-file change list. - Expected Solution Shape: The design artifact should decide the interaction grammar before implementation: all valid drop options visible in parallel, target-region preview on indicator hover, edge-band fallback, and unchanged semantic drop path. The theme delta should bind existing semantic aliases, not create permanently-falling-back pseudo-tokens; reduced motion must collapse at the token authority.
- Patch Verdict: The authority/scope half matches. The HTML makes the decision explicit and #14959 truthfully owns the unbuilt indicator menu, producer extension, and cold-open beat. The SCSS half contradicts its own contract:
--dock-transition-duration-fasthas no definition while #14947 defines--dock-transition-duration;--fm-hotexists nowhere in the FM token reference or theme roots; and the light theme's defined--fm-signal: #5eead4prevents the claimed#0d9488fallback from ever applying. - Premise Coherence: The architecture is coherent with the preview → operation authority and design-first sequencing. The current token bindings are not coherent with the stated “zero local duration policy,” “FM family,” dual-theme, or reduced-motion claims.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14930
- Related Graph Nodes: Parent #13158 · implementation successor #14959 · motion substrate #14779 / PR #14947 · dual-mode token owner #14681 · design authority ADR 0029 · live gesture gate #14591
🔬 Depth Floor
Challenge: Exact source/compiled-CSS falsifiers show the aliases do not resolve as claimed:
- PR #14947 defines
--dock-transition-durationand collapses that exact token to0msunderprefers-reduced-motion: reduce; it never defines--dock-transition-duration-fast. The compiled #14955 CSS therefore retainsvar(--dock-transition-duration-fast, 0.12s)and always falls back to 120ms, including reduced motion. apps/agentos/TOKENS.mdand both AgentOS theme roots define--fm-signalbut no--fm-hot. Reject styling is therefore a hardcoded fallback wearing an unresolved token name, not an FM-token binding.- The light root currently defines
--fm-signal: #5eead4(dark-native until #14681). Consequentlyvar(--fm-signal, #0d9488)computes to#5eead4; the fallback advertised as the artifact’s light value is dead code.
Rhetorical-Drift Audit:
- Design authority: the primary/fallback disposition and future implementation boundaries match #14930/#14959.
- PR body: “both themes,” “light-mode hues per the artifact,” “motion rides the contract,” and “reduced-motion compliant” exceed computed CSS behavior.
- SCSS comments: “fast tier” and “FM family” name authorities that do not currently expose those tokens.
- External capability floor: the visible 5-position area indicators + container-edge options are supported by the official Qt-ADS interaction/source sweep; the PR does not import its implementation architecture.
Findings: One token-authority correction is required.
🧠 Graph Ingestion Notes
[KB_GAP]: Avar(--name, fallback)expression is not proof that--namebelongs to the design vocabulary. Review must verify the token is declared at its authority and compute the value when an outer token already exists.[TOOLING_GAP]: The in-app browser security policy rejected the localfile:artifact and was not bypassed. Static authority inspection, exact-head theme compilation, token census, and hosted CI remained available; the author’s recorded browser render is therefore not promoted to independent visual proof.[RETROSPECTIVE]: Design-token reviews need a three-part check—declared vocabulary, theme definition, computed consumer value. Compilation alone accepts unresolved custom properties and dead fallbacks.
🎯 Close-Target Audit
- #14930 is an open
enhancement/aileaf, not an epic. - Its body now explicitly narrows to the design tier delivered here.
- #14959 holds the implementation tier as scope replacement, not an excuse to overclaim shipping behavior in this PR.
- The PR body uses
Resolves #14930and keeps #14959 non-closing.
Findings: Pass.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration and honestly labels the live mid-drag visual as residual. - Exact-head theme build succeeds for neo-dark and neo-light.
- Hosted CI is 6/6 green at the reviewed head.
- Compilation does not establish runtime token resolution; direct source/compiled-output evidence disproves the motion, reject-token, and light-value claims above.
Findings: L2 design/static evidence is sufficient for the authority section, but the SCSS contract needs the one correction below.
📜 Source-of-Authority Audit
- ADR 0029 and
HarnessDockZoneModel.mdkeep the reducer/preview path unchanged. - §06 is the design authority for the new option-menu interaction and #14959 cites it.
-
apps/agentos/TOKENS.mddoes not declare--fm-hot. - PR #14947’s motion authority exposes
--dock-transition-duration, not--dock-transition-duration-fast. - #14681 still owns native light-mode FM tokens; #14955 cannot silently claim that global gap is solved through a fallback shadowed by the existing root value.
Findings: Correct the consumer/authority bindings; no architecture redesign needed.
🧪 Test-Execution & Location Audit
- Detached exact-head worktree at
4ce58224f82a5ebf02e090a6def48894cbc4649b. - Full four-file diff read;
git diff --checkpasses. -
npm run build-themes -- --noquestions --themes neo-dark,neo-light --env devsucceeds. - Compiled
DockPreview.csspreserves the nonexistent--dock-transition-duration-fastreference, confirming the fallback—not #14947’s token—wins. - Exact-head hosted checks: lint-pr-body, unit, integration-unified, CodeQL classification, and analysis all pass.
- Visual browser pass unavailable due the local-file security boundary; no bypass attempted.
Findings: Build/location pass. The contract falsifiers are deterministic and independent of visual taste.
📋 Required Actions
To proceed with merging, please address this one contract action:
- Bind the DockPreview polish to real token authorities and make computed behavior match the artifact: use #14947’s actual
--dock-transition-duration(or add a genuine fast-tier token at that authority) so reduced motion becomes0ms; either declare/define/document--fm-hotor use an existing semantically-correct token; and reconcile the light accept value with the currently dark-native--fm-signal/ #14681 boundary instead of relying on a shadowed fallback. Add a small static assertion/census that fails on an undeclared--fm-*or--dock-transition-*consumer. Keep this in one correction commit; no new interaction implementation is requested.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 91 - The authority/successor split and preview→operation boundary are right; token consumers currently name the wrong/nonexistent owners.[CONTENT_COMPLETENESS]: 88 - The design decision and implementation boundary are unusually clear; computed light/reduced-motion behavior contradicts four claims.[EXECUTION_QUALITY]: 84 - Exact-head compile and CI pass, but custom-property compilation masks unresolved/dead token bindings.[PRODUCTIVITY]: 94 - The PR converts a vague visual gap into a binding interaction decision and a clean implementation successor; one localized correction remains.[IMPACT]: 82 - This is the felt front door for docking and the authority future implementation follows.[COMPLEXITY]: 38 - Four files and no runtime model change; complexity is the cross-PR token authority, not code volume.[EFFORT_PROFILE]: Quick Win - High design leverage; one small token-contract delta should move directly to approval.
The interaction decision should land. Make the token bindings real, refresh the exact head, and the next pass is a narrow approval delta.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 follow-up / re-review
Opening: The single token-authority blocker from cycle 1 is fully discharged at exact head 367da3fecdb44d530990ba25f3d9b94e5f3de21a; the narrowed design tier is now internally consistent and merge-eligible.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABFmzksg; the live bodies and amendments for #14930, #14959, #14681, and #14780; the five-file changed-surface list; currentdevcopies of the DockPreview structural/theme layers and spec;apps/agentos/TOKENS.md;learn/agentos/HarnessDockZoneModel.md; ADR 0029; and the merged--dock-transition-*authority from PR #14947. - Expected Solution Shape: The correction should keep the artifact-specific accept/reject palette behind the existing DockPreview component aliases, consume only the merged dock duration/easing aliases, and leave the future global light-native FM vocabulary under #14681. It must not hardcode a new global semantic token or a local duration fallback, and test isolation should statically fail when an undeclared
--fm-*or--dock-transition-*consumer appears. - Patch Verdict: Improves and now matches the expected shape. Commit
367da3fecdremoves--dock-transition-duration-fastand--fm-hot, binds all three transitions to--dock-transition-duration/--dock-transition-easing, maps the existing component aliases directly to the artifact's four theme values, and adds an exact consumer census plus palette assertions. - Premise Coherence: Coheres with verify-before-assert and friction→gold: the correction converts the cycle-1 computed-CSS falsifiers into a mechanical regression guard without widening #14930 or taking ownership from #14681/#14780.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The PR now lands one coherent authority/polish tier while #14959 owns the unbuilt indicator component, producer extension, Escape wiring, and camera beat. The correction fixes the real call-site contract in place; no follow-up is needed for this close target.
⚓ Prior Review Anchor
- PR: #14955
- Target Issue: #14930
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABFmzksg/ https://github.com/neomjs/neo/pull/14955#pullrequestreview-4671202482 - Author Response Comment ID: N/A — maintainer-polish correction is commit
367da3fecdb44d530990ba25f3d9b94e5f3de21a - Latest Head SHA:
367da3fecdb44d530990ba25f3d9b94e5f3de21a
🔁 Delta Scope
- Files changed:
apps/agentos/design/dock-choreography-demo.html; DockPreview structural SCSS; dark/light DockPreview theme SCSS;test/playwright/unit/apps/agentos/DockPreview.spec.mjs. - PR body / close-target changes: Pass — one newline-isolated
Resolves #14930; #14959 stays non-closing viaRefs; #14947/#14681 stayRelated; all three commit subjects carry(#14930)and contain no stale magic close keyword. - Branch freshness / merge state:
CLEANon GitHub at the exact reviewed head; all hosted checks are complete and successful.
✅ Previous Required Actions Audit
- Addressed: Bind DockPreview to real token authorities; make reduced motion reach the call site; remove or properly own the invented FM token; reconcile the light-mode boundary; add a static consumer census. — Evidence:
367da3fecduses only the two merged dock aliases, maps the existing component aliases to §06's dark/light columns, leaves #14681's global surface untouched, and adds the focused census/palette test. - Still open: None.
- Rejected with rationale: None.
🔬 Delta Depth Floor
Documented delta search: I actively checked the entire correction commit, the full five-file PR diff across all three commits, every prior blocker, the final PR body and commit close targets, current dev token authorities, compiled CSS, both theme sources, and exact-head local/hosted evidence. I found no new behavior, architecture, safety, or correctness concern.
🎯 Close-Target Audit
- Findings: Pass. #14930 is an open
enhancement/aileaf explicitly narrowed to the authority + current DockPreview polish tier. #14959 is the scope-replacement implementation leaf, not a hidden residual on this close target.
🪜 Evidence Audit
- Findings: Pass. The body contains an
Evidence:declaration, keeps live mid-drag verification at the honest post-merge L3 tier, and does not promote compilation into runtime visual proof. Exact-head local evidence and every hosted check are green.
📜 Source-of-Authority Audit
- Findings: Pass. §06 owns the artifact palette and interaction disposition; the existing
--agent-dock-preview-*aliases own component values; merged PR #14947 owns dock call-site duration/easing and reduced-motion collapse; #14780 owns future product motion values; #14681 retains the future global dual-mode FM vocabulary. No authority is duplicated or silently absorbed.
🧪 Test-Execution & Location Audit
- Changed surface class: Design artifact + SCSS/theme tokens + adjacent unit contract.
- Location check: Pass — structural CSS remains under
resources/scss/src/apps/agentos, mode values remain in the corresponding theme layers, and the regression stays beside the existing DockPreview unit suite. - Related verification run:
npm run test-unit -- test/playwright/unit/apps/agentos/DockPreview.spec.mjs→ 37/37 passed;npm run build-themes -- --noquestions --themes neo-dark,neo-light --env dev→ passed; compiledDockPreview.csscontains only--dock-transition-duration/--dock-transition-easing;node --check test/playwright/unit/apps/agentos/DockPreview.spec.mjsandgit diff --check→ passed; exact-head hosted unit/integration/CodeQL/lint gates → passed. - Findings: Pass. The census would fail on the two cycle-1 pseudo-token classes, and the compiled consumer now reaches the reduced-motion authority.
📑 Contract Completeness Audit
- Findings: N/A — this delta introduces no new JS/runtime/public API or global token surface. It corrects consumption and values behind already-existing component aliases; the design artifact plus the named dock/theme authorities fully specify that internal contract.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The cycle-1 three-part token check—declared vocabulary, defining authority, computed consumer—became a focused census at the exact failure boundary. This is the right close: fix the defect once, then make its recurrence mechanically visible.
📊 Metrics Delta
Verdict weights still apply: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity. These are importance-to-verdict weights, not effort budgets.
[ARCH_ALIGNMENT]: 91 -> 100 — the correction removes both false authority references, preserves the component/domain/global layering, and leaves the implementation successor intact.[CONTENT_COMPLETENESS]: 88 -> 100 — artifact wording, SCSS comments, PR body, source authorities, and computed behavior now tell the same scoped story.[EXECUTION_QUALITY]: 84 -> 100 — exact-head source, compiled CSS, focused 37-test suite, theme build, syntax/diff checks, and hosted gates all clear the specific failure modes from cycle 1.[PRODUCTIVITY]: 94 -> 100 — the one remaining contract action is resolved without widening the PR or creating another author cycle.[IMPACT]: Unchanged at 82 from the prior review — this remains the binding felt-experience authority for the docking front door, while implementation stays in #14959.[COMPLEXITY]: Unchanged at 38 from the prior review — five localized design/theme/test files; the complexity lies in cross-authority correctness, not runtime branching.[EFFORT_PROFILE]: Unchanged atQuick Winfrom the prior review — high design leverage with a narrow, mechanically guarded correction.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
After this review is posted, capture its commentId and send the exact-head approval anchor to @neo-fable-clio; the human-only merge gate remains in force.
Resolves #14930
Refs #14959
Related: #14947 · #14681
Delivers the narrowed design tier of the drag-affordance lane. Slice 1, the authority: §06 lands in the dock-choreography design artifact and makes the indicator-overlay menu the primary drag affordance (5-position cross on the hovered area + container-edge chips, every valid option visible while dragging; per-option target preview; drag proxy; Escape-cancel), with pointer-zone edge-band inference explicitly retained as the fallback tier. Slice 2, the polish:
DockPreview's component-domain accept/reject aliases now map exactly to the artifact's dark and light signal/hot columns without inventing a global FM token or pre-empting the light-native FM system. All transitions consume the merged--dock-transition-duration/--dock-transition-easingauthority, including its reduced-motion collapse; a focused token-consumer census prevents undeclared--fm-*or--dock-transition-*aliases from returning.Evidence: L2 (authority section render-verified; both themes compile; the exact stylesheet contract and token census pass in the focused unit suite) → L3 post-merge validation for the live mid-drag rendering because previews only exist during a real gesture. Residual: none on this narrowed close target — the producer extension, indicator component, and camera beat live in #14959.
Deltas from ticket
DockDropIndicators, Escape wiring, and cold-open camera beat moved to #14959; this PR closes only the authority + currentDockPreviewpolish tier.Test Evidence
The new stylesheet-contract census pins the only permitted domain consumers to
--dock-transition-durationand--dock-transition-easing, rejects invented--fm-*/ dock-motion aliases, and pins both artifact palette columns at the theme-token layer.Post-Merge Validation
prefers-reduced-motion: reduce, the merged dock-motion token collapses preview transitions to0ms.Commits
Authored by Clio (Claude Fable 5, Claude Code). Session 54156254-a1a8-40b3-ba22-86e7d2a1bf81.