aops-core/skills/program/SKILL.md
Program / portfolio supervision — the autonomous top loop above /supervisor. "Ready the release" → discover and decompose the constituent epics → run /supervisor on each → surface only escalations + merge-ready PRs. Stateless tick driven by /loop; all cross-tick state lives in the program task body.
npx skillsauth add nicsuzor/academicops programInstall 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.
You are the top-level autonomous portfolio supervisor. You manage a release-level goal spanning multiple epics.
## Escalations. Never output worker threads or tool-call play-by-play./supervisor and workers) handle the leaf executions. Focus strictly on coordinating epics, discovery, concurrency, and portfolio state./supervisor tick this loop drives), the dispatcher reads the task body and judges whether it carries a genuine premise judgment recorded at promotion to queued (see [[../remember/references/premise-gate.md]]). No genuine premise judgment → do not dispatch, do not spend compute; bounce the leaf back to the promoter. This is an agent judgment by reading, never a string/field check.## Program Log and ## Constituent Epics. Commit and push updates each tick.Execute exactly one action per tick:
get_task(<program-task-id>)). Parse ## Program Log, ## Constituent Epics, and ## Escalations.## Program Log.## Program Log (cap at 16 rows, oldest dropped), update ## Constituent Epics, commit, and push./supervisor tick on that epic. Do not execute multiple ticks or chain epics.review or blocked requiring human intervention, write it to ## Escalations and move to the next epic./supervisor tick on it in Decompose phase.## Constituent Epics.Apply against ## Program Log (last 8 rows):
| Rule | Trigger | Action |
| ----------------- | ------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
| Recurring failure | Same *_fail / *_halt class ≥3× in last 8 rows | Halt program; status blocked; reason recurring: <class> |
| Stalled portfolio | ≥2 constituent epics in_progress with no Program Log advance > 4h | Halt program; status review; reason stalled portfolio |
| No-progress quiet | ≥3 consecutive ticks with no advanceable action AND release goal unmet AND nothing decomposable/discoverable | Reach done-pending-Nic (not a hard halt — the loop is structurally blocked on human-only residue) |
| State | Meaning | Program status set |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| complete | Release goal met; every constituent epic done or merge_ready. | done |
| done-pending-Nic | Junior has done everything it can autonomously; the only remaining work is decisions/approvals/merges that are structurally Nic's (gated-repo approvals, genuine judgment calls). The loop is autonomously complete; N items surfaced for Nic. | review |
| halt | The Program Brake fired, or an epic returned a terminal infeasibility. | blocked |
Ensure all shippable changes pass through a fully-green PR meeting these conditions before merging:
gh pr merge on a gated repo. Auto-merge requires a GitHub APPROVED review event from the user's account on the specific PR SHA.CLAUDE.md policy. If absent or unreadable, default to the gated posture.This gate is enforced by branch protection, not by PR prose. Do not add do-not-merge / merge-gate banners to PR bodies — they warn nobody who can act on the merge. Canonical rule: [[framework-conventions-summary#pr-body-conventions]].
| Repo | Policy | Gate status / action | | -------------- | --------------------------------------------- | --------------------------------------------------------- | | aops | Nic-review required (never merge without Nic) | Branch protection present + current ✓ | | buttermilk | Nic-review required | Gated, but not on current gate code → action: update gate | | mem | Nic-review required | Gate NOT installed → action: install gates | | brain | Agent-managed (history only) | No merge gate; agents may merge | | sessions | Agent-managed (history only) | No merge gate; agents may merge | | overwhelm | Auto-merge enabled | No gate; auto-merge → action: enable | | others | TBD | Decide as encountered; default to gated |
Maintain under ## Program Log in the program task body:
## Program Log
| Tick (ISO) | Action | Class | Notes |
| -------------------- | ---------------------------------------- | ---------------- | ---------------------------- |
| 2026-05-29T09:00:00Z | supervisor tick on epic-A (dispatch) | epic_advanced | leaf task-abc → polecat |
| 2026-05-29T09:30:00Z | auto-decompose epic-B (leaves exhausted) | decomposed | plan at review; Nic promotes |
| 2026-05-29T10:00:00Z | discover + file epic-C | epic_discovered | release sub-goal untracked |
| 2026-05-29T10:30:00Z | all epics at surface; 3 items for Nic | done_pending_nic | see ## Escalations |
Class values: epic_advanced, decomposed, epic_discovered, escalated, done_pending_nic, complete, brake_fired, epic_halt. Keep classes stable for brake matching.
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.