ADR-0002: Fix artifact lifecycle design flaws
Status: accepted | Date: 2026-01-17
References: RFC-0000
Context
Analysis of the artifact lifecycle state machines revealed several design flaws:
-
Clause
kindvsstatusduplication: Thekindenum includesdeprecatedalongsidenormativeandinformative, butstatusalso hasdeprecated. This creates confusion about where deprecation state belongs. -
ADR missing
rejectedstate: The ADR lifecycle isproposed → accepted → superseded. If a proposal is rejected rather than accepted, there is no state to record this outcome. The alternative is leaving it asproposedforever or deleting it, both of which lose information. -
Work Item forced activation before cancellation: The lifecycle
queue → active → done|cancelledimplies you must start work before abandoning it. This is illogical - planned work can be abandoned before starting. -
RFC status×phase constraint rules undocumented: The 3×4 matrix of valid/invalid status×phase combinations exists implicitly but is not formally documented in SCHEMA.md.
Decision
We will fix all four lifecycle design flaws:
-
Remove
deprecatedfrom Clausekind: Thekindfield should only contain semantic categories (normative,informative). Deprecation is a lifecycle state that belongs instatus. -
Add
rejectedto ADR lifecycle: The new lifecycle becomes:proposed → accepted → superseded → rejectedThis allows recording when a proposal was considered but declined.
-
Allow Work Item
queue → cancelled: The new lifecycle becomes:queue → active → done ↘ ↘ cancelledWork can be abandoned at any stage.
-
Document RFC constraint rules: Add explicit invariant rules to SCHEMA.md stating when status×phase combinations are forbidden.
Consequences
Positive:
- Cleaner separation of concerns (kind = category, status = lifecycle)
- Complete lifecycle coverage for all artifact types
- Explicit rules prevent confusion about valid state combinations
Negative:
- Existing tools validating
kind: deprecatedwill need updating - Schema version bump required for breaking changes
Migration:
- Any clause with
kind: deprecatedshould change tokind: normative, status: deprecated - Currently no such clauses exist in the codebase