Skip to content

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

coverstypecommandresultat commit
observation_becomes_grouped_candidatetestbash 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_accumulated8 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.

Searches the titles and descriptions of every page this site publishes.