I3273 — Each requirement of a campaign revision has a content-derived identity and is reconciled into the existing intents and issues
Split a campaign revision into segments whose identity is the digest of their normalised text (document, heading path and position are only their location) and classify each against the existing intents and issues: existing from I3254's duplicates, satisfied or partial from the derived verdict, superseded from the matched record's stage or superseded_by, conflicting where it negates a matched invariant or non_goal (reported with both texts for a person), new otherwise. A conversation enters only as workspace references read from the local store. Output is a draft for I3252's check, never records.
BLOCKED wave 6 · p3 · implementation profile · parallel safe
Blocked. This issue cannot start until I3272, I3252, I3251, I3254, I3280, I3281, I3278, milestone:intent-intake are done. The status is derived from that, not declared.
Objective
Split a campaign revision into segments whose identity is the digest of their normalised text (document, heading path and position are only their location) and classify each against the existing intents and issues: existing from I3254's duplicates, satisfied or partial from the derived verdict, superseded from the matched record's stage or superseded_by, conflicting where it negates a matched invariant or non_goal (reported with both texts for a person), new otherwise. A conversation enters only as workspace references read from the local store. Output is a draft for I3252's check, never records.
Why
2026-09-12 accepted: requirements become outcome-shaped records after discovery classifies each, not one issue per bullet; 2026-10-18: one revision may update several intents. Proposed in ADR 0194 (An ingested brief is an intake revision, and its requirements are reconciled into the existing plan) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c174#19, chatgpt-majordomus:c210#4, chatgpt-majordomus:c297#9, chatgpt-majordomus:c033#3, chatgpt-majordomus:c054#8, chatgpt-majordomus:c088#3.
Current state
No segment identity; the promotion of 2026-10-18 reconciled conversations by hand with conv#msg sources; I3254 (duplicates) is planned, and the derived verdict is on master in intent.rs.
Desired state
Classification is reproducible from the revision and the plan at a commit and matches a committed fixture.
Scope
- apps/majordomus-cli/src/intent_realization.rs
- apps/majordomus-cli/src/intent.rs
- share/schemas/majordomus/intent
- apps/majordomus-cli/src/capability/builtin/intents.rs
- apps/majordomus-cli/src/commands/intent.rs
- apps/majordomus-cli/src/lib.rs
- share/allow/intent.txt
Dependencies
- I3272BLOCKED A received brief is a campaign revision pinned by its manifest digest, and the same bytes again are the same revision
- I3252BLOCKED A draft plan is judged as if it were written, and only a checked draft is written, through one capability
- I3251READY A desired outcome is briefed with what the repository already holds about it
- I3254BLOCKED A proposal names the existing intents and issues it duplicates or overlaps, and is merged into one rather than added beside it
- I3280READY An intent, a milestone and an issue carry provenance the way an ADR and a knowledge record do
- I3281BLOCKED A workspace message is a typed provenance reference that validates in every checkout without the store
- I3278BLOCKED The 2026-10-18 import is the workspace store's first sync, not a scratchpad
What waits on this
- I3274BLOCKED A new campaign revision reports only the criteria whose source requirement changed
- I3275BLOCKED An intent's inspector shows the campaign segments it was derived from
Acceptance criteria
- Each derived draft item names its source segment by digest and location
- 'existing' is the duplicate result of I3254. No second duplicate detector is built
- 'satisfied' and 'partial' are read from the derived intent verdict (intent.rs verdict, intent_realization.rs) and are never judged by the classifier
- 'superseded' is read from the matched record's stage or superseded_by. 'conflicting' is a requirement that negates the matched record's invariant or non_goal, and it is reported with both texts for a person and never resolved automatically
- A segment's identity is the digest of its normalised text. Document, heading path and item position are its location, not its identity
- Each derived draft criterion carries its source segment as a reference in the shared Provenance grammar (an optional derived_from on intent satisfaction items)
- A conversation enters as workspace: references read from .ai/local/workspaces, and no message text reaches a tracked file or the published snapshot
- A committed synthetic brief under test/fixtures, with two revisions and an expected class per requirement, is classified to exactly those classes by tests/intake.rs
- A test/cases case runs the built executable over the fixture
Validation
- majordomus plan validate
- majordomus intent validate
Evidence required
- test_requirements_are_reconciled
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/I3273.yaml. Read it back with majordomus plan show I3273.