Skip to content

A decision record without a task, a head and a reason is reported, and does not block

.ai/local/state/decisions.md is where a worker externalises a decision so the next one does not reopen it. An entry that does not say which task made it, at which commit, and why, cannot be found by the worker who needs it. That is reported as a warning; it does not stop a command.

advisory Projected into the worker's instructions. Whether a worker honours it is not observable from outside. Documentation, not enforcement.

decisions.md is hand-editable by design, so an unattributable entry is a warning. finish still refuses when a profile requires a record it cannot find.

What it means

.ai/local/state/decisions.md is where a worker externalises a decision so the next one does not reopen it. An entry that does not say which task made it, at which commit, and why, cannot be found by the worker who needs it. That is reported as a warning; it does not stop a command.

How it works

mj_decision_malformed in lib/decision.sh returns the line numbers of entries missing Task, Head or Why. mj_validate_decisions reports them. The doctrine majordomus.decision-records is declared advisory, which is what makes the finding a WARN and leaves the exit code at 0 — the class is read by mj_doctrine_fail at dispatch time, so the level is not a choice made inside the validator.

The file is deliberately hand-editable: majordomus decision writes well-formed entries, and a person editing it directly is a supported way to work. finish is where it stops being advisory — a profile that requires a decision record refuses completion when it cannot find one for the task.

How to see it

printf '\n## 2026-01-01 — hand written, no fields\n' >> .ai/local/state/decisions.md
majordomus check                  # WARN records decisions.md — entry at line(s) 12 lacks Task, Head or Why
echo $?                           # 0

What it does not cover

The check reads structure, not judgement. An entry carrying all three fields and a reason of "because" passes. Nothing verifies that the rejected alternatives were real, or that the decision was followed.

Why it exists

The advisory class exists for exactly this shape of rule: the cost of a malformed entry is paid later and by someone else, and blocking a commit over the formatting of a note somebody wrote by hand would teach people to stop writing them.

Detail rendered from docs/claims/decision-attribution.md.

Provenance

defined in
read it on this site · docs/DOCTRINE.md
implemented in
lib/check.sh · majordomus check
proved by
test/cases/21_decision_question.sh
claim id
decision-attribution

Verify it yourself

The test runs in a disposable temporary repository and asserts the behaviour, not a string in the source.

from a clone of the repository
bash test/run.sh 21_decision_question

Where this claim is used

Related claims same implementation

The moments this answers