aops-core/skills/survey/SKILL.md
Survey a corpus, classify, and dispatch outputs. Three modes: retro (transcript review → issues), trend (longitudinal performance analysis), sweep (GitHub issue triage → fix-epics). Delegates execution to pauli (retro/trend) or jr (sweep) to keep main context clean.
npx skillsauth add nicsuzor/academicops surveyInstall 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.
Survey a corpus, classify findings, and dispatch outputs according to the selected mode.
| Mode | Corpus | Primary output |
| ------- | ----------------------------------- | ------------------------------ |
| retro | Session transcripts (one at a time) | GitHub issues filed via gh |
| trend | Many sessions / audit files | Trend report + recommendations |
| sweep | Open GitHub issues | PKB tasks, fix-epics, closures |
Privacy Rule: Anonymize all findings. Do not expose real names, emails, student details, or raw session dumps.
This skill delegates execution to keep the main context clean:
retro / trend mode: Dispatch pauli with access to PKB and system tools.sweep mode: Dispatch jr to handle interactive triage and confirmation gates.Perform a critical, forensic review of a single session transcript, apply immediate fixes where appropriate, and file the tracking GitHub issues.
pauli dispatched within the session) is explicitly allowed and structurally sound because the subagent executes in a clean, detached context.$AOPS_SESSIONS is set and $AOPS_SESSIONS/transcripts exists. If not, stop and ask the user.$AOPS_SESSIONS/transcripts/YYYY-MM/*-${SID}-*-claude-full.md. Use -abridged.md only as a fallback.$AOPS_SESSIONS/transcripts/YYYY-MM/) exists and is non-empty. A zero-hit glob in a wrong or missing directory is a lookup error, not an absent transcript.-full.md file..jsonl — a forensic review on a degraded transcript yields false findings; proceed on raw JSONL only with explicit user confirmation./craft defects: compliance framing, missing artifact chain, etc.)./learn that last task should have been xyz: When Nic invokes this style with a description of what should have happened, treat it as a directive to perform a dual action:
When the transcript shows an artifact whose premise a sharp principal would have bounced — "was this a good idea?" answered no; good, working, well-tested work done for a bad idea (canonical instance: a deterministic rig — regex/threshold/NLP/checklist — built for a call a smart agent should just make, judgment-non-delegable) — that nonetheless passed review, classify it as a bad-premise approval and score the miss against the reviewer who approved it, not only the author:
/verify / rbg / pauli). Each of those carries a forced step-0 Premise Test (canonical definition: [[premise-test.md]]); an approval means that forcing function was skipped or rationalised past — a reviewer failure, with test-passing as its expected surface, never an excuse.This makes the reviewer's miss visible and attributed — the compounding fix for floor-optimisation (#1585): a slipped-through bad premise becomes a logged, attributed miss instead of an invisible one, so the cost lands on the surface that should have caught it.
Any fix that changes what an agent is directed to do (an instruction, persona edit, rule, hook, gate, or chokepoint) is a regulatory-pyramid action. A retro applying one MUST:
{#enforcement-map-currency} (it covers instructions and persona edits, not only gates). State the grain call in the review: either the change is content on an already-mapped mechanism class (e.g. a repo-local .agents/CORE.md / persona edit rides the already-mapped L1 SessionStart-reads row → no new row owed) or it is a genuinely new mechanism class (→ add one row to specs/ENFORCEMENT-MAP.md in the same change). Never leave the decision unrecorded.aops-core/agents/<agent>.md) via a gated aops PR — not buried in one host's local launch context. A local-only edit is an acceptable immediate stopgap, but the retro MUST then recommend propagation to the canonical layer — this is the "correctly placed + propagated" precondition §4 requires before any later escalation.Produce a review in this exact format. Keep text concise:
## Transcript Review: <filename>
**Session**: <session_id> **Date**: <date> **Project**: <project>
**Verdict**: [EXCELLENT | GOOD | ADEQUATE | POOR | FAILING]
### Findings
[Concise description of failures/successes, grouped by structural cause.]
### Patterns (Optional)
[Upstream/structural root cause spanning multiple findings.]
gh issue list and gh pr list to avoid duplication.gh issue edit.Bug: <brief-slug>.uv run pytest) to verify no regressions were introduced.| Anti-pattern | What to do instead |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Same-context self-grading (the same agent reviewing their own work within the same conversation/turn context without a fresh reviewer boundary) | Review by a fresh subagent (like pauli dispatched within the same session) or a separate reviewer, ensuring a detached/clean review context. Same-session review by a fresh subagent is structurally sound and explicitly allowed. |
| Including remediation proposals in the report | Stop at facts, structural context, and impact — a detached cross-incident pass decides on rule changes. Propose fixes directly in the codebase (if permitted) but keep the filed issue strictly forensic. |
| Citing a single session as justification for a new mechanism | Recurrence is the evidence base for framework change, not the salience of a single transcript. |
| Stacking a heavier guard beside an untested instruction fix ("the real enforcement still open"), or applying a behavioural fix without recording the enforcement-map grain decision / propagating a framework-wide truth to the canonical agent def | Apply §2b: lowest sufficient tier first, escalate only on demonstrated insufficiency (defer heavier guards), record the {#enforcement-map-currency} decision, propagate framework-wide truths to aops-core/agents/<agent>.md. |
Review multiple sessions to identify systemic effectiveness and trends.
Corpus selection — prompt mining vs trend reading. If the goal is to extract what the user typed (prompts,
/commandinvocations, skill usage patterns), start with the structured summaries corpus at$AOPS_SESSIONS/summaries/YYYY-MM/*.json. Read the top-leveluser_promptsarray ([{timestamp, text}]) or filtertimeline_events[type="user_prompt"]tosystem_injected=false— across ALL clients, no client-name filter needed. This is faster and more reliable than grepping raw transcripts. Seespecs/CAPABILITIES.md §Session Summariesfor full field reference. Raw transcripts ($AOPS_SESSIONS/transcripts/) are the fallback for content that summaries don't capture (agent reasoning, tool calls).
Analyze aggregate true/false rates, temporal trends, coverage, and cost-benefit. Produce a report in this format:
# Trend Review: <Component Name>
**Question**: <review question> **Date**: <today>
**Corpus**: <N> files, <date range> **Sample**: <N> files (criteria: ...)
## Executive Summary
[3-5 sentences summarizing if the system is working and the main trend/issues.]
## Objectives Verdict
| Objective | Verdict | Evidence |
| --------- | -------------------------------------------- | -------- |
| [obj 1] | ANSWERED / PARTIALLY ANSWERED / UNANSWERABLE | [why] |
## Individual Assessments
### <filename> (<date>)
- **Context**: ... **Component behavior**: ... **Accuracy**: [TP/FP/FN] **Impact**: ...
## Aggregate Analysis
[Signal Quality / Temporal Trends / Coverage Map / Cost-Benefit]
## Recommendations
[Actionable, prioritized recommendations with evidence citations.]
## Confidence and Limitations
Save the report to ~/.aops/sessions/reviews/<component>-trend-<date>.md.
Triage and process open issues on nicsuzor/academicOps (batch limit: ≤20 issues).
Fetch open issues, focusing on the focal issue first if a directed focus is provided. Classify using this rubric:
| Disposition | Criterion | Action | Label |
| ----------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------- |
| close-as-stale | >90d old, no activity, or describes retired behavior. | Close issue with explanatory comment. | triaged-stale |
| consolidate-duplicate | Describes the same underlying problem. | Merge details into canonical issue; close duplicate with cross-link comment (#N). | triaged-duplicate |
| aggregate | Multiple issues sharing one root cause/fix surface. | Fold into one fix-epic task (leave queued); close source issues with pointer comments. | triaged-aggregate |
| evidence-bump | Accumulates evidence for a related open issue/epic. | Leave open; add comment citing canonical issue (#N). | triaged-evidence-bump |
| single-task | Atomic task (AC clear, ≤3 files, obvious fix). | File polecat task with Closes #N. | triaged-single |
| fix-epic | Multi-step, multi-file, or design-required work. | Create epic task and decompose, leave queued. | triaged-epic |
| defer | Real but blocked or low-criticality. | Apply defer label and revisit-by date. | triaged-defer |
For proposals that add or escalate a rule, perform this review before assigning the disposition:
specs/ENFORCEMENT-MAP.md rows as a pipeline gap.Log results in the following format:
## Cycle <N> — applied (open before: <K>; batch: <M>)
### Applied autonomously (done)
- Consolidate-duplicate: #R → unique detail merged into #S, #R verified state:closed
- Aggregate: #A, #B, #C → folded into fix-epic <id> (queued)
- Evidence bump: #T → bumped #U
- Close (stale): #P
- Defer: #Q (revisit-by YYYY-MM-DD)
- Single-task: #X → "<title>"
- Fix-epic (queued): <title> ← #D, #E
### Needs human triage / decision (waiting)
- #Z (rubric ambiguous: <reason>)
- <add-or-escalate proposal>: cost-ladder reasoning + ≥3 recurrence links
severity (or set severity=0) on tasks created during the sweep. Assigning non-zero severity to ordinary tasks is prohibited; severity belongs exclusively on target milestones (see [[../remember/references/TAXONOMY.md#severity-target-boundary]]). Set any status only from the canonical set ([[../remember/references/TAXONOMY.md#status-values-and-transitions]]); created tasks default to inbox and ready is computed downstream — do not hand-write it.priority at the uncurated default band on swept tasks — never infer, estimate, or propagate a band ([[framework-conventions-summary#intent-authority]]). To make a swept task more important, raise the stated_weight of its contributes_to edge (Renooij-Witteman verbal scale; see [[wire-edges]] / [[../remember/references/TAXONOMY.md#target-nodes]]), never bump priority. Do not set priority=0 (P0) on swept tasks unless it is deliberately calibrated under canonical rules (see [[../remember/references/TAXONOMY.md#p0-calibration-bar]]) and explicitly requested/justified.state: closed.epic-a0523a25 and append the cycle log details.Skill(skill="verify", args="Verify cycle <N> of /issue-sweep on epic-a0523a25.")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.