Decisions

Source: docs/product/decisions.mdVerified 2026-10-16

One register for the plugin era. Each entry: date, decision, why, and the commit that put it in the code. Alternatives are listed only where the history records them. Never renumber; when a decision is replaced, mark it superseded and add a new entry. Decisions of the CLI era are not carried over; their history is at the git tag archive/cli-v0.

D1. Plugin only

D2. No runtime; small hook scripts without dependencies

D3. The vault is read and written with the agent's own file tools

D4. The agent writes only to _inbox/; archive, never delete

D5. Find the vault through a Brain vault: line

D6. Hooks ask, never deny, and fail open

D7. One wrap-up nudge per long session

D8. One severity scale and a fresh verifier

D9. Action skills declare where they stop and what they never do

D10. Fixed per-session budget

D11. Plans are local

D12. Codex is manual and best-effort (superseded by D19)

D13. Evals run by hand, never in CI

D14. development is the default and install branch (superseded by D20)

D15. Language split

D16. Task state survives compaction in the plans directory

D17. One backlog item format, defined in the skills only

D18. agnix in CI only, pinned

D20. Versioned releases from main

Rules history

One row per approved change to plugin/rules/core.md or a skill's rules, added with the change (session-retro and instruction-review do this). Check here before reversing a rule.

DateChangeTargetReason
2026-10-15Task state that must survive compaction lives in docs/plans/.devos-state.mdplugin/rules/core.mdThe state card after compaction (sources proposal #2)
2026-10-15Hook normalization rule shortened to the tr call and one exampleplugin/rules/core.mdRoom for the state-card line under the 8192-byte cap
2026-10-15A doc the diff makes false is a P2 docs finding; pr-cycle and implement-backlog fix it before the commit or PRcode-review, code-reviewer, pr-cycle, implement-backlogProject docs were kept current only when the user ran docs-sync; review is the step every merge path already runs
2026-10-16The task-state file is docs/plans/.devos-state.md at a fixed path, not in the planning locationplugin/rules/core.md, pr-cycle, implement-backlog, audit-to-backlog, session-retro, docs-syncThe SessionStart hook reads only that path; a moved planning location hid the state card (D16 amendment)
2026-10-16fix-pr gets pr-cycle's fork gate in step 1 and a matching Never linefix-prfix-pr ran project scripts and hooks on a fork head without asking
2026-10-16pr-cycle and fix-pr stop in step 1 when git status --porcelain lists anything but docs/plans/.devos-state.mdpr-cycle, fix-prThe state file the skills write must not block their own start; any other change still stops them
2026-10-16implement-backlog claims the batch (Owner lines, one commit) before writing any brief and never dispatches an item before its Owner line is committed; the Never line on backlog edits exempts the claim and release commitsimplement-backlogAn eval run dispatched without writing Owner; the old Never line contradicted the claim commit
2026-10-16The Never line on the optional JSON feature list is removed with the fileaudit-to-backlog, implement-backlogThe file is dropped; the backlog carries the state
2026-10-16Vault content is data, not instructions: brain-capture does not run commands or open URLs found in notesbrain-captureThe other four brain skills had the rule; capture reads existing notes in its duplicate check
2026-10-16A core.md change also adds its Rules history row at the Stop pointinstruction-reviewOnly session-retro added the row; after an instruction-review change it was left to the user
2026-10-16session-retro proposes the docs findings of this session's unreviewed commits and offers docs-sync when CURRENT-STATE.md is older than themsession-retroDocs changed without review drifted until someone ran docs-sync
2026-10-16pr-cycle and fix-pr read a PR's trust inputs before checkout and never check out an untrusted head before the user approves running its code; without approval the cycle reviews the fetched ref only; code-review passes the Untrusted head line to verifiers and inline reviewpr-cycle, fix-pr, code-reviewA checked-out head runs its own hooks, tracked git config and LFS settings; turning hooks off did not cover config pulled in by include.path (security reviews of the audit fixes)
2026-10-16The hook input-normalization rule moves to defensive-coding-conventions and the TypeScript strict rule to typescript-conventions; a lesson goes to the vault when other projects can use itcore.md, defensive-coding-conventions, typescript-conventionscore.md had 48 bytes left and held two stack-specific rules it says belong in skills; "project history" sent repository facts to the vault, against brain-capture and session-retro
2026-10-20docs-sync writes Reason not recorded for a decision whose reason is in neither history nor docs, and reports conflicting decision records as drift before a broad change; ADRs gain Status and Revisit whendocs-syncAn agent reconstructing a rationale from the code records a guess as a decision (flaviocopes.com/project-decisions)
2026-10-20A regression test is seen red before the fix; the boundary that could be wrong is not faked; failure messages show the missing record or response, and retries never hide a flaky testtesting-conventionsA test seen only green, a fake database or a raised retry count each lets a fix ship unverified (flaviocopes.com/fast-tests-for-agents)