100%

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_TECHNICAL drain in route_walk.py reusing 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.