LearnNewsExamplesServices
Frontmatter
id14668
titlePerspective restore into changed topology: reconciliation + the fail-closed contract
stateClosed
labels
enhancementaiarchitecture
assigneesneo-opus-grace
createdAtJul 4, 2026, 5:49 AM
updatedAt7:58 AM
githubUrlhttps://github.com/neomjs/neo/issues/14668
authorneo-fable-clio
commentsCount3
parentIssue13158
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAt7:58 AM

Perspective restore into changed topology: reconciliation + the fail-closed contract

Closed Backlog/active-chunk-3 enhancementaiarchitecture
neo-fable-clio
neo-fable-clio commented on Jul 4, 2026, 5:49 AM

Context

Tree line B5 (#13158 map) — the HARD half of restore (fable-tier in the triage): applying a captured perspective when the window topology CHANGED (fewer/more windows than capture time). ADR 0029 §2.2's restore-semantics table governs; #14653 owns the unchanged-topology case.

The Problem

Changed-topology restore is where designs lie: silently dropping panes, spawning surprise windows, or half-applying are all worse than refusing. §2.2's contract: deterministic reconciliation for the coverable subset + an explicit, RENDERED fail-closed result for what cannot restore (the Demo-B scene G4 shows this honestly — it is a feature, not an apology).

The Architectural Reality

Reconciliation = mapping captured window-slots onto live windows by shape affinity (never ids), then per-window #14653 restore plans; the uncoverable remainder returns a structured unrestored set (items + reason classes). No window CREATION in v1 (spawning is a §2.3/#13028-boundary decision — out of scope, documented). Blocked_by #14653 + B3.

The Fix

One PR: the slot-mapping reconciler (pure) + composed restore + the fail-closed result shape + specs (shrunk topology: best-coverage mapping + unrestored set; grown topology: no surprise spawns; determinism).

Acceptance Criteria

  • Slot mapping is deterministic + id-free (spec).
  • Unrestored set carries reason classes; NOTHING silently drops (spec: item count conservation — restored + unrestored = captured).
  • No window creation in v1 (review-checkable).
  • Composes #14653 per-window (no duplicate restore logic).
  • Cross-family review.

Out of Scope

Window spawning · unchanged-topology path (#14653) · UI rendering of the fail-closed result (Demo-B G4 + B7 consume the shape).

Related

Parent #13158 (line B5) · blocked_by #14653 + B3 leaf · authority ADR 0029 §2.2 · consumed by #14590 G4. Sweeps: 03:47Z clean. Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "perspective restore changed topology reconciliation fail closed unrestored"

tobiu referenced in commit a916bca - "feat(dashboard): changed-topology restore reconciler — affinity mapping + fail-closed contract (#14668) (#14925) on 7:58 AM
tobiu closed this issue on 7:58 AM