100%

create-plan requires a plan-wide functional acceptance criterion

Goal

A plan with work-bearing sections is refused at emit time unless it carries >=1 plan-wide (owner_section_id:null) kind: functional criterion distinct from regression proxies.

Implementation Sketch

Extend create_plan_runtime/floor.py:assert_floor_or_raise with a plan-wide gate after the per-section check: when any work-bearing section exists, require >=1 ownerless kind: functional criterion; else raise PlanWideFunctionalCriterionMissing. Catch in __main__.py:_cmd_scaffold and emit a halt envelope (exit_reason: plan_wide_functional_criterion_missing, payload.section_ids: [null]). Bug-plan floor_exempt carve-out unchanged.

Spec References

scripts/create_plan_runtime/floor.py:96-111; scripts/create_plan_runtime/main.py:157-170.

Work Items

  • Extend floor.py:assert_floor_or_raise with the plan-wide functional-criterion gate + new error class.
  • Catch the new error in __main__.py:_cmd_scaffold; emit halt envelope with plan_wide_functional_criterion_missing.
  • pytest: regression-only plan-wide criteria refused; functional plan-wide criterion accepted; bug floor_exempt still bypasses.