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.work-serves-a-declared-intent@1

Work serves a declared intent, and an intent is satisfied only by evidence

What it is

URI
majordomus://rule/project.work-serves-a-declared-intent@1
Kind
rule
Identity
project.work-serves-a-declared-intent@1
Path
.ai/repo/rules/project/work-serves-a-declared-intent.v1.md
Provenance
declared
Media type
text/markdown
As a capability
rule.project.work-serves-a-declared-intent@1

Front matter

{
  "id": "project.work-serves-a-declared-intent",
  "version": 1,
  "kind": "rule",
  "title": "Work serves a declared intent, and an intent is satisfied only by evidence",
  "description": "What must become true is a typed intent record above the milestones that realise it; its stage is derived from the plan and its satisfaction from recorded evidence, it is never stored, and an intent model whose links do not resolve is refused by a gate.",
  "statement": "Every intent is a schema-valid record naming the milestones that realise it and the evidence that settles each criterion; its stage and satisfaction are derived and never written; and an intent that names no milestone, or a milestone or evidence reference that resolves to nothing, fails the intent-check gate.",
  "status": "active",
  "class": "blocking",
  "depends_on": [
    "project.derived-once@1",
    "project.no-claim-without-test@1"
  ],
  "tags": [
    "intent",
    "project",
    "evidence",
    "projections"
  ],
  "x-majordomus": {
    "tests": [
      "test/cases/367_an_intent_is_satisfied_only_by_evidence.sh",
      "apps/majordomus-cli/tests/intent.rs"
    ]
  }
}

Content

---
id: project.work-serves-a-declared-intent
version: 1
kind: rule
title: Work serves a declared intent, and an intent is satisfied only by evidence
description: What must become true is a typed intent record above the milestones that realise it; its stage is derived from the plan and its satisfaction from recorded evidence, it is never stored, and an intent model whose links do not resolve is refused by a gate.
statement: Every intent is a schema-valid record naming the milestones that realise it and the evidence that settles each criterion; its stage and satisfaction are derived and never written; and an intent that names no milestone, or a milestone or evidence reference that resolves to nothing, fails the intent-check gate.
status: active
class: blocking
depends_on: [project.derived-once@1, project.no-claim-without-test@1]
tags: [intent, project, evidence, projections]

x-majordomus:
  tests: [test/cases/367_an_intent_is_satisfied_only_by_evidence.sh, apps/majordomus-cli/tests/intent.rs]
---

# Rationale

The plan says what work exists and in which order; the evidence ledger says what ran. Neither
says what the work was for. That question lived in prompts, and a prompt is unversioned,
unenforced and gone at the end of a session, so no command could say which outcome a change
served or whether finished milestones achieved it.

An intent record closes that gap only if it does not become a second account of the work.
A stored intent status would drift the first time an issue was re-planned, exactly as a
stored issue status would, which is why the plan stores none.

# Required behaviour

- An intent lives under `.ai/repo/project/intents/<id>.yaml` and is validated by
  `majordomus.intent/v1`; its keys are closed by `share/allow/intent.txt`.
- An intent names at least one milestone and at least one satisfaction criterion, each
  criterion naming its evidence by kind and reference.
- The stage is derived from the status the plan derives for the named milestones, and a
  criterion is met only when the evidence ledger holds a current passing run for its test,
  or its claim is proven or has unchanged inputs. `command` and `deployment` evidence
  resolves but is never counted as met.
- No capability writes an intent, stores its stage or transitions it.
- `majordomus intent validate` exits 10 on any failure, and the `intent-check` gate runs it
  on every change to the project model or the intent engine.

# Failure behaviour

`majordomus intent validate` prints one line per finding with its level, code, subject,
message and reproduce command, and exits 10 when any is a failure: `intent_without_milestone`,
`intent_without_criterion`, `unknown_milestone`, `criterion_without_ref`,
`unresolved_evidence_ref`, `unresolved_governance`, `unknown_successor`, `duplicate_criterion`,
`file_name_mismatch`. A milestone no intent serves is the warning
`milestone_serves_no_intent`.

# Verification

`apps/majordomus-cli/tests/intent.rs` proves the command line, HTTP and MCP answer the same
derived intents and that an invalid model exits non-zero naming the finding.
`test/cases/367_an_intent_is_satisfied_only_by_evidence.sh` proves through the built
executable that a recorded passing run is what moves a criterion to met, and that a broken
reference is refused.