Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

project.an-intent-outlives-its-sessions@3

An intent outlives the sessions and providers that realise it, and closed work does not outrank evidence

What it is

URI
majordomus://rule/project.an-intent-outlives-its-sessions@3
Kind
rule
Identity
project.an-intent-outlives-its-sessions@3
Path
.ai/repo/rules/project/an-intent-outlives-its-sessions.v3.md
Provenance
declared
Media type
text/markdown
As a capability
rule.project.an-intent-outlives-its-sessions@3

Front matter

{
  "id": "project.an-intent-outlives-its-sessions",
  "version": 3,
  "kind": "rule",
  "title": "An intent outlives the sessions and providers that realise it, and closed work does not outrank evidence",
  "description": "Which work realises an intent is derived from the ledger, the session records and the peer board, with every link's provenance; no session, provider or handover holds intent state — a task or handover may carry the names its worker declared and a hash compared on read, never a stage, a verdict or a criterion; and an intent whose work is all closed while its evidence says no is refused by a gate.",
  "statement": "The lineage from an intent to the tasks, episodes, providers, handovers, session records and peer claims realising it is derived on read and stored in none of them; what a task or a handover may carry is the name its worker declared (an issue, an intent, an exemption with its reason) and pins compared on a later read (plan_revision, evidence_standing), and no stage, verdict, criterion or evidence state; every link says whether it is declared, observed, derived or inferred; every episode records its provider on the ledger so the lineage survives the episode's end; an intent whose milestones are all DONE while a criterion's recorded evidence is failing or stale fails the intent-realization gate, naming the criterion; and every disagreement between the plan-derived stage and the evidence-derived verdict is reported as drift.",
  "status": "active",
  "class": "blocking",
  "depends_on": [
    "project.work-serves-a-declared-intent@1",
    "project.derived-once@1"
  ],
  "tags": [
    "intent",
    "session",
    "handover",
    "provenance",
    "evidence"
  ],
  "x-majordomus": {
    "tests": [
      "test/cases/388_an_intent_is_realised_across_providers_and_held_to_reality.sh",
      "test/cases/367_an_intent_is_satisfied_only_by_evidence.sh",
      "test/cases/895_a_finished_task_does_not_satisfy_an_intent.sh",
      "apps/majordomus-cli/tests/intent_realization.rs",
      "test/cases/960_a_task_starts_bound_to_what_it_serves.sh",
      "test/cases/961_a_resumed_task_is_told_its_intent_moved.sh"
    ]
  }
}

Content

---
id: project.an-intent-outlives-its-sessions
version: 3
kind: rule
title: An intent outlives the sessions and providers that realise it, and closed work does not outrank evidence
description: Which work realises an intent is derived from the ledger, the session records and the peer board, with every link's provenance; no session, provider or handover holds intent state — a task or handover may carry the names its worker declared and a hash compared on read, never a stage, a verdict or a criterion; and an intent whose work is all closed while its evidence says no is refused by a gate.
statement: The lineage from an intent to the tasks, episodes, providers, handovers, session records and peer claims realising it is derived on read and stored in none of them; what a task or a handover may carry is the name its worker declared (an issue, an intent, an exemption with its reason) and pins compared on a later read (plan_revision, evidence_standing), and no stage, verdict, criterion or evidence state; every link says whether it is declared, observed, derived or inferred; every episode records its provider on the ledger so the lineage survives the episode's end; an intent whose milestones are all DONE while a criterion's recorded evidence is failing or stale fails the intent-realization gate, naming the criterion; and every disagreement between the plan-derived stage and the evidence-derived verdict is reported as drift.
status: active
class: blocking
depends_on: [project.work-serves-a-declared-intent@1, project.derived-once@1]
tags: [intent, session, handover, provenance, evidence]

x-majordomus:
  tests: [test/cases/388_an_intent_is_realised_across_providers_and_held_to_reality.sh, test/cases/367_an_intent_is_satisfied_only_by_evidence.sh, test/cases/895_a_finished_task_does_not_satisfy_an_intent.sh, apps/majordomus-cli/tests/intent_realization.rs, test/cases/960_a_task_starts_bound_to_what_it_serves.sh, test/cases/961_a_resumed_task_is_told_its_intent_moved.sh]
---

# Rationale

