knowledge-acts-on-what-it-learns — The repository decides when to evolve its layer, and a session carries it out
Friction is measured and then derived; each boundary records an evolve readiness verdict the next session is told; evolve output does not feed itself; outcomes are measured; a curated note whose source moved is flagged.
PLANNED 0 of 5 issues done
- ready
- 3
- blocked
- 2
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
Observations become grouped, routed candidates at the episode boundary (I2073-I2075 DONE), but acting on them waits for the owner to call /evolve by hand: .ai/repo/skills/evolve/SKILL.md lists when to use it, and nothing derives that it is due. Intent a-session-leaves-what-it-observed declares acting on a route and friction from task.refused/task.gate out of scope 'until measured'. Curated notes are never re-judged when the files they cite change. Proposed in ADR 0183 (Evolution is scheduled at the episode boundary and carried out by a session; nothing promotes itself) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c274#2.
Outcome
Friction is measured and then derived; each boundary records an evolve readiness verdict the next session is told; evolve output does not feed itself; outcomes are measured; a curated note whose source moved is flagged.
Current state
Verified on master 707a04c: lib/knowledge.sh derives, groups, routes, promotes and rejects; knowledge_base.rs judges the stopped writer (case 708); four curated notes under .ai/repo/knowledge/curated carry provenance.derived_from (this branch adds a fifth); lib/history.sh reads task.refused for display, but no deriver reads it; no readiness verdict exists.
Desired state
I3162-I3166 landed; ADR 0183 accepted and ADR 0118 amended to reference it (I3163).
Scope
- lib/knowledge.sh
- apps/majordomus-cli/src/capability/builtin/knowledge_base.rs
- apps/majordomus-cli/src/capability/builtin/brief.rs
- share/events.yaml
- .ai/repo/policy.yaml
- .ai/repo/skills/evolve
- docs/KNOWLEDGE.md
- lib/context.sh
- lib/session.sh
- apps/majordomus-cli/src/ui/knowledge.rs
- apps/majordomus-cli/src/cockpit
- apps/majordomus-cli/src/devcontext
- site/content/guarantees
- share/schemas/majordomus/policy/policy.v1.schema.json
- share/skeleton/policy.yaml
- share/allow/policy.txt
- share/schemas/majordomus/knowledge
- .ai/repo/adrs/0183-evolution-is-scheduled-at-the-episode-boundary-and-carried-out-b.md
- .ai/repo/adrs/0118-a-session-leaves-what-it-observed-and-one-candidate-per-defect-is-routed.md
- .ai/repo/project/intents
Out of scope
- Promoting, merging or releasing a lesson without a person
- An LLM in the derivation
Acceptance criteria
- Every closed episode records exactly one readiness verdict, at its close
- Concurrent 'run' verdicts in several checkouts lead to one evolve run
- An evolve run's own change yields no candidate about itself
- Friction becomes a candidate only after its measurement is recorded
- A curated note whose cited source moved since its last review is flagged for review
Validation
- majordomus plan validate
Risks
- Overlaps the in-flight a-session-proceeds work (board f6, branch docs/a-session-proceeds, I2974; not on master): proceed may be where the verdict is surfaced; coordinate on the board before I3163 starts
- Whether 'run' becomes an input to proceed.plan (I2972) is the f6 peer's decision and the owner has not accepted the scheduler design; until then I3163 delivers a case-asserted briefing directive, which does not prove a session follows it
- It follows a-session-leaves-what-it-observed in practice; the edge is kept off the milestone so two milestones of one order are not reordered.
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 |
|---|---|---|---|---|
| I3162 | READY | 0 | — | Which task.refused lines are friction is measured across every checkout, and then each repeated refused rule becomes one observation candidate |
| I3163 | READY | 0 | — | Each episode boundary derives whether evolve is due — skip, defer or run — and the next session is told why |
| I3164 | BLOCKED | 1 | I3163, I3162 | A change an evolve run makes yields no candidate about itself, and a rejected subject is not proposed again without new evidence |
| I3165 | BLOCKED | 1 | I3163 | What evolution changed is measured: recurrence of a subject after its lesson landed, per window, with its denominator |
| I3166 | READY | 0 | — | A curated note whose cited file changed since its last review is reported for review, not served as current |
The graph
flowchart LR
I3162["I3162<br/>Which task.refused lines are friction is measured across every checkout, and then each repeated refused rule becomes one observation candidate"]:::ready
I3163["I3163<br/>Each episode boundary derives whether evolve is due — skip, defer or run — and the next session is told why"]:::ready
I3164["I3164<br/>A change an evolve run makes yields no candidate about itself, and a rejected subject is not proposed again without new evidence"]:::blocked
I3165["I3165<br/>What evolution changed is measured: recurrence of a subject after its lesson landed, per window, with its denominator"]:::blocked
I3166["I3166<br/>A curated note whose cited file changed since its last review is reported for review, not served as current"]:::ready
I3162 --> I3164
I3163 --> I3164
I3163 --> I3165
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)
- I3162 Which task.refused lines are friction is measured across every checkout, and then each repeated refused rule becomes one observation candidate
- I3163 Each episode boundary derives whether evolve is due — skip, defer or run — and the next session is told why
- I3164 A change an evolve run makes yields no candidate about itself, and a rejected subject is not proposed again without new evidence
- I3165 What evolution changed is measured: recurrence of a subject after its lesson landed, per window, with its denominator
- I3166 A curated note whose cited file changed since its last review is reported for review, not served as current
Canonical record: .ai/repo/project/milestones/knowledge-acts-on-what-it-learns.yaml. Read it back with majordomus plan show knowledge-acts-on-what-it-learns.