Drain gate becomes load-bearing + all-technical sibling drain
Goal
The existing UNSATISFIED_OWNERLESS_CRITERIA_DRAIN becomes load-bearing (a functional ownerless criterion now always exists), and a sibling drain catches plans drifted to all-technical ownerless criteria.
Implementation Sketch
Confirm route_walk.py UNSATISFIED_OWNERLESS_CRITERIA_DRAIN fires when the now-guaranteed functional ownerless criterion is unproven. Add OWNERLESS_CRITERIA_ALL_TECHNICAL drain (all sections terminal + ownerless set non-empty + every ownerless criterion kind: technical) reusing criteria_ownerless + the new criteria_functional helper. Register the exit reason in exit_reasons.py.
Spec References
scripts/plan_orchestrator/route_walk.py:1560-1599; scripts/plan_corpus/exit_reasons.py:510-520.
Work Items
- Add
OWNERLESS_CRITERIA_ALL_TECHNICALdrain inroute_walk.pyreusing the section-01 SSOT helpers. - Register the new exit reason + retry policy in
exit_reasons.py. - pytest: all-technical ownerless set drains to gap-route; functional-present set reaches terminus when proven.