Configuration — the constitution workflow knobs¶
ARDD's behavior knobs live in constitution.md's frontmatter — they
are workflow settings, not constitution content: setting or changing one
never bumps the constitution version and never touches the Sync Impact
Report. next_step_prompt, delegation, merge_policy, and
update_check_max_age_days are stamped via ardd-state.sh stamp <file>
<field> <value>, never hand-edited; workflow_mode is written into the
frontmatter by /ardd-init directly.
Every one has a safe default when absent — projects initialized before a
field existed need no migration.
/ardd-init asks each question once at setup; /ardd-update backfills
next_step_prompt, delegation, and (solo mode) merge_policy once for
installs whose constitution lacks the field entirely — workflow_mode is
never asked again and simply defaults to solo when absent. Enum
enforcement: the installed lint-project.sh.
workflow_mode — where in-progress work lives¶
solo | collaborative — absent = solo.
- solo — single developer, one machine. Committing to the local
default branch is fine for inline runs;
/ardd-planhas no branch gate at all. Delegated runs use isolated worktrees that merge back eagerly and are then reaped. In-flight visibility:inflight-worktrees.sh//ardd-status's In Flight section. - collaborative — nothing is ever committed to the local default
branch. Work always moves to a branch; after the first commit the skill
offers to push and open a draft PR titled with the feature slug(s) —
the mode's shared in-flight signal. Register flips ride the branch and
land when the PR merges. Pushes always require explicit confirmation.
One extra constraint: delegated worktrees branch from
origin/<default>, so plan/tasks files must reach the remote before delegated implementation can see them.
Suggested by detection at init: branch protection on the default branch →
collaborative; no remote → solo.
next_step_prompt — one-keypress next steps¶
true | false — absent = false.
When true, exactly two skills — /ardd-status and /ardd-plan — end by
offering their recommended next step via a yes/no prompt, and only when
that recommendation is a concrete runnable /ardd-* invocation (anything
else stays plain text). One prompt per user-visible turn end: when plan
hands off to status, status owns the prompt. false/absent keeps
recommendations as plain text, so delegated and scripted runs are
unaffected.
delegation — the background gate¶
eager | ask | inline — absent = ask. Consulted by
/ardd-implement's delegation gate:
eager— delegate to a background worktree subagent without promptingask— offer each time, suggesting yesinline— never offer; run in the foreground
merge_policy — landing a delegated run¶
auto | ask — absent = ask. Solo mode only — collaborative mode
merges through the PR and never consults it (which is why init doesn't
ask it there).
auto— when a delegated run completes, merge its branch into the default branch without asking, when the merge is fast-forward or conflict-free. Any conflict aborts, surfaces, and falls back to asking — nothing is ever auto-resolved.ask— offer the merge each time, suggesting yes (eager merging keeps the in-flight window short).
update_check_max_age_days — opt-in freshness fetch for the update check¶
A positive integer — absent = never fetch (the default: the update check
is local-git-only). Neither /ardd-init nor /ardd-update asks for it;
opt in deliberately:
ardd-state.sh stamp .project/artifacts/constitution.md update_check_max_age_days 7
When set, ardd-update-check.sh runs git fetch --tags on the source
before comparing — but only when the source is the release-channel owned
checkout (~/.ardd/source; a dev-mode checkout is read, never mutated,
and the self-hosted case never fetches) and the checkout's
.git/FETCH_HEAD is older than N days (missing = stale). A failed fetch
appends note=fetch-failed to the check's output line and the comparison
proceeds against local tags — offline machines lose nothing. An invalid
value behaves like absent (and is flagged by lint-project.sh).
Related per-clone git opt-ins (not frontmatter)¶
Two settings git refuses to take from a repo commit, suggested by install.sh and set once per clone:
git config merge.ours.driver true # report files merge clean, keeping the current side
(and in this source repo only, git config core.hooksPath hooks for the
pre-commit checks — see CONTRIBUTING.md.)