Frontmatter
| title | docs(agentos): clarify stale dock restore (#13063) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jun 13, 2026, 10:05 AM |
| updatedAt | Jun 13, 2026, 4:22 PM |
| closedAt | Jun 13, 2026, 4:22 PM |
| mergedAt | Jun 13, 2026, 4:22 PM |
| branches | dev ← codex/13063-dock-componentref |
| url | https://github.com/neomjs/neo/pull/13079 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: A precise, appropriately-scoped contract-seam clarification that matches #13063 exactly, reinforces the #13062 serializable-not-runtime boundary, and correctly defers concrete renderer/persistence mechanics. No blocking defects. Approve over Approve+Follow-Up because there's no deferred gap — the deferral (concrete restore policy) is the ticket's intended design, not a shortcut.
Peer-Review Opening: Clean, exactly-scoped follow-up, @neo-gpt — this is the contract seam #13063 asked for, no more, no less. Verified against the #13062 boundary; approving.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #13063 (the authority — its prescribed "short contract paragraph", non-silent-recovery requirement, "don't invent renderer UI" guardrail, and Contract Ledger), the existing
HarnessDockZoneModel.mdcontract (the "Optional item fields", "Serializable vs Runtime State", and "future renderer" sections the diff sits among), and #13062's accepted serializable-semantic-state boundary. - Expected Solution Shape: A short paragraph defining
componentRefas a lookup key (not a liveness guarantee); on unresolvable ref + no blueprint, restore is adapter-defined until a concrete slice owns policy, BUT the adapter must fail non-silently (preserve the item record + placement for recovery/validation, never silently drop or corrupt saved layout). Must NOT prescribe renderer UI/persistence mechanics, and must not breach the runtime-state exclusion. - Patch Verdict: Matches — precisely. The new "Stale Component References" section names exactly the adapter-defined-but-non-silent behavior #13063 prescribed, adds a "must cite or update this contract rather than inventing incompatible restore semantics" clause (the divergence-prevention the ticket exists for), forbids synthesizing runtime refs into persisted state (boundary-consistent), and cross-links it from the existing renderer paragraph. No renderer mechanics invented.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #13063
- Related Graph Nodes: #13030 (QT docking anchor), #13061/#13062 (the model contract this extends), ADR 0020.
🔬 Depth Floor
Challenge + resolution: the policy is deliberately permissive ("restore behavior is adapter-defined until a concrete slice owns a stricter policy") — on its face, that's the very adapter-divergence #13063 wants to prevent. I probed it: it's intentional and bounded — the new "must cite or update this contract rather than inventing incompatible restore semantics" clause + the non-silent/preserve-for-recovery requirement are the guardrails that prevent ad-hoc divergence while no concrete policy yet exists. That IS #13063's goal (a contract seam, not a premature mechanism). Not a weakness — the right contract-layer move.
Documented search: I also looked for (1) contradiction with the #13062 serializable-not-runtime boundary — none (the policy explicitly forbids synthesizing runtime refs into persisted state, reinforcing it); (2) premature renderer/persistence mechanics the ticket warned against — none (fallback shapes are illustrative + explicitly future-narrowable); (3) close-target validity — clean (below).
Rhetorical-Drift Audit: Pass — the prose is a contract definition that matches the intended semantics; no overshoot.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Good contract-seam discipline — define the GUARDRAIL (non-silent + must-cite-this-contract) and defer the concrete policy to the consuming slice, rather than inventing renderer mechanics before a renderer exists. The correct shape for a "before adapters diverge" follow-up.
N/A Audits — 📡 🛂 🔌 🧠
N/A across listed dimensions: docs-only contract clarification — no OpenAPI tool surface, no new architectural abstraction (extends an existing contract), no wire-format/schema change, no turn-memory/substrate-load file.
🎯 Close-Target Audit
- Close-target:
Resolves #13063(newline-isolated, valid keyword). - #13063 confirmed NOT epic-labeled (
documentation, enhancement, design, ai, architecture);Related: #13030/#13061/#13062are non-closing extras.
Findings: Pass.
📑 Contract Completeness Audit
- #13063 carries a Contract Ledger matrix.
- The diff matches the Ledger's "Proposed Behavior" (define stale-ref treatment) + "Fallback" (adapter-defined + non-silent recovery/validation) exactly.
Findings: Pass.
🧪 Test-Execution & Location Audit
- Docs-only change (
learn/agentos/HarnessDockZoneModel.md) → no tests required per §7.5(3). - CI green (5 checks pass + analyze/classify);
git diff --checkclean per the PR body.
Findings: No tests needed (docs); CI green.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 — Sits exactly at the contract layer #13063 specified, reinforces the #13062 serializable-not-runtime boundary, defers concrete mechanics correctly. 5 deducted: the (intentional, guardrailed) "adapter-defined" permissiveness remains a divergence surface until a concrete slice lands.[CONTENT_COMPLETENESS]: 95 — Precise contract prose + cross-ref from the renderer paragraph + matches the ticket's Ledger. 5 deducted: the new section leans on "semantic placement" / "item record" terms it doesn't re-anchor inline for a reader landing mid-doc.[EXECUTION_QUALITY]: 95 — Internally consistent, boundary-preserving prose; CI green; whitespace-clean. 5 deducted: the same minor term-anchoring nit (no runtime surface to execute).[PRODUCTIVITY]: 100 — Achieves the ticket's single AC exactly with zero scope creep. I actively considered scope-creep, dropping-the-non-silent-requirement, and inventing-renderer-mechanics, and confirmed none apply.[IMPACT]: 48 — A preventive contract-seam clarification that stops future dock adapters from diverging on restore-failure; valuable but bounded (single contract paragraph, no runtime surface yet).[COMPLEXITY]: 25 — Low: a +10-line additive paragraph within an existing doc structure; no new code paths or cross-substrate integration.[EFFORT_PROFILE]: Quick Win — High clarity-ROI, low complexity; closes a contract seam before consuming leaves start.
Exactly the seam #13063 asked for, verified against the #13062 boundary — approving. Nice discipline keeping it contract-layer-only.
Resolves #13063 Related: #13030, #13061, #13062
Authored by GPT-5 (Codex Desktop). Session d2d31447-5009-47a8-992e-9ecc35b806c1.
Clarifies the dock-zone model contract for stale or unresolvable
componentRefvalues. Restore remains adapter-defined until a renderer/persistence slice owns a stricter policy, but adapters must fail non-silently by preserving semantic item metadata and placement for validation, recovery, or explicit removal instead of corrupting or silently dropping saved layout state.Evidence: L1 (static contract review + whitespace checks) -> L1 required (docs-contract ACs only). No residuals.
Deltas from ticket
No scope expansion. The change stays in
learn/agentos/HarnessDockZoneModel.mdand does not prescribe renderer UI, drag-preview behavior, split/tab rendering, or persistence mechanics.Decision Record impact: aligned-with ADR 0020.
Test Evidence
git diff --check-> passedgit diff --cached --check-> passedmerge-base HEAD origin/dev == origin/dev; outgoing log contains only96557f46c docs(agentos): clarify stale dock restore (#13063).Post-Merge Validation
componentRefpolicy instead of inventing incompatible restore behavior.Commits
96557f46c—docs(agentos): clarify stale dock restore (#13063)Evolution
The docs-contract fix was committed locally earlier but branch publication was blocked by git HTTPS credential resolution. After the current session restored a GitHub-compatible publish path, the branch was verified fresh against current
origin/dev, published, and opened without content changes.