Reconcile
You are the sole explicit writer of reconciled truth — the writer half of the
audit → reconcile → close seam (ADR-003 §7; ADR-009 §1). Audit identifies what
changed and assembles the reconciliation brief; you consume it, write the changes,
and record what was done. Close confirms the outcome before the terminal transition.
You write to two surfaces with different mechanisms (D2):
| Surface | Mechanism |
|---|---|
Per-slice artefacts (design.md, slice-NNN.md) |
Direct edit with user agreement |
| Governance/spec truth (ADRs, specs, requirements, policies, standards) | REV kind (doctrine revision) — typed [[change]] rows, approval checkpoint, apply path |
Project-local documentation outside .doctrine/ is not a doctrine feature category — edit
it directly like any project file, same as per-slice artefacts.
A single reconcile pass may use both surfaces — e.g. update design.md directly
and author a REV for an ADR amendment. Where each change lands is driven by the
reconciliation brief, not guessed.
A brief item can name a surface you don't write.
plan.tomlcriteria (EN-/EX-/VT-,PHASE-NN) are immutable-append (boot rule) — not a reconcile surface. If a brief item asks you to edit a plan criterion, do not; hand it back to/auditor/consultas a design/plan escalation. And a conformance / "spurious undelivered" item is fixed by the selector registry (doctrine slice selector rm/add) — the load-bearing verb — not by adesign.md §6prose edit alone (§6 is only the mirror;slice conformancereads the registry inslice-NNN.toml). Edit prose only, and conformance stays red.
No CLI verb surface.
doctrine slice reconcileis not built yet (deferred, ADR-003 §11). You drive existing verbs (doctrine revision *, direct file edits) as manual discipline — same posture as/audittoday.
Inspect, don't re-audit (D9). You inspect target artefacts to validate applicability, locate edit points, and detect drift since audit — but you do not perform new issue discovery. If you discover a new gap not in the brief, do not open a new finding here; hand it back to
/auditor raise it with/consult. The seam stays intact: audit owns discovery, you own the write.
Inputs:
the RV ledger —
review-NNN.toml(finding status) +review-NNN.md(the review markdown, carrying the reconciliation brief)the
## Reconciliation Briefsection withinreview-NNN.md— the structured handoff from audit (D3). It maps findings to target artefacts, split into per-slice (direct edit) and governance/spec (REV) items. Its shape:## Reconciliation Brief ### Per-slice (direct edit) - design.md §3: the eviction model changed … update prose ### Governance/spec (REV) - ADR-006 §D5: branch-point staleness description is wrong → REV modify - REQ-077: cordage scale target verified at 50k nodes → REV status active
The brief lives in a dedicated section, separate from ## Synthesis (the audit's
closure story).
Process
1. Read inputs
Read review-NNN.md for the ## Reconciliation Brief section. Read
review-NNN.toml for finding status — confirm every finding is terminal
(verified / withdrawn / tolerated). A finding still in open / disputed /
follow-up is an incomplete audit — stop and hand back to /audit.
Findings stay verified — remediation is recorded separately by you, never by
mutating the finding disposition. Record the RV id and the brief items you will act
on.
2. No-op gate
If the reconciliation brief is empty — every finding was withdrawn or tolerated
with no writes needed — append a ## Reconciliation Outcome section to
review-NNN.md confirming the no-op, then hand off to /close:
## Reconciliation Outcome
All findings were withdrawn or tolerated with rationale. No writes needed.
Reconcile pass complete — handoff to /close.
3. Per-slice edits
For each direct-edit item in the brief:
- Present the proposed edit to the user. Show the exact location, the old text, and the new text. Get confirmation before writing.
- Write the edit to
design.mdand/orslice-NNN.md(if scope changed during implementation). - Record what was edited — and which finding drove it — in a running reconciliation outcome. You will append this to the RV markdown in step 6.
4. REV authoring
For each governance/spec item in the brief, author a REV change. Multiple
governance items may be collated into a single REV per slice by default (one
reconcile SL-NNN REV with multiple [[change]] rows), or into separate REVs
when items need independent debate (see the split rule below).
4a. Discover or create the REV
If the brief records a REV id, use it:
doctrine revision show REV-N
Otherwise, create one by convention:
doctrine revision new "reconcile SL-NNN" --slug reconcile-sl-NNN
The REV starts proposed with no change rows. Transition it to started before
adding rows:
doctrine revision status REV-N started
4b. Collision guard
If reconcile-sl-NNN slug already exists, inspect before reuse:
doctrine revision show REV-N
- If related (same slice, same class of change) → reuse it; append new
[[change]]rows. - If unrelated (different slice or intent collided on slug) → create a distinct slug or ask the user for a decision. Do not silently mix unrelated changes in one REV.
4c. Add [[change]] rows
For each governance/spec item, append a typed row:
doctrine revision change add REV-N --action <action> [--target <T>] [--to-status <S>] [--new-label <L> --member-of <SPEC>] [--primary]
Actions map to intent:
| Brief says | --action |
Extra flags |
|---|---|---|
| ADR/Spec prose wrong → amend | modify |
--target <ADR-N> |
| Requirement changed status | status |
--target <REQ-N> --to-status <S> |
| New requirement needed | introduce |
--new-label <FR-|NF-NNN> --member-of <SPEC-N> |
| Requirement obsolete | retire |
--target <REQ-N> |
| New spec needed | create |
--new-label <label> [--member-of <SPEC>] |
| Requirement moves spec | move |
--target <REQ-N> --member-of <SPEC-N> |
modify / retire / create / move / prose rows are surfaced for manual
landing at apply time — revision apply auto-lands only status rows.
4d. Record the reconcile narrative
Write the reconciliation rationale into revision-NNN.md — what changed, why, and
a link back to the RV finding that drove it. Example:
## Reconcile narrative (SL-080)
- [RV-042 finding F3]: ADR-006 §D5 branch-point staleness description was wrong.
Updated to match the CAS row semantics from SL-056.
- [RV-042 finding F5]: REQ-077 verified at 50k nodes. Status moved to `active`.
4e. Split rule
If any row is known to require separate debate or will not land in this pass,
split it into its own REV before approval/apply. Do not create a half-applied
omnibus REV that blocks close because one row is stuck. A REV stays started until
all rows land — a stuck row in an omnibus REV blocks the whole slice.
5. Approve & apply
When all [[change]] rows are written and the narrative is complete:
doctrine revision approve REV-N
doctrine revision apply REV-N
approverecords the orthogonal approval —applyrefuses without it (invoker-blind: a solo dev self-approves; ADR-009).applyauto-landsstatusrows and surfacesmodify/create/introduce/move/retire/proserows for manual landing. A pre-flight from-guard aborts the whole apply if any target moved since the change was drafted — if this fires, re-inspect the affected targets and retry.- Note which rows were auto-landed and which are surfaced-for-manual.
6. Manual prose landing
For surfaced-for-manual rows, perform the edits by hand under the authored-truth honour model. The REV tells you what to change; you make the actual file edit.
When all surfaced rows are landed:
doctrine revision status REV-N done
Then record the reconciliation outcome on the RV. Append a ## Reconciliation Outcome section to review-NNN.md:
## Reconciliation Outcome
### Direct edits applied
- design.md §3: updated eviction model prose → matches implementation (RV-042 F2)
### REVs completed
- REV-011 (`reconcile-sl-080`): done — ADR-006 §D5 amended, REQ-077 → active
(covers RV-042 F3, F5). Rationale in revision-011.md.
### Withdrawn / tolerated
- RV-042 F4: tolerated — drift in error message wording; rationale in finding disposition.
7. Escalation gate
If while reconciling you discover that the model itself is inadequate — not mere instance drift, but a design flaw that the change cannot be expressed within — escalate back to design:
doctrine slice status <id> design
This is the ADR-009 §1 back-edge: reconcile → design. Describe the inadequacy in
a note (the --note flag), and what the design needs to resolve. Do not improvise
a fix that the governing design does not support.
When all items are resolved and the outcome is recorded, hand off to /close.
Outcomes
- Every governance/spec item from the reconciliation brief is resolved: covered by
a
doneREV, withdrawn with rationale in the RV, tolerated with rationale in the RV, or escalated to design. - Every per-slice direct-edit item is applied to its target file.
- The RV carries a
## Reconciliation Outcomesection recording what was done and why. - Each REV carries a reconciliation narrative in its
revision-NNN.md. - The slice is ready for
/close— every item is resolved; no half-applied REVs block the close-gate.