Skip to content

Configuration ​

The project configuration lives in config/pipeline.json at the repository root. The file is optional: without it every key takes its default. Keys that are not set take their defaults too, so the file only needs the keys that differ.

npx noomoo contour-config prints the resolved configuration, the defaults merged with the file, as JSON.

How the file is merged ​

  • A section that is absent takes the defaults of the section.
  • A key set to null takes its default.
  • A section that is present must be an object. Anything else is an error, and the command that read it fails instead of using defaults silently.
  • A file that cannot be parsed as JSON is an error.
  • Unknown keys, those that noomoo does not know, are kept as they are.
  • Arrays replace the default array as a whole; they are not merged element by element.
  • Nested sections (stand.ready, data.declaration, review.codeArtifact, useCases.guarantees) are merged key by key.

An empty string is a value, not "unset", with two exceptions: an empty language takes the default, and an empty command in commands means the step is not run.

Language ​

KeyDefaultMeaning
language"en"Language the project writes its documents in: ru or en. setup writes it explicitly: en by default, ru under NOOMOO_LANGUAGE=ru; a configuration without the key reads as en, and "language": "ru" keeps a Russian project Russian. It chooses the labels of the documents (header keys, section names, states — en uses Acceptance criteria., Constraints., Status), the labels that setup and scaffold write, and the language of the message catalog; a language without a catalog falls back to ru. Rules that judge content, such as vocabularies of vague wording, exist only for ru and stay silent on an English document.

Git ​

KeyDefaultMeaning
git.targetBranch"develop"Branch that pull requests merge into; the merge state in context-status is counted against it.
git.branchPattern"feature/<KEY>-<slug>"Name pattern of a task branch. <KEY> is the task key, <slug> a short latin title. The workflow names branches by it; the acceptance check finds the task key anywhere in the branch name and prints this pattern in its refusal.
git.serviceBranches["chore/**","docs/**","release/**"]Branch patterns that have no task by design. Acceptance passes on them with a stated reason as long as the diff carries no code: documents, changelog, images and video, version bumps and core updates — see what a service branch carries without a task. * matches one segment, ** the rest of the name.
git.commitTemplate"<KEY>: <subject>"Pattern of commit subjects. The task workflow writes subjects by it, and the check of pull requests judges the subjects of their commits against it.
git.remoteAlias""SSH host alias from ~/.ssh/config, used when doctor reads the repository address. Empty means no alias.
git.isolation"worktree"Where a task is worked on: worktree (separate working tree), here (a branch in the current checkout) or ask (ask before the first write).

Commands ​

The task workflow runs these commands; noomoo does not prescribe its own. An empty command means the step is not run.

KeyDefaultMeaning
commands.test"npm test"Runs the tests of the project.
commands.lint"npm run lint"Runs the linter.
commands.typecheck"npm run typecheck"Runs the type check.
commands.gate"npm run task:ready --"Runs the readiness gate of a task; the task key is appended.
commands.format""Runs the formatter. Empty means no formatting step.

Review models ​

KeyDefaultMeaning
judge.planModel""Model of the reviewer for the plan gate. Empty means not set: the model is resolved from the environment (see Environment).
judge.taskModel""Model of the reviewer for the task gate. Empty means not set, as above.
judge.provider""Agent CLI of the reviewer: claude, codex or opencode. Empty means not set: NOOMOO_JUDGE_PROVIDER, then claude.
judge.codexModel""Model of the Codex reviewer. Empty means not set: NOOMOO_CODEX_JUDGE_MODEL, then the default model of the Codex CLI.
judge.opencodeModel""Model of the opencode reviewer, as provider/model. Empty means not set: NOOMOO_OPENCODE_JUDGE_MODEL, then the default model of opencode.

Layout ​

KeyDefaultMeaning
layout.roots["hub","src","server","frontend","apps","packages","infra","bin","scripts","docs","prisma","tests","bridge","e2e",".githooks",".claude"]Top-level directories from which a path in a task document is recognised as a file path. A project with another layout declares its own list, which replaces this one.

Architecture, coverage and plan size ​

