Feature Specification: FEAT-017 — Iteration Documentation
Example from HELIX’s own docs. This generated page comes from
docs/helix/. Use it to see the method in practice; start with the artifact-type catalog for reusable templates. Historical plans and reports may describe retired architecture.
Source identity (from
01-frame/features/FEAT-017-iteration-documentation.md):
ddx:
id: FEAT-017
authoring:
home: repo
depends_on:
- helix.prd
status: draftFeature Specification: FEAT-017 — Iteration Documentation
Feature ID: FEAT-017 Status: Draft Priority: P1 Owner: HELIX maintainers
Overview
The HELIX catalog covers the artifact-authority axis (vision → PRD →
features → designs → tests → implementation plans) thoroughly, but has no
artifact types on the time/commitment axis: how a human team sequences
outcomes across iterations, commits one iteration’s worth with owners and
trade rules, and records how the iteration went. FEAT-017 adds the three
missing types — roadmap (01-frame), iteration-plan (06-iterate), and
status-report (06-iterate) — plus one iterate workflow route in the
routing skill that ties them into a loop with the existing
improvement-backlog.
Ideal Future State
A team running HELIX on a human cadence (sprints, program increments, consulting engagements) documents each iteration with governed artifacts: the roadmap sequences framed outcomes across iterations; the iteration plan commits one time-box with a falsifiable goal, tiered outcomes, owners, and stable-ID task tables; the status report records outcome status against the plan with evidence per claim. Runtime work-item surfaces (DDx beads, markdown boards, GitHub issues) derive from the iteration plan’s task tables and own live status — the plan decides what work exists, the tracker decides where each item stands. Review learnings land in the improvement backlog, whose next-iteration selection feeds the next plan, closing the 06-iterate loop.
Problem Statement
- Current situation:
improvement-backlogwalks up to the commitment boundary and stops — it has a requiredselection_for_next_iterationsection and describes itself as “ordered candidates for future execution without becoming the live tracker” (workflows/activities/06-iterate/artifacts/improvement-backlog/meta.yml). No type holds the commitment itself.implementation-plan(04-build) decomposes an approved design into build slices; it cannot hold a cross-workstream, time-boxed team commitment. The routing skill’s engage list names “roadmap brief” as a HELIX artifact (skills/helix/SKILL.md), but no roadmap type exists in the catalog. - Evidence: a consulting engagement running HELIX on a sprint cadence had to invent all three documents outside HELIX governance — a sprint plan (goal, Must/Like/Nice-tiered outcomes, owners, dates, task tables), a client-facing deliverables cut of the same commitment, and a sprint-review record — while its product documents mapped cleanly to existing types.
- Pain points:
- Teams on a human cadence author iteration documents ungoverned — no template, no quality checks, no graph edges, no drift detection.
- The skill/catalog inconsistency (“roadmap brief” named but untyped) means a roadmap request cannot bind a template and fails §Catalog Resolution’s authoring contract.
- Without a governed plan, runtime work items and human boards have no single membership source, so scope drifts silently between surfaces.
Requirements
Functional Requirements by Area
Catalog types
- FR-1: A
roadmaptype in01-framethat sequences framed outcomes across iterations/horizons with dependencies, confidence, and ordering rationale. It commits sequence, not owners or dates. - FR-2: An
iteration-plantype in06-iteratethat commits one time-box: falsifiable goal, exactly one Good, one Better, and one Best outcome per participating workstream — Good is the protected floor (never traded; at-risk means escalation, and once committed its ID, text, and acceptance evidence are immutable for the iteration), Best drops first under pressure, then Better. More outcomes per workstream is confusing; fewer breaks the flex model, so a workstream that cannot fill all three tiers is not participating this iteration, never partially committed (participation is per-iteration; registry active/closed status lives in the roadmap). Each outcome carries an owner, acceptance evidence, and at least one task. Outcome and task IDs are unique within the plan and fully qualified as<iteration-id>.<id>when cited elsewhere. - FR-2a (membership direction): the plan owns commitment membership —
task rows select existing work items by ID (Work Item column), and rows
without one are the source from which the runtime creates items,
back-referencing each new ID in the plan. The tracker owns live state;
the plan’s Status column is planning-time state only.
workflows/conventions.md§HELIX Integration states the same contract. - FR-3: A
status-reporttype in06-iteratethat records outcome status against the plan’s IDs with evidence per claim, trades against the plan’s trade rules, blockers, and decisions needed.
Graph edges
- FR-4: Edges close the loop:
prd→roadmap→iteration-plan→status-report→improvement-backlog→roadmap(revision), plusimprovement-backlog→iteration-planandmetrics-dashboard→status-report. The graph generator projects onlyrelationships.informs:into edges, so the loop is declared via the new types’informsblocks plus additiveinformsentries in theprd,improvement-backlog, andmetrics-dashboardmetas, then regenerated intoworkflows/graph.yml.
Routing
- FR-5: The routing skill gains an
iterateroute (“plan or report a human iteration”) and a workflow contract that enforces the plan-owns-membership invariant: the plan decides which outcomes and tasks exist; the runtime tracker owns live status. The skill’s activity table lists the three new types.
Workstreams
- FR-6: Iterations carry a workstream concept. The roadmap is the
registry of record: each workstream gets a stable shorthand alias
WS-<n>(assigned sequentially, never reused or renumbered — a closed workstream keeps its alias), a name, a scope line, and an owner. Iteration plans and status reports reference workstreams by alias and never mint new ones; a roadmap-less plan (single-workstream skip case) has one implicit workstream and uses no aliases — a second workstream requires the registry first. Aliases are unique within one flow instance. Runtime work items preserve the alias — as a label where the runtime supports labels (e.g.ws:WS-1, prefixed with the flow instance when several flows share one store), otherwise in the item’s title or reference field — which is how workstreams are represented in the runtime’s work-item store (the beads database on DDx) without HELIX shipping tracker schema.
Acceptance Criteria
- AC-1: Given a request “cut the sprint plan” or “write the sprint
status report”, the skill routes to
iterateand binds the matching template from the catalog. - AC-2:
scripts/generate_graph.pyregeneratesworkflows/graph.ymlwith the three nodes and loop edges;tests/validate-skills.shpasses. - AC-3: Each new type’s
template.mdheadings satisfy its ownmeta.ymlrequired_sections. - AC-4: The
iteration-plantemplate states, in the Tasks section, that task IDs are stable and that the runtime tracker owns live status. - AC-5: The roadmap template carries a Workstreams registry section
with the
WS-<n>alias rules; the iteration-plan template references aliases in outcomes and task groups and names thews:WS-<n>work-item label convention; a blocking quality check on each side enforces registry-only aliases. - AC-6: A blocking iteration-plan quality check rejects a plan where an active workstream has missing or surplus Good/Better/Best tiers; the template shows the inactive-workstream escape hatch.
Non-Functional Requirements
- NFR-1: All three types stay runtime-neutral — no tracker commands, no board-tool references in template or prompt bodies (PRD R-4).
- NFR-2: HELIX still ships no tracker: the types govern documents; work-item surfaces remain runtime property (PRD out-of-scope list).
Edge Cases and Error Handling
- Iteration plan requested with no roadmap or backlog: the graph consultation surfaces them as non-required prerequisites (“consider also drafting”); authoring proceeds — small teams may start at the plan. A roadmap-less plan has one implicit workstream and uses no aliases.
- Status report claims Done without evidence: blocking quality check (claims-vs-reality); the claim is a phantom until evidence is cited.
- Scope added directly to a runtime board/tracker: the contract routes it back through the iteration plan; hand-added tracker items never silently widen the plan.
- Mid-iteration re-tiering: an
evolvepass against the iteration plan, recorded in the next status report’s Changes and Trades — Better and Best only. A committed Good is immutable; a Good that becomes impossible is an escalation recorded in the status report with its decider named, never an edit or re-tier.
Success Metrics
- A pilot engagement’s next sprint documents author from these templates with no structural sections invented outside them.
- Zero skill/catalog naming inconsistencies: every artifact named in the skill’s engage list binds a catalog type.
Constraints and Assumptions
- Anti-ceremony guard: each type’s prompt and the skill’s
iteratecontract carry an explicit skip test — these artifacts are authored only when there is coordination or an audience (multiple workstreams, multiple owners, a review). Authoring them because the types exist is process as deliverable, and the contract says so. implementation-plankeeps its lane: design-derived build slices for a feature. The iteration plan may reference implementation plans but never replaces them.- Lifecycle: the 06-iterate entry gate (deployed, monitored system) gates the metric-loop artifacts only; the human cadence pair is exempt — a project’s first iteration plan precedes any deployment. Recorded in the activity’s GATE.yaml scope note and README “Human cadence pair”.
- Ownership boundary:
metrics-dashboardkeeps measurement interpretation;status-reportowns commitment accounting against the plan and cites dashboard readings rather than re-deriving them (06-iterate README “Human cadence pair”). - Examples use the DepositMatch universe for consistency with existing catalog examples.
Out of Scope
- Any board/tracker tooling, generators, or sync code (runtime property).
- First-class workstream objects in a runtime’s work-item schema (e.g. a
DDx beads-database entity with
wscommands) — runtime-repo work; HELIX specifies only theWS-<n>alias standard and thews:WS-<n>label convention. - A retro/postmortem type — revisit when evidence shows the status report’s review-kind section is insufficient.
- Per-runtime board conventions (markdown kanban, GitHub Projects) — install-guide material for runtimes that want it, not catalog content.
Dependencies
helix.prd— R-1 (artifact catalog), R-4 (runtime-neutral), out-of-scope list (no tracker).
Relationships
- Extends activity
06-iterate(types) and01-frame(roadmap). - Closes the loop with
improvement-backlog(existing).
Innsigle seal: model-primary by HELIX
The signature covers the markdown source of this page, not these HTML bytes. This page quotes that seal; verify it against the source file.
- Composition
- model-primary
- Issuer
- HELIX
helix - Signing key
ed25519:b0865d76d834a52c48506414d16f4e5a(build key)- Signed source
artifacts/features/FEAT-017-iteration-documentation.md- Signed
- 2026-09-23T14:11:58Z
- Content digest
sha256:3c5dc81a…2f4a54f8
This build key is endorsed by the human key for build signing; the signature is not a detector and not a truth guarantee.
Raw attestation JSON
{
"payload": {
"innsigle": "1",
"type": "https://innsigle.dev/claim/colophon/v1",
"issued_at": "2026-09-23T14:11:58Z",
"issuer": {
"id": "helix",
"name": "HELIX",
"key_id": "ed25519:b0865d76d834a52c48506414d16f4e5a",
"key_url": "https://documentdrivendx.github.io/helix/.well-known/innsigle/keys.json"
},
"subjects": [
{
"uri": "https://documentdrivendx.github.io/helix/artifacts/features/FEAT-017-iteration-documentation/",
"digest": {
"alg": "sha256",
"value": "3c5dc81a82a24ab7d90e7368dfcb7acbd9fe62b39f02a502611f1b3e2f4a54f8"
}
}
],
"colophon": {
"schema_version": "1",
"composition": "model-primary",
"ingredients": [
{
"kind": "model",
"name": "Claude",
"role": "draft"
},
{
"kind": "tool",
"name": "sloptimizer",
"role": "rewrite"
},
{
"kind": "human",
"name": "operator",
"role": "structure-edit"
}
],
"notes": null
}
},
"payload_encoding": "json",
"signatures": [
{
"key_id": "ed25519:b0865d76d834a52c48506414d16f4e5a",
"alg": "ed25519",
"sig": "T0CQCwrLFK2K-_mAqhRMfaLHUcc3lm5AvYv-Du7WoS-ZfCKLIdwdOELqZSlUeAQJF010gnGx7h4z81gA0667Bg",
"signed_at": "2026-09-23T14:11:58Z"
}
]
}