You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Predecessor: #1755 and its stacked draft PR, which persisted the accepted plan and made re-observation consume it.
Prototype evidence: draft PR #1743 and checkpoint 3f11f175, especially the carried-port reconciliation in svg.py.
Retrieving the prototype: git fetch origin refs/pull/1743/head:pr-1743-checkpoint, then read files with git show 3f11f1758f16341ace6b1409eff53a36a36ec715:<path>. Never check that branch out into your worktree.
Outcome
Project carried-port, header, envelope, and containment translations through the accepted owner frames, and materialize accepted member and convergence grants exactly once, emitting the TYPED_MATERIALIZATION trace event. Publishing and enforcing the cohort-final freeze is the successor's job (#1757); this issue delivers the single typed materialization the freeze will protect.
The chokepoint decision, stated explicitly: after this issue, the carried-port, header, envelope, and containment chokepoints in _settle_render_geometry are owner-frame projections of the persisted plan, not re-routes. #1755 made that possible by making re-observation consume the plan; this issue makes the translations themselves flow through the stored owner frames. If a chokepoint cannot be expressed as a projection of the accepted record, stop: that is evidence the accepted plan or translation basis is incomplete, not permission for a repair pass.
Estimate: 4-6 focused hours, hard maximum one working day. Use a fresh worktree based on the predecessor PR.
(The third lock, test_post_freeze_stages_are_validation_only, belongs to #1757, which makes the freeze binding.)
Preserve test_after_final_checkpoint_sees_settled_geometry (on main), test_render_consumes_discovery_deferral_at_final_route_guard (ported by #1759), and the opposing-bypass geometry lock test_opposing_bypass_lines_hold_separated_direction_qualified_lanes (landed by #1761).
Check the collected count on every -k run. Behavioral children also refresh the derived corpora (hash pins, gate coverage, guard goldens) and declare the churn in the PR body.
This issue finishes one typed materialization. If a translation changes feasibility, owner membership, or order, stop: that is evidence that the accepted plan or translation basis is incomplete, not permission for a repair. Deletion is part of the ownership transfer: if removing a displaced re-route path exposes missing coverage, stop and repair the earlier owner model; do not retain dual ownership.
Parent: #1745
Predecessor: #1755 and its stacked draft PR, which persisted the accepted plan and made re-observation consume it.
Prototype evidence: draft PR #1743 and checkpoint
3f11f175, especially the carried-port reconciliation insvg.py.Retrieving the prototype:
git fetch origin refs/pull/1743/head:pr-1743-checkpoint, then read files withgit show 3f11f1758f16341ace6b1409eff53a36a36ec715:<path>. Never check that branch out into your worktree.Outcome
Project carried-port, header, envelope, and containment translations through the accepted owner frames, and materialize accepted member and convergence grants exactly once, emitting the
TYPED_MATERIALIZATIONtrace event. Publishing and enforcing thecohort-finalfreeze is the successor's job (#1757); this issue delivers the single typed materialization the freeze will protect.The chokepoint decision, stated explicitly: after this issue, the carried-port, header, envelope, and containment chokepoints in
_settle_render_geometryare owner-frame projections of the persisted plan, not re-routes. #1755 made that possible by making re-observation consume the plan; this issue makes the translations themselves flow through the stored owner frames. If a chokepoint cannot be expressed as a projection of the accepted record, stop: that is evidence the accepted plan or translation basis is incomplete, not permission for a repair pass.Estimate: 4-6 focused hours, hard maximum one working day. Use a fresh worktree based on the predecessor PR.
Starting reproduction
pytest -q -n 0 tests/test_corridor_cohort_integration.py -k 'materializ' --collect-only -qZero collected on the predecessor: the materialization locks named below do not exist yet.
Scope
member_geometry.py: project exact persisted member/edge/segment identities through their stored owner frames.convergences.py: project exact persisted plan/trunk recipe identities through their stored owner frames.svg.py: gather the known carried-port/header/envelope/containment translations, materialize once, and emitTYPED_MATERIALIZATIONfrom Trace final settlement and resolve seed-72 routing defects #1746's vocabulary at that point.Test additions
test_final_solve_materializes_accepted_grants_before_cohort_finaltest_owner_frame_translation_is_solver_free(The third lock,
test_post_freeze_stages_are_validation_only, belongs to #1757, which makes the freeze binding.)Preserve
test_after_final_checkpoint_sees_settled_geometry(onmain),test_render_consumes_discovery_deferral_at_final_route_guard(ported by #1759), and the opposing-bypass geometry locktest_opposing_bypass_lines_hold_separated_direction_qualified_lanes(landed by #1761).Non-goals
Acceptance
final solve -> typed materialization, trace-asserted.Verification
pytest -q -n 0 tests/test_corridor_cohort_integration.py::test_final_solve_materializes_accepted_grants_before_cohort_final tests/test_corridor_cohort_integration.py::test_owner_frame_translation_is_solver_free pytest -q -n 0 tests/test_deferred_final_guards.py pytest -q -n 0 tests/test_convergence_corridor_grants.py pytest -q -n 0 tests/test_corridor_cohort_integration.py -k 'opposing_bypass' pytest -q -n 0 tests/test_hash_seed_determinism.py ruff check src/nf_metro/layout/routing/member_geometry.py src/nf_metro/layout/routing/convergences.py src/nf_metro/render/svg.py ruff format --check src/nf_metro/layout/routing/member_geometry.py src/nf_metro/layout/routing/convergences.py src/nf_metro/render/svg.py mypyCheck the collected count on every
-krun. Behavioral children also refresh the derived corpora (hash pins, gate coverage, guard goldens) and declare the churn in the PR body.#1653 guardrail and stop condition
This issue finishes one typed materialization. If a translation changes feasibility, owner membership, or order, stop: that is evidence that the accepted plan or translation basis is incomplete, not permission for a repair. Deletion is part of the ownership transfer: if removing a displaced re-route path exposes missing coverage, stop and repair the earlier owner model; do not retain dual ownership.