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
Add a related list to each candidate group in the Rust knowledge_base.candidates reader and on /ui/knowledge. It is computed on read and never written into a candidate. It lists the curated notes that entity.affected (I3412) reaches from the group's subject path and, for a subject that is a rule, the rule's path. The shell reader is unchanged, and case 981's parity normalisation leaves related out. Step 2 of the evolve skill tells the reviewer to read related, and to reject with --by naming the curated note when a candidate duplicates it.
BLOCKED wave 3 · p2 · implementation profile · parallel safe
Blocked. This issue cannot start until I3413, I3412, milestone:knowledge-is-reconciled-before-it-is-reviewed are done. The status is derived from that, not declared.
Objective
Add a related list to each candidate group in the Rust knowledge_base.candidates reader and on /ui/knowledge. It is computed on read and never written into a candidate. It lists the curated notes that entity.affected (I3412) reaches from the group's subject path and, for a subject that is a rule, the rule's path. The shell reader is unchanged, and case 981's parity normalisation leaves related out. Step 2 of the evolve skill tells the reviewer to read related, and to reject with --by naming the curated note when a candidate duplicates it.
Why
The owner's 2026-10-19 Cognitive Fabric pack asks for duplicates and contradictions to be detected against curated content and rules (campaigns/prismatic-way-cognitive-fabric-prompt-pack/prompts/03_KNOWLEDGE.md). verification/ACCEPTANCE.md asks that contradictory evidence stay a visible conflict keeping both sources. contracts/EVENT_CONTRACT.md asks for conflicts to stay visible rather than newest-wins.
Current state
knowledge_base.rs:733-768 and lib/knowledge.sh:1517-1530 group candidates/ only. The contradicts relation exists only in the vocabulary (lib/knowledge.sh:1029, knowledge.v1.schema.json:166). Curated notes cite file: and issue: references and carry no about field. .ai/repo/skills/evolve/SKILL.md step 2 asks for duplicates to be rejected, with no tool support.
Desired state
Each group carries the curated notes and the rule that name its subject, from the one reverse reader. Deciding remains a person's act.
Scope
- apps/majordomus-cli/src/capability/builtin/knowledge_base.rs
- apps/majordomus-cli/src/ui/knowledge.rs
- test/cases/981_an_observation_becomes_a_grouped_candidate.sh
- .ai/repo/skills/evolve/SKILL.md
- docs/KNOWLEDGE.md
- site/content/docs/knowledge.md
- docs/generated/openapi.json
- docs/generated/openapi.yaml
- docs/generated/registry.json
- docs/generated/registry.yaml
- site/data/generated/openapi.json
- site/data/registry/registry.json
Out of scope
- A shell derivation of the same backlinks
- Writing a contradicts relation into a candidate
- Judging whether two statements contradict, by any means
- A new capability or store
Dependencies
- I3413BLOCKED 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
- I3412BLOCKED entity.affected also answers the rules, claims and knowledge records whose declared references name an affected path or issue, and takes a revision range
What waits on this
Acceptance criteria
- A group whose subject is a file a curated note cites lists that note's id under related, in the Rust reader and on /ui/knowledge
- A group about a rule lists the rule's path; an unknown rule lists nothing and is not an error
- The shell and Rust JSON stay byte-identical outside related under case 981's normalisation
- No candidate file changes bytes because of this issue (case 564 stays green)
- The evolve skill's step 2 names the related field and reject --by
Validation
- bash test/run.sh 981_an_observation_becomes_a_grouped_candidate 564_knowledge_derivation_is_idempotent 3003_the_knowledge_screen_answers 3004_evolve_is_a_procedure_of_existing_commands
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib knowledge_base
- bin/majordomus-cli generate --check
- majordomus plan validate
Evidence required
- a_group_names_the_curated_notes_and_rule_of_its_subject
- case_a_candidate_names_what_already_says_it
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/I3414.yaml. Read it back with majordomus plan show I3414.