I3252 — A draft plan is judged as if it were written, and only a checked draft is written, through one capability
Revive I2205 and I2207 from origin/chore/the-owner-packs-are-planned (ec37317fe7c, 2026-10-10, never landed): intents.draft_check runs the plan and intent validators over a draft (intent, criteria, milestones, issues) in memory; intents.draft_write writes it as records only when the check passes, as one execution with a declared repository_mutation effect.
BLOCKED wave 2 · p1 · implementation profile · parallel safe
Blocked. This issue cannot start until I3251, I3247 are done. The status is derived from that, not declared.
Objective
Revive I2205 and I2207 from origin/chore/the-owner-packs-are-planned (ec37317fe7c, 2026-10-10, never landed): intents.draft_check runs the plan and intent validators over a draft (intent, criteria, milestones, issues) in memory; intents.draft_write writes it as records only when the check passes, as one execution with a declared repository_mutation effect.
Why
Owner orders of 2026-10-04, 2026-10-11 and 2026-10-13: an intent entered in the UI is planned and materialised into milestones and issues with the same result on every surface. A proposed plan must not be execution authority before it is checked. Proposed in ADR 0191 (A plan drafted from an intent is a proposal, checked by the plan's own validators before any record is written) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c185#4, chatgpt-majordomus:c226#3, chatgpt-majordomus:c245#2.
Current state
Only intents.propose writes (ADR 0144); milestones and issues are hand-written YAML; plan validate and intent validate read only written records.
Desired state
Check and write share one validator path, so a draft that passes the check is exactly what the written tree validates to.
Scope
- apps/majordomus-cli/src/capability/builtin/intents.rs
- docs/PLANNING.md
- apps/majordomus-cli/src/intent_plan.rs
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/src/intent.rs
- apps/majordomus-cli/src/commands/intent.rs
- apps/majordomus-cli/src/cli.rs
- apps/majordomus-cli/tests/intent_plan.rs
Dependencies
- I3251READY A desired outcome is briefed with what the repository already holds about it
- I3247BLOCKED Work is drafted for each criterion nothing serves, under a key derived from the intent, the criterion and the gap, so a second draft drafts the same work
What waits on this
- I3253BLOCKED A proposal lists the values it left unresolved, and a draft that carries an invented threshold is refused
- I3260BLOCKED One intent is carried in a disposable repository from a sentence through a failing criterion to a satisfied verdict, across two providers and a handover
- I3273BLOCKED Each requirement of a campaign revision has a content-derived identity and is reconciled into the existing intents and issues
Acceptance criteria
- A draft with a dangling dependency or an uncovered criterion is refused by check and by write, writing nothing
- A passing draft written then validated produces no finding
- CLI, HTTP and MCP return the same check result
Validation
- majordomus plan validate
- majordomus intent validate
Evidence required
- test_a_checked_draft_is_written
- case_a_draft_is_written_only_when_checked
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3252.yaml. Read it back with majordomus plan show I3252.