Example

Let the overlay end with the session

See a ten-minute overlay apply in one scope, end with the review, invalidate what depended on it, and promote nothing.

“Communication policy can persist. Communication state should usually not.” The chapter’s mechanism is an overlay: a scoped, expiring set of decisions derived from the current request. It ends with its scope, it sheds its effects when it ends, and it never becomes a durable trait on its own.

Run it

git clone https://github.com/ernanhughes/project-language.git
cd project-language
git checkout 329660f679a5a87831f91fe1430c20ac9360dda8
npm ci
npm run example:personal -- ch24

The example is cumulative. The model is a scripted stand-in and the review is an invented one.

Expected outcome

The overlay applies in its scope, for its session, and carries its decisions:

...
Chapter 24: this session's overlay (ten minutes) applies in this scope and session, and ends with them. It is not a trait.
  overlay ov-pre-meeting: used; ends the review ends
  decisions: fold:supporting, first:decisive-equation

And at the end of the session it ends, invalidates what depended on it, and promotes nothing:

...
Chapter 28: the session ends. Temporary things end with it; nothing is promoted; standing declarations remain
  overlay ov-pre-meeting ended; invalidated plan-003, plan-004, plan-013
  friction contract fr-one-paper expired
  boundary bd-quiet-feeds expired (its removal at each service is a separate act: /personal revoke)
  standing records unchanged: pol-arch-review:active, pref-terse-triage:active, acc-keyboard:active
  promoted to a durable trait: nothing (promotion is a separate, human act)

Behaviour seen while the overlay was active keeps the overlay as a condition, so it is evidence about that interaction and not about the person:

/** Behaviour seen while an overlay was active keeps that condition. It is evidence about that interaction, not about the person. */
export function observeUnderOverlay(i: {
  id: string; scope: string; now: string; evidence_id: string; behaviour: string; overlay: SessionOverlay; extra_conditions?: string[];
}): ObservedInteraction {
  return validateRecord({
    id: i.id, kind: "observed_interaction", origin: "observed", key: `observed:${i.behaviour}`, scope: i.scope,
    valid: { from: i.now, until: null }, recorded_at: i.now, source: { by: "system", ref: "interaction-observer" }, authority_ref: null,
    evidence_id: i.evidence_id, behaviour: i.behaviour,
    conditions: [`under overlay ${i.overlay.id}`, ...i.overlay.decisions, ...(i.extra_conditions ?? [])], produced_under: i.overlay.id,
    depends_on: [i.overlay.id],
  }) as ObservedInteraction;
}

The overlay’s own rules

An overlay is a declared, scoped, expiring record. Its effects are recorded so that ending it can invalidate them.

/** A scoped, expiring set of decisions derived from the current request. Not a second standing policy. */
export interface SessionOverlay extends Base {
  kind: "session_overlay"; origin: "declared";
  /** Named session or task whose end ends the overlay. */
  session: string;
  ends: { at: string | null; when: string | null };
  decisions: string[];
  /** Presentation effects this overlay caused. Ending the overlay invalidates them. */
  effects: string[];
}

And the module’s own statement of the rule, including the part that keeps it from becoming a trait:

// Chapter 24: the person changes during the day. A scoped, expiring overlay, and no inference of inner state.
//
//   Communication POLICY can persist. Communication STATE should usually not.
//
// An overlay is the bounded application of a standing policy, the current context and an explicit temporary instruction.
// It ends with its scope, it sheds its effects when it ends, and it never becomes a durable trait on its own. Promotion to a
// standing policy is a separate act that only a person can perform.

Mechanism and limitations

Documented: the overlay’s shape, its expiry and its effects are in core/personal/src/types.ts; the promotion rule is in core/personal/src/overlay.ts.

Observed: the run above. The overlay was used while it was live; when the session ended it ended with it, three plans were invalidated, and the standing declarations were unchanged. Nothing was promoted.

Not shown. The overlay’s ten minutes are a declared length, not a measured one, and the chapter’s wider question — what should persist and for how long — is argument, not code. A temporary behaviour is offered to the person as a proposal; it is never a declaration and never a policy. Nothing here shows that a scoped, expiring state helps anyone.

Canonical source and the overlay module .

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.