knowledge-is-reconciled-before-it-is-reviewed — What a session proposes as knowledge is reconciled with what the repository already knows before a person reviews it, and a promotion stands on evidence that resolves
A known fact gets one candidate. Each candidate group names what already speaks about its subject, read from the entity layer rather than from a second derivation. A promotion needs a resolvable reference and records it. An observation can cite the review that found it.
BLOCKED 0 of 5 issues done
- ready
- 0
- blocked
- 5
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
The deriver compares a new candidate with curated knowledge only by full id, episode included (lib/knowledge.sh:1334-1337), so the same decision in a second episode becomes a second candidate. Nothing relates a candidate to the curated notes or rules about its subject: knowledge_base.rs:733-768 groups candidates/ only, and the contradicts relation has no producer or consumer. Promotion accepts any non-blank prose without a transcript marker (lib/knowledge.sh:1586-1591). An observation cannot cite a mesh review (lib/knowledge.sh:187). Repetition, partial tasks and concurrent closes hold by construction, and nothing proves them.
Outcome
A known fact gets one candidate. Each candidate group names what already speaks about its subject, read from the entity layer rather than from a second derivation. A promotion needs a resolvable reference and records it. An observation can cite the review that found it.
Current state
Cases 564, 707-711, 980, 981 and 3004 verify knowledge observe, derive --dry-run, candidates, reject and check. session.knowledge_on_end derives knowledge at the episode end (lib/session.sh:663-673).
Desired state
I3416, I3413, I3414, I3415 and I3417 have landed in that order, each extending an existing case.
Scope
- lib/knowledge.sh
- apps/majordomus-cli/src/capability/builtin/knowledge_base.rs
- apps/majordomus-cli/src/ui/knowledge.rs
- test/cases/564_knowledge_derivation_is_idempotent.sh
- test/cases/709_knowledge_promotion_is_an_act.sh
- test/cases/980_a_session_records_what_it_observed.sh
- test/cases/981_an_observation_becomes_a_grouped_candidate.sh
- test/cases/3004_evolve_is_a_procedure_of_existing_commands.sh
- .ai/repo/skills/evolve/SKILL.md
- docs/KNOWLEDGE.md
- docs/CLI.md
- share/events.yaml
- .ai/repo/project/intents
Out of scope
- Automatic promotion, rejection or relation of any record
- Model-based similarity or contradiction judgement
- Rejected subjects proposed again (I3164)
- An incident entity, a review event or any new store (rule project.no-new-nouns)
- The evolve readiness verdict, friction derivation, self-feeding and moved-source flags (milestone knowledge-acts-on-what-it-learns, I3162-I3166)
Acceptance criteria
- The criteria a-known-fact-is-one-candidate, a-candidate-names-what-already-says-it, promotion-cites-resolvable-evidence and an-observation-cites-its-review are rewritten to evidence: test naming the extended cases
- Case 981's shell and Rust parity block stays byte-identical outside the related field, which only the Rust reader answers
Validation
- majordomus plan validate
Risks
- I3162, I3163, I3164 and I3166 also have lib/knowledge.sh, knowledge_base.rs, ui/knowledge.rs and the evolve skill in scope; I3413 depends on I3164, and the rest must be announced on the board, with master merged between them
- I3415 changes promote's documented evidence contract. Whether an agent may promote at all is an open owner question that this milestone does not settle: ADR 0091 says a person promotes, while step 2 of the evolve skill has an agent run promote
- I3413 runs inside session close (lib/session.sh:663-669); its comparison is a directory listing of file names, not a read of records, and its added time is measured and reported
- I3413's curated arm matches nothing today, because no curated note's file name has the derived episode-and-digest shape (ls .ai/repo/knowledge/curated); its value lies in the pending arm and in promotions from now on
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I3413 | BLOCKED | 2 | I3416, I3164 | A decision, resolved question or verified task fact already curated or pending from another episode of this checkout is not proposed again, and derive names the record it matched |
| I3414 | BLOCKED | 3 | I3413, I3412 | Every candidate group names the curated notes and the rule that already speak about its subject, read from entity.affected, so a possible duplicate or contradiction is in front of the reviewer with both sources |
| I3415 | BLOCKED | 4 | I3414 | knowledge promote refuses evidence that names no reference existing in this checkout, and knowledge.promoted records the references it stood on |
| I3416 | BLOCKED | 0 | — | The episode boundary is proven to give one candidate for an observation recorded twice, none for a partial task, and one file per episode when two episodes close at once |
| I3417 | BLOCKED | 5 | I3415 | An observation can cite the mesh review that found what it records, and the reference stays in the candidate's body, never in its provenance |
The graph
flowchart LR
I3413["I3413<br/>A decision, resolved question or verified task fact already curated or pending from another episode of this checkout is not proposed again, and derive names the record it matched"]:::blocked
I3414["I3414<br/>Every candidate group names the curated notes and the rule that already speak about its subject, read from entity.affected, so a possible duplicate or contradiction is in front of the reviewer with both sources"]:::blocked
I3415["I3415<br/>knowledge promote refuses evidence that names no reference existing in this checkout, and knowledge.promoted records the references it stood on"]:::blocked
I3416["I3416<br/>The episode boundary is proven to give one candidate for an observation recorded twice, none for a partial task, and one file per episode when two episodes close at once"]:::blocked
I3417["I3417<br/>An observation can cite the mesh review that found what it records, and the reference stays in the candidate's body, never in its provenance"]:::blocked
I3413 --> I3414
I3414 --> I3415
I3415 --> I3417
I3416 --> I3413
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (5)
- I3413 A decision, resolved question or verified task fact already curated or pending from another episode of this checkout is not proposed again, and derive names the record it matched
- I3414 Every candidate group names the curated notes and the rule that already speak about its subject, read from entity.affected, so a possible duplicate or contradiction is in front of the reviewer with both sources
- I3415 knowledge promote refuses evidence that names no reference existing in this checkout, and knowledge.promoted records the references it stood on
- I3416 The episode boundary is proven to give one candidate for an observation recorded twice, none for a partial task, and one file per episode when two episodes close at once
- I3417 An observation can cite the mesh review that found what it records, and the reference stays in the candidate's body, never in its provenance
Canonical record: .ai/repo/project/milestones/knowledge-is-reconciled-before-it-is-reviewed.yaml. Read it back with majordomus plan show knowledge-is-reconciled-before-it-is-reviewed.