KeyDefaultMeaning
architecture.requiredfalseRequires an architecture slice in the plan of a task. The shape of slices that exist is judged regardless of this key.
architecture.since""Date from which the requirement applies; tasks older than the date are not judged. Empty means all tasks.
architecture.slices[]Slices the project requires.
coverage.completenessFrom""Project phase from which the completeness-of-coverage rule applies, and on every later phase. Empty means the rule is off.
readiness.stricttrueStrictness of the task readiness gate task-ready: strict fails the verdict on a warn finding as well, normal only on error. The project sets it, not the driver, and anything but false is strict. The value is read from the target branch, and acceptance counts only a readiness verdict of this strictness.
plan.maxTestItems0Largest allowed number of test items in a plan. 0 means no limit.
plan.honestAnchorsSince"2026-09-16"Date from which an empty anchor in the decision protocol of a plan is a finding. Plans created earlier are not judged. Empty means all plans.
plan.reviewFrom""First task, as TASK-NNN, for which phase-check requires a plan review and the tests promised by the plan. Empty means every task from the first. Tasks below the threshold are exempt, and the check names this key; a value of another form fails the check.
raw.dir"docs/raw"Folder of raw materials: a relative path to a folder inside the project, or an absolute path to an external one. setup hides a folder inside the repository from git; an external folder is out of git anyway.
raw.commitfalseSays the raw files are the project's own and may be committed. Off, the intake gate stage reports raw files that git tracks or does not ignore.
intake.quotesfalseAllows word-for-word quotes from raw material in intake proposals. Off by default, so confidential text does not reach git piece by piece.

Review, use cases and data ​

KeyDefaultMeaning
review.codeArtifact.requiredtrueRequires a code review artifact for a task.
review.codeArtifact.since"2026-09-16"Date from which the requirement applies; tasks started earlier are not judged. Empty means all tasks.
useCases.guarantees.requiredfalseRequires a "guarantee on failure" in every use case.
useCases.guarantees.since""Date from which the requirement applies. Empty means all use cases.
data.schema""Path of the schema file, relative to the repository root. Empty means no schema is declared, and entities are not compared with it.
data.declaration.requiredfalseRequires a data declaration in every use case.
data.declaration.since""Date from which the requirement applies. Empty means all use cases.
stateMachine.requiredfalseRequires that a described state machine is sound.

Roles and stamps ​

KeyDefaultMeaning
roles.owner[]GitHub logins of the owners of the project.
roles.techLead[]GitHub logins of the technical leads.
roles.implementers[]GitHub logins of the implementers.
roles.testers[]GitHub logins of the testers.
stamps.since""Date from which decision stamps are judged; documents created earlier are not. Empty means the rule is off.
stamps.doneTraceFrom""Commit SHA of the legacy closure boundary: a task already ✓ done at that commit with an unchanged spec passes as before; one closed after needs a fingerprinted gate round or a trusted decision. The status date plays no part. none inherits nothing: every closed task needs a trace. Empty means the rule is off. A fresh setup that creates config/pipeline.json writes the HEAD SHA, or none while HEAD is unborn.
stamps.requireSignedCommitsfalseRequires verified signatures on the commits of a branch.
stamps.intakeBy"human"Who may approve an intake proposal with stamp --intake. human: only a person; an agent run is refused. agent: an agent run may approve too, and its approval line carries the agent mark. Turning it on in a branch is a policy weakening that the owner accepts. See stamp.

Light lane ​

A branch that matches lightLane.branches and has no task key is judged by the size of its diff and the presence of a test, not by task documents.

KeyDefaultMeaning
lightLane.branches["fix/**"]Branch patterns of the light lane.
lightLane.maxFiles30Largest number of changed files.
lightLane.maxLinesnullLargest number of changed lines. null means lines are not limited.
lightLane.infra[".github/**","infra/**","deploy/**","docker/**","scripts/**","*.config.*","**/*.config.*"]File patterns whose change does not need a test.

Testing ​

KeyDefaultMeaning
testing.mode""How the project is tested: stand (checked on a stand) or manual (checked by a tester after the merge). Empty means not declared, and no check depends on it.

Stand ​

The stand is the running copy of the project that tests are run against. The project fills this section; empty means there is no stand.

KeyDefaultMeaning
stand.up""Command that starts the stand.
stand.ready.url""URL polled until the stand answers.
stand.ready.expect200HTTP status that means the stand is ready.
stand.ready.timeoutSec120Seconds to wait for readiness.
stand.ready.identity""String the readiness response must contain. Empty means identity is not checked.
stand.baseUrl""Base address of the stand API.
stand.authnullAuthentication settings for the stand. The shape is chosen by the project.
stand.reset""Command that resets the data of the stand.
stand.down""Command that stops the stand.
stand.uinullSettings of the interface tests. The shape is chosen by the project.

Keys outside the defaults ​

These keys of config/pipeline.json are read by noomoo but have no default in the resolved configuration.

  • phase — presale or contract. Any other value, a missing key or an unreadable file means contract. coverage.completenessFrom names one of these phases.
  • stages — the list of the stages of the project's own pipeline.
  • stageOptions — options of the stages, by stage name. Project stages run only in a repository you consented to.