Keep declared, observed and inferred apart
See the record kinds discriminated in the types themselves, and watch a scope that does not cover the task leave a declared preference inapplicable rather than applied.
Part III begins with a vocabulary, and the chapter’s claim is that the distinctions have to be in the types, not in prose. There is deliberately no profile, no person-type, no score that combines kinds, and no field that could hold an inferred inner state.
Run it
git clone https://github.com/ernanhughes/project-language.git
cd project-language
git checkout 329660f679a5a87831f91fe1430c20ac9360dda8
npm ci
npm run example:personal -- ch21The Part III example is cumulative: selecting a chapter establishes the fixture
stages it depends on before showing that chapter’s output. npm run example:personal -- all shows the full invented architecture-review morning. The model is a
scripted stand-in.
Expected outcome
Three standing declarations, each with its own scope, and a preference that does not apply here:
...
declared_policy pol-arch-review scope architecture-review applies here
declared_preference pref-terse-triage scope technical-triage does not apply here: scope "technical-triage" does not cover "architecture-review:talk-q"
accessibility_requirement acc-keyboard scope * applies hereAnd the origin of each is stated in the record:
...
(standing records are kept in durable memory through core/remembering; none came from the model)The distinctions are in the types
The record kinds are discriminated, so a record that claims another kind’s origin cannot be constructed. This is the vocabulary of the part:
// Part III: personal mediation. The vocabulary.
//
// No host, model, clock, storage or network access here. Records are DISCRIMINATED: each kind has its own fields, so the
// distinctions the chapters draw are in the types, not in comments. There is deliberately no profile, no person-type, no
// score that combines kinds, and no field that could hold an inferred inner state.
/** Where a record came from. Authority runs in this order and inference may propose but never establish. */
export type Origin = "declared" | "observed" | "inferred";The presentation dimensions are independent, and there is no slot for a type of person:
/** The independent presentation dimensions of Chapter 21. There is no slot for a type of person. */
export const DIMENSIONS = ["depth", "form", "explanation", "order", "evidence", "interaction", "technicality", "navigation"] as const;
export type Dimension = (typeof DIMENSIONS)[number];And the kinds an inference may be about exclude person types, personality and inner states — not by policy, but because they cannot be represented:
/** What an inference may be about. Person types, personality and inner states are not in this list and cannot be represented. */
export const BELIEF_KINDS = ["task_condition", "knowledge", "preference", "strategy", "expertise"] as const;
export type BeliefKind = (typeof BELIEF_KINDS)[number];An observation is evidence of an interaction, and the conditions under which it happened stay attached to it:
export interface ObservedInteraction extends Base {
kind: "observed_interaction"; origin: "observed";
/** The core/evidence record this observation is an instance of. Observations are evidence, not statements about preference. */
evidence_id: string;
behaviour: string;
/** The conditions under which it happened. They stay attached: behaviour under an overlay is evidence about that interaction. */
conditions: string[];
produced_under: string | null;
}Mechanism and limitations
Documented: the record kinds, the origin ordering, the presentation
dimensions and the belief kinds are in core/personal/src/types.ts; the wider
Part III design is in PART-THREE-CONTRACT.md at the root of the repository.
Observed: the run above. Three standing records were in force, the architecture-review policy applied to the current scope, the accessibility requirement applied everywhere, and the terse-triage preference did not apply to this task and was reported as inapplicable rather than applied anyway.
Not shown. That any personalisation helps anyone is not established, and nothing here shows that a person noticed, understood or used anything. The declared policies are written by hand: they are not measured, and their correctness is not evaluated. The example uses one invented person and one invented morning.
Understand this example
Copy this prompt into your AI tool. No code runs here.
Apply this example
Copy this prompt into your AI tool. No code runs here.