Skip to content

.project/ file formats

Every file ARDD writes into a target project, its schema, and who owns it. The schema-of-record for status enums and required fields is the installed lint-project.sh (run via /ardd-lint) — this page describes; that script enforces. If they ever disagree, the script wins and this page has a bug.

Directory layout

.project/
  artifacts/           # living decision documents
  features/            # per-feature register — one file per idea
  feedback/            # captured observations, consumed by the next plan
  plans/               # generated plans and research docs
  tasks/               # tasks-<slug>-<hex>.md — execution queues
  STATUS.md            # written only by /ardd-status
  DEFECTS.md           # written only by /ardd-defects
  TRACKER.md           # written only by /ardd-tracker
  audit.md             # written only by /ardd-audit
  WORKFLOW.md          # static skill reference, installed by /ardd-init from the shipped template
  ardd-version.md      # commit this — records the installed ARDD source
  .gitattributes       # shipped by install.sh: report files merge=ours

Status enums

Six lifecycles. Five are script-mutated via ardd-state.sh (skills decide when a transition happens; the script does the writing and refuses illegal transitions); the exception is the artifact status field, which the editing skill sets directly while writing the artifact body — a judgment call, not a mechanical flip:

File kind Field Values
Artifact status draftstable (and back, if gaps reopen)
Artifact diagram_status unrenderedcurrentstale
Plan status draftapprovedsuperseded
Tasks status generatingreadyin-progresscompleted (or → abandoned)
Feedback status openplanned
Feature register status backloggedplannedtaskedimplemented (or → retired)

Who advances the feature register: backlogged entries come from /ardd-backlog (or /ardd-tracker pull); /ardd-plan flips backlogged → planned at plan approval and planned → tasked when the tasks file is generated; /ardd-implement flips tasked → implemented when every tasks file bound to the plan completes (with /ardd-status performing that last flip in the orphaned-completion case).

retired means "shipped, then deliberately removed" — it is entered only from implemented and is terminal. No skill automates removal decisions, so the flip is performed manually: ardd-state.sh feature-flip <slug> retired.

completed and planned (feedback) are terminal: a completed tasks file never reopens (post-completion failures become new feedback), and a planned feedback file is a historical record.

Artifacts (artifacts/<name>.md)

---
status: draft | stable        # draft = open questions; not safe to plan against
last_updated: YYYY-MM-DD
diagram_type: erDiagram       # optional — declaring it makes the artifact renderable
diagram_status: unrendered    # required once diagram_type is present
render_hint: ...              # optional render fields — see the /ardd-diagram page
render_target: ...
render_section: ...
---

The constitution additionally carries the workflow knobs (workflow_mode, next_step_prompt, delegation, merge_policy) — see configuration.md — plus its own version line and Sync Impact Report comment. Open design questions appear in bodies as [OPEN: <question>]; production shortcuts under a ## Production Annotations heading.

Feature register (features/<slug>.md)

One file per feature. Frontmatter: slug, status, logged, plus plan: / tasks: pointers stamped as the feature advances and an optional gh_issue: <n> once synced by /ardd-tracker. Body: one sentence on the capability, optional Why: line.

Feedback (feedback/feedback-<slug>-<hex>.md)

Frontmatter: status, created, plan (null until consumed). Items get stable IDs F001… numbered across the whole file, grouped under ## Bugs / ## UX / ## Reconsidered, each optionally tagged [artifacts: <name>]. Checkboxes are 3-state: [ ] open, [x] incorporated, [-] declined.

Plans (plans/plan-<slug>-<date>-<hex>.md)

---
status: draft
branch: <slug>                  # the branch inline implementation would use; may never be created
created: YYYY-MM-DD
features: [<slug>, ...]         # register slugs this plan designs
surfaced-defects: [<id>, ...]   # DEFECTS.md identifiers already offered (accepted or declined)
---

Research docs (plans/research-*.md) share the directory but have no lifecycle — frontmatter topic/date/status: complete, nothing reads them back.

Tasks (tasks/tasks-<slug>-<hex>.md)

---
plan: plan-<slug>-<date>-<hex>.md   # authoritative binding to the source plan
generated: YYYY-MM-DD
status: generating
---

Task lines:

- [ ] T001 [artifacts: datamodel, infrastructure] Create Patient table
- [ ] T002 [artifacts: datamodel] [parallel] Create Appointment table

[artifacts: ...] declares what /ardd-implement loads before executing the task (omitted entirely when none apply — never a placeholder); [parallel] marks tasks with no shared files or dependencies. A legacy worktree_branch: frontmatter field may appear in files from before worktree-native state; nothing writes it anymore.

Report files — single-writer, disposable at merge

STATUS.md, DEFECTS.md, TRACKER.md, and audit.md each have exactly one writing skill; every other skill treats them as read-only. At merge/rebase they are disposable: take either side without deliberation and let the owning skill regenerate from disk. The shipped .project/.gitattributes marks them merge=ours, and with the per-clone opt-in git config merge.ours.driver true they merge clean automatically. These four are deliberately not schema-validated by lint-project.sh — they're prose for humans, not machine-checkable state.

ardd-version.md

Written by install.sh on every run: the source commit, date, Source-Path: (where the checkout lives), Source-Ref: <tag> when the source sat exactly at a release tag, and Channel: <stable|beta> (absent = stable). Commit this file — it's the project's record of which ARDD version was active — while gitignoring the regenerated .claude/skills/ardd-*/ files themselves.