I3246 — The evidence half of a gap is drafted from the ledger, and a second draft at one commit is the same
Revive I2217 from origin/chore/the-owner-packs-are-planned (ec37317fe7c, 2026-10-10, never landed): a read-only intents.draft_gap (`intent draft gap <intent>`) prints a majordomus.gap/v1 record whose criterion states are derived from the evidence at the presented commit, each observation citing the ledger execution or claim it read. Port the record byte-identical first, then update its current_state to master.
READY wave 0 · p1 · implementation profile · parallel safe
Ready. Every dependency is done, so majordomus plan start I3246 will be accepted.
Objective
Revive I2217 from origin/chore/the-owner-packs-are-planned (ec37317fe7c, 2026-10-10, never landed): a read-only intents.draft_gap (`intent draft gap <intent>`) prints a majordomus.gap/v1 record whose criterion states are derived from the evidence at the presented commit, each observation citing the ledger execution or claim it read. Port the record byte-identical first, then update its current_state to master.
Why
The owner asked from 2026-09-15 to 2026-10-16 that Majordomus find what is not true instead of a person writing it. On master a gap is hand-written and intent_review.rs only judges it; the draft was planned on 2026-10-10 on a branch that never reached master. 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); ADR 0192 (Replanning is bounded, idempotent and never weakens its intent) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c205#2.
Current state
apps/majordomus-cli/src/intent_review.rs judges gap records under .ai/repo/project/gaps/; capability/builtin/intents.rs declares list, record, validate, coverage, preflight, binding and propose; nothing drafts a gap.
Desired state
intents.draft_gap is pure over IntentView, the evidence index and the ledger; its output passes intent validate's gap checks unchanged; nothing is written.
Scope
- apps/majordomus-cli/src/capability/builtin/intents.rs
- docs/PLANNING.md
- apps/majordomus-cli/src/intent_review.rs
- apps/majordomus-cli/src/intent.rs
- apps/majordomus-cli/src/evidence/ledger.rs
- apps/majordomus-cli/src/commands/intent.rs
- apps/majordomus-cli/src/cli.rs
- apps/majordomus-cli/tests/intent.rs
- .ai/repo/project/issues
Dependencies
None. This issue is a root of the graph.
What waits on this
- 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
- I3250BLOCKED Before drafting work the planner says whether a criterion is met, met but unproven, or unmet, and drafts proof-only work where only proof is missing
Acceptance criteria
- A drafted gap validates with no finding
- Every state that is not unknown cites an observation that resolves
- Two runs at one commit print byte-identical output and leave the tree clean
Validation
- majordomus plan validate
- majordomus intent validate
Evidence required
- test_the_gap_is_drafted_from_the_ledger
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/I3246.yaml. Read it back with majordomus plan show I3246.