Skip to content
Back to skills

Intentions

ASecurity

`strategy-graph-review-curriculum` records a standing requirement: the whole graph is subject to a recurring review curriculum, because deferrals calcify into dogma, author knowledge atrophies, and delegations are forgotten. As of this plan the doctrine is fully recorded and **nothing is built** — measured:

  • 3 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 3, 2026
ai-agentsgoshellbashnodeexpressgitapisecurity

Works with

  • terminal
  • cli
  • api

Security analysis

A100/100

Pro scans all 21 files and shows the line behind each finding

Scanned September 3, 2026

npx -y skills add natb1/commons.systems --skill intentions --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Intentions?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Intentions
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/natb1-intentions-67e8a55c/badge)](https://www.skillsdirectory.com/skills/natb1-intentions-67e8a55c)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
id: tactic-node-review-skill
kind: tactic
statement: Build the /exetasis skill (author-named; formerly drafted as
  /node-review) and the virtual review node — a derived, rank-ordered review
  target over durable-layer nodes un-reviewed since they last changed, with a
  per-node reviewed stamp
owner: ai
status: codified
parent: null
rationale: "Retained from the 2026-08-30 /align interview that added the
  indifference option to the interview round. The graph now records the doctrine
  (strategy-graph-review-curriculum's 2026-08-30 virtual-review-node
  clarification, and the amended conditions and success_signal); this tactic
  carries the encoding. Two-entry serves is the honest cross-cutting case (the
  artifact-owner rule, strategy-graph-native-dispatch clarification 27): the
  sitting skill is a curriculum artifact, but the derived rank-ordered candidate
  is router selection machinery, which strategy-graph-native-dispatch owns. The
  author flagged at the interview that this 'likely requires new mechanisms' —
  the router selects stored nodes today."
reading: null
serves:
  - strategy-graph-review-curriculum
  - strategy-graph-native-dispatch
recovers: []
clarifications:
  - question: How does this build reconcile with strategy-graph-review-curriculum's
      condition 4 (drift review, 2026-08-30)?
    answer: "(Recorded 2026-08-30 /align-tactics per-node finalize drift review.)
      Reconciling this build with strategy-graph-review-curriculum's condition 4
      ('expansion stays reversible and total — no node class becomes permanently
      exempt from review'): the eligible review-subject population this node
      builds is NOT the whole durable layer. Traditions and delegations are
      excluded outright — mount records carry no author dispositions
      (author-ratified, 2026-08-30 resolution round) — and virtues are reviewed
      only as ancestors, never ranked directly (author-ratified). The
      condition's 'total' clause predates both rulings and was not amended
      alongside them, so a reader checking the built sensor against the
      condition text will see an apparent breach. It is not one: the exclusion
      is scoped to /exetasis's author-disposition review, and mount accuracy —
      being objective rather than a disposition — is repaired by QA and
      office-hours processes rather than by a sitting. Recorded here rather than
      parked because the author already ratified the exclusion; nothing new
      needs ratifying and the plan reads the exclusion directly from the
      ratified clarification. A later strategy-touching round should fold this
      reconciliation into the condition text."
  - question: What is the measured code baseline for this build (drift review,
      2026-08-30)?
    answer: "(Measured 2026-08-30 during the /align-tactics per-node finalize drift
      review, in the strategy-explicit-intent worktree.) Baseline for scoping:
      this build starts from zero code. `.claude/skills/exetasis/` does not
      exist; grep over `packages/intentionsutil/src/` returns no occurrence of
      the decision-stamp vocabulary (`delegated-pending-review`,
      `delegated-review-declined`), of any reviewed-stamp or review-fingerprint
      field, or of `keystone` — the disposition model, the per-kind review
      fingerprint, the priority function and keystone rank inheritance are all
      prose-only. What DOES exist is the superseded predecessor:
      `packages/intentionsutil/src/coverage.ts` (run via
      `scripts/review-coverage.ts`) still implements the pre-2026-08-30
      mode-A/mode-B frontier-entry design and still counts tradition and
      delegation as durable review subjects. The two live durable-layer
      definitions also disagree — `coverage.ts:32-38` includes tradition and
      delegation, `grounding.ts:26-31` omits tradition — and NEITHER is the
      /exetasis subject set (see the condition-4 reconciliation clarification),
      so the plan must define that set explicitly rather than importing either
      constant. Also confirmed live this round:
      `.claude/skills/align/SKILL.md:326` and `:751` still cite the pruned
      `tactic-review-curriculum-coverage-sensor` (the fix this node's body
      already claims as in scope), `.claude/skills/align/SKILL.md` contains no
      'adjacen*' text at all (the ratified /align adjacency duty is unencoded),
      and `packages/intentionsutil/src/transitions.ts:525` still holds
      `isFingerprintStale`, the staleness predicate the body names as the one to
      mirror."
  - question: Which in-flight siblings own adjacent scope this build sequences
      around (drift review, 2026-08-30)?
    answer: "(Recorded 2026-08-30 /align-tactics per-node finalize drift review.)
      Three in-flight siblings this build sequences around rather than absorbs.
      (1) `tactic-substantiation-edge-migration` (status: raw) owns the
      state-vocabulary rename delegated-pending-review → deferred and
      delegated-review-declined → delegated; this node's plan targets the
      canonical ratified/deferred/delegated vocabulary and must not carry the
      sweep. (2) `tactic-attention-per-tier-boost-migration` Unit 3 rewrites
      `intentions/strategy-graph-review-curriculum.md`'s own frontmatter boost
      attribute inside a large data-only commit; a per-node finalize writes only
      this tactic node, so the collision risk here is low, but any later
      strategy-touching round must re-read after that migration lands rather
      than hand-editing the same block. (3) `tactic-align-audit-retirement`
      (phase: implement; `.claude/skills/align-audit/` confirmed still on disk
      this round) explicitly scopes coverage.ts's replacement to this node
      rather than to itself — so replacing the stale coverage sensor is this
      node's work, and the plan must not assume /align-audit is already gone."
  - question: Does the SUPERSEDING UPDATE retire the ~30-author-minute capacity
      condition (drift review, 2026-08-30)?
    answer: "(Recorded 2026-08-30 /align-tactics per-node finalize drift review.)
      Guard against a conflation this node's own SUPERSEDING UPDATE invites: the
      clause retiring 'the earlier
      session-type-penalty/30-minute/ancestor-prefix stamp' as superseded
      retires a priority-function implementation detail, NOT
      strategy-graph-review-curriculum's condition 1 (office-hours capacity
      bounds the cadence at ~30 author-minutes of independent author work per
      sitting, coverage amortized across cycles, never exhaustive). That
      condition still holds and still binds the sitting design; the
      author-ratified single-disposition-with-opportunistic-may-batch scope is
      the new mechanism that honors it. Related and still open by design: the
      retired stamp's unpenalized-rank clause (a derived review item is not a
      minted park, so no 0.5x re-pick penalty) is carried held-deferred to
      Claude (decision: deferred, delegation-anthropic-claude, 2026-08-30). The
      plan should state its disposition of that clause against
      `officeHours.ts`'s `SESSION_TYPE_PENALTY` / `sessionTypePenalty` rather
      than silently assuming either answer — it does not gate authoring, since
      the ratified four-term disposition ranking (node rank, graph position with
      keystone dispositions prioritized, timestamp, disposition category)
      supersedes the penalty machinery that clause rode on."
  - question: Does /exetasis's queue include delegated dispositions, and which
      validateGraph number does the reviewed-stamp rule claim (2026-08-31)?
    answer: "(Recorded 2026-08-31, tactic-rsi-graph-review finalize interview; two
      amendments to this plan, body updated in the same edit.) (a) BOTH QUEUES:
      the boundary sentence that read '/exetasis reviews author dispositions
      only' is amended - delegated dispositions sit in both queues, with the rsi
      batch (tactic-rsi-graph-review, finalized the same day) their primary
      quality-review home and /exetasis keeping them as its lowest-priority
      re-confirmation lane exactly where the ratified priority ordering already
      placed them. This resolves the measured contradiction between this plan's
      boundary sentence and the priority ordering ratified on
      strategy-explicit-intent (deferred > null > ratified > delegated).
      (decision: author-ratified, 2026-08-31) (b) RULE RENUMBER, mechanical:
      tactic-supersession-edge-and-terminal landed validateGraph rules 24/25/26
      on main (commit f0603ff7, 2026-08-31) after this plan claimed 25, so the
      reviewed-stamp rule claims 27 - re-check the schema.ts collision note at
      implementation time; burned numbers are never reused. Also relevant to
      Unit 3: the overrule algebra recorded on strategy-explicit-intent
      (2026-08-31) - any AI overrule of a delegated or deferred disposition
      produces a deferred one."
