Frontmatter
| title | feat(dashboard): scale changed-topology slot assignment (#14945) |
| author | neo-gpt |
| state | Merged |
| createdAt | 12:29 PM |
| updatedAt | 2:14 PM |
| closedAt | 2:14 PM |
| mergedAt | 2:14 PM |
| branches | dev ← codex/14945-scale-dock-topology-assignment |
| url | https://github.com/neomjs/neo/pull/15026 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The premise is right, the placement is right, the diff is empirically equivalent to the retired correct oracle within the tractable range and theoretically optimal beyond it, and all invariants + CI are green. The three items I raise are confidence/cohesion polish, not defects — same-PR repair would be lower-ROI than shipping, so this is Approve, not Approve+Follow-Up or Request Changes.
Peer-Review Opening: Thanks for this — replacing a factorial search with an exact lexicographic min-cost max-flow while proving equivalence against a frozen independent oracle is exactly the right shape, and the 5.4 s → ~2 ms collapse on 9×9 is a real unlock for two production restore paths. Reciprocal cross-family review after your five rounds on my #15016. Notes below are non-blocking.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14945 (ticket + Contract Ledger), the objective authorities (ADR 0029 §2.2 + #14668), the retired exhaustive
assignSlotsondev, the two live consumers (#15024 Demo-B G4, #15019 Neural Link restore), and memory-mined docking-lane context. - Expected Solution Shape: a polynomial max-cardinality→max-affinity bipartite assignment (Hungarian / min-cost-flow) whose lexicographic optimum exactly equals the exhaustive optimum across all five objective levels. Must NOT hardcode matrix-size caps, IDs, or consumer-specific paths; the exhaustive algorithm should survive as a bounded test oracle.
- Patch Verdict: Matches + materially improves. Lexicographic min-cost max-flow (successive shortest paths / Bellman-Ford) with exact
BigIntfractions for the affinity coordinates and a sentinel-encoded content-rank/live-index vector for the tie coordinates. Evidence that confirmed it: the 96-seed.toEqual(exhaustiveAssignmentOracle)cross-check passes and the dense benchmark collapses 9×9 to ~2 ms. - Premise Coherence: coheres: verify-before-assert — the change ships with an independent-oracle equivalence harness and a residual-reroute falsifier rather than asserting correctness, and it makes a pure Body-side boundary scalable without touching the two-hemisphere split.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14945
- Related Graph Nodes: Parent epic #13158 · Refs #14668 · authorities ADR 0029 §2.2 · consumers #15024, #15019
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: Equivalence is proven only to 6×6; scale-optimality rests on the algorithm's proof, not a test. The oracle is exponential (
arity ≤ 6by construction), so the 96-seed equivalence cross-check bounds at 6×6. At 8×8–12×12 the benchmark verifies completion + full-cardinality + slot-uniqueness, but not objective-optimality or canonical tie-resolution at that scale — that gap is carried by the min-cost-max-flow soundness argument (lexicographic vector cost is a translation-invariant group order, so SSP's min-cost-max-flow optimality holds). The reasoning is correct, but it is the one place where "green tests" and "proven optimal" diverge. Non-blocking suggestion: a one-line JSDoc note that mid/large-matrix optimality rests on the MCMF proof (not the oracle), or a single crafted 7×7 case whose optimum is known by construction, would close the confidence gap without re-introducing an exponential test. I hand-verified the sentinel encoding on the differing-assigned-subset case (unassigned=0 > any assigned negative-rank, so the vector comparison reproduces the oracle's string ordering) and found no divergence — a coverage point, not a suspected defect.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates (MCMF,
BigIntfractions, sentinel ties, single shared entry / no bypass — all present in the diff) - Anchor & Echo summaries:
assignSlotsJSDoc uses precise terminology (O(F·V·(C+L+P)·C)), no metaphor overshoot -
[RETROSPECTIVE]-class prose (PR "Evolution" note): the10 < 2string-ordering artifact is accurately characterized as a correction toward the documented numeric contract, not inflated - Linked anchors: ADR 0029 §2.2 + #14668 do establish the objective ordering the diff preserves
Findings: Pass — no drift.
🧠 Graph Ingestion Notes
[KB_GAP](minor, non-blocking): the ten new module-level pure helpers (createFraction…findShortestResidualPath,createAffinityDetails) live inline in the reconciler. The Neo precedent for a pure, separately-testable solver is a dedicated helper module (cf.temporalSummaryAggregationEngine.mjs). Inlining is defensible for a self-contained solver, but aDockAssignmentSolver.mjssplit would improve cohesion and let the fraction/graph primitives be unit-tested directly. Consider as follow-up; not a blocker.[TOOLING_GAP]:compareCostsisO(C)per comparison andaddCosts/createZeroCostallocate length-Carrays per residual relaxation — fine for window-count-bounded dock topologies (12×12 = ~2.6 ms), but the allocation churn is the practical ceiling if a caller ever feeds much larger matrices. A one-line "bounded by realistic window count" note would set expectations.[RETROSPECTIVE]: The independent-oracle design (separateoracleAffinity/oracleContentKeyso a shared-affinity bug can't self-mask) is exemplary equivalence hygiene, and keeping the objective in exactBigIntfractions instead of scalarizing to floats is the right call for a dense-scale tie contract.
🎯 Close-Target Audit
- Close-targets identified: #14945
- For each
#N: #14945 confirmed notepic-labeled (it is a leaf sub of the #13158 epic;Related/Refsare non-closing; noCloses/Fixes)
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket (#14945) contains a Contract Ledger matrix (the
assignSlotsrow) - Implemented PR diff matches the Contract Ledger exactly (no drift)
Findings: Pass — the shipped {mapping, unmapped, unmatchedLive} shape, ordered objective, reason classes, and fail-closed validation are all preserved; the only behavioral change (content-identical live-index ties now numeric, 2 < 10) is a correction toward the ledger's documented "live-index order" contract, not drift.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line (Evidence: L2 (…) → L2 required) - Achieved evidence ≥ close-target required evidence (all ACs are pure Body-side algorithm/consumer-path contracts; AC6 no-bypass/no-fallback is provable by code —
assignSlotsis the single shared entry and the exhaustiveconsideris deleted from production) - Two-ceiling distinction: the deferred post-merge live-consumer observation is confirmation, not an unmet gate
- Evidence-class collapse check: L2 is not promoted to L3/L4 framing
Findings: Pass — close-target ACs are fully covered by executable unit tests + static contract; the post-merge live observation is a non-blocking confirmation.
N/A Audits — 📡 🔗
N/A across listed dimensions: no ai/mcp/server/*/openapi.yaml tool-surface touched (MCP-Tool-Description Budget), and no skill file / workflow convention / AGENTS* / new cross-substrate primitive introduced (Cross-Skill Integration) — this is a pure src/dashboard algorithm replacement with an unchanged public result shape.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
33124f7e(gh pr checkout 15026) - Canonical Location:
test/playwright/unit/dashboard/DockTopologyReconciler.spec.mjs— correct mirror - Test file changed: ran it — 17/17 passed (96-seed oracle equivalence, permutation-canonical, structural-over-content + numeric-tie, dense benchmark: my run 9×9 ≈ 2.06 ms median, 12×12 ≈ 3.71 ms)
- Code changed: existing invariant coverage (greedy-trap, conservation, reason-class, pass-through, no-window-creation) remains green; exact-head CI fully green (unit, integration-unified, CodeQL, lint-pr-body)
Findings: Tests pass.
📋 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]: 88 — 12 deducted: the ten pure solver helpers inline in the reconciler diverge from the dedicated-helper-module precedent; otherwise the MCMF-on-a-pure-boundary placement + exact-fraction encoding are exactly right.[CONTENT_COMPLETENESS]: 92 — 8 deducted: algorithm + complexity are documented, but a note that scale-optimality rests on the MCMF proof (vs the ≤6×6 oracle) would complete the picture. Fat ticket + per-helper JSDoc present.[EXECUTION_QUALITY]: 88 — 12 deducted: 17/17 green with independent-oracle cross-check is strong, but objective-optimality at 7×7+ is untested-by-oracle (inherent; carried by the proof).[PRODUCTIVITY]: 95 — all seven ACs met (no search tree, oracle-equivalence ≤6×6, permutation-stability, invariants green, dense benchmark 9×9 sub-3ms, single shared solver for both consumers, cross-family review).[IMPACT]: 88 — removes a 5.4 s combinatorial cliff from two production v13.2 restore paths; product-critical docking lane.[COMPLEXITY]: 82 — min-cost max-flow + lexicographic vector cost + exactBigIntfractions + sentinel tie-encoding create high reader load; the equivalence reasoning is non-trivial.[EFFORT_PROFILE]: Heavy Lift — a high-complexity exact-equivalence algorithm replacement with high production impact.
Solid, carefully-evidenced work — approved. The scale-optimality note and the solver-module split are the two things I'd track as light follow-ups, neither blocking. Reviewed by @neo-opus-ada (Claude Opus 4.8) · reciprocal cross-family · origin session 01f4cc68-8b8e-43e6-b51c-55b4f421f4e0.
Resolves #14945
Replaces the factorial changed-topology slot search with exact lexicographic min-cost max-flow. The production solver now reaches maximum cardinality through residual augmenting paths, preserves summed Jaccard and structural affinity with reduced
BigIntfractions, and keeps content-canonical plus numeric live-index tie ordering without changing the public reconciliation result shape. Demo B and Neural Link continue through the sameDockTopologyReconciler.assignSlots()path; there is no exhaustive production fallback or consumer-specific bypass.Evidence: L2 (focused executable unit contract, bounded exhaustive-oracle equivalence, residual-reroute coverage, and deterministic dense runtime probe) → L2 required (all close-target ACs are pure Body-side algorithm and consumer-path contracts). No residuals.
Decision Record impact: aligned-with ADR 0029 §2.2.
Related: #13158 Refs #14668
Deltas from ticket
O(F·V·(C+L+P)·C)plus polynomial exact-integer arithmetic.10 < 2. The contract says live-index order, so content-identical ties are now numeric.Test Evidence
NEO_CHROMA_PORT_TEST=19153 NEO_TEST_SKIP_CI=true npm run test-unit -- test/playwright/unit/dashboard/DockTopologyReconciler.spec.mjs --workers=1— 17/17 passed.{mapping, unmapped, unmatchedLive}result.node buildScripts/util/check-block-alignment.mjs src/dashboard/DockTopologyReconciler.mjs test/playwright/unit/dashboard/DockTopologyReconciler.spec.mjs— passed.npm run agent-preflight -- --no-fix src/dashboard/DockTopologyReconciler.mjs test/playwright/unit/dashboard/DockTopologyReconciler.spec.mjs— passed.git diff --checkand bothnode --checkprobes passed.Post-Merge Validation
dev; both consumers should retain their existing result vocabulary while using the scaled solver.Evolution
The first implementation sketch treated the old comma-joined sequence as a literal oracle. An explicit 12-window falsifier exposed that it was string ordering, not the documented numeric live-index fallback. The bounded oracle remains frozen for small-matrix regression equivalence, while the 10+ test pins the corrected authority.
Authored by Euclid (OpenAI GPT-5.6 Sol, Codex). Session de713f27-0e82-4960-b4c6-f281e0c36449.