aops-core/skills/supervisor/SKILL.md
The single authoritative supervision process for any delegate-and-verify work — at every scale: one epic, a release spanning many epics (portfolio), or conversational orchestration of background workers (`/goal` "don't get involved yourself, make sure it gets done", `/dogfood`). Stateless tick driven by `/loop`; cross-tick state lives in the task body. Any orchestrator MUST invoke this skill for supervision; never hand-roll it inline.
npx skillsauth add nicsuzor/academicops supervisorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill is the framework's supervision process at every scale. The discipline below is
identical across all three contexts; only the unit of state changes: Epic (one PKB epic,
cross-tick state in the body), Portfolio/Release (many epics, state in release task body),
and Conversational orchestration (background Agent() workers, ledger still opened). There
are no deterministic halt brakes: halt, escalate, and promote by judgment on the proof
discipline below — not by row counters.
Any orchestrator MUST run supervision through this skill — never hand-rolled in
the main conversation — whenever delegating work and verifying it gets done. This includes
/goal "delegate this, don't get involved yourself, make sure it actually gets done", /dogfood
runs, and any delegate-and-verify loop over background workers. "I'm just the conversational
orchestrator" is not an exemption.
The Select → Gates spine — task selection, the premise gate, and the freshness / stale-leftover pre-check — is owned by the [[aops-pkb/skills/task-lifecycle/SKILL.md]] skill (§§1–2). The supervisor's Dispatch phase reuses that spine, then adds the pre-flight confirmation, proof, ledger, evaluation, and escalation discipline that span ticks and are the supervisor's own.
For universal dispatch rules (expand terse instructions, pre-dispatch gates, surface variants): see [[references/dispatch-rules]] and [[instructions/worker-dispatch]].
Core discipline — applies in every mode, on every tick. Your value is not trusting any single agent: proof claims, isolate confounds, never relay a conclusion you have not made falsifiable. Posture: supervise, don't do. Hold the conclusion, not the file dumps; hand bulk reading to the cheap summariser agent (§7) — never absorb a 30k narrative to lift a one-line verdict.
§1 — Orient before the FIRST dispatch (mandatory, no exceptions). Four steps: (1) PKB
semantic search — prior diagnoses, recorded harnesses, related tasks, known confounds; (2)
prior-art sweep — open and merged PRs/branches; (3) identify the SANCTIONED QA harness —
refuse ad-hoc substitutes; HALT and [ATTN] Nic if none designated (a worker never invents the
gate it's judged by); (4) cross-vendor surface → fetch vendor's authoritative docs first —
reverse-engineering is a fallback only.
§2 — Proof, not claims; state the acceptance gate up front. A change is not a fix until a runtime observation confirms user-facing behaviour. State the falsifiable acceptance gate before dispatching — the observable that must be true in a real run. "Tests pass" is never the gate for a behaviour bug.
§2a — Capstone = done. Final acceptance is ONE check with all clauses true at once: the exact previously-failing user-facing check (supervisor supplies it from the ledger — capstone agent does not reconstruct it); on a fresh instance; by a non-implementer; with the sanctioned harness; hallucination ruled out by byte-matching observed output to source. See [[references/subagent-contracts#marsha--verify-review-surface]] for brief composition.
§3 — The confound rule. A verdict blaming anything you don't own — "platform," "upstream," "external" — is not believable until a clean-room isolation proves it: reproduce with our contribution removed (vanilla, plugin-free) plus a positive control in the same harness. Derive the control from the authoritative spec, never by copying the suspect. Convergent confidence is not the control — N agents sharing one confound is worth nothing.
§4 — Don't trust convergence. Independently QA each worker's strongest claim. When workers contradict, adjudicate with methodology-independent evidence; treat a tidy, confident narrative as a prompt to find the missing control, not as closure.
§5 — Catch mis-briefed workers early; never pre-seed skip permission. A worker re-deriving known intelligence is wasted context — stop and relaunch with a surgical brief. Front-load every brief (gate + known intelligence + "escalate, don't fake-pass" + handback contract) — you usually cannot steer a running background worker. State every assumption as a testable hypothesis ("check whether X"), never as licence to skip ("you likely can't test X, so escalate").
§6 — Report up honestly. Every relayed claim carries an Observed/Reported label and a
confidence level — the register is defined once, canonically, in
[[specs/interactive-experience/head-role-charter.md#fitness-criteria--anti-patterns]] and is not
restated here. A worker's verification claim is not your finding: re-check any cheaply
re-checkable live state (PR merged/open, a task with status: done, branch pushed, file landed)
yourself at report time and relay the live result — never pass a worker's "confirmed" up to the
principal as established fact, correct your own prior conclusions out loud, supersede the PKB
record, and never fake-pass.
§7 — Context-economy contract (mandatory, every mode). (a) Capped structured handback,
every brief — require the worker to end with the canonical structured handback; read that,
not the narrative. The field shape, the substance-over-form review requirement, and the
Observed/Reported labelling rule are defined once, canonically, in
[[specs/enforcement/evidence-contract.md#the-canonical-structured-handback-format]] and are not
restated here (format worked example: [[references/subagent-contracts#worker-handback-format]]).
CONFOUND CHECK: NOT RUN blocks relay — commission the control first (§3). Reading the fields
back is not the check: verify the claims they point to, per
[[specs/enforcement/evidence-contract.md#substance-over-form]] — a worker's own VERDICT: PASS is
never sufficient by itself. (b) Cheap summariser agent for all bulk reading — never absorb a
30k narrative to lift a one-line verdict. (c) Ledger lives in the epic body — always open an
epic node, even in conversational mode; chat is not durable state.
One-line test before reporting: Have I proofed this against a falsifiable gate? If it blames anything I don't own — has a clean-room control ruled out our code? If not, I'm relaying a claim, not a finding.
Same proof discipline; mechanics differ: workers are background
Agent(subagent_type=…, run_in_background=True) calls; results arrive as <task-notification>.
Front-load every brief (§5) — you cannot steer a running worker. Still open an epic node for the
ledger. When work produces code/PRs, the one-epic-one-PR pattern applies unchanged:
see [[references/cohesive-pr-epic]].
When the goal spans many epics: advance ONE epic per tick — never two workers on the
same task-id (concurrent worktree creation races the worktree-lock). State lives in the release
task body under ## Constituent Epics and ## Escalations. File missing epics. The premise gate
still binds at every dispatch. Terminal: when every epic is at its review surface — set
release task to review, write N items to ## Escalations, stop. That is the correct end of an
autonomous loop. See [[references/supervision-mechanics#phases]] for per-phase mechanics.
Operate in decide-and-report mode. Exit in one of three states:
[ATTN] block: Emit a single YAML block (see [[references/supervision-mechanics#user-attention-notification]]) for decisions requiring explicit user authorisation.Supervision is a stateless tick — one invocation does one tick, by design, so
context stays small (the cross-tick state lives in the task body, not in a
long-running context). The recurrence is supplied externally by /loop. But a
user who types /supervisor <id> once should not get one tick and silence — so
when invoked interactively and the tick did not reach a terminal state, arm the
next tick yourself:
[ATTN]
(i.e. work remains and you are not halting), call ScheduleWakeup with the same
/supervisor <id> invocation as the prompt so the loop continues. Use a
delay in the idle range (≈1200–1800s) — see
[[references/supervision-mechanics#mechanism-selection]], where ScheduleWakeup
is the sanctioned idle/fallback wait mechanism.ScheduleWakeup call so the loop ends cleanly. This is the correct end of an
autonomous run — do not keep scheduling once every epic is at its review
surface./loop or a cron schedule, that mechanism re-fires the next tick — do not also
schedule one, or ticks will stack.Escalate only if: (1) action is irreversible or modifies external systems without authorisation; (2) involves methodology or claims published under the user's name; (3) no defensible default exists; (4) your judgment says stop — same failure keeps recurring, workers are stalled, or you cannot proof a verdict. No row counter; if it smells stuck, halt and escalate.
A delegate-and-verify run that ends with a tail of not-yet-closed items must be filtered, not relayed. A worker's catch-all "needs-the-user" bucket is an input to your judgment, never the output. Triage every residual against one maxim: an item escalates only if it meets the Escalation Criteria above; otherwise you own it. Anything reversible and inside your authority, clear yourself and report done; only genuine user-gates (those meeting the Escalation Criteria above) go back, batched into a digest, never handed over as a list of homework.
Execute exactly once per tick:
mcp__pkb__get_task(<id>)) and ledger. Before the first
dispatch: run the §1 orient checklist — PKB search, prior-art sweep, sanctioned-harness
identification, vendor-docs fetch for cross-vendor surfaces. Escalate if orient is incomplete.Do not:
gh auth status are permitted).marsha).data-ai
Canonical session close — commit, push, PR, release_task, reflection blocks, handover. Use /dump for emergency bail (no commit/PR/reflection).
data-ai
Emergency session bail — fast resume task + short handover, no commit/PR/reflection. For when you (or the user) need a clean context now. Use /end-session for canonical close.
data-ai
Daily note lifecycle — compose and maintain a factual daily note. Reports the state of the day; does not prioritise or recommend. SSoT for daily note structure.
testing
Launder supervisor/worker task-log output into a Nic-facing narrative — what happened, where things are headed, and what (if anything) is genuinely his to decide. Never relays raw process detail (worker IDs, thread pointers, log paths) or verbatim task-log stream-of-consciousness.