tooling_goals: []
success_signal: null
attention: null
phase: implement
execution: null
validates: []
blocked_by: []
superseded_by: []
supersession_expiry: null
office_hours: null
pace_exempt: false
rounds: null
attributes: {}
---
# Build /exetasis and the virtual review node — a derived, rank-ordered review target over durable-layer dispositions un-reviewed since they last changed, with a per-node reviewed stamp

## Context

`strategy-graph-review-curriculum` records a standing requirement: the whole
graph is subject to a recurring review curriculum, because deferrals calcify
into dogma, author knowledge atrophies, and delegations are forgotten. As of
this plan the doctrine is fully recorded and **nothing is built** — measured:

- `.claude/skills/exetasis/` does not exist (`ls .claude/skills/` shows
  `align-audit`, `reading-review`, `review-fix`, `review-plan`, `rsi-audit` and
  no review-sitting skill).
- No occurrence of the disposition vocabulary or any per-node reviewed
  fingerprint exists under `packages/intentionsutil/src/`.
- `grep -roh "(decision: [a-z-]*" intentions/` returns 19 stamps total:
  11 `deferred`, 5 `delegated`, 3 `author-ratified`.
- `grep -roh "delegated-pending-review\|delegated-review-declined" intentions/`
  returns 26 + 11 across 9 files — the interim vocabulary.

So every clarification describing selecting, ranking, or stamping is describing
a design, not a running system. This node builds it.

**What the doctrine asks for** (authoritative:
`intentions/strategy-graph-review-curriculum.md`, the 2026-08-30 clarifications
"How is the next review sitting selected…", "How does the adjacent-/align path
discharge review debt…", and "How does the 2026-08-30 disposition model change
this strategy…"):

- **One virtual review node.** Always exists, *derived* never stored, always
  carries the rank of the highest-ranked un-reviewed durable-layer content and
  points at it. No review node is created, ranked, or retired per target — that
  is the whole point: one derived fixture replaces N born-parked nodes.
- **Rank resolves live at selection time**, so it can never go stale.
- **Fully virtual review items** (author-ratified, 2026-08-30 continuation):
  nothing mints a stored review node, review-later deferrals included. The
  queue derives from stamps. Fold-in is automatic — the sitting reads stamps.
- **The unit of selection is a DISPOSITION, not a node** (author-ratified,
  2026-08-30 resolution round). A disposition is the thing that can be
  ratified, deferred, or delegated; a node carries many. Ranking =
  f(node rank, graph position with keystone dispositions prioritized,
  timestamp, category); category order **deferred > null > ratified >
  delegated**.
- **Change-gate.** Content needs no further review, as leaf or as ancestor,
  unless it changes. An ancestor changing does *not* dirty its descendants;
  consequences propagate by the reviewer amending a descendant, which changes
  it, which re-enrolls it. Forced subtree re-review would restore the
  per-node-schedule cost this design exists to avoid.
- **Ancestry-first.** Reviewing content reviews its un-reviewed ancestors
  first, root-first, then the target.
- **"Changed" = a per-kind review fingerprint** (author-ratified): strategies →
  the freeze-substance set PLUS `rationale`; other durable kinds → `statement` +
  `rationale` + `clarifications` + kind-normative attributes; router-owned
  stamps excluded everywhere. Reviewed stamp = `{fingerprint, date}`, stale iff
  they differ.
- **Detection is derived, never a manual sitting step** (Claude-owned,
  review-declined): the reviewed stamp additionally attests the fingerprints of
  the node's DIRECT ancestors; when an ancestor's current fingerprint diverges
  from an attested one, every holder of the stale attestation mechanically
  gains a consistency-unknown term. One level only — that is the blast-radius
  bound.
- **Sitting scope** (author-ratified): single-disposition review with
  opportunistic **may**-batch of hot-context sibling dispositions on the same
  node — never *must*, so the ranking's attention allocation is not bypassed
  and sittings stay bounded.
- **Virtues are reviewed as ancestors, never ranked directly** (author-ratified)
  — preserves `kind-kind`'s virtues-stay-unranked doctrine.
- **Mount records (tradition, delegation) are NOT review subjects**
  (author-ratified, superseding the interim kind-tradition clause): they carry
  no author dispositions; reference accuracy is objective and repaired through
  normal QA/office-hours processes. Kinds inherit rank via keystone position.
- **Legacy-null migration**: every decision recorded before the three-state
  model carries state `null` (stamp ABSENCE, not a fourth enum value).
  "Unreviewed" includes all of it, so the queue's initial population is the
  whole durable layer. Null is transitional — once legacy declarations drain,
  the lint forbids it.
- **/exetasis supersedes every other author-owned graph review process** except
  telemetry monitoring (the WIP dashboard). In particular the curriculum
  reading-and-review program is DEPRECATED: tradition reading and review arrive
  as deferred dispositions in the /exetasis queue instead, and the sitting
  metadata model must capture the deprecated program's outputs (what the author
  learned, reinforcement material, frontier extensions) so nothing it produced
  is lost.
