Example

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 -- ch21

The 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 here

And 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.

Canonical source and the personal vocabulary .

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.