an-entity-says-how-it-is-known-and-what-it-affects — One entity read names how its record says it is known and when it was observed, identically on every surface, and what a change affects is derived from the same index
entity.show answers, on every surface from one declaration, a class read from the record and the observation envelope repository.info already uses. Proof stays a pointer (entity.rs:181-185). A test fails on any divergence between surfaces. entity.affected answers what a path set or a revision range touches, with reasons, from the loaded index.
BLOCKED 0 of 5 issues done
- ready
- 0
- blocked
- 5
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
EntityView (apps/majordomus-cli/src/capability/builtin/entity.rs:395-435) carries no epistemic class, no observation time and no blob. Separate vocabularies each answer part of how a record is known: entity.rs:140-151, intent_realization.rs:77-101, devtask/mod.rs:93-125, knowledge epistemics in docs/KNOWLEDGE.md:30, and ProofState in evidence/mod.rs. No test compares entity.show across the command line, REST, MCP and the Cockpit. No capability composes path, issue scope, served intent and the records that name the path: graph.rs RELATIONS has no scope or serves relation, and trace.commit attributes by branch only (capability/builtin/trace.rs:269-271).
Outcome
entity.show answers, on every surface from one declaration, a class read from the record and the observation envelope repository.info already uses. Proof stays a pointer (entity.rs:181-185). A test fails on any divergence between surfaces. entity.affected answers what a path set or a revision range touches, with reasons, from the loaded index.
Current state
Projections are registry-derived and drift-checked (apps/majordomus-cli/tests/projections.rs). tests/cockpit.rs:187-245 compares the Cockpit entity page with GET /api/v1/entity only. I3314 plans the last-changing commit on the entity read.
Desired state
I3427, I3428, I3429, I3407 and I3412 have landed. docs/SURFACES.md states the class vocabulary once, with the mapping from each older vocabulary, as the proposed ADR decides.
Scope
- apps/majordomus-cli/src/capability/builtin/entity.rs
- apps/majordomus-cli/src/entity.rs
- apps/majordomus-cli/src/intent_binding.rs
- apps/majordomus-cli/src/live.rs
- apps/majordomus-cli/tests/objects.rs
- apps/majordomus-cli/tests/cockpit.rs
- docs/SURFACES.md
- docs/generated/registry.json
- docs/generated/registry.yaml
- docs/generated/openapi.json
- docs/generated/openapi.yaml
- docs/generated/modules/entity.md
- site/data/generated/openapi.json
- site/data/registry/registry.json
Out of scope
- Renaming or removing IntentLinkProvenance, FieldProvenance, knowledge epistemics, EvidenceState or ProofState
- Running a proof inside entity.show
- A confidence score (no deterministic producer exists)
- An accountable-owner field (no canonical owner record exists)
- Adding relations to graph::RELATIONS
- CI case selection (I3238) and derive input selection (milestone a-derive-does-only-the-work-its-inputs-changed)
Acceptance criteria
- The criteria an-entity-says-how-it-is-known, every-surface-reads-one-entity and what-a-change-affects-is-derived are rewritten to evidence: test
- bin/majordomus-cli generate --check passes with every new field projected and no projection edited by hand
Validation
- majordomus plan validate
Risks
- entity.rs is edited by I3427, I3428, I3407, I3412 and I3314; I3407 and I3412 chain on I3427, I3428 waits on I3314, and each must merge master before it lands
- An object whose record carries no basis reads observed; screens that showed resolved evidence keep showing it beside the class, and they must not read as a regression
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 |
|---|---|---|---|---|
| I3407 | BLOCKED | 1 | I3427 | What a set of paths affects in the plan is derived from the index: the issues whose scope covers them, what those issues serve and their incoming edges, each with its relation, and nothing is rescanned |
| I3412 | BLOCKED | 2 | I3407 | entity.affected also answers the rules, claims and knowledge records whose declared references name an affected path or issue, and takes a revision range |
| I3427 | BLOCKED | 0 | — | Every entity read names how its record says it is known, and never answers verified itself: proof stays the pointer it is |
| I3428 | BLOCKED | 1 | I3314, I3427 | An entity read carries the observation envelope repository.info already answers, plus the blob of its file, and a change to that file moves both |
| I3429 | BLOCKED | 2 | I3427, I3428 | One entity reads the same on the command line, REST, MCP and the Cockpit: identity, kind, class, evidence, observation envelope and edge order |
The graph
flowchart LR
I3407["I3407<br/>What a set of paths affects in the plan is derived from the index: the issues whose scope covers them, what those issues serve and their incoming edges, each with its relation, and nothing is rescanned"]:::blocked
I3412["I3412<br/>entity.affected also answers the rules, claims and knowledge records whose declared references name an affected path or issue, and takes a revision range"]:::blocked
I3427["I3427<br/>Every entity read names how its record says it is known, and never answers verified itself: proof stays the pointer it is"]:::blocked
I3428["I3428<br/>An entity read carries the observation envelope repository.info already answers, plus the blob of its file, and a change to that file moves both"]:::blocked
I3429["I3429<br/>One entity reads the same on the command line, REST, MCP and the Cockpit: identity, kind, class, evidence, observation envelope and edge order"]:::blocked
I3407 --> I3412
I3427 --> I3407
I3427 --> I3428
I3427 --> I3429
I3428 --> I3429
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)
- I3407 What a set of paths affects in the plan is derived from the index: the issues whose scope covers them, what those issues serve and their incoming edges, each with its relation, and nothing is rescanned
- I3412 entity.affected also answers the rules, claims and knowledge records whose declared references name an affected path or issue, and takes a revision range
- I3427 Every entity read names how its record says it is known, and never answers verified itself: proof stays the pointer it is
- I3428 An entity read carries the observation envelope repository.info already answers, plus the blob of its file, and a change to that file moves both
- I3429 One entity reads the same on the command line, REST, MCP and the Cockpit: identity, kind, class, evidence, observation envelope and edge order
Canonical record: .ai/repo/project/milestones/an-entity-says-how-it-is-known-and-what-it-affects.yaml. Read it back with majordomus plan show an-entity-says-how-it-is-known-and-what-it-affects.