- **Interview minimum, everywhere** (author verbatim): "interview responses
  always include (at least) recommendation, accept as deferred for review,
  accept as delegated (don't care)".

**Name.** The skill is `/exetasis` — the Socratic examination (*ho anexetastos
bios*, Apology 38a), author-chosen at the 2026-08-30 migration round over the
recommended `/examen`. It is a NEW function, distinct from the deprecated
`/align-audit`, and distinct from `/align-review`, which is claimed by
`tactic-align-review-skill` for adversarial review of drafts at record time —
do not merge them. The earlier `/node-review` draft name survives only in this
node's id, which stays as-is.

**Greenfield vs. brownfield.** The greenfield design is the one described
above and implemented below: one derived queue over dispositions, one stamp,
one comparator, no stored review nodes. The only concessions to the existing
system are two, both stated at their unit: (a) `coverage.ts` /
`review-coverage.ts` implement the *superseded* mode-A/mode-B frontier-entry
design and are retired rather than extended; (b) `office-hours-select.ts`'s
`--list` stdout contract is parsed positionally by an out-of-package consumer,
so review rows are additive behind an opt-in flag rather than injected into the
existing rows.

**Sizing.** This is larger than one PR. Units 1–5 are the minimum coherent
shipment (schema → derivation → CLI → skill → retirement of the superseded
sensor); units 6–7 are enforcement and migration and may land as a follow-up PR
on the same node. Sequence them in the order given; the dependencies are stated
per unit.

**Bootstrap decision (this plan settles it): COLD START.** Do not seed reviewed
stamps from dated clarifications, completed reading chunks, or any other
existing evidence. A seeded stamp would be an attestation no sitting made, and
`.claude/rules/code-style.md` forbids exactly that class of plausible-looking
fabrication. The consequence, stated so nobody reads it as a regression: the
backlog begins at full durable-layer size, and the `success_signal`'s
"un-reviewed across 2+ consecutive cycles trends down" clause has no useful
reading until at least three cycles have run. The *first* clause ("each cycle's
sitting reviews the then-pointed disposition") is readable from cycle one.

**Measured data defect to handle, not to silently absorb.** Ratified doctrine
says mount records carry no author dispositions, but two do today:
`intentions/tradition-hacker-culture.md:41` and
`intentions/tradition-motivation-psychology.md:45` each carry
`(decision: deferred, delegation-anthropic-claude, 2026-08-30)`. The derivation
must exclude mount records from the queue **and report these as a defect on
stderr**, never rank them and never drop them silently.

### Boundaries with sibling nodes — do not duplicate

- `tactic-align-indifference-option` (status raw) owns encoding the three-state
  decision model into the `/align` skill surface, including "stamps not minted
  review nodes" and the recommendation / accept-as-deferred /
  accept-as-delegated question mechanics. **Out of scope here.** Unit 6 touches
  `.claude/skills/align/SKILL.md` only for the adjacency duty and the two dead
  sensor citations.
- `tactic-substantiation-edge-migration` (status raw) owns the vocabulary sweep
  `delegated-pending-review → deferred`, `delegated-review-declined →
  delegated`. **Out of scope here.** The parser in Unit 2 therefore reads both
  spellings tolerantly rather than pre-empting the sweep.
- `tactic-rsi-graph-review` (finalized 2026-08-31, phase implement) is the
  primary quality-review home for **delegated**-state dispositions. AMENDED
  2026-08-31 (author-ratified, this node's 2026-08-31 clarification): delegated
  dispositions sit in BOTH queues — the rsi batch reviews their quality, and
  `/exetasis` keeps them as its lowest-priority re-confirmation lane exactly
  where the ratified priority ordering already placed them. `/exetasis`'s
  primary queue remains the author dispositions — deferred, null, and ratified
  re-queues.
- `tactic-align-audit-retirement` (phase: implement) deletes
  `.claude/skills/align-audit/`. **Do not delete it here** — it is still on
  disk and that removal is that node's diff.
- `tactic-keystone-decomposition-reorg` (parked to office_hours) owns what
  "keystone position" means. No code implements it (`grep -rn "keystone"
  packages/intentionsutil/src/` → zero hits). Unit 3 implements graph position
  as root-distance, the author-ratified direction ("closer to the roots is
  reviewed sooner"), and leaves the keystone refinement as a documented
  extension point.
- `tactic-attention-per-tier-boost-migration` rewrites `boost` → `boosts` on
  many node frontmatters including this strategy's. It changes no code this
  plan touches; no sequencing constraint.

### Deferred decision carried forward, not resolved here

The unpenalized-rank clause — *"a derived item is not a minted park, so no 0.5x
re-pick penalty"* — is held **deferred** (decision: deferred,
delegation-anthropic-claude, 2026-08-30). This plan therefore does **not**
implement a penalty exemption. Unit 3 applies the existing
`SESSION_TYPE_PENALTY` treatment unchanged to review candidates
(`packages/intentionsutil/src/officeHours.ts:13`, `sessionTypePenalty`), which
is the status-quo rule applied to a new member class, and records the deferral
as a review item the first /exetasis sitting can settle. Implementing the
exemption would be executing an undecided disposition.

---

## Unit 1 — Review fingerprint and the reviewed stamp

**Scope.** New module `packages/intentionsutil/src/review.ts` (fingerprint and
stamp half only; the queue lands in Unit 3), plus one new `validateGraph` rule
in `packages/intentionsutil/src/schema.ts`. New test file
`packages/intentionsutil/test/review.test.ts`.

Export from `review.ts`:

- `EXETASIS_SUBJECT_KINDS: readonly string[] = ["virtue", "strategy", "kind"]`.
  This is a FOURTH durable-layer set and must carry a doc comment saying so and
  why, following the precedent at `packages/intentionsutil/src/schema.ts:616-628`
  (which documents why `DURABLE_LAYER_KINDS` deliberately differs from
  `grounding.ts`'s). The three existing sets and how this one differs:
  - `packages/intentionsutil/src/coverage.ts:32` — virtue/strategy/kind/
    tradition/delegation (the superseded coverage sensor; retired in Unit 5).
  - `packages/intentionsutil/src/grounding.ts` `DURABLE_KINDS` — virtue/
    strategy/kind/delegation (which nodes must carry a grounding mark).
  - `packages/intentionsutil/src/schema.ts:629` `DURABLE_LAYER_KINDS` —
    virtue/strategy/delegation/kind/tradition (the unattended-writer fence).
  Ours excludes `tradition` and `delegation` because mount records carry no
  author dispositions (ratified 2026-08-30). **Do not unify the sets** — they
  answer different questions, and merging them would put mounts back in the
  review queue.
- `ROUTER_OWNED_ATTRIBUTE_KEYS: ReadonlySet<string>` — the attribute keys
  excluded from every fingerprint because machinery writes them:
  `reviewed`, `tier`, `bug_fix`, `security`, `boost`, `boosts`,
  `last_assessed`, `last_exercised`, and every `wait_*` key
  (`wait_for`, `wait_until`, `wait_attempts`, `wait_reason`,
  `wait_recommendation` — see `schema.ts` rule 22 at
  `packages/intentionsutil/src/schema.ts:1793`). **`reviewed` MUST be in this
  set** — a fingerprint that covered its own stamp would be invalidated by the
  act of stamping, so every sitting would immediately re-enroll its own target.
  Add an explicit unit test asserting that.
- `reviewFingerprint(node: IntentionNode): string` — sha256 over canonical JSON,
  mirroring `strategyFingerprint`'s construction exactly
  (`packages/intentionsutil/src/router.ts:103-113`). Per-kind substance:
  - `kind === "strategy"`: the freeze-substance set **plus** `rationale` — i.e.
    `{statement, clarifications, conditions: attributes.conditions ?? null,
    serves: [...serves].sort(), success_signal, tooling_goals, rationale}`.
    Reuse `strategyFingerprint`'s field selection verbatim rather than
    re-deriving it, so the two cannot drift.
  - every other subject kind: `{statement, rationale, clarifications,
    attributes: <attributes minus ROUTER_OWNED_ATTRIBUTE_KEYS, key-sorted>}`.
    "Kind-normative attributes" resolves to *the whole attributes bag minus the
    router-owned deny set* — a deny-list, not an allow-list, for the same
    fail-closed reason `isDurableWriteRefused`
    (`packages/intentionsutil/src/schema.ts:657`) is negative: an unanticipated
    new attribute must count as substance, not silently vanish from the
    fingerprint.
- `interface ReviewStamp { fingerprint: string; date: string; ancestors:
  Record<string, string>; outcomes?: { learned?: string[]; reinforce?: string[];
  frontier?: string[] } }` and `parseReviewStamp(node): ReviewStamp | null`.
  `ancestors` maps direct-ancestor id → that ancestor's `reviewFingerprint` as
  attested at sitting time (the one-level blast-radius bound). `outcomes` is
  the sitting-outcome metadata the doctrine requires be machine-readable:
  `learned` (what the author learned), `reinforce` (reinforcement material),
  `frontier` (frontier extensions the sitting identified) — these are the
  deprecated reading program's outputs, preserved.
- `isReviewStale(stamp: ReviewStamp | null, currentFingerprint: string): boolean`
  — mirror `isScopeStale` (`packages/intentionsutil/src/transitions.ts:492`)
  and `isFingerprintStale` (`:525`). **`null` is stale here**, unlike both
  precedents: absence means never reviewed, which is exactly the legacy-null
  population the queue must surface. Say so in the doc comment, because it
  inverts the precedent's polarity.

**Storage location:** `attributes.reviewed`. Rationale to record in the doc
comment: `attributes` is the documented home for non-first-class fields, it
already hosts machinery-written stamps (`last_assessed`, `last_exercised`,
parsed by `coverage.ts`'s `collectStampStrings`), and `reviewed` is not an
`IntentionNode` field name so it does not trip rule 23's shadow-ban
(`packages/intentionsutil/src/schema.ts:1812`). Adding a first-class field
instead would force an `IntentionNode` + `FIRST_CLASS_FIELD_PROBE` change
(`packages/intentionsutil/src/schema.ts:220`, `:267`) for a cross-kind stamp
that no existing first-class field shape fits.

**Caveat to record in the doc comment:** `attributes` is NOT in `STATE_FIELDS`
(`packages/intentionsutil/src/schema.ts:605`), so `isDurableWriteRefused`
refuses an *unattended* writer that stamps a durable node. That is correct and
deliberate: an /exetasis sitting is author-attended, and no autonomous path may
manufacture an attestation. Do not add `attributes` to `STATE_FIELDS`, and do
not add a fence exemption.

**New `validateGraph` rule — claim number 27** (renumbered 2026-08-31: this
plan originally claimed 25, but `tactic-supersession-edge-and-terminal` landed
rules 24/25/26 on main first — commit f0603ff7 — and burned numbers are never
reused). Re-check the rule-number collision note in
`packages/intentionsutil/src/schema.ts` for later claims at implementation
time, and extend it to record this claim so the next claimant sees it. Rule 27
shape, following rules 19/21/22 (inert when the key is absent, shape-checked
when present): `attributes.reviewed`, when present, is an object with
`fingerprint` a non-empty 64-char lowercase hex string, `date` a `YYYY-MM-DD`
string, `ancestors` a record of string → 64-char hex, and `outcomes`, when
present, an object whose `learned`/`reinforce`/`frontier` are arrays of
non-empty strings. A `reviewed` key on a non-subject kind (tradition,
delegation, tactic) is a violation — mount records carry no dispositions, so a
stamp on one is malformed data, and rejecting it here is what keeps the two
measured tradition stamps from quietly becoming legitimate.

**Out of scope:** the queue, the priority function, any CLI, any skill file,
any change to `coverage.ts`, and any migration of existing `(decision: …)`
prose.

**Recommended model:** opus.

---

## Unit 2 — The disposition parser

**Scope.** Add to `packages/intentionsutil/src/review.ts` a pure parser over
node text. Tests in `packages/intentionsutil/test/review.test.ts`.

A disposition is an inline prose stamp — that is what actually exists in the
store today, and the grammar is recorded on `strategy-explicit-intent` (the
"How were the migration and sustenance rounds reviewed" clarification, grammar
note H11, at `intentions/strategy-explicit-intent.md:719-724`):

```
(decision: <state>, <delegatee>, YYYY-MM-DD)   # deferred and delegated
(decision: <state>, YYYY-MM-DD)                # ratified — delegatee omitted
```

Export:

- `type DispositionState = "ratified" | "deferred" | "delegated"`.
- `parseDispositions(nodeId: string, kind: string, text: string):
  DispositionRecord[]` where `DispositionRecord = { nodeId, state, delegatee:
  string | null, date: string, key: string, excerpt: string }`. `key` is a
  stable identifier for the disposition within its node — use
  `<nodeId>#<ordinal>` over stamps in document order, so a sitting can name
  exactly which disposition it reviewed and the queue can be diffed across
  cycles. `excerpt` is a bounded (≤200 char) slice of surrounding text so the
  queue is readable without opening the node.
- State normalization, tolerant by design: `author-ratified` and `ratified`
  both map to `ratified`; `delegated-pending-review` maps to `deferred`;
  `delegated-review-declined` maps to `delegated`. This mirrors
  `isFingerprintStale`'s three-shape tolerance
  (`packages/intentionsutil/src/transitions.ts:508-534`) and deliberately does
  not pre-empt `tactic-substantiation-edge-migration`'s rename sweep. An
  unrecognized state token is an error naming the node and the excerpt — never
  silently skipped (`.claude/rules/code-style.md`).
- `MOUNT_KINDS = ["tradition", "delegation"]` and a `mountDispositionDefects()`
  helper returning every disposition found on a mount record. The two measured
  cases (`intentions/tradition-hacker-culture.md:41`,
  `intentions/tradition-motivation-psychology.md:45`) are the live fixture for
  this; the derivation in Unit 3 reports them on stderr and excludes them from
  the queue.

The parser needs BODIES, not just frontmatter — this node's own deferred
clause lives in its body, and `strategy-explicit-intent`'s live in
clarification answers. Clarification answers arrive via `node.clarifications`;
bodies arrive from `readNodeBody` (`packages/intentionsutil/src/store.ts:166`)
at the script layer. Keep `review.ts` pure and fs-free — it takes
`(node, bodyText)` pairs, exactly as `computeReviewCoverage` takes a
`bodyById` map (`packages/intentionsutil/src/coverage.ts:178`).

**Out of scope:** rewriting any existing stamp, the vocabulary sweep, and any
change to how `/align` writes stamps.

**Dependencies:** Unit 1.

**Recommended model:** opus.

---

## Unit 3 — The virtual review node: derivation, priority, ancestry-first

**Scope.** Add the queue half to `packages/intentionsutil/src/review.ts`.
Tests in `packages/intentionsutil/test/review.test.ts`.

Export `reviewQueue(nodes, bodyById): ReviewQueue` where
`ReviewQueue = { items: ReviewItem[]; head: ReviewItem | null; defects:
string[] }` and `ReviewItem = DispositionRecord & { rank: RankKey; position:
number; consistencyUnknown: boolean; category: DispositionState | "null" }`.

**Population (the change-gate as a filter, not a term).** An item enters the
queue only when its host node's `attributes.reviewed` is absent or stale
against `reviewFingerprint(node)` — that is the change-gate. A node whose stamp
matches contributes nothing, however many dispositions it carries. Additionally,
each subject-kind node with **no** disposition stamps at all and no reviewed
stamp contributes exactly one synthetic `category: "null"` item keyed
`<nodeId>#null` — this is the legacy-null population, which is initially the
whole durable layer.

**Exclusions.** Mount kinds are excluded entirely; their dispositions go to
`defects`. Tactics contribute their explicit `(decision: …)` stamps but never a
synthetic null item — the legacy-null census is scoped to virtue/strategy/kind
(mounts and tactics excluded) per the ratified drain design, and a tactic's
substance is covered through its serving strategy. Record this asymmetry in the
doc comment; it is the one place the "durable layer" and "where dispositions
live" sets legitimately differ, and this node's own deferred clause is the
worked example of a tactic-hosted disposition that must be reviewable.

**Priority — implement the ratified key order verbatim**, lexicographically,
in this sequence:

1. **Node rank**, descending, via `compareRankKeyDesc`
   (`packages/intentionsutil/src/attention.ts:39`) over the host node's
   `resolveAttention` entry (`:459`). A node absent from the map — every
   non-goal-layer kind, i.e. virtue and kind, since only `kind-tactic` and
   `kind-strategy` carry `attributes.goal_layer: true` — takes the neutral
   baseline `{tier: 1, band: 0, score: 0, depth: 0}`, matching
   `officeHoursQueue`'s own default at
   `packages/intentionsutil/src/officeHours.ts` (the `resolved?.tier ?? 1`
   block). Apply `sessionTypePenalty` to band and score exactly as
   `officeHoursQueue` does, treating review items as `curriculum-review` — see
   the deferred-decision note in Context; do NOT exempt them.
2. **Graph position**, root-closer first. Compute root-distance as the minimum
   hop count to a `kind: "virtue"` node over `parent` + `serves` edges — the
   same edge pair `buildAncestryProjection` walks
   (`packages/intentionsutil/scripts/node-ancestry.ts:173`). Virtues are
   distance 0. A `kind: "kind"` node has no `serves`/`parent` path to a virtue;
   assign it distance 0 as well, and record the reason: kinds are keystones and
   "kinds inherit rank via their keystone position" (ratified), but no code
   implements keystone position (`grep -rn "keystone"
   packages/intentionsutil/src/` → zero hits) and its defining node
   `tactic-keystone-decomposition-reorg` is parked for author rulings. Leave a
   named extension point (`keystonePosition?: (node) => number`) and a comment
   pointing at that node.
3. **Consistency-unknown**, true first. True when the host node's reviewed
   stamp attests a direct-ancestor fingerprint that diverges from that
   ancestor's current `reviewFingerprint`. Direct ancestors = the union of
   `parent` and `serves` targets, one level only — that IS the blast-radius
   bound, so do not transitively close it.
4. **Timestamp**, older first (the disposition's own `date`; the synthetic null
   item takes the node's newest clarification date via `readingDate`
   (`packages/intentionsutil/src/router.ts:271`), or the empty string when the
   node carries none, which sorts oldest and is the right default for content
   nobody has dated).
5. **Category**: `deferred` > `null` > `ratified` > `delegated`.
6. **`key` ascending** as the total-order tiebreak, so `head` is deterministic.

Record in the doc comment where the *earlier* author-ratified priority shape
went: `f(graph position, unreviewed-change state, pending-review stamp
density)`. Under the later disposition-unit model, unreviewed-change state
became the population filter and stamp density became the category ordering —
a node holding many deferred stamps contributes many top-category items. The
density term is **not dropped**; say so explicitly, because it is recorded as
load-bearing and a future reader will look for it.

**Ancestry-first** is a property of the sitting, not of the ranking: export
`ancestryPrefix(nodes, item): string[]` returning the host node's un-reviewed
ancestors root-first (nearest-last), which the skill walks before the target.
Virtues appear here and only here — that is what "virtues are reviewed as
ancestors, never ranked directly" means mechanically, and it is why virtues
must never produce a queue item of their own. Add a test asserting no
`ReviewItem` has a `kind: "virtue"` host, and a companion test asserting a
virtue DOES appear in the `ancestryPrefix` of a strategy that serves it.

`head` is the virtual review node: `items[0]`, or `null` when the queue is
empty. It is computed, never written anywhere. Nothing in this unit performs a
graph write.

**Out of scope:** any CLI, any skill, any office-hours-queue change.

**Dependencies:** Units 1, 2.

**Recommended model:** opus.

---

## Unit 4 — `exetasis-select.ts` and the office-hours composition

**Scope.**

(a) New `packages/intentionsutil/scripts/exetasis-select.ts`, following the
pure-store-read stdout-only script precedent of
`packages/intentionsutil/scripts/review-coverage.ts` and the ref-reading
posture of `packages/intentionsutil/scripts/office-hours-select.ts`. Resolve
the repo root from `import.meta.url`, never cwd (the convention both those
scripts state in their headers). Read the store **at a git ref** (default
`origin/main`) for the reason `office-hours-select.ts`'s header gives verbatim:
a selector reading its own checkout answers from whatever that worktree last
synced, so a stale worktree silently reports stale review state.

Use `listNodesAtRef` (`packages/intentionsutil/scripts/lib-store-at-ref.ts:47`)
— **strictly**, which it already is, and that matters here for the same reason
it matters in `select-targets.ts`: a durable node the tolerant reader silently
drops would silently vanish from the review backlog. The parser needs bodies,
which `listNodesAtRef` does not return; extend that file with
`listNodeTextsAtRef(repoRoot, ref): { node, body }[]` reusing the same
`git archive` + `tar -x` materialization and the same two-separately-checked-
`execFileSync` discipline its header insists on (a shell pipeline without
`pipefail` yields a silently empty store).

stdout contract, exactly one line except `--list`:

```
review <node-id> <disposition-key> <category>   — the virtual review node's target
empty                                           — nothing un-reviewed
```

`--list` emits `<score>\t<category>\t<nodeId>\t<disposition-key>\t<date>` rows.
`--json` emits the whole `ReviewQueue`. Mount-record defects and any parse
error go to **stderr** and set a non-zero exit — clear errors over fallbacks;
a review queue that silently swallowed malformed dispositions would under-report
review debt, which is precisely the signal this build exists to produce.

(b) `packages/intentionsutil/scripts/office-hours-select.ts` gains an
**opt-in** `--with-review` flag. With it, `--list` interleaves review rows into
the parked rows by the same `compareRankKeyDesc` order with the sessionType
column reading `exetasis`, and queue-head mode may emit a
`review <node-id> <disposition-key>` disposition line.

**The flag is opt-in, and that is a deliberate migration concession, not the
greenfield shape.** The greenfield is one queue with two member classes. Two
existing consumers make default-on unsafe:
`.claude/skills/dispatch-propagate/scripts/dispatch-terminal-gap-audit` parses
`--list` rows POSITIONALLY with `IFS=$'\t' read -r _rank _stype nid _since`
and would read a review row's node id as a parked node — the header of
`office-hours-select.ts` calls out this exact consumer and this exact silent
misparse; and `packages/intentionsutil/scripts/office-hours-graph` walks
`--list` top-down and launches the first free node, but a review item has no
worktree and no park record, so an autonomous launcher must never try to launch
one. Default-off leaves both untouched. Do **not** change `office-hours-graph`
in this unit.

(c) `.claude/skills/office-hours/SKILL.md` gains one paragraph in its
graph-native mode: the human lane reads the queue with `--with-review`, and a
`review` disposition line means run `/exetasis` with that disposition key
rather than launching a parked node.

**Out of scope:** `office-hours-graph`, `dispatch-terminal-gap-audit`, the
autonomous dispatch queue, and any change to the existing four `--list`
columns.

**Dependencies:** Unit 3.

**Recommended model:** opus.

---

## Unit 5 — The `/exetasis` skill, and retiring the superseded coverage sensor

**Scope.**

(a) New `.claude/skills/exetasis/SKILL.md`. Mirror the section structure of its
sibling `.claude/skills/reading-review/SKILL.md` — Trigger and selection /
Session flow / Session bounds / Recording rules / Landing / Prohibitions /
Reuse / Verification (headings at `.claude/skills/reading-review/SKILL.md:45`,
`:145`, `:170`, `:196`, `:577`, `:589`, `:596`, `:618`). Frontmatter takes
`name: exetasis`, `user-invocable: true`, and a description saying it is an
interactive office-hours sitting that reviews one graph disposition.

Content the skill must carry:

- **Selection.** Run `exetasis-select.ts`; with no argument take the head, with
  a disposition key take that item. Walk `ancestryPrefix` root-first before the
  target — the ancestry-first rule.
- **Sitting form.** Single-disposition, with opportunistic **may**-batch of
  sibling dispositions on the same node while its context is hot — never must.
  State the reason inline: batching by default would bypass the ranking's
  attention allocation and unbound the sitting.
- **Two content classes in one sitting.** Mode A (re-validation of
  deferred/delegated content — collect the source: the reading, the exercise,
  the world state) and Mode B (confirmation of author-owned content — collect
  recursively broadened context). These are names for *what the author collects
  beforehand*, not separate enrollment paths; one sitting covers both halves of
  its target.
- **The author articulates first.** Probes cite the record and the collected
  sources; the author states their position before Claude offers one. This is
  the type-b sitting rule that holds the capture loop controlled, and it is why
  this skill can conduct reviews of a record Claude helped draft.
- **Interview minimum** (author verbatim): every question offers at least the
  recommendation, accept-as-deferred-for-review, and accept-as-delegated
  ("don't care").
- **Capture call-out.** During the sitting, read the target's disposition
  stamps and graft edges plus its direct ancestors', and flag position-weighted
  outliers per `strategy-graph-mounts`' capture model. Use
  `packages/intentionsutil/src/attention.ts`'s `captureScore` /
  `captureAddendFor` as canonical — `grounding.ts`'s `divergenceRank` /
  `gatedRank` / `delegationScore` is a reporting-only duplicate, per its own
  comment, and must not be the ranking authority.
- **Recording.** The sitting writes `attributes.reviewed` on the target
  (fingerprint, date, direct-ancestor attestations) and records
  `outcomes.learned` / `outcomes.reinforce` / `outcomes.frontier`. This is
  where the deprecated reading program's outputs now live. Amending the node's
  substance during the sitting changes its fingerprint, which re-enrolls it —
  that is correct and expected; stamp AFTER the amendment, in the same commit.
- **Landing.** One `graph-commit` per sitting. Per `.claude/rules/sandbox.md`,
  `graph-commit` runs with `dangerouslyDisableSandbox: true` on the FIRST
  attempt and takes an explicit `-C <repo root>`, with a single-line `-m`.
- **Prohibitions.** Never mint a stored review node — for any disposition,
  review-later deferrals included. Never file a GitHub issue. Never write a
  reviewed stamp for a node the sitting did not actually review. Never review a
  mount record. Never rank a virtue directly.
- **Supersession, stated on the skill surface.** /exetasis supersedes every
  other author-owned graph review process except telemetry monitoring; the
  curriculum reading-and-review program is deprecated and its material arrives
  here as deferred dispositions. `/exetasis` is not `/align-audit` (deprecated,
  deleted by `tactic-align-audit-retirement`) and not `/align-review` (owned by
  `tactic-align-review-skill`).

(b) Delete `packages/intentionsutil/src/coverage.ts`,
`packages/intentionsutil/scripts/review-coverage.ts`, and
`packages/intentionsutil/test/coverage.test.ts`. They implement the
**superseded** pre-2026-08-30 mode-A/mode-B frontier-entry design and treat
tradition/delegation as review subjects, which the resolution round reversed.
The review-debt queue replaces the coverage table wholesale. Update the two
referencing sites: `.claude/skills/reading-review/SKILL.md:654` (which tells a
sitting to run the retired script) and
`packages/intentionsutil/SEPARABILITY.md:59`. `readingDate`
(`packages/intentionsutil/src/router.ts:271`) stays — Unit 3 uses it and rule
17 documents it.

Note for whoever runs this unit: `coverage.ts`'s deletion also removes
`lastReviewedOf`'s date-only staleness, which is intended — the per-kind review
fingerprint replaces it. `tactic-align-audit-retirement` already flags this
staleness and explicitly scopes the replacement to this node.

**Out of scope:** deleting `.claude/skills/align-audit/` (that is
`tactic-align-audit-retirement`'s diff), and any `/align` edit (Unit 6).

**Dependencies:** Unit 4.

**Recommended model:** opus.

---

## Unit 6 — The `/align` adjacency duty, and two dead sensor citations

**Scope.** `.claude/skills/align/SKILL.md` only.

(a) **Encode the ratified adjacency duty.** Add it to the interview mechanics,
near the "Question mechanics" and "Deferral mechanics" subsections
(`.claude/skills/align/SKILL.md:275` and the "Deferral mechanics" heading
immediately below it). Verbatim substance, ratified and binding:

> A legacy-null disposition is **adjacent** to an /align round iff the round
> quotes it, amends it, or touches an edge incident to it — nothing else
> qualifies, so a round cannot ratify arbitrary content by declaring it
> adjacent; the criterion is auditable from the round's own diff. Any adjacent
> legacy-null disposition MUST be dispositioned in that round. **Silence on an
> adjacent null disposition is a defect of the round.**

Also record the attestation consequence: an /align adjacent-doctrine
ratification writes the same `attributes.reviewed` stamp `{fingerprint, date}`
that an /exetasis sitting writes, so both paths end in the same attestation and
the virtual review node's predicate drops the node either way. Without this,
adjacent-ratified content would sit atop the queue forever — the incoherence
the post-hoc review found.

(b) **Fix the two dead citations.** `.claude/skills/align/SKILL.md:326` and
`:751` both cite `tactic-review-curriculum-coverage-sensor` as the sensor
deriving curriculum-frontier linkage by id-matching. That node is absent from
`intentions/` (confirmed) and the sensor it named is deleted in Unit 5. Remove
the parenthetical citation and the "invisible to it" clause that depends on it
at both sites.

**Explicitly out of scope, and stated so the implementer does not drift into
it:** the surrounding "Deferral mechanics" prose still instructs rounds to
mint born-parked review items ("Create exactly one review item, born-parked, in
the same `graph-commit`", `.claude/skills/align/SKILL.md:~313`). Replacing
minting with stamping is `tactic-align-indifference-option`'s scope, as is the
recommendation/deferred/delegated question-option encoding. Do not touch that
paragraph beyond deleting the dead sensor citation embedded in it. Leave a
one-line pointer comment naming `tactic-align-indifference-option` so the
inconsistency is visible rather than silent.

**Dependencies:** Unit 5 (the citation removal must not precede the deletion it
describes).

**Recommended model:** sonnet.

---

## Unit 7 — The stamp-drain lint and the legacy-null census

**Scope.** The delegated migration detail (decision: delegated,
delegation-anthropic-claude, 2026-08-30 — author: "don't care, it's a migration
detail"), which means Claude picks the mechanism but the shape is fixed:

(a) New `packages/intentionsutil/scripts/exetasis-drain-census.ts`: counts
author dispositions on **virtue/strategy/kind** nodes recorded before
2026-08-30 that carry no reviewed stamp — mounts and tactics excluded. Pure
store read, stdout only, repo root from `import.meta.url`. Follows
`review-coverage.ts`'s script shape (which Unit 5 deletes — copy the shape, not
the file).

(b) Extend the Unit 1 rule-25 validation with the drain rule: the null marker
is stamp **ABSENCE**, not a fourth enum state, and it is tolerated only while
legacy declarations remain. Wire the census count into the lint so that at
count zero the lint mechanically forbids absence on subject-kind nodes. Gate it
on the count rather than a hand-flipped flag — that is the "mechanical flip"
the drain design asks for, and a hand flag would need a human to notice the
drain finished.

(c) A diff-scoped check that a `deferred` or `delegated` stamp survives
revision of its content — it may become `ratified` only alongside a reviewed
stamp in the same commit, never silently. Home: a new function in
`packages/intentionsutil/src/planlint.ts` if it can be expressed over node
content, otherwise a shell lint beside
`.claude/skills/dispatch-propagate/scripts/lint-prose-rules.sh`, registered in
`run-lint.sh` alongside the existing `lint-prose-rules.sh` /
`lint-verify-fence-paths.sh` / `lint-vendored-skills.sh` calls
(`.claude/skills/dispatch-propagate/scripts/run-lint.sh:145`, `:179`, `:200`).
Prefer the `planlint.ts` home — it is already wired into `validate-graph.ts`
after `validateGraph` and needs no new CI registration.

**Out of scope:** performing the drain (rewriting existing stamps), and the
`delegated-pending-review → deferred` vocabulary rename
(`tactic-substantiation-edge-migration`).

**Dependencies:** Unit 1 (rule 27), Unit 2 (the parser the census uses).

**Recommended model:** opus.

---

## Reuse

Reuse these rather than re-deriving them. Every path is repo-relative from the
repo root; anchors are symbol-first because line numbers drift.

- `packages/intentionsutil/src/router.ts` — `strategyFingerprint` (~:103): the
  canonical sha256-over-canonical-JSON-of-substance-fields construction, and
  the source of the strategy freeze-substance field set Unit 1 extends with
  `rationale`. `tacticScopeFingerprint` (~:134) is the same pattern over a
  `{statement, body}` pair. `readingDate` (~:271) extracts the newest ISO date
  from free text — Unit 3's null-item timestamp.
- `packages/intentionsutil/src/transitions.ts` (550 lines total) —
  `isFingerprintStale` (~:525), the staleness predicate Unit 1 mirrors,
  including its documented three-shape (null / legacy string / current object)
  tolerance; `stampHash` (~:508), the single home of that shape discrimination;
  `ScopeStamp` / `parseScopeStamp` / `isScopeStale` (~:467–:496), the simpler
  fingerprint+sha stamp precedent with the missing-stamp policy left to the
  caller.
- `packages/intentionsutil/src/attention.ts` — `RankKey` (:24),
  `compareRankKeyDesc` (:39), `resolveAttention` (:459): the shared rank key and
  its descending comparator. Compose into these rather than inventing a parallel
  ordering. `captureScore` / `captureAddendFor` (~:165–256) is the canonical
  capture-axis scoring for Unit 5's capture call-out.
- `packages/intentionsutil/src/officeHours.ts` — `QueueMember` (extends
  `RankKey`), `officeHoursQueue`, `sessionTypePenalty`, `SESSION_TYPE_PENALTY`
  (:13), `openBlockers`, `selectOfficeHours`: the existing ranked-queue shape a
  review item composes into, including the `resolved?.tier ?? 1` neutral
  baseline for nodes absent from the attention map.
- `packages/intentionsutil/src/schema.ts` — `IntentionNode` (:220),
  `FIRST_CLASS_FIELD_PROBE` (:267), `STATE_FIELDS` (:605),
  `DURABLE_LAYER_KINDS` (:629), `isDurableWriteRefused` (:657), and the
  numbered `validateGraph` rule docs (:1719–:1831, rule 23 at :1812, the
  rule-number collision note at :1827). Rules 19/21/22 are the shape-rule
  template Unit 1's rule 27 follows.
- `packages/intentionsutil/src/store.ts` — `readNode` (:153), `readNodeBody`
  (:166), `listNodes` (:232), `listNodesStrict` (:249), `writeNode` (:52): the
  single frontmatter write gate and read primitives. Never hand-roll
  frontmatter parsing.
- `packages/intentionsutil/scripts/lib-store-at-ref.ts` — `listNodesAtRef`
  (:47), `readNodeAtRef` (:100): read-the-store-at-a-ref, with the header's
  stated reasons for strictness and for the two separately-checked
  `execFileSync` calls. Unit 4 extends this file rather than starting a new one.
- `packages/intentionsutil/scripts/office-hours-select.ts` — the CLI contract
  precedent: `--ref` reading, the one-line stdout disposition contract, the
  `--list` column contract and its named out-of-package positional consumer,
  `--type` validation against `SESSION_TYPES`, and stderr-is-advisory-only.
- `packages/intentionsutil/scripts/review-coverage.ts` — the pure-store-read,
  stdout-only, repo-root-from-script-location sensor-script shape. Unit 5
  deletes it; copy the shape first.
- `packages/intentionsutil/scripts/node-ancestry.ts` —
  `buildAncestryProjection` (:173): the bounded BFS over BOTH `parent` and
  `serves` edges, nearest-first. Unit 3's root-distance and `ancestryPrefix`
  walk the same edge pair.
- `packages/intentionsutil/src/coverage.ts` — read before deleting:
  `computeReviewCoverage`'s `(nodes, bodyById)` signature is the purity
  convention Unit 2 keeps, and `collectStampStrings` shows the existing
  attribute-stamp scraping the fingerprint deny-list must cover.
- `.claude/skills/reading-review/SKILL.md` — the sibling sitting skill: section
  structure (:45, :145, :170, :196, :577, :589, :596, :618) and its own
  `## Reuse` / `## Verification` sections are the template for
  `.claude/skills/exetasis/SKILL.md`.
- `.claude/skills/office-hours/SKILL.md` — how a skill consumes the selector's
  stdout disposition line; Unit 4(c) adds one paragraph to its graph-native
  mode.
- `.claude/skills/dispatch-propagate/scripts/run-lint.sh` — the lint
  registration site (:145, :179, :200) if Unit 7(c) lands as a shell lint.

## Verification

```verify
npx vitest run --project packages/intentionsutil --root .
```

```verify
node --import tsx/esm packages/intentionsutil/scripts/validate-graph.ts intentions
```

Typecheck the touched workspace **explicitly**. `run-typecheck.sh` with no
arguments scopes itself to dirty apps and can pass vacuously; `--app` takes a
repo-root-relative workspace directory and cannot:

```verify
.claude/skills/dispatch-propagate/scripts/run-typecheck.sh --app packages/intentionsutil
```

```verify
.claude/skills/dispatch-propagate/scripts/run-lint.sh
```

The new selector must answer, and its answer must be non-empty on a cold graph
(every durable node is un-reviewed at bootstrap, so an `empty` result here means
the derivation is broken, not that the graph is clean):

```verify
node --import tsx/esm packages/intentionsutil/scripts/exetasis-select.ts --ref HEAD --json
```

The dead-citation removal. **Fence-shape constraint, measured 2026-08-30 while
writing this plan:** a worktree-isolated session's Bash tool refuses any command
containing command substitution ("too complex to verify that it stays inside the
worktree"), and a `&&`-joined compound had its non-zero exit swallowed in the
tool report. So each fence below is ONE simple command whose own exit code is
the assertion — no `$(…)`, no `&&`. The first fence is the anti-vacuity guard
for the second (a deleted or renamed skill file would make a negated grep pass
for the wrong reason):

```verify
test -f .claude/skills/align/SKILL.md
```

```verify
! grep -q 'curriculum-coverage-sensor' .claude/skills/align/SKILL.md
```

The retired sensor and its test are gone:

```verify
test ! -f packages/intentionsutil/src/coverage.ts
```

```verify
test ! -f packages/intentionsutil/scripts/review-coverage.ts
```

```verify
test ! -f packages/intentionsutil/test/coverage.test.ts
```

Nothing still names the retired script (`.claude/skills/reading-review/SKILL.md`
and `packages/intentionsutil/SEPARABILITY.md` are the two sites Unit 5 updates).
This fence matches prose mentions too, so the new `/exetasis` skill must narrate
the supersession without spelling the old script's name:

```verify
! grep -rq 'review-coverage' .claude packages/intentionsutil
```

**Manual and judgment checks — not auto-runnable:**

- **Run one real sitting.** The only end-to-end proof is an author-attended
  `/exetasis` sitting: take the head, walk the ancestry prefix, review one
  disposition, land the stamp via `graph-commit`, then re-run
  `exetasis-select.ts` and confirm the head **moved** and the reviewed node
  dropped out of the queue. That round trip — pointer, sitting, stamp, pointer
  moves — is the success_signal's first clause made observable, and it cannot
  be simulated: a fabricated stamp would prove nothing about the sitting.
- **Confirm the reviewed node stays out.** Re-run after an unrelated commit and
  confirm the stamped node has not re-enrolled. If it has, the fingerprint is
  covering a router-owned attribute it should be excluding — check
  `ROUTER_OWNED_ATTRIBUTE_KEYS` first, and `reviewed` itself first of all.
- **Confirm ancestor motion flags exactly one level.** Amend a strategy's
  `rationale`, then confirm its direct dependents gain
  `consistencyUnknown: true` and their dependents do NOT. Transitive flagging
  would restore the per-node-schedule cost this design exists to avoid.
- **Confirm the two mount-record defects are reported, not ranked.**
  `intentions/tradition-hacker-culture.md:41` and
  `intentions/tradition-motivation-psychology.md:45` must appear in `defects`
  and in no queue item.
- **Confirm the office-hours consumers are untouched.** With `--with-review`
  absent, `office-hours-select.ts --list` output must be byte-identical to its
  pre-change output on the same ref, and `office-hours-graph` must behave
  identically. Diff the two `--list` renders directly.
- **Success-signal reading.** The second clause ("durable nodes un-reviewed
  across 2+ consecutive cycles trends down") has no reading until at least
  three cycles have run — a cold start, decided above. Do not record a reading
  that says otherwise, and do not read the initial full-size backlog as a
  regression.

Files in this skill

  • README.md708 B
  • delegation-anthropic-claude.md14.4 KB
  • delegation-app-signin-identity.md3.1 KB
  • delegation-attention-services.md2.4 KB
  • delegation-banking.md2.4 KB
  • delegation-client-income.md2.1 KB
  • delegation-cloud-backup.md2.9 KB
  • delegation-communications.md2.6 KB
  • delegation-connectivity.md2 KB
  • delegation-finance-saas.md2.8 KB
  • delegation-firebase.md5.3 KB
  • delegation-food-supply.md2.6 KB
  • delegation-github.md2.2 KB
  • delegation-health-records.md1.9 KB
  • delegation-hosted-publishing.md2.2 KB
  • delegation-identity-root.md2.4 KB
  • delegation-knowledge-notes.md2 KB
  • delegation-media-libraries.md1.8 KB
  • delegation-mobile-platform.md2.5 KB
  • delegation-os-hardware.md2.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.