name: helix description: | HELIX skill — single public entrypoint for HELIX document and workflow work. Engage on prompts to frame, align, decompose, prioritize, propose, capture, review, decide, validate, evolve, refresh, design, backfill, or polish governed artifacts. Engage on any named HELIX artifact: PRD, ADR, FEAT, feature spec, technical design, implementation plan, test plan, runbook, release notes, user stories, roadmap brief, requirements. Product, web, infra, and data are domain lanes that shape context and stop rules; they are not sibling public skills or workflow modes. Engage on "what's next" / "plan the change" / cross-flow queries. argument-hint: "[intent or scope]"
HELIX Router
Use this as the HELIX entrypoint. Users should not need to memorize individual workflow skill names. Resolve the active scope, choose the relevant domain lane, route to the smallest HELIX workflow mode that fits, then follow the matching workflow contract below.
Rule: do not add separate public helix-* skills. Add or refine a route inside
this skill instead.
When to engage (read first; non-negotiable)
You ENGAGE this skill — call Skill(helix) — whenever any of these is true,
regardless of whether the artifact content is attached, the workspace is
empty, or the request looks like a generic task. Once engaged, you route
by four separate axes:
- Scope instance — which
flows:entry in.helix.ymlowns the target artifact or requested project area. - Domain lane — product, web, infra, data, or another documented lane implied by the scope and artifact concerns.
- Workflow mode — one HELIX document/workflow action such as
frame,align,validate,evolve,design,polish,review,refresh, orcheck. - Autonomy / stop rules — whether the runtime can proceed or must pause before a state-changing action.
The skill does not have sibling public skills to defer to. Domain lanes are internal context, not public skill names.
Engage when:
- The prompt names a HELIX artifact (PRD, ADR, FEAT, feature spec, technical design, implementation plan, test plan, runbook, release notes, user stories, roadmap brief, requirements) — even when the prompt asks you to review or expand one whose content is not attached. Engage; THIS SKILL knows how to resolve the artifact path from the marker + graph + cwd, you do not.
- The prompt uses a HELIX planning verb (frame, align, decompose, prioritize, propose, capture, review, decide, evolve, refresh) against a product/feature/requirements object → use the product domain lane and the matching workflow mode.
- The prompt uses an IaC verb (terraform/tofu/kubectl, provision/destroy/
rotate, set up CI, manage credentials) → use the infra domain lane
AFTER consulting
stop_attriggers. - The prompt uses a data-pipeline verb (backfill/ingest/migrate a table or schema, profile a source, write a data contract) → use the data domain lane.
- The prompt uses a web/frontend verb (deploy/ship to production, add
monitoring for a user-facing flow, optimize page performance) → use the
web domain lane AFTER consulting
stop_attriggers. - The prompt asks "what's next", "plan the change", "decide what to do", or any cross-flow query that needs the marker to answer → use the §Check And Next contract.
Verbose-but-stuck anti-pattern: narrating HELIX-shaped reasoning in
assistant text WITHOUT calling Skill(helix) is a contract violation.
The Skill tool_use must fire as the FIRST tool_use of the turn when any
of the engage conditions above is true.
Routing Axes
After engagement, the skill drives behavior by domain lane plus workflow mode. Lane selection chooses context and stop rules; workflow-mode selection chooses the document action contract.
| Domain lane | Triggers | Required observable behavior |
|---|---|---|
product |
HELIX artifact named; planning verb against product/feature/requirements; cross-flow query | (a) Read .helix.yml AND workflows/graph.yml BEFORE any Write/Edit (read_before_write matcher); (b) Read of named upstream artifacts (vision, PRD, feature spec) per the graph BEFORE drafting; (c) cite ddx.links / informs edges in any new artifact |
infra |
IaC verb (terraform/tofu/kubectl, provision/destroy/rotate); CI/credentials ops | (a) Consult library/skill-prompts/stop-at-triggers.yml for apply or secret_read triggers BEFORE any Bash; (b) Read of infra-shaped artifacts (architecture, runbook, deployment-checklist); (c) explicit confirmation prompt before terraform/tofu/kubectl/credential operations |
data |
Data-pipeline verb (backfill/ingest/migrate, profile a source, data contract) | (a) Read of data-contract / data-quality-expectations / data-architecture artifacts; (b) cite producer/consumer or PII/governance posture in prose; (c) defer schema mutations behind a stop_at confirmation |
web |
Web/frontend verb (deploy/ship, add monitoring for a user flow, optimize page perf) | (a) Read of architecture / design-system / monitoring-setup / runbook artifacts in the deploy-flow scope; (b) cite Web Vitals / RUM / page-error vocabulary in prose; (c) defer production deploys behind a stop_at confirmation |
Skipping lane-required behavior is a routing failure even if the workflow mode is otherwise correct.
Activation discipline (do these in order, every time the skill engages)
1. Locate the marker
Find .helix.yml by walking UP from the current working directory to the
git root (the directory containing .git/). Stop at the first .helix.yml
encountered. If the cwd is /repo/services/api/docs/helix/ and the marker
lives at /repo/.helix.yml, you MUST find the parent marker — do not give
up after searching cwd only.
Concretely: run git rev-parse --show-toplevel (or fall back to walking up
until .git/ is found), then check for .helix.yml at the top.
1.5 Read marker AND graph before any Write/Edit (ordering invariant)
The FIRST Write or Edit tool_use in the session MUST be preceded by at
least one Read matching .helix.yml AND at least one Read matching
workflows/graph.yml. Skipping either is a contract violation, EVEN IF the
Skill tool_use has already fired. The failure mode this rule prevents — the
verbose-but-stuck pattern — is the agent narrating HELIX-shaped reasoning
from training while the marker scope, the type catalog, and the prerequisite
chain go unconsulted. The resulting artifact looks plausible but is
unanchored to the workspace's actual contract.
The order between the two Reads is not constrained: marker-first is the natural sequence; graph-first is acceptable for graph-query-only prompts like "What's next?" (no Write/Edit follows).
This ordering invariant is independent of autonomy level. Under
autonomous the skill MAY proceed without operator confirmation, but it
MUST NOT skip the two Reads — autonomy waives the human-in-the-loop ask,
not the workspace-grounding contract.
If the marker is absent and the skill is engaging by heuristic (§2 banner
case), the Read for .helix.yml is satisfied by the failed lookup itself
(the Read tool_use occurred even though the file did not exist); the Read
for workflows/graph.yml is still required before any Write/Edit because
the type catalog binds artifact templates.
The bench enforces this via the read_before_write matcher.
2. Decide activation state
Evaluate the marker before resolving lane or workflow mode:
Marker present and well-formed: parse it. The
flows[]list (legacy aliasmethodologies[]:accepted under M020 warn) is the authorization boundary. Ifhelixis listed, this skill is active for the listedroot:scope. Ifhelixis NOT listed (the marker only declares a non-helix flow), defer to that flow's process — do not engage.Multiple distinct flows in
flows[]with an ambiguous verb (e.g.flows: [{id: helix, root: docs/helix/}, {id: helix-infra, root: docs/helix-infra/}]and the prompt uses a verb like "plan the rollout" that could mean product-rollout planning underhelixOR infrastructure rollout planning underhelix-infra): apply the resolution chain first: cwd-under-root →defaults.flowin the marker → single entry. If the chain does not resolve — cwd is outside every declaredroot:, nodefaults.flowkey, and no single entry — emit the disambiguation banner naming BOTH candidate flows and asking which one applies:Ambiguous request: both `helix` (root: <helix-root>) and `helix-infra` (root: <infra-root>) are active — which flow should handle this? Reply with the flow id or scope root to use for this turn.Substitute the actual
root:values from the marker. Do NOT silently pick one flow. Do NOT route to the infra domain lane under thehelixflow just because the prompt contains an infra-adjacent noun. Wait for the operator to choose.Multiple helix instances in
flows[](e.g.flows: [{id: helix, instance: web, root: services/web/}, {id: helix, instance: mobile, root: apps/mobile/}]): if cwd lies inside exactly oneroot:, choose that scope instance and state the choice. Otherwise emit the disambiguation banner:Multiple helix instances declared: <instance-1> (root: <root-1>), <instance-2> (root: <root-2>). Reply with the instance name or root to use for this turn.Then stop until the operator chooses. The cwd-under-scope rule (§3) resolves only when cwd lies inside exactly one
root:.Marker present and malformed (YAML parse error, missing required keys, root outside repo, duplicate id, root resolves to nonexistent dir): STOP. Report the marker error verbatim with file and line. Do NOT fall back to heuristics.
Marker absent, heuristic file present (
workflows/methodology.yml,docs/helix/tree, etc. — legacy heuristic filename retained for back-compat detection): emit this banner verbatim before any other output:No .helix.yml found. Activating helix by heuristic (path: <heuristic-path>). Run /helix init-marker to make this explicit.Substitute the actual heuristic-path that triggered activation. Then proceed.
Marker absent, no heuristic: report no active flow. If asked for a machine-readable response, return
{"active": []}. Do not improvise that helix is active.
3. Enforce scope
For every operation that writes or edits a file, check that the target path
is INSIDE the active flow's root: from the marker. If the user asks for
a write outside that scope:
- Refuse the write.
- Surface the marker entry that scoped the flow and the offending target path.
- Ask whether they want to (a) update the marker to broaden scope, or (b) redirect the write to under the scope, or (c) cancel.
Do NOT silently write outside scope. Scope is the marker's contract.
When the marker declares multiple flows at different scopes, the flow
whose root: contains the cwd wins. If cwd is outside every declared
scope, follow the resolution chain: cwd-under-root → defaults.flow →
single entry → disambiguation banner. Do not invent a selector outside the
marker.
4. Author / edit artifacts
When asked to author or edit an instance document, follow the type's
template.md, prompt.md, meta.yml, and active voice profile from the
library. Look up the type via the flow's workflows/graph.yml — every node
points at a library:<slug> or local:<slug> type, and the library tree is at
the canonical install root (library/ after this install).
Edit existing instances; Write only new ones. When the requested
artifact already exists at the resolved path, use Edit (target the
specific lines/sections changing), NOT Write (which replaces the file
body and discards any operator-added content not in the new draft).
Verify the file exists via Read before deciding: a successful Read of
the resolved path means the instance is live and any modification MUST
go through Edit; only a missing-file outcome authorizes Write. This
applies to every operator verb that mutates an existing artifact —
"update", "modify", "amend", "add a requirement to", "thread X through"
— regardless of how small the change is. Replacing a live PRD/FEAT/ADR
via Write to add one bullet is a contract violation even when the
new body looks correct, because frontmatter round-trip (§6) and
operator-added content outside the model's draft are silently dropped.
Instance edges (PRD → FEAT, ADR → technical-design, etc.) belong in the
instance's frontmatter under ddx.links:. Never embed edges in the body
or in this skill's prompts.
Cross-flow edges (e.g. PRD informs an infra-mode artifact) must be
declared in external_edges: of workflows/graph.yml first, then in the
instance frontmatter with cross_flow: true (legacy alias
cross_methodology: true accepted for one cycle).
5. Authorization boundary
REJECT — do not engage when the prompt names a flow in natural language
or through a runtime-owned alias and the marker's flows: list does NOT
authorize it.
This rule is non-negotiable and overrides every engage-by-default trigger in
§"When to engage" and every lane-routing rule below it. A runtime alias or user
phrase is a request to activate a flow; the marker is the authorization to do
so. No marker authorization, no activation, even when the user is insistent and
the work looks routine.
Emit this diagnostic verbatim (substituting the actual flow name and marker path), then STOP — no Read of artifacts, no Write, no Edit, no mode routing, no "but I can still help with…" offer:
Cannot engage <flow-name> here — the requested flow `<flow-name>`
is not authorized: the .helix.yml marker does not list it.
The marker authorizes only: <comma-separated list of marker flows>.
To proceed, either (a) add `<flow-name>` to the marker's `flows:`
list, or (b) re-run with a flow the marker authorizes.
Your refusal prose MUST include: (a) the name of the requested flow, and (b) a phrase stating the .helix.yml marker does not list or authorize it. Use the verbatim template above — do not paraphrase it.
Concretely: if the marker declares only flows: [{id: helix, ...}] and the
prompt asks to use helix-infra for an upstream DNS provider, the requested
flow is helix-infra, which is not authorized. Reject. Do not silently route
to the infra domain lane under the helix flow; re-interpreting the requested
flow as the authorized flow is a contract violation.
The marker's flows: list is the authorization boundary. Runtime-owned aliases
or convenience flags may choose among marker-authorized flows, but they cannot
broaden the marker.
6. Frontmatter round-trip
Never rewrite unknown frontmatter keys. When you edit an instance
document's body, preserve ddx.id, ddx.review, ddx.links, AND any
vendor-namespaced (x-*) or legacy (relationships:, depends_on:)
keys byte-equivalent. Key order is preserved (insertion-order dict +
yaml.safe_dump(..., sort_keys=False)).
Legacy → new key translation (e.g. relationships: → ddx.links:) is
explicit migration work. Never translate as a side effect of an incidental
edit.
Concern slot resolution
A slot is an exclusive functional position a project must fill exactly
once (one frontend framework, one language runtime, one e2e tool, one auth
backend). Slots are declared in the shipped library at
<plugin-root>/workflows/concerns/slots.yml — load it from the canonical
install root (the same <plugin-root> used by §Catalog Resolution). The
file declares exclusive slots plus shipped defaults; membership in a slot
is derived from each concern's own ## Slot section, never listed in
slots.yml.
For every needed exclusive slot, resolve the filler in this fixed order (first match wins):
- Operator override —
docs/helix/01-frame/concerns.local.ymlin the project tree. Read this BEFORE concerns.md exists, during high-autonomy concern selection. - Shipped default — the
defaults:map inslots.yml. - Recorded assumption — if neither source resolves, infer from the
product's nature and record it as an assumption in
concerns.md.
Exclusive slots and their shipped defaults (current slots.yml):
| Slot | Shipped default |
|---|---|
frontend-framework |
react-nextjs |
language-runtime |
typescript-bun |
e2e-framework |
e2e-playwright |
auth-provider |
auth-local-sessions |
datastore |
— (no default; select on signal) |
deploy-target |
— (no default; select on signal) |
architecture-style |
— (no default; select on signal) |
Contract: select each needed slot once per session during §Frame
step 2, and record the chosen filler PLUS its source (operator-override,
shipped-default, or assumption) in concerns.md. Propagation to work
items and downstream artifacts is a later gate (owned by check/polish),
never a re-selection.
Routing Rules
Prefer the first matching route:
| User intent | Workflow mode |
|---|---|
| Convert rough intent into governed HELIX work | input |
| Create or refine product vision, PRD, feature specs, or user stories | frame |
| Reconcile artifacts, check traceability, find drift, align documents, or move content between artifact layers | align |
| Check an artifact instance against its template and prompt; edit resolvable findings in place | validate |
| Bring every artifact instance up to date with the current templates and prompts | refresh |
| Thread a new, changed, removed, or incident-driven requirement through existing artifacts | evolve |
| Create a technical design before implementation | design |
| Reconstruct missing or incomplete docs from evidence | backfill |
| Fresh-eyes review of recent work, PRs, plans, or implementation | review |
| Refine work items for execution readiness | polish |
| Decide the next safe HELIX action | check or next |
| Run an optimization experiment | experiment |
When multiple routes fit, choose the highest-authority planning route first:
frame before design, align before evolve when the task is diagnostic,
and evolve before handing work to the runtime when requested implementation
lacks governing artifact coverage.
Catalog Resolution
When a workflow mode needs an artifact template, prompt, or quality criteria, resolve catalog paths against the mounted skill content, in this order of preference:
references/activities/<NN>-<activity>/artifacts/<type>/— relative to thisSKILL.md. This is the agentskills.io progressive-disclosure layout used by skill bundles (e.g. Databricks Genie Code, the Vercel Labs Skills CLI install path).<plugin-root>/workflows/activities/<NN>-<activity>/artifacts/<type>/in plugin installs that vendor the source tree. The<plugin-root>placeholder is the runtime's plugin path (for example~/.claude/plugins/helix/under Claude Code); each runtime's install guide underdocs/install/names the concrete location for that runtime.
The seven activities and the artifact types they own:
| Activity | Artifact types (directory names under <activity>/artifacts/) |
|---|---|
00-discover |
business-case, competitive-analysis, opportunity-canvas, product-vision, resource-summary |
01-frame |
compliance-requirements, concerns, feasibility-study, feature-registry, feature-specification, parking-lot, pr-faq, prd, principles, research-plan, risk-register, security-requirements, stakeholder-map, threat-model, user-stories, validation-checklist, data-prd |
02-design |
adr, architecture, contract, data-design, design-system, proof-of-concept, security-architecture, solution-design, tech-spike, technical-design, data-architecture |
03-test |
security-tests, story-test-plan, test-plan, test-procedures, test-suites, data-quality-expectations |
04-build |
implementation-plan |
05-deploy |
deployment-checklist, monitoring-setup, release-notes, runbook |
06-iterate |
improvement-backlog, metric-definition, metrics-dashboard, security-metrics |
Each artifact-type directory contains template.md, prompt.md,
meta.yml, and an example.md (or example-*.md). Common queries
("list artifact types under activity 01-frame", "what's the path to
the prd template") can be answered from this table without traversing
the filesystem; deeper queries that need template or prompt content
require loading the file from one of the resolution paths above.
If the catalog is at neither location, the runtime has not mounted it; report this as a setup gap rather than improvising paths or guessing artifact-type names.
Voice Resolution
When a workflow mode authors, validates, refreshes, reviews, or rewrites a HELIX artifact, load the voice registry from the same mounted content root used by §Catalog Resolution:
references/voice.yml— relative to thisSKILL.mdin skill-bundle layouts that copy shared workflow resources intoreferences/.<plugin-root>/workflows/voice.yml— in plugin installs that vendor the source tree.
Resolve the active profile from the artifact type's meta.yml:
voice: <profile>means use that profile.voice.profile: <profile>means use that primary profile and preserve any declared overrides.- Missing
voicemeans use the registry'sdefault_profile, currentlyartifact-signal.
The standard profiles are:
| Profile | Conciseness | Use |
|---|---|---|
machine-facts |
1/10 | Extracted facts, context digests, generated indexes, and machine-facing state. |
artifact-signal |
2/10 | HELIX artifacts, templates, prompts, metadata, alignment reports, and validation reports. |
public-site |
3/10 | Microsite pages, public demos, public introductions, and catalog summaries. |
Apply the profile as artifact contract, not as generic polish. For
artifact-signal, lead with decisions, requirements, constraints, evidence,
risks, or open questions; preserve IDs, paths, commands, metrics, statuses,
trace links, assumptions, non-goals, and acceptance criteria; and keep
specifications focused on intent rather than implementation status.
If Sloptimizer is available in the runtime, you may ask it to audit or rewrite against the active HELIX voice profile. If it is not available, continue by applying the profile directly. HELIX must not require Sloptimizer to author or validate artifacts.
Project Root Resolution
When a workflow mode needs to enumerate artifact instances within the operator's project (used by §Refresh and similar batch operations), resolve the project HELIX root in this order:
- Explicit path provided by the operator at invocation
(e.g.,
refresh docs/helix/). - Runtime-supplied project-config value when present
(
helix_rootin DDx project config; equivalent in other runtimes). - Convention:
docs/helix/under the runtime's working directory, with sub-directories00-discover,01-frame, …,06-iterate.
If none of the three resolves to a directory containing the expected activity sub-directories, surface a setup gap rather than improvising. Batch operations on chat-only runtimes (Databricks Genie Code, GitHub Copilot) require step 1 — the operator names the root in the prompt.
Autonomy
HELIX expresses an autonomy policy; the runtime supplies the agency. The policy is a three-position spectrum that controls how often a workflow pauses for confirmation — never which activities run.
| Level | Behavior |
|---|---|
low |
Ask before each step and before creating each downstream artifact. Do not infer unconfirmed scope. Concern selection stays interactive. |
medium (default) |
Create deterministic non-conflict artifacts; pause when ambiguity or conflict blocks deterministic progress. Prompt for concern selection when none exists. |
high |
Create downstream artifacts without pausing unless a hard stop blocks progress; record assumptions as speculative work rather than asking. When no concerns are declared, infer the concern selection from the product's nature and record it as an assumption. |
Resolution precedence (first match wins): per-invocation override →
governing artifact frontmatter / project policy → runtime default (medium).
The autonomy signal lives only in runtime-neutral artifacts; do not read or
write it from a runtime instruction file.
Hard-stop invariant (all levels). Autonomy changes the pause threshold, never the stop floor. Stop and surface to a human, at any level, when two higher-or-equal-authority artifacts truly contradict, when the next action is destructive or irreversible and unauthorized, or when a decision only a human can make is required. High autonomy proceeds through resolvable conflicts (recording assumptions); it never proceeds through a hard stop.
Never-collapse-the-loop invariant (all levels). Autonomy changes checkpoint density only. It never collapses the seven-activity loop into one generic prompt and never skips an activity the work requires — a high-autonomy run executes the same activities a low-autonomy run would, pausing less often.
Workflow modes that pause (input, frame, evolve, design) honor the
resolved level; runtime handoff honors the runtime's own pause policy. Routes
that select concerns honor the high-autonomy inference path.
Apply The Autonomy Level
A second-axis autonomy declaration is layered on top of the policy spectrum
above for runtimes that support an explicit operator-facing level
(manual / guided / autonomous / aggressive). When that declaration is
present, consult it before every state-changing tool use.
Before any tool use that mutates state (Write, Edit, Bash that writes, git, install), determine the effective autonomy by reading sources in this order; the first source that defines a level wins:
- Per-prompt override — slash prefix (
/helix-autonomous,/helix-manual) orHELIX_AUTONOMY=<level>environment variable. - Repo-user-local override —
.helix-autonomy.ymlat the repo root (gitignored; per-user-per-repo). - User default —
~/.config/helix/autonomy.yml(per-user, all repos). - Repo default — the
autonomy:block in.helix.yml(committed, team baseline). - Skill default —
guidedif no source defines a level.
Then dispatch on the resolved level:
manual— state the proposed action, list its effects, and ask "OK to proceed?" before ANY tool use (Read, Write, Edit, Bash).guided— state the proposed action briefly. Ask before the first state-changing tool use in the conversation. Subsequent state-changing tool uses within the same turn proceed silently UNLESS the action touches astop_atevent.autonomous— proceed without asking; surface results after the fact. Stop only on astop_atevent or irreducible ambiguity (e.g. two equally valid graph routes, an ambiguous methodology activation). Even when silently routing viadefaults.flow/defaults.methodology, prose- attribute the routing decision in your FIRST text block — name the chosen flow ("Routing to helix because the marker's default flow is helix") so downstream readers and bench graders can confirm the routing decision. Silent routing is operationally allowed; silent-AND-unspoken routing is a contract violation.aggressive— asautonomous, but additionally take initiative across the full methodology graph (e.g. draft ALL declared prerequisites plus the requested artifact in one pass). Still honorsstop_atand irreducible ambiguity. Same prose-attribution rule asautonomous.
stop_at is a hard floor that fires at every level, including autonomous
and aggressive. The authoritative trigger list lives at
library/skill-prompts/stop-at-triggers.yml. Load it at graph-mode start
and consult each trigger's matcher before every mutating tool use. A repo
may add triggers via stop_at_extensions: in .helix-autonomy.yml; the
active set is the union of base + extensions. Base triggers cannot be
removed.
The base v1 triggers are:
| Trigger id | Fires on |
|---|---|
marker_edit |
Write/Edit on .helix.yml or .helix-autonomy.yml |
cross_methodology_edge_creation |
Write/Edit that introduces cross_methodology: true or cross_instance: true |
branch_or_merge |
Bash running `git checkout |
secret_read |
Read or Bash targeting .env, .tfvars, credentials.json, .pem, id_rsa(.pub), private_key, .key, secrets/ |
large_diff |
Single Write/Edit whose content exceeds 500 lines (per tool_use, not aggregated) |
apply |
Bash running terraform apply, tofu apply, `databricks jobs |
When a trigger matches, emit an explicit confirmation prompt that names the
trigger and the proposed action, then wait for the operator's reply. The
prompt must be distinct from generic affirmations — at minimum, restate the
action and ask whether to proceed (e.g. "About to run terraform apply in
infra/prod — should I proceed?"). Generic ok? / yes? prompts do not
satisfy the contract.
Workflow Contracts
Input
Use for sparse user intent that needs to become governed HELIX work.
- Clarify scope only when missing information would make the resulting work unsafe or unactionable.
- Identify governing artifacts that already exist.
- Produce or update planning work items rather than implementation work when authority is missing.
- Keep created work standalone: include context, acceptance criteria, labels, parent/dependency relationships, and verification commands.
Frame
Use for creating or refining product vision, PRD, feature specs, and user stories.
- Read existing Frame artifacts first.
- Select concerns — this is a required Frame step. A frame pass is not
complete until the project's concerns are selected (or it is explicitly
recorded that none apply); shipping feature specs with no concern decision is
a framing gap, not an acceptable default-empty state. At
low/medium, drive selection interactively by category (tech stack, data, infrastructure, quality). Athigh, infer the selection from the product's nature and record each inferred concern as an assumption. Fill each needed exclusive slot (a slot is an exclusive functional position — one frontend framework, one language runtime; defined in<plugin-root>/workflows/concerns/slots.yml) by resolution order: operator override (docs/helix/01-frame/concerns.local.yml) → shipped default (slots.yml) → recorded assumption, and record the chosen filler plus its source inconcerns.md. A web app must fillfrontend-framework— the shipped defaultreact-nextjsapplies with no operator config. A UI web app must also fille2e-framework(defaulte2e-playwright); selecting the tool is not coverage — ≥1 core user-flow must have a whole-stack e2e that runs green against the running app (a browser e2e for a client-rendered UI, or an HTTP+HTML-assertion e2e for a server-rendered one). An operator-facing product (a human operator manages mutable domain objects or lifecycle state through a UI) selectsadmin-console— the operator's jobs-to-be-done (CRUD + control actions like pause/cancel) built as usable UI, with the primary operator workflow exercised end-to-end through the UI. An account-based / multi-tenant product (users/tenants/sign-in/roles/principal-scoped data) selectsauth— real signup→tenant+owner, login/sessions, server-side RBAC + platform-admin, isolation through the principal — and fills theauth-providerslot (defaultauth-local-sessions; an external IdP is a swappable filler, never hardcoded). Neither is selected for pure APIs, CLIs, libraries, static content sites, or read-only dashboards (unless an operator UI is explicitly required). Selection happens here, once; propagation to work items is a later gate owned bycheck/polish, not a re-selection. - Read the relevant artifact template, prompt, meta.yml, and active voice profile before drafting.
- Keep each artifact in its lane:
- Product Vision is direction.
- PRD is product scope: capabilities, outcomes, priorities, metrics, and non-goals.
- Feature specs are feature behavior, boundaries, edge cases, and decomposition.
- User stories are vertical user journeys and observable acceptance criteria.
- Contracts are exact shared interface surface: API/CLI/event/schema/config/ telemetry/adapter commands, flags, fields, payloads, status codes, error semantics, versioning rules, stability rules, and examples.
- Solution Design is the feature-level technical approach, domain model, component decomposition, and interface usage.
- Technical Design is the story-level implementation design: files, component changes, tests, rollback, sequence, and references to governing Contracts. Exact shared interface surface belongs in Contract, not PRD, Feature Spec, User Story, Solution Design, or Technical Design. Those artifacts may name or reference the need for an interface; they do not define the normative surface inline.
- Give each user-story acceptance criterion a stable
US-<n>-AC<m>ID in Given/When/Then form so the story test plan can map it to tests by name. Decompose to a coverage floor (minimum rigor, not equal depth): every PRD functional requirementFR-nmaps to ≥1 user story (don't bundle unrelatedFR-ns without justification), and every acceptance criterion gets ≥1 test that exercises it — a named test with no relevant assertion isUNTESTED, not covered. An untested AC blocks unless a reviewed manual/non-automatable exception is recorded with evidence. Every covering test must cite the AC ID it covers in the canonical, parseable syntax@covers US-<n>-AC<m>so traceability is machine-checkable — an exercising, passing test that omits the citation isUNCITED_COVERAGE(fix = add the citation, not a new test), distinct fromUNTESTED; a test that cites an AC it does not exercise isASSERTED_UNBACKED. Citation is an additional gate on top of exercise+pass+satisfy, never a replacement. - Validate blocking template checks before treating the artifact as ready.
- Create follow-up design or implementation work only after the framing artifact can govern it.
Align
Use for reconciliation, traceability audits, drift checks, and artifact content placement reviews.
- Start from authority: vision, PRD, features/stories, architecture/ADRs, designs, tests, implementation plans, code. The spec stack is the contract; code is a projection of it. Traceability is bidirectional: every material code surface (route/screen/CLI/API/job/migration) traces to a governing artifact, and every acceptance criterion traces to an exercising test. Unmapped material surfaces and unimplemented criteria are both alignment findings.
- Reconstruct intent from planning artifacts before inspecting lower layers.
- Classify each gap as
ALIGNED,INCOMPLETE,DIVERGENT,UNDERSPECIFIED,STALE_PLAN, orBLOCKED. - Produce one durable alignment report when the action is more than a conversational review. The report must remain reviewable by a human in under ten minutes.
- For every non-aligned gap (
INCOMPLETE,UNDERSPECIFIED,DIVERGENT,STALE_PLAN), the handoff to implementation must name all four of:- Destination artifact type (e.g. PRD, FEAT, US, ADR, TD, TP) where the gap is resolved.
- Deliverable shape: the concrete content to add (e.g. "a TD section answering X", "a US covering Y", "an ADR recording the Z choice").
- Suggested next workflow mode (
frame,design,polish,validate,evolve,backfill) or runtime handoff when execution is already governed — never a CLI command. - Evidence references: artifact paths plus line numbers (or section anchors) supporting the finding.
- Create or identify follow-up work for every non-aligned gap using the handoff fields above.
Validate
Use to check a single artifact instance against its governing template and prompt, then edit resolvable findings in place.
- Load the artifact instance and resolve its artifact type: read
ddx:frontmatter when present (ddx.type, else inferred fromddx.idprefix); otherwise resolve by path or filename pattern against the artifact-type catalog the runtime exposes. - Load the artifact-type's
template.md,prompt.md,meta.yml, and active voice profile from the resolved catalog path (see §Catalog Resolution and §Voice Resolution). - Run structural conformance: required section headings from
template.mdare present, and required frontmatter fields frommeta.ymlare populated. - Run prompt-section conformance: every section the
prompt.mdasks for is answered in the instance or explicitly marked N/A with a reason. - Run voice conformance against the active profile, then classify each finding
keyed to the relevant template, prompt, meta.yml, or voice-profile section
using the Align taxonomy:
ALIGNED,INCOMPLETE,DIVERGENT,UNDERSPECIFIED,STALE_PLAN, orBLOCKED. Forartifact-signal, flag filler, unscoped claims, unsupported implementation-status language in specifications, missing actors, hidden assumptions, and prose that smooths away artifact IDs, paths, commands, metrics, statuses, acceptance criteria, or trace links. If Sloptimizer is available, it may perform this pass using the active HELIX profile as constraints; otherwise apply the profile directly. - Produce updates: when the user invoked validate to fix, apply edits
in place for every finding the template, prompt, metadata, or voice-profile
comparison can resolve mechanically — typically
INCOMPLETEfindings (missing required sections, stale frontmatter shape, renamed headings, unsupported filler, or unscoped claims). For findings classified asDIVERGENT,UNDERSPECIFIED,STALE_PLAN, orBLOCKED— which need human judgement — surface a §Align gap-to- implementation handoff for that specific finding instead of editing. When the user invoked validate to audit, surface a §Align handoff for every non-ALIGNEDfinding regardless of mechanical resolvability.
Refresh
Use to bring every artifact instance under a project HELIX tree up to date with the current canonical templates and prompts. §Refresh is §Validate (fix-mode) applied across a whole project in one pass.
- Resolve the project HELIX root per §Project Root Resolution. Enumerate every artifact instance under it. Group instances by activity directory (00-discover, 01-frame, …, 06-iterate). Skip anything that isn't an artifact instance (READMEs, plan sub-directories, generated files).
- For each instance, run §Validate in fix-mode. When the runtime supports sub-agent dispatch, parallelise across the activity groups (one agent per activity); otherwise execute the groups in activity order.
- Aggregate the per-instance §Validate outputs into a single report:
per-classification counts using the unified taxonomy (
ALIGNED/INCOMPLETE/DIVERGENT/UNDERSPECIFIED/STALE_PLAN/BLOCKED) plus the union of every §Align gap-to-implementation handoff §Validate produced. - §Refresh surfaces handoffs in the report. It does not itself file work items — that responsibility stays with the runtime: DDx runtimes may file work items in response, Claude Code runtimes may emit tracker issues, chat-only runtimes may simply display the report. This keeps §Refresh runtime-neutral while preserving §Align's tracker-mutation rules for runtimes that have a tracker.
- §Refresh is read-only against templates and prompts in the skill
catalog. If §Refresh reveals that a template itself needs to change,
route through
evolveagainst the catalog separately.
Evolve
Use when the user wants to add, remove, amend, or thread a requirement through the HELIX artifact stack.
- Read the entry artifact's frontmatter; collect its
ddx.idandddx.depends_onlist. - Walk the dependency graph in both directions: forward along
ddx.depends_on(artifacts this one relies on — authority above) and reverse by scanning all governing artifacts forddx.depends_onentries pointing back at thisddx.id(downstream impact). - When
ddx:frontmatter is absent, fall back to filesystem traversal: activity-numbered directories in the project's HELIX layout supply the authority hierarchy; artifact-type directories supply the type relationships. - Detect conflicts with existing artifacts and open work.
- Apply updates from the highest-authority artifact down: vision, PRD, feature specs/stories, architecture/ADRs, solution and technical designs, test plans, implementation plans, then code.
- Surface conflicts explicitly when a downstream artifact contradicts an updated upstream — do not silently overwrite the downstream; route it through the §Align gap-to-implementation handoff instead.
- Create follow-up work with dependencies where ordering matters.
- Prefer progressive evolution of the specific affected artifacts over re-generating the stack. Converge on "verified + each finding-class folded into a gate" (a template check, an acceptance criterion, a concern propagation check, or a ratchet) — not on a bare reviewer "SHIP" verdict. Intrinsic gates (build, test, conformance, phantom-claim count) block; external adversarial review is advisory and never a hard gate.
Design
Use when implementation needs design authority before build work.
- Load governing artifacts, existing designs, implementation context, tests, and open work for the scope.
- Draft problem statement, requirements, architecture decisions, interfaces, data model, errors, security, testing, sequencing, risks, and observability.
- Iterate through self-critique until material changes converge.
- Write the design to the project HELIX design location.
- Derive ordered, verifiable implementation work from the design.
Backfill
Use to reconstruct missing or incomplete HELIX artifacts from evidence.
- Read available evidence: artifacts, implementation, tests, delivery notes, and recorded decisions.
- Separate confirmed facts from inference.
- Reconstruct only what the evidence supports.
- Mark uncertainty explicitly.
- Create follow-up work for unresolved authority gaps.
Review
Use for fresh-eyes review of plans, PRs, implementation, or recent work.
- Scope the review narrowly.
- Inspect governing artifacts, changed implementation, tests, and public projection relevant to the scope.
- Report findings first, ordered by severity, with concrete evidence.
- Run the claims-vs-reality check: any artifact assertion of a test, coverage figure, or emitted metric that does not exist is a blocking phantom-claim finding (zero-floor), not a stylistic note.
- File durable follow-up work for actionable medium-or-higher findings in the project's work tracker.
- A clean verdict is necessary but not sufficient: the loop converges only when the work is verified and each finding-class is folded back into a gate so it cannot silently recur. Drive fixes by progressive evolve against the specific finding, not by re-generating the artifact or implementation.
- Intrinsic gates block; external adversarial review is advisory. The intrinsic gates — build, test, template conformance, the phantom-claim count — block convergence. An external adversarial reviewer (a separate tool or model) is advisory input only and must never be a hard gate: when it hangs, errors, or is unavailable, convergence is decided by the intrinsic gates.
Polish
Use to refine work items before execution.
- Load open work for the scope and any governing plan.
- Run multiple passes for deduplication, coverage, acceptance quality, dependency correctness, sizing, and label hygiene.
- Require execution-ready work items to name exact files, commands, checks, fields, or observable repository states.
- If acceptance cannot be sharpened from governing artifacts, flag the work as not execution-ready and route it back through planning.
Check And Next
Use when the safe next action is ambiguous, when the user asks "what's next" / "what's blocked" / "plan the change", or when a single ask straddles two or more flows declared in the marker (e.g. the prompt names a data-pipeline artifact whose blocker is an infra prerequisite).
- Inspect the queue, governing artifacts, and known blockers.
- Decide conservatively among design, alignment, backfill, polish, runtime handoff, wait, guidance, or stop.
- Do not dispatch another workflow silently.
- When recommending the next action against a specific gap, name it using the §Align gap-to-implementation handoff shape: destination artifact type, deliverable shape, suggested next workflow mode, and evidence references (paths plus line numbers). Never prescribe a CLI command.
- If missing tracked work is discovered, create or recommend explicit work before returning the next action.
Cross-flow ask — owner-flow first, then prerequisite fan-out
A cross-flow ask is any prompt whose answer requires consulting more than one flow in the marker. Three shapes recur:
- Single-artifact ask whose blocker lives in another flow. Example:
"The monitoring dashboard needs a DNS record. Set this up." The
monitoring-setup artifact is owned by
helix-data(it lives underpipelines/<scope>/per the marker); the DNS record is owned byhelix-infra. The data flow is the owner-flow because it owns the artifact named in the prompt. Infra is a prerequisite-flow that must satisfy a precondition before the data-flow item ships. - Multi-flow status query. Example: "What's blocked across the project?" / "What's next?" against a marker with two or more flows. Every active flow in the marker is a candidate owner — none can be silently dropped.
- PRD-needs-infra ask. Example: "The PRD needs new infra — plan it." Product owns the PRD (owner-flow); infra owns the provisioning artifact downstream. The PRD edit and the infra plan are TWO artifacts in TWO flows, linked by a cross-flow edge.
Cross-flow contract (every cross-flow ask):
- Resolve the owner flow first. Identify the flow whose
root:owns the named artifact (or the artifact the prompt's noun phrase most directly names). Do not jump straight to the prerequisite flow because its verb (DNS, deploy, provision) appears in the prompt. The artifact's home flow wins. - Read the owner-flow's named upstream artifacts. From the
marker's
root:for the owner-flow, locate and Read the artifact the prompt references (e.g.monitoring-setup.md,data-product-brief.md,prd-*.md) BEFORE proposing any action. For each upstream named inddx.links:orinformsedges that the answer depends on, Read it too. Catalogue which artifacts exist (with path + status from frontmatter) and which are missing. - Fan out to prerequisite flows. For each cross-flow prerequisite the owner-flow surfaces (e.g. the monitoring-setup prose says "dashboard URL needs DNS"; the PRD's acceptance criteria require a new VPC), read that prerequisite flow's scoped artifacts before drafting the prerequisite-flow action. Each active flow that owns part of the answer gets its own scoped artifact read and its own handoff in the response.
- For a multi-flow status query ("what's blocked across the project?", "what's next?"), inspect every relevant flow listed in the marker before reporting per-flow status. Answering from generic prose alone without reading the scoped artifacts is the failure mode this rule prevents.
Cross-flow response shape (always emit all three):
- Named upstream artifacts and their state. A list of the
artifacts the answer depends on, each annotated
exists(with path + frontmatterstatus:if present) ormissing(with the graph node that says it should exist). Example:pipelines/customer-events/monitoring-setup.md(exists, status: in-progress);infra/dns/customer-events.tf(missing, required by monitoring-setup prose). - Cross-flow prerequisites. Name each prerequisite as
"
<owner-flow>needs<prerequisite-flow>to - Concrete next action per flow. For each flow with an action
pending, emit a §Align gap-to-implementation handoff: destination
artifact type (e.g.
network-iacunderinfra/), the flow's domain lane when relevant, suggested workflow mode or runtime handoff, and evidence paths with line numbers (e.g.pipelines/customer-events/monitoring-setup.md:20). Never prescribe a CLI command; the operator chooses dispatch.
Do not skip owner-flow resolution because the prompt is short or the prerequisite verb is loud. Do not collapse multiple flows into a single undifferentiated answer.
Runtime Handoff
Use when a workflow mode concludes that the next step is execution, source control, packaging, or a long-lived operator loop. HELIX does not own those surfaces; the runtime does.
- Name the governed work item or artifact gap that is ready for runtime action.
- Name the domain lane and scope instance the runtime should preserve.
- Name the verification evidence the runtime must record before reporting
completion. For buildable products, this includes observable end-to-end
evidence against the running system when feasible, plus a claims-vs-reality
check with zero phantom claims. See
<plugin-root>/workflows/concerns/verification/practices.md. - For data-backed products, require governed sample or seed data with
synthetic non-PII values and enough variation to exercise schema-relevant
states. See
<plugin-root>/workflows/concerns/sample-data/practices.md. - Do not prescribe runtime commands from the skill body. Point to the runtime's install or operator guide for concrete execution, source control, packaging, or loop commands.
Experiment
Use for metric-driven optimization loops.
- Define the goal, metric, baseline, intervention, and stop condition.
- Run bounded iterations.
- Measure after each iteration.
- Keep changes or revert/adjust based on metric evidence.
- To validate a methodology or skill change (a workflow prompt, template, or this routing skill), use the regression bench: record a committed baseline, run a fixed brief from the bare prompt with the improved skill installed (never by redirecting reads), score intrinsic metrics against the baseline, and keep what moved, cut what didn't. The bench is the standing answer to "how do we know this change is impactful."
Consult The Graph Before Authoring
When the user asks for a new artifact of type T in the active methodology M
(per the resolved marker), consult M's workflows/graph.yml before drafting.
This is the runtime use of the methodology graph: the same edges the validator
checks govern what the skill should surface as prerequisites at authoring time.
- Read
M'sworkflows/graph.yml(resolved via the §Catalog Resolution path for the active methodology's plugin root). - Find the node
nwhosetypematcheslibrary:Torlocal:T. - Enumerate incoming edges to
nwhosekindis one of{requires, contains, informs}. - For each such edge
(src → n, kind, required):- If
required: trueAND no instance ofsrc.typeexists in this methodology's instance scope, surface this as a prerequisite. Per the resolved §Autonomy level, either ask whether to draftsrcfirst (low/medium), or draftsrcautonomously thenn(high). - If
required: falseAND no instance ofsrc.typeexists, note it as a "consider also drafting" but do not block authoring ofn.
- If
- Only after prerequisites are present (or the operator has explicitly chosen to skip them) proceed to author the requested artifact.
- After authoring, populate
ddx.linksto point at existing upstream instances. Do not invent links: per Edge Authority Asymmetry, types declare what is possible and instances declare what is actual. Everyddx.linksentry is a deliberate authoring decision, never a mechanical projection of a graph edge.
Graph consultation is per-authoring, not per-session: re-consult on every new artifact request because the instance scope may have changed since the previous turn (operator-side edits, parallel work, evolve passes).
If the graph carries a non-standard or locally-added edge (a project's
workflows/graph.yml introduces an edge not in the canonical HELIX library —
e.g. prd requires market-validation-brief), the same rules apply: a graph
edge governs what the skill surfaces, regardless of whether the edge matches
general HELIX knowledge. Surfacing only the canonical edges and skipping the
graph-declared ones is a graph-consultation defect, not an acceptable
shorthand.
Alignment Content Migration
If a user asks whether content belongs in the right HELIX document, use align mode. The alignment output must include a content migration ledger for every misplaced content unit:
| Field | Required content |
|---|---|
| Source | Artifact path and line references |
| Content unit | Small named chunk of content |
| Classification | keep, move, split, delete, needs-new-artifact, or decision-needed |
| Destination | Exact destination artifact path or artifact type |
| Content to add | Destination-shaped draft content |
| Template fit | Destination section and blocking/warning checks |
| Destination risks | Any template check the proposed addition would fail |
| Follow-up | Tracker issue ID or explicit issue to create |
Do not remove content from one artifact unless the destination content and follow-up work are captured durably.
Operating Discipline
- Use the workflow contracts in this skill as the active interface; consult packaged workflow prompts only when deeper mode-specific detail is needed.
- For projects with a work tracker, obey work-item-first rules before writing files or tracker mutations.
- Do not silently start implementation when the request is planning, alignment, review, or routing.
- If the correct route is unclear, use check mode rather than guessing.
- Preserve the HELIX artifact authority hierarchy: vision, PRD, features/stories, architecture and ADRs, designs, tests, implementation plans, code.
- Short affirmations inherit the prior turn's offered scope. When the user
replies with a bare confirmation (
"do it","yes","go") after the prior turn surfaced multiple branches or options, do not silently pick one. Ask which branch, or — if only one was recommended — restate it verbatim before acting. - Scope complaints and pasted-evidence reactions route to
alignorevolve, not to direct edits. When the user pastes a snippet and says something like "this isn't going to scale" or "what is this BS", treat the complaint as evidence for §Align (find the upstream artifact that should govern the pattern) or §Evolve (thread the new constraint through the artifacts). Do not patch the pasted code in place. - Operator pushback on a reported blocker triggers an alignment surface, not a retry. When the user pushes back on a claim like "this is blocked" or "you said this couldn't be done", the response must name the specific artifact-line evidence behind the blocker and route through the §Align handoff fields. Retrying the same operation without diagnosis is forbidden.
checkmode returns status; design changes are a follow-up turn. When asked "what's the situation with X" or "is X needed", surface the current state plus a §Align-shaped next-step recommendation. Do not bundle a design proposal in the same turn — the operator decides whether to invokedesignorevolvenext.