Overview
Closes the footgun where a process-config.yaml with scope_removed: Removed passes all current validation but fails at runtime when twig state Removed is called against an ADO Basic project (which has no Removed state — only To Do, Doing, Done).
Supports Epic #521 (mission north star) by giving consumers safe, per-template defaults when onboarding. A self-contained polyphony package that ships with a one-size-fits-all config that breaks on ADO Basic is not consumable without manual correction.
Scope
-
Extend ConfigValidator to validate state names against the process template's state set
- Accept
process_template + states: table as part of the validation context
- For every state name in
transitions: (right-hand side), assert it exists in the template's known state set
- Source of truth for state sets:
twig2/tests/Twig.TestKit/ProcessConfigBuilder.cs:48-96
- Closes V-21 validation rule (referenced in
docs/polyphony-architecture.md:36 but not enforced in code)
-
Ship per-template config scaffolds
.polyphony-config/scaffold/ — add process-config.basic.yaml (ADO Basic: To Do / Doing / Done), process-config.agile.yaml (ADO Agile: Active / Resolved / Closed / Removed etc.), process-config.scrum.yaml
- Each scaffold is valid for its template; onboarding operators copy the correct one rather than editing the default
-
Document the template-specificity rule prominently
docs/polyphony-process-config-schema.md — add a banner warning that state names on the right side of transitions: are template-specific; link to the scaffold directory
Source of record
Acceptance criteria
In-situ clause
Apply DU patterns and hygiene fixes opportunistically where natural in your scope. Don't make these the primary focus.
Created by Beethoven (Mission Keeper) — 2026-05-28
Overview
Closes the footgun where a
process-config.yamlwithscope_removed: Removedpasses all current validation but fails at runtime whentwig state Removedis called against an ADO Basic project (which has noRemovedstate — onlyTo Do,Doing,Done).Supports Epic #521 (mission north star) by giving consumers safe, per-template defaults when onboarding. A self-contained polyphony package that ships with a one-size-fits-all config that breaks on ADO Basic is not consumable without manual correction.
Scope
Extend
ConfigValidatorto validate state names against the process template's state setprocess_template+states:table as part of the validation contexttransitions:(right-hand side), assert it exists in the template's known state settwig2/tests/Twig.TestKit/ProcessConfigBuilder.cs:48-96docs/polyphony-architecture.md:36but not enforced in code)Ship per-template config scaffolds
.polyphony-config/scaffold/— addprocess-config.basic.yaml(ADO Basic: To Do / Doing / Done),process-config.agile.yaml(ADO Agile: Active / Resolved / Closed / Removed etc.),process-config.scrum.yamlDocument the template-specificity rule prominently
docs/polyphony-process-config-schema.md— add a banner warning that state names on the right side oftransitions:are template-specific; link to the scaffold directorySource of record
scope_removed: Removedinvalid in ADO Basicdocs/polyphony-architecture.md:233-263(§The footgun) + lines 36 (V-21 rule)docs/polyphony-process-config-schema.md:244-263.polyphony-config/process-config.yaml:25, 30, 34— hardcodesRemovedeverywhereAcceptance criteria
ConfigValidatorrejects aprocess-config.yamlwith state names invalid for the declared process templatedocs/polyphony-process-config-schema.mdupdated with template-specificity bannerIn-situ clause
Apply DU patterns and hygiene fixes opportunistically where natural in your scope. Don't make these the primary focus.
Created by Beethoven (Mission Keeper) — 2026-05-28