Skip to content

I3162 — Which task.refused lines are friction is measured across every checkout, and then each repeated refused rule becomes one observation candidate

Measure once, over every checkout's ledger, which refusals are friction rather than the tool working, and record the classification rule through majordomus reasoning; then have the deriver, reading only the closing checkout's ledger across its episodes, turn a refused rule id seen in at least a declared number of episodes into one observation candidate with about and route.

READY wave 0 · p2 · deep-work profile · parallel safe

Part of knowledge-acts-on-what-it-learns — The repository decides when to evolve its layer, and a session carries it out.

Ready. Every dependency is done, so majordomus plan start I3162 will be accepted.

Objective

Measure once, over every checkout's ledger, which refusals are friction rather than the tool working, and record the classification rule through majordomus reasoning; then have the deriver, reading only the closing checkout's ledger across its episodes, turn a refused rule id seen in at least a declared number of episodes into one observation candidate with about and route.

Why

Intent a-session-leaves-what-it-observed puts friction from task.refused/task.gate out of scope until measured; the 2026-10-16 evolve design asked for repeated failure and repeated manual intervention as signals. Critique 2026-10-18 measured 2 task.refused lines in the primary ledger, 127 task.refused lines and 1 task.gate line across the 443 worktree ledgers. It also corrected the current_state: lib/history.sh:158 reads task.refused for display, but no deriver reads it, and master has four curated notes, not five. Sources: chatgpt-majordomus:c274#2.

Current state

mj_knowledge_evidence maps decisions, resolved questions, finished tasks and observation.recorded; task.refused is written and lib/history.sh reads it for display, but no deriver reads it; task.gate is written only by `majordomus gate record`.

Desired state

A recorded measurement and a policy-declared threshold.

Scope

  • lib/knowledge.sh
  • .ai/repo/policy.yaml
  • docs/KNOWLEDGE.md
  • share/schemas/majordomus/policy/policy.v1.schema.json
  • share/skeleton/policy.yaml
  • share/allow/policy.txt
  • .ai/repo/project/intents

Out of scope

  • Classifying with a model
  • Deriving friction from task.gate
  • Reading another checkout's ledger from the deriver

Dependencies

None. This issue is a root of the graph.

What waits on this

Acceptance criteria

  • The measurement is recorded with its denominator
  • A refused rule id seen in N episodes of the closing checkout yields one candidate citing every episode
  • Each new case named here takes its number from `scripts/case-numbers next` and is announced on the board before the file is written (ADR 0053); a case number written in this record before that is provisional
  • The measurement is a one-time read of every checkout's ledger (the primary and each <repository>-wt worktree), recorded through majordomus reasoning with per-checkout counts and the denominator (episodes and finish calls per checkout)
  • The deriver reads only the closing checkout's own ledger, across its episodes; that read writes nothing, and the deriver still writes only the closing episode's candidate file, which keeps the parent invariant
  • A friction candidate cites only references that resolve in every checkout (task ids, issue ids, refused rule ids, commits), never a checkout-local episode or session id, so a committed friction candidate passes doctor in another checkout (adopter report #20)
  • The subject of a refusal is each rule id in task.refused's refused[], routed as mj_knowledge_route routes it (majordomus.* to platform, project.* to the repository); the measurement records, per class, whether a refusal is friction or the tool working
  • task.gate is not a deriver source; the measurement reports its count and the reason it is rare (only `majordomus gate record` writes it, and it keys on 'task', not 'task_id')
  • The friction threshold is an optional policy key with a default, declared in the policy schema and skeleton; doctor passes on a policy without it
  • The criterion friction-is-measured-first is rewritten to evidence: test with the allocated case path, and that case runs in this issue's validation

Validation

  • bash test/run.sh 981_an_observation_becomes_a_grouped_candidate

Evidence required

  • case_friction_becomes_a_candidate

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/I3162.yaml. Read it back with majordomus plan show I3162.

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