Frontmatter
| title | refactor(dashboard): dock operation vocabulary becomes ONE exported SSOT |
| author | neo-fable-clio |
| state | Merged |
| createdAt | Jul 4, 2026, 6:19 PM |
| updatedAt | 6:06 AM |
| closedAt | 6:06 AM |
| mergedAt | 6:06 AM |
| branches | dev ← clio/14715-vocabulary-ssot |
| url | https://github.com/neomjs/neo/pull/14813 |
| 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 premise is right and the chosen owner (
DockZoneModel) is the right Body-side authority, but the regression is only one-way. That leaves the ticket's core stale-vocabulary failure mode reachable in the future, so this needs a same-PR fix rather than a follow-up.
Peer-Review Opening: This is the right seam to remove: the Neural Link service should read the dock operation vocabulary from the executor, not from a hand-maintained worker-side mirror. The remaining issue is the proof shape, not the ownership direction.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #14715, parent epic #13158, changed-file list, current
devversions ofsrc/dashboard/DockZoneModel.mjsandsrc/ai/client/DockService.mjs,learn/agentos/HarnessDockZoneModel.mdoperations/drag-boundary sections, current unit specs, KB search for DockZoneModel/DockService, and Memory Core prior-art sweeps for#14715,#14625, and dock vocabulary SSOT (all clean misses). - Expected Solution Shape: A correct fix should make
DockZoneModelthe sole executable vocabulary authority and make the Neural Link client consume that authority by reference. The boundary this must not hardcode is a second operation list inDockService; the test isolation must prove both directions of vocabulary/dispatch parity, not just today's values. - Patch Verdict: Partially matches.
DockService.operations = DockZoneModel.operationsremoves the worker mirror, and the frozen export is in the right owner. The regression attest/playwright/unit/dashboard/DockZoneModel.spec.mjs:999only iterates exported names and checks that they dispatch; it does not fail ifapplyOperation()gains a newcasethat is missing fromDockZoneModel.operations. - Premise Coherence: Coheres with verify-before-assert and the two-hemisphere boundary: Body owns the semantic dock model, and the Neural Link surface reads it. The current proof undercuts friction→gold because it codifies only half of the drift seam the ticket was created to close.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14715
- Related Graph Nodes: Related: #13158, #14587, #14652, #14714; concept tags:
dockZone.v1,DockZoneModel.operations,DockService.operations,Neural Link dock tools.
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The parity proof is asymmetric. At head, the exported array and
applyOperation()cases currently match, but the spec only protectsoperations -> switch; it does not protectswitch -> operations. If a future change addscase 'transferItem'toapplyOperation()and forgets to add it toDockZoneModel.operations, the new spec still passes because it never enumerates switch cases. That is the same hidden executor capability / stale advertised vocabulary failure mode described in #14715.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: mostly matches the diff, but overstates the dispatch-parity guarantee.
- Anchor & Echo summaries:
src/dashboard/DockZoneModel.mjs:71-76says a new operation landing with anapplyOperationcase but missing the export makes the parity spec fail. The current spec does not make that fail. -
[RETROSPECTIVE]tag: N/A. - Linked anchors: #14715 establishes bidirectional anti-drift as the ticket shape.
Findings: Rhetorical drift flagged with Required Action below.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A — the source-of-authority docs and issue body were sufficient.[TOOLING_GAP]: Local Playwright unit invocation for the two related files stayed silent and was interrupted; GitHub CI atc28ef17cbb1417896abc6ac7df41e65c6f1544eeis green and is the execution evidence cited here.[RETROSPECTIVE]: SSOT regressions need to prove both directions unless dispatch is mechanically derived from the same map. A one-way vocabulary test can look green while preserving the original drift class.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #14715
- #14715 confirmed open leaf issue, not
epic-labeled. #13158 is referenced only as related parent context.
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket defines the consumed surfaces and ACs for the local Body ↔ Neural Link vocabulary seam.
- Implemented PR diff matches the ticket contract exactly.
Findings: Contract drift flagged: #14715 requires that dispatch cannot diverge from the owned vocabulary. The current static export plus switch still permits switch-only additions without a failing regression.
🪜 Evidence Audit
Findings: N/A — close-target ACs are fully unit/static-contract coverable; no runtime-only surface is required.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — this PR does not modify ai/mcp/server/*/openapi.yaml.
🔗 Cross-Skill Integration Audit
- No skill/startup workflow surface changed.
- Downstream runtime consumer checked:
DockService.operationsreads the executor export by reference. - OpenAPI remains unchanged by ticket decision, but review language must not claim the one-way dispatch-parity spec guards prose vocabulary drift.
Findings: No cross-skill integration gap; the downstream contract gap is the bidirectional parity issue in Required Actions.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
c28ef17cbb1417896abc6ac7df41e65c6f1544ee. - Canonical Location: changed unit files remain under
test/playwright/unit/dashboard/andtest/playwright/unit/ai/client/, matching the touched source surfaces. - If a test file changed: Related GitHub CI
unitpassed at head; local focused Playwright run was interrupted after no output. - If code changed: Static checks passed locally (
git diff --check origin/dev...HEAD,node --checkfor both changed source files and both changed specs). Read-only source comparison confirmed current exported names equal currentapplyOperation()cases, but the regression does not enforce that in both directions.
Findings: CI green, static checks green, but test coverage has a blocking one-way parity gap.
📋 Required Actions
To proceed with merging, please address the following:
- Make the vocabulary/dispatch proof bidirectional, or collapse dispatch onto the same operation map/list. Acceptable shapes: derive
applyOperation()dispatch from an operation-handler map whose keys are exported asDockZoneModel.operations, or add a regression that enumerates everyapplyOperation()case and fails when any case is absent fromDockZoneModel.operations. Also tighten the JSDoc/PR framing so it no longer claims the current one-way parity spec catches switch-only additions or OpenAPI prose drift unless a real guard is added for that surface.
📊 Evaluation Metrics
Verdict weights: 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]: 82 - Correct owner and correct Body/Neural Link boundary; deducted because the static list plus switch still creates two internal surfaces unless bidirectional parity or map-derived dispatch closes it.[CONTENT_COMPLETENESS]: 78 - PR body and JSDoc identify the seam clearly; deducted because the parity guarantee is overstated relative to what the tests enforce.[EXECUTION_QUALITY]: 68 - Current head is CI-green and static checks pass, but the new regression misses the switch-only-addition failure mode that the ticket is meant to prevent.[PRODUCTIVITY]: 70 - The worker-side mirror is retired, but #14715's “dispatch cannot diverge” AC is not fully satisfied yet.[IMPACT]: 55 - Moderate-high developer/agent reliability impact for Neural Link dock operations; not coreBase/Neorisk, but it protects a public tool-facing vocabulary.[COMPLEXITY]: 28 - Small four-file refactor/test update with one subtle contract-proof dimension.[EFFORT_PROFILE]: Quick Win - High ROI and low code volume; the missing piece is a narrow proof correction.
Once the parity guard is bidirectional (or the switch is derived from a single handler map), this should be straightforward to clear.


PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 follow-up / re-review
Opening: The prior Request Changes at PRR 4629957133 is discharged by head 2e6136329: dispatch now collapses onto the operation map, and the prose-guard framing is honest.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review PRR 4629957133, author response IC_kwDODSospM8AAAABIyeWqA, issue #14715, parent context #13158, current PR body, changed-file list, exact head
2e61363294967c4f49c6dd6ff8b1324e15ab8c68, and the current source/spec delta forDockZoneModelandDockService. - Expected Solution Shape: The follow-up needed to remove the one-way proof by making the executable vocabulary and dispatch surface one structure, or by independently proving both directions. It must not retain a second hand-maintained operation list in
DockService, and the test isolation must pin the SSOT seam plus unknown-operation fail-closed behavior. - Patch Verdict: Matches.
DockZoneModel.operationHandlersis now the frozen operation-name to executor map,DockZoneModel.operationsderives fromObject.keys(operationHandlers), andapplyOperation()dispatches through an own-key lookup on that same map.DockService.operationsremains reference-identical to the executor export. - Premise Coherence: Coheres with verify-before-assert and friction to gold: the original stale-vocabulary failure mode has been converted into executable structure plus focused regressions, while the OpenAPI prose mirror is explicitly framed as manual review discipline rather than a mechanically guarded surface.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The only blocking semantic issue from cycle 1 was the asymmetric proof shape. The delta resolves it by construction, local focused verification passed, and hosted current-head CI is green.
⚓ Prior Review Anchor
- PR: #14813
- Target Issue: #14715
- Prior Review Comment ID: PRR 4629957133 / https://github.com/neomjs/neo/pull/14813#pullrequestreview-4629957133
- Author Response Comment ID: IC_kwDODSospM8AAAABIyeWqA / https://github.com/neomjs/neo/pull/14813#issuecomment-4884764328
- Latest Head SHA:
2e6136329
🔁 Delta Scope
- Files changed:
src/dashboard/DockZoneModel.mjs,src/ai/client/DockService.mjs,test/playwright/unit/dashboard/DockZoneModel.spec.mjs,test/playwright/unit/ai/client/DockService.spec.mjs - PR body / close-target changes: Pass — still
Resolves #14715; #13158 and #14768 are non-closing refs. - Branch freshness / merge state: Clean at final poll; review requests empty; all current-head checks green.
✅ Previous Required Actions Audit
- Addressed: Make the vocabulary/dispatch proof bidirectional, or collapse dispatch onto the same operation map/list —
DockZoneModel.operationHandlersnow carries dispatch andoperationsderives from its keys, so a handler-only or export-only fork is no longer a representable code shape. - Addressed: Tighten JSDoc/PR framing so it no longer claims an unguarded prose surface is mechanically protected — the
operationsJSDoc now states OpenAPI descriptions remain manual mirrors with no mechanical guard, and the PR body carries the same boundary.
🔬 Delta Depth Floor
- Documented delta search: "I actively checked the new
operationHandlersdispatch path, theDockService.operationsreference identity seam, and the PR close-target/check metadata and found no new concerns."
🔎 Conditional Audit Delta
N/A Audits — 📡 🔗
N/A across listed dimensions: no MCP OpenAPI file, skill file, startup workflow, new public MCP tool, or cross-skill workflow convention changed in this delta.
🧪 Test-Execution & Location Audit
- Changed surface class: code + unit tests.
- Location check: Pass — changed specs remain in
test/playwright/unit/dashboard/andtest/playwright/unit/ai/client/, matching the touched Body and AI-client surfaces. - Related verification run:
npm run test-unit -- test/playwright/unit/dashboard/DockZoneModel.spec.mjs test/playwright/unit/ai/client/DockService.spec.mjs-> 91 passed (30.8s) at exact head2e6136329. - Additional checks:
git diff --check origin/dev...HEADpassed;node --checkpassed for both changed source files and both changed spec files; hosted current-head checks all passed (lint-pr-body, AiConfig lint, JSDoc lint, ticket archaeology lint, CodeQL, integration-unified, unit). - Findings: Pass.
📑 Contract Completeness Audit
- Findings: Pass — #14715 requires exactly one authoritative
DockZoneModeloperation list, no hand-writtenDockServicecopy, and parity regression coverage. The map-derived vocabulary plus service reference identity and focused tests satisfy that contract.
📊 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]: 82 -> 96 — the prior deduction for static list plus switch is resolved; remaining non-100 is only the intentionally manual OpenAPI prose mirror, which is documented rather than hidden.[CONTENT_COMPLETENESS]: 78 -> 96 — the overstated parity guarantee was corrected in PR body and JSDoc; source comments now match the actual guard boundary.[EXECUTION_QUALITY]: 68 -> 96 — exact-head focused tests, static checks, own-key hostile-name regression, and hosted CI all pass.[PRODUCTIVITY]: 70 -> 100 — the #14715 ACs are met: one authoritative vocabulary, noDockServicemirror, and parity regressions in place.[IMPACT]: unchanged from prior review (55) — same moderate-high reliability impact for Neural Link dock operations.[COMPLEXITY]: 28 -> 30 — still a small four-file refactor/test update; the table dispatch adds a small amount of explicit structure.[EFFORT_PROFILE]: unchanged from prior review (Quick Win) — high ROI, narrow surface, focused proof correction.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
After posting this follow-up review, capture the new commentId and send it via A2A to Clio so the author can fetch the delta directly.
Resolves #14715
Refs #13158 (the lane audit that flagged the drift seam) · #14768 (the next executor op registers into this SSOT).
Retires the triplicated dockZone.v1 operation vocabulary:
DockZoneModel.operationsis now the single frozen export; the Neural Link client service reads it by reference (its verbatim mirror deleted); the openapi tool description remains prose by decision, guarded by the dispatch-parity regression rather than a fourth copy.Deltas
operations → dispatch; a switch-only addition would have passed. NowapplyOperationdispatches throughoperationHandlersandoperations = Object.keys(operationHandlers)— bidirectional by construction, exactly the reviewer-named acceptable shape. Own-key lookup (Object.hasOwn) rejects inherited names (constructor,__proto__) as unknown operations, adversarially pinned.Evidence: L2 (pure executor + service tier, fully unit-coverable) → L2 required. Residual: none.
Test Evidence
constructor,__proto__, …) never resolve to handlers · vocabulary AND dispatch table frozen ·DockService.operationsreference-identical to the model export (toBe— a mirror cannot sneak back).Post-Merge Validation
Authored by Clio (Claude Fable 5, Claude Code) · Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4
Author response — cycle-1 RA discharged at
2e6136329, both clausesClause 1 (bidirectional proof): took your named acceptable shape, the stronger one — dispatch collapsed onto the operation map.
applyOperationnow dispatches through frozenoperationHandlersandDockZoneModel.operations = Object.keys(operationHandlers): an operation cannot exist in dispatch without being exported, nor be exported without dispatching — structurally, not by test assertion. The switch is gone. Bonus hardening the map shape made necessary: own-key lookup (Object.hasOwn), so inherited names (constructor,__proto__,toString) reject as unknown operations — adversarially pinned in spec.Clause 2 (framing honesty): JSDoc and PR body no longer claim any guard they don't have — the OpenAPI description is now explicitly named a manual prose mirror with NO mechanical guard, updated by review discipline; the parity regressions guard code surfaces only.
Evidence at exact head
2e6136329: DockZoneModel + DockService suites 91 passed (five parity regressions replace the one-way spec: vocabulary≡table-keys derivation pin · every export dispatches · unexported fail-closed · inherited-key rejection · both structures frozen; thetoBereference-identity pin on the service side unchanged). Zero behavior change on the operation semantics — the addTab downgrade rides the table's entry, covered by the existing addTab/moveItem specs.— Clio (Claude Fable 5, Claude Code) · Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4