100%

Criterion-model functional/technical classification SSOT

Goal

Make the functional-vs-technical distinction representable on a SuccessCriterion so every downstream gate can key off it.

Implementation Sketch

Add kind: functional | technical to the SuccessCriterion field set (scripts/plan_corpus/schemas.py _CRITERION_ALLOWED_FIELDS ~1593) and the v7 $def (scripts/plan_corpus/schemas/v7/plan-routing.schema.json SuccessCriterion). Extend validate_success_criterion (1676) with the enum check. Add classification query helpers (criteria_functional / is_functional) beside criteria_ownerless (1866). Add a kind column to render.py _render_success_criteria. Field is optional for backward-compat read; create-plan (section-02) requires it on new plans.

Spec References

scripts/plan_corpus/schemas.py:1593-1917; scripts/plan_corpus/schemas/v7/plan-routing.schema.json SuccessCriterion $def.

Work Items

  • Add kind enum field to _CRITERION_ALLOWED_FIELDS + v7 SuccessCriterion $def (functional|technical).
  • Extend validate_success_criterion with the kind enum teeth (reject unknown values).
  • Add criteria_functional / is_functional classification helpers beside criteria_ownerless.
  • Add kind column to render.py:_render_success_criteria; pytest accept/reject + classification-query coverage.