Skip to content

A change is reconciled by the modules that own its state: hooks only sense, reconciliation is derived on read and says how each join is known, a private read stays on its machine, and verified is answered only by proof

A change is reconciled by the modules that own its state: hooks only sense, reconciliation is derived on read and says how each join is known, a private read stays on its machine, and verified is answered only by proof

majordomus://adr/adr-0217proposed fabricchatgpt-project

it references

referenced by

Nothing in the layer names it. Backlinks are derived, so an empty list is an answer rather than an omission.

217. A change is reconciled by the modules that own its state: hooks only sense, reconciliation is derived on read and says how each join is known, a private read stays on its machine, and verified is answered only by proof

Context

On 2026-10-19 the owner handed over the Cognitive Fabric prompt pack (campaigns/prismatic-way-cognitive-fabric-prompt-pack) and a design. In it, lifecycle hooks are sensors and triggers, and models are inference workers, never the authoritative store. Epistemic classes run from observed to verified, and a model never promotes an inferred claim. The design's eight principles, the Prismatic Way, are mostly owned already. Reuse before create is rule project.no-new-nouns. Derive before infer and increment before rescan are project.derived-once. Infer before ask is project.advisors-are-optional. Verify before promote is project.review-is-recorded-not-claimed. Push before poll is ADR 0216 (on an unlanded branch). Measure before optimise is project.performance-evidence. Complete before celebrate is project.published-evidence-is-what-ci-recorded together with project.no-claim-without-test. The reuse audit found that every state the pack names has an owner: the capture archive and the ledger, the index and entity relations, devcontext, intent binding, the knowledge deriver, the reasoning store, the mesh journal, the live channel and the capability registry. Four decisions are missing, and the plan for intent a-change-reconciles-what-it-affects needs them. The first is where the hook boundary lies and how it is checked. The second is whether reconciliation is stored. The third is how a read of private records is kept on its machine when ADR 0126 admits every read from beyond loopback. The fourth is which vocabulary says how an entity is known, given that entity.show answers proof by pointer (capability/builtin/entity.rs:181-185) and the repository already has five partial vocabularies.

Decision

(1) Hook boundary. A lifecycle hook command and the shell units its subcommand sources carry no business logic and reach no inference transport. reasoning check derives that closure from share/providers.yaml and the shims, and refuses a breach (I3424). (2) Derived on read. A prompt match, the prompt-to-task slice, an affected set and an epistemic class are answered on read from records that already exist, and are never stored beside them. The one fact the slice records is the prompt identity on task.started, written by the task lifecycle that owns it (I3411). Every join names whether it is recorded or inferred. (3) Private reads. A capability that reads the checkout-private prompt archive declares so on its ExecutionPolicy, is refused to a caller beyond loopback through ADR 0126's existing refusal, and is never rendered into a snapshot (I3434, I3433, I3435). ADR 0126 is otherwise unchanged. (4) One class vocabulary. Surfaces state one epistemic class (observed, derived, inferred, proposed, superseded), read from the record's own fields and defined once in docs/SURFACES.md, with a mapping from IntentLinkProvenance, FieldProvenance, knowledge epistemics and EvidenceState, none of which is renamed. Verified is never computed by the entity read. It is the answer of the proof capability that the entity's ProofRef names, and an advisor's agreement or a resolving reference never produces it. The pack's routing levels are documented as the existing plan outcomes, with no tier noun (I3423). The Prismatic Way principles are review vocabulary that points to the rules above. They are not new rules, and this ADR adds no check beyond the ones named.

Consequences

['reasoning check gains a hooks check that refuses an inference transport in any hook closure (I3424)', 'A capability that reads .ai/local/prompts must declare the checkout-private field; a remote caller is refused it (I3434), and snapshots withhold any page reading it (I3433, I3435)', 'No reconciliation result gets a store; a reviewer refuses a match, link or class table written beside the records it summarises', "entity.show gains a class read from record fields and keeps proof as a pointer; a surface that shows verified without the proof capability's answer is a defect that I3429's surface test reports", "The pack's routing levels stay documentation of PlanOutcome; adding a tier field would need this ADR amended together with rule project.no-new-nouns", "The pack's acceptance targets stay proposed targets on every surface until a run measures them", 'Whether other capabilities that read .ai/local stores should declare the checkout-private field is left to the owner; this ADR marks only the prompt reader']

Sources

Promoted on 2026-10-18 from the owner's ChatGPT project (workspace chatgpt-majordomus, issue I3100). The owner has not accepted it; it is proposed for the owner's decision.

Where this comes from

canonical file
.ai/repo/adrs/0217-a-change-is-reconciled-by-the-modules-that-own-its-state-hooks-o.md
identity
adr-0217
also served as
MCP resource majordomus://adr/adr-0217 · majordomus entity show adr/adr-0217 · GET /api/v1/entity?uri=majordomus://adr/adr-0217
in the Cockpit
/cockpit/objects/adr/adr-0217

This page is generated from the file above by scripts/generate-site-data; editing the page changes nothing, editing the file changes every surface. The relations above are edges of docs/generated/graph.json, which the executable writes from the same index.

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