human-only-skills · git:20260826.8cdcb5a · 2026-08-26 · sha256 4208f75b3426635a
human-only-skills git:20260826.8cdcb5aA
Immutable. This exact content is served forever at /api/v1/blob/4208f75b3426635a.
---
name: human-only-skills
description: 'Name the skills reserved for people to invoke — where the runtime honors disable-model-invocation — and when to reach for each. Triggers: "human-only skills", "which skills must I run myself".'
practices: [design-by-contract]
hexagonal_role: supporting
consumes: []
produces: [stdout]
context_rel: []
skill_api_version: 1
allowed-tools: Read, Grep, Glob
user-invocable: true
context:
window: inherit
intent: {mode: none}
metadata:
capabilities: [human_only_skill_routing]
effects: []
canonical_status: canonical
disposition: keep_specialist
tier: meta
dependencies: []
output_contract: a named pointer list; this skill invokes nothing
---
# Human-only skills
Four skills carry `disable-model-invocation: true`. In runtimes that honor
that key, their descriptions stay out of the context window and the model
cannot invoke them — a person types the command. In runtimes without the
switch, the key is stripped at projection time and these remain ordinary
advertised skills (see docs/contracts/codex-skill-api.md); the pointer below
still tells a person which ones to run themselves. This skill **names**
skills. It never invokes one.
## The roster
| Skill | A person reaches for it when |
|---|---|
| `craft-goal` | authoring or linting a persistent goal prompt meant to drive many bounded experiments toward one outcome — a standing artifact a person owns, not this session's intent |
| `learn` | mining a *collection* of durable verdicts for recurring evidence, after the critical path, on purpose |
| `postmortem` | testing one retrospective causal question against verdict evidence that already exists |
| `toil-mining` | mining supplied usage history for repeated operational work worth automating |
What they share: each is off the critical path, each is started deliberately
rather than inferred from a task, and nothing else in the repository reaches
for any of them.
## When a model wants one
Say which skill applies and why, and stop. Reproducing the skill's procedure
by hand defeats the point of removing it from model reach — the command exists
so a person decides the timing.
## Before adding a row
Model invocation is load-bearing whenever anything else reaches for the skill,
so a skill joins this roster only after all four surfaces come back clean, with
the evidence recorded:
1. `ao skills consumers <slug>` and `ao skills graph` — declared `dependencies`
and `consumes` edges.
2. `workflows/*.js` — a workflow that dispatches the slug.
3. Other skills' `SKILL.md` bodies — a "routes to `<slug>`" sentence or a
`See Also` entry is a reach.
4. `evals/routing-probes/templates.json` — an `applicable` entry means a probe
measures whether the *model* routes there, which stripping makes
unmeasurable rather than merely cheaper.
Retire this skill when the roster is empty.