STV_ADR_008: Stable navigation after fresh placement
Status: accepted. Date: 2026-10-24. Scope: browser layout and rendering. Decision owner: project owner through the scoped review recorded in Round 9: Stable navigation concept and implementation handover. Supersedes: partially STV_ADR_006: Centered layout and interactive overview for repeated parent recentering on relationship/root toggles. Superseded by: partially STV_ADR_009: Resolve evidence rows before exploration for classified test evidence; legacy-role and navigation decisions remain.
Context and requirement paths
The owner approved the Keep node positions stable ... (STV_PR_013) prototype after correcting Firefox arrow clipping and initial ID order. Reapplying collision-aware centering after every toggle moves the activated node and its peers. The refined centering scope is Center parents over their v... (STV_SHR_052) / Center parent boxes with co... (STV_SWR_056); stable navigation is Keep navigation positions s... (STV_SHR_054) / Stabilize committed navigat... (STV_SWR_058) / Render complete edge bounds... (STV_SWR_059), and fresh numeric ordering is Order initial ordinary node... (STV_SHR_055) / Use natural ID order for fr... (STV_SWR_060). Owners remain Semantic rank layout (STV_SWE_LAYOUT) and Accessible view and viewport (STV_SWE_RENDER).
Decision and algorithm
Keep ELK.js 0.10.0 as an ordering proposal, semantic bands and custom safe routing. Fresh initialization/seed/overview/page scenes use collision-aware parent centering; edge-free ordinary rows use full-ID natural numeric ordering. For group/root commands pass previous committed geometry and the activated key into layout. Preserve surviving ordinary horizontal slots, anchor its band, allocate new slots near fresh proposals translated toward the anchor and retain surviving test-lane x. Preserve same-rank test offsets; append newcomers and reranked shared tests, then make vertical room above/below the clicked band. The complete deterministic constants and exceptions are in Internal interfaces and model contract and Implementation concept and handover.
Recompute and validate all routes after final placement. Negative x/y are valid; the renderer covers every route/node with padded SVG bounds and matches the CSS origin to its viewBox. Commit geometry only with the current request’s accepted scene. Failures/stale completions retain the last committed state and geometry. Reset viewport fits committed node bounds without relayout; restore focus with preventScroll. Geometry is per-view transient state, never serialized into Needs.
Alternatives and consequences
ELK incremental hints alone cannot enforce the semantic/test-lane invariants. Translating the entire recomputed graph preserves only one anchor and still moves its peers. Keeping every old x/y unconditionally cannot accommodate taller bands or reranked shared tests. Recenter-on-every-toggle reproduces the reported defect. The selected projection deliberately sacrifices renewed exact centering and can leave gaps after collapse; fresh navigation starts compact the scene. No manual dragging, persistent saved layout, optimal crossings or arbitrary rank changes of ordinary Needs are introduced. The separate artifact vertical-target CR is outside this decision. No dependency, component boundary, schema or event transition changes. The software view depicts the geometry feedback; the state view names stable slots.
Verification and handover
Use Stable navigation geometry ... (STV_TC_SW_043), Complete finite SVG bounds (STV_TC_SW_044), Natural ID ordering for fre... (STV_TC_SW_045), Stable keyboard navigation ... (STV_TC_SY_058), Negative route rendering an... (STV_TC_SY_059), Natural seeded order surviv... (STV_TC_SY_060) and existing fresh-centering/transactional/viewport cases. Review test designs before execution. Development evidence belongs to PR013 final development verification; a new release requires separate owner instruction and complete release qualification.