I2074 — An observation becomes a candidate that says what it is about, and reading groups recurrence
Add the observation.recorded row to mj_knowledge_evidence with ADR 0091's per-episode id over kind, subject and statement; add optional about and route to knowledge/v1 (proto, generate); have knowledge candidates and the Rust knowledge_base.candidates group by about, listing each record and its episodes.
DONE wave 1 · p1 · implementation profile · runs alone
Part of a-session-leaves-what-it-observed — A session leaves what it observed, and the repository routes it.
Objective
Add the observation.recorded row to mj_knowledge_evidence with ADR 0091's per-episode id over kind, subject and statement; add optional about and route to knowledge/v1 (proto, generate); have knowledge candidates and the Rust knowledge_base.candidates group by about, listing each record and its episodes.
Why
The same defect seen by several sessions must read as one thing without any episode writing another's file.
Current state
Four events map to candidates; no record says what it is about; candidates is a flat list.
Desired state
Observation candidates carry about; both readers group by it; a second derivation is byte-identical; an empty episode still records knowledge.derived with written 0.
Scope
- lib/knowledge.sh
- share/schemas/majordomus/knowledge
- share/allow
- share/sections
- .ai/repo/knowledge/candidates/README.md
- share/skeleton/ai/repo/knowledge
- apps/majordomus-cli/src/capability/builtin/knowledge_base.rs
- apps/majordomus-cli/tests/knowledge_base.rs
- docs/KNOWLEDGE.md
- test/cases/981_an_observation_becomes_a_grouped_candidate.sh
Dependencies
What waits on this
Acceptance criteria
- An episode with two observations derives two candidates, each with about set to its subject
- Two episodes observing one subject write two files and candidates lists one group naming both episodes, the shell and the Rust reader alike
- A rejected candidate stays superseded after the second episode, which adds a new candidate to the same group
- An episode with no observation writes no candidate and still appends knowledge.derived with written 0
- Cases 563, 564, 565, 707, 709, 710 and 711 still pass
Validation
- bash test/run.sh 981_an_observation_becomes_a_grouped_candidate
- bash test/run.sh 563_knowledge_is_derived_at_the_boundary
- bash test/run.sh 564_knowledge_derivation_is_idempotent
- cargo test --test knowledge_base
Evidence required
- observation_becomes_grouped_candidate
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| observation_becomes_grouped_candidate | test | bash test/run.sh 981_an_observation_becomes_a_grouped_candidate 563_knowledge_is_derived_at_the_boundary 564_knowledge_derivation_is_idempotent 565_knowledge_switch_and_failure_leave_evidence 707_knowledge_check_refuses_malformed_records 709_knowledge_promotion_is_an_act 710_briefing_names_the_candidates 711_candidates_are_reviewed_not_accumulated | 8 passed, 0 failed at master c0e3585dc83 (2026-10-14T23:3xZ); delivered by 4afbde69ed8; Rust reader knowledge_base.rs unchanged since validate run 38626102499 (success on e8505a431d, rust (1)/(2)/(3) jobs 116065669902/116065669775/116065669794) | c0e3585 |
Timeline
- started
- 2026-10-14T23:32:49Z
- verified
- 2026-10-14T23:32:56Z
- completed
- 2026-10-14T23:33:06Z
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/I2074.yaml. Read it back with majordomus plan show I2074.