An intent says what must become true and the plan says which issues realise it, but the work
itself happens in episodes: a Claude Code window starts a task, hands it over, and a Codex
window finishes it. If the answer to "what is this session realising" lived in the session, it
would end with the session; if it lived in a field an agent fills in, it would be as good as the
agent's memory. And if "the work is closed" were allowed to stand for "the intent is true", a
regression after closure would never be seen.

Every fact the lineage needs is already recorded by something that does not depend on the
worker remembering it: the ledger stamps each task, handover and plan transition with its
episode, the episode's start line names its provider, a closed session record lists the issues
it moved, and a peer claim names its scope. The join over them is the lineage, and it is only
honest if a link guessed from overlapping paths is never shown as a link a person declared.

# Required behaviour

- `intent_realization.work` (`majordomus intent realization`, `GET /api/v1/intents/realization`,
  `majordomus_intent_realization`) joins every ledger task, closed session record and peer claim
  to the intents it realises, through issue and milestone, and writes nothing.
- Each link carries `via` and `provenance`: `declared` when the work cites the issue, `observed`
  when its episode moved the issue, `derived` when its branch names the issue, `inferred` only
  when nothing stronger exists and an open issue's scope overlaps. One link per issue, the
  strongest.
- A task record and a handover may carry what the worker named at `start` — `issue`, `intent`,
  `exemption` with its reason — and two pins, `plan_revision` and `evidence_standing`, which are
  hashes `intents.binding` answered and a later read compares (ADR 0111). They carry no stage,
  no verdict, no criterion and no evidence state: a name is a declaration and a pin is a
  question to ask again, and neither is the answer. The issue a task named is a `declared`
  link, as an issue cited in its title is.
- `session.started` carries `provider` and `provider_session` when a provider opened the
  episode, so a closed episode keeps its provider.
- Each intent reports its unmet criteria with the issues serving each, the work and providers
  realising it, and its drift: `closed_work_contradicted`, `closed_work_unproven`,
  `criterion_closed_unmet`, and — where the stage and the verdict disagree (ADR 0107), once per
  intent — `evidence_ahead_of_plan` (the verdict is `satisfied` while the stage is `planned` or
  `executing`) and `closed_work_not_satisfied` (every milestone DONE and the verdict
  `unsatisfied` or `unknown`, naming each criterion that holds it back with its evidence kind and
  state). Live work serving no intent is the warning `work_serves_no_intent`.
- `intent_realization.explain` (`majordomus intent explain <id>`) states why the intent stands
  where it stands, sentence by sentence, from the same derivations.
- The `intent-realization` gate runs `majordomus intent realization`, which exits 10 on any
  `closed_work_contradicted`.

# Failure behaviour

`majordomus intent realization` prints each finding with its level, code, subject, message and
reproduce command and exits 10 when an intent whose milestones are all DONE has a criterion whose
recorded run is failing or stale (`closed_work_contradicted`). Every other drift —
`closed_work_unproven`, `criterion_closed_unmet`, `evidence_ahead_of_plan`,
`closed_work_not_satisfied` — and `work_serves_no_intent` is a warning: printed with its code and
reproduce command, never an exit 10. An intent that is not there is refused by name, never
answered empty.

# Verification

`test/cases/388_an_intent_is_realised_across_providers_and_held_to_reality.sh` drives the loop
through the lifecycle: a Claude Code episode through its own session hook and a Codex episode
through the session entry point carry one task across a handover; closing every issue and the
milestone while one case fails leaves the intent `verifying` with exit 10; the fix satisfies it;
breaking the behaviour takes the satisfaction away again; the repair restores it; and the intent
file is byte-identical throughout. `apps/majordomus-cli/tests/intent_realization.rs` proves the
provenance of each kind of link and that the command line, HTTP and MCP answer the same join.
`test/cases/367_an_intent_is_satisfied_only_by_evidence.sh` proves `evidence_ahead_of_plan` while
the milestone is open and its absence once it closes;
`test/cases/895_a_finished_task_does_not_satisfy_an_intent.sh` proves `closed_work_not_satisfied`
naming the criterion after a completed finish.
`test/cases/960_a_task_starts_bound_to_what_it_serves.sh` proves that a bound task's record holds
the names and the pins and no line of the intent itself, and
`test/cases/961_a_resumed_task_is_told_its_intent_moved.sh` that a handover holds the same and
that a pin a body tries to write is refused.