You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Refine ADR-012's operational-knowledge model from a strict upward tree (Skill → Guide → ADR) into a many-to-many graph with Persona as a first-class node, enforced by bidirectional frontmatter backlinks and a parity linter in CI. This makes downstream artifacts (personas, skills) detectably-in-sync with their parent ADRs without a full-repository semantic read — directly mitigating the staleness risk ADR-012 itself flags but does not solve.
Refinement, not reversal (per #380 boundary test): the three-layer ADR→Guide→Skill decision stands; we are extending the "Reference direction" section. This is intended as the first real exercise of the in-place refinement path introduced by #380 — ADR-012 is edited in place with a ## Changelog entry, not superseded.
Motivation
ADR-012 §"Reference direction" asserts references point upward only in a tree. Real usage breaks the tree:
One ADR → many personas — ADR-003 shapes Planner, Implementor, Reviewer, and Administrator.
One skill → many personas — shared skills (e.g. validate-dependencies) serve Implementor and Planner.
ADR-012 lists this as an unmitigated risk: "(!) Reference chain integrity must be maintained — a broken link between layers means drift goes undetected." This issue mitigates it mechanically.
Decision to encode (graph + invariant)
ADR (decision) ──affects──▶ Persona ──exercises──▶ Skill
▲ many-to-many ▲ │ many-to-many │ │
└────────────────┴──────────┴──────────────┴─ optional direct Skill→ADR
Persona becomes a first-class node (e.g. Administrator, PR Reviewer, Issue Triager, Implementor, Planner), living under a documented home (docs/personas/ and/or the plugin agents/ dir — to be decided in design).
Edges are declared in frontmatter on both endpoints, e.g.:
Invariant (parity linter): every declared edge MUST be reciprocated on the other endpoint. A one-directional edge fails CI. A skill with no ADR parent MUST declare adrs: [] explicitly (deliberate, not an oversight).
Maturity is derived, not stored: do NOT add "operationalized / enforced / validated" status fields to ADRs (they rot — cf. ADR-003's Implemented/Planned enforcement column). Compute maturity by walking the graph: operationalized iff ≥1 persona references it; enforced iff a skill/hook implements it.
Honest boundary (tabula-rasa / ADR-010)
The parity linter verifies structural consistency (links resolve and reciprocate; supersede flags surface dependents for review) — not semantic freshness (that the skill still reflects the ADR's intent). State this limit explicitly in the ADR so the standard doesn't over-promise. Semantic freshness remains a human/agent judgment.
Define the frontmatter edge schema for ADR / Persona / Skill (and where personas live).
Specify the parity-linter contract (inputs, the reciprocity invariant, failure output) — implementation may be a follow-up.
Document the supersede interaction: when an ADR goes superseded, the linter flags all referencing personas/skills for review.
Sync Starlight mirror for ADR-012; commit alongside source.
Acceptance criteria
ADR-012 expresses ADR↔Persona↔Skill as a many-to-many graph with reciprocal edges; the old "upward tree only" wording is replaced and a changelog entry records the refinement.
The frontmatter schema is precise enough that a linter can be written from the ADR alone.
The structural-vs-semantic limit is stated explicitly.
No implementation-maturity status fields are added to any ADR.
Summary
Refine ADR-012's operational-knowledge model from a strict upward tree (Skill → Guide → ADR) into a many-to-many graph with Persona as a first-class node, enforced by bidirectional frontmatter backlinks and a parity linter in CI. This makes downstream artifacts (personas, skills) detectably-in-sync with their parent ADRs without a full-repository semantic read — directly mitigating the staleness risk ADR-012 itself flags but does not solve.
Motivation
ADR-012 §"Reference direction" asserts references point upward only in a tree. Real usage breaks the tree:
validate-dependencies) serve Implementor and Planner.ADR-012 lists this as an unmitigated risk: "(!) Reference chain integrity must be maintained — a broken link between layers means drift goes undetected." This issue mitigates it mechanically.
Decision to encode (graph + invariant)
docs/personas/and/or the pluginagents/dir — to be decided in design).personas: [planner, implementor, reviewer, administrator]adrs: [ADR-003, ADR-008],skills: [pickup-issue, validate-dependencies]adrs: [ADR-003](or explicitadrs: []for intentionally standalone),personas: [implementor],guide: CONTRIBUTOR_WORKFLOW.mdadrs: []explicitly (deliberate, not an oversight).Implemented/Plannedenforcement column). Compute maturity by walking the graph: operationalized iff ≥1 persona references it; enforced iff a skill/hook implements it.Honest boundary (tabula-rasa / ADR-010)
The parity linter verifies structural consistency (links resolve and reciprocate; supersede flags surface dependents for review) — not semantic freshness (that the skill still reflects the ADR's intent). State this limit explicitly in the ADR so the standard doesn't over-promise. Semantic freshness remains a human/agent judgment.
Deliverables
## Changelogentry + bumpLast-updated(uses docs(governance): allow in-place refinement of accepted ADRs (refine vs. supersede + Last-updated + Changelog) #380 mechanics).superseded, the linter flags all referencing personas/skills for review.Acceptance criteria
Dependencies
References
(!)integrity risk this resolves)Filed under contribution governance (ADR-003). No implementation/file edits until
approved+ assigned.