Skip to content

ADR-005: Concern practices.md is HELIX-activity-keyed

Source identity (from 02-design/adr/ADR-005-concern-practices-activity-keyed.md):

ddx:
  id: ADR-005
  depends_on:
    - helix.prd

ADR-005: Concern practices.md is HELIX-activity-keyed

DateStatusDecidersRelatedConfidence
2026-05-30AcceptedHELIX maintainersconcerns library, context-digest assemblyHigh

Context

AspectDescription
ProblemConcern practices.md files use two incompatible organizing principles. Some are keyed by HELIX activity (Discover / Frame / Design / Test / Build / Deploy / Iterate), so per-activity context-digest assembly is a mechanical lookup. Others are keyed by topic (Implementation / Quality Gates / etc.), forcing the context assembler to guess which heading belongs to which activity.
Current StateTen concerns are topic-keyed: auth-local-sessions, caching-strategy, classic-layered, cqrs, domain-driven-design, enterprise-application-patterns, hexagonal-architecture, mcp-server, onion-architecture, sample-data. The remaining concerns already organize practices by HELIX activity.
RequirementsPer-activity context-digest assembly must be a deterministic lookup, not a heuristic. The concerns library must use one consistent organizing principle so that any consumer — context assembler, alignment review, methodology docs — extracts the practices for a given activity by reading the corresponding heading.

Decision

Every concern’s practices.md organizes its per-activity content under HELIX activity headings: Discover, Frame, Design, Test, Build, Deploy, Iterate. Topic-keyed or quality-gates-keyed organization is no longer acceptable for practices.md.

Activity-keying makes per-activity context-digest assembly a mechanical lookup: the assembler reads the heading whose name matches the current activity and pulls the bullets underneath. No guessing, no mapping table, no per-concern schema.

The ten topic-keyed concerns named above convert to activity-keying in Phase 3 of the artifact-types-and-concerns audit. New concerns ship activity-keyed from day one.

Key Points: HELIX activity headings are the only acceptable top-level structure in practices.md | mechanical per-activity lookup | ten existing topic-keyed concerns convert in Phase 3

Alternatives

OptionProsConsEvaluation
Keep both styles (activity-keyed and topic-keyed)No conversion workContext-digest assembly must implement per-concern mapping logic and stay in sync as concerns evolveRejected: pushes guesswork into every consumer
Topic-keyed everywhere (Implementation / Quality Gates / …)Matches a few existing concernsForces the assembler to guess which topic applies to which activity; topics differ by concernRejected: not mechanically extractable
Add a frontmatter mapping table from topic → activity in each practices.mdPreserves topic proseIntroduces a per-concern schema to maintain; the heading and the mapping can driftRejected: heading is already the natural index
Activity-keyed everywhere; convert the ten topic-keyed concerns in Phase 3One consistent structure; mechanical lookup; matches the majority of existing concernsRequires per-concern restructuring for ten concernsSelected: smallest sufficient unification

Consequences

TypeImpact
PositivePer-activity context-digest assembly becomes a mechanical heading lookup across every concern.
PositiveDownstream consumers (alignment review, methodology docs, the website mirror) get a uniform structure to render and reason about.
PositiveNew concerns have one obvious shape to follow; no per-concern bikeshed about structure.
NegativeThe ten topic-keyed concerns require restructuring; some topic prose (e.g. cross-cutting Quality Gates) has to be reseated under the activity it applies to.
NeutralThe bullet content of each concern is preserved; only the organizing headings change.

Risks

RiskProbImpactMitigation
Conversion silently drops practice content during restructuringMMPhase 3 conversion reviews the diff per concern; bullets must land under exactly one activity heading
Cross-cutting content (e.g. Quality Gates) has no natural single activity homeMMAllow the same bullet to appear under more than one activity heading when it genuinely applies across activities; prefer the closest activity otherwise
New concerns drift back to topic-keyingLMLint or review check rejects practices.md whose top-level headings are not from the HELIX activity vocabulary

Validation

Success MetricReview Trigger
Every practices.md uses HELIX activity headings as its top-level structureA practices.md lands or merges with topic-keyed headings
The ten named concerns are converted in Phase 3 with no lost contentPhase 3 closes with any of the ten still topic-keyed
Context-digest assembly extracts per-activity practices by heading lookup, with no per-concern mappingThe assembler grows per-concern conditional logic

References

  • PRD
  • Phase 1A plan: docs/helix/02-design/plan-2026-05-30-artifact-types-and-concerns-audit.md
  • Concerns library: workflows/concerns/