aops-pkb/skills/daily/SKILL.md
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.
npx skillsauth add nicsuzor/academicops dailyInstall 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.
Compose and maintain the daily note at $ACA_DATA/daily/YYYYMMDD-daily.md (filename uses today's date, date +%Y%m%d). On every run, point the symlink at it: ln -snf daily/YYYYMMDD-daily.md $ACA_DATA/daily.md.
Fill out the template in references/note-template.md. That file is the structural SSoT — follow its section order.
A factual, reportive snapshot of the day: what happened, what's open, what's due, what's in the inbox. It is not prescriptive — never rank what the user should do next or suggest a sequence. Forward prioritisation is the user's, in ### My priorities (create the empty heading; never write under it).
type: daily. This is the canonical-path derivation key: the storage path is derived from this field alone, so a note written or regenerated without it is misfiled by definition. Verify the field is present before the first write and after every regeneration; never let a fallback path (e.g. type: note) stand in silently.[x]) and annotations, across regenerations. Match items by ID/PR/subject and carry ticks forward.$AOPS_SESSIONS/transcripts/$(date +%Y-%m)/$(date +%Y%m%d)-*-claude-*.md (prefer -abridged.md) — and reconstruct the day from them. Assembling it from artifacts already in the note (prior retro stamps, yesterday's log) or from the reconcile sweep's merged-PR list is a criterion substitution: it reproduces the file, not the day. If no same-day interactive transcript exists, omit the section — do not back-fill it from second-hand artifacts.$AOPS_SESSIONS/state/prompt_ledger.md is missing or stale (not regenerated today), refresh it: uv run python aops-core/scripts/transcript.py --ledger --since <7-days-ago> from the academicOps checkout. Tail its most recent ~10 lines into ## Prompt Ledger verbatim. Never write ledger lines by hand and never fill in a blank outcome/link yourself — they're blank because the pipeline couldn't honestly resolve them from the session summary, not because the field was skipped.Available, not mandatory steps. Use them when the day's content calls for them:
/email --daily — triage the inbox into tasks + FYI items./q — capture a task (e.g. routing a mobile capture from $ACA_DATA/notes/mobile-captures/; delete the original with mcp__pkb__delete once it's routed)./remember — persist durable knowledge./decision-extract — expand the pending-decisions list if the user wants detail./strategy — if the user signals they want a priorities reset.mcp__pkb__get_task; drop it if it's missing, done, cancelled, or already ticked in today's note. Copying blindly produces phantom-overdue items.$AOPS_SESSIONS/state/pr-state.json for the "Outstanding Workflows" / open-PR snapshot (it is cheap and good enough for a display list). Do NOT run a bulk gh pr list just to populate that display. The reconcile sweep below is the exception: it resolves and checks PRs one task at a time against live gh, because a pre-baked feed's recent-window misses older merges and silently leaves tasks parked.goals field.mcp__pkb__task_summary. Never count tasks yourself — aggregation is the PKB's job.Hoist a due task into a ## 🚨 ESCALATED DEADLINES callout when it meets any of these conditions:
Render its verbatim consequence text; drop it from the Status deadline list to avoid duplication. Do not hoist movable SEV2 tasks unless they are also overdue — that is false urgency inflation. Do not compute tiers or ratios — the full escalation model lives in [[importance-visibility-escalation]], and a follow-up PKB-tool task will compute a real escalation tier upstream.
status: merge_ready = parked on a PR. Under review — PR open, awaiting CI, review, or iteration ([[taxonomy#status-values-and-transitions]] is the SSoT for the full protocol). The PR is the source of truth for whether it can close.status: review = parked on a human. Actionable work waiting on Nic's (or an agent's) judgment, not on a merge ([[taxonomy#status-values-and-transitions]]). Most status: review tasks have no PR at all — reading notes, design decisions, "needs Nic's direction" items.Never auto-close a review task. Its close is always a decision, never a PR match — even a PR showing MERGED is evidence, not authority. Surface every review task under "Needs your call" every run; it must never silently disappear as if it were parked PR backlog.
Resolve PRs against live GitHub, not the pre-baked pr-state.json feed — its recent_merged is a recent-window snapshot and misses older merges. The canonical reconcile contract is [[workflows-reconcile]]: structured fields (pr_url, else branch, else a repo-qualified PR number) drive the match, gh confirms the state.
For each merge_ready task: resolve its PR and check the live state. MERGED closes the task (mcp__pkb__complete_task, citing the PR URL and merge time as evidence). OPEN leaves it parked. CLOSED-without-merge, or unresolvable to a concrete <repo>#<number>, is surfaced under "Needs your call" instead of auto-closed.
For each review task: resolve any linked PR the same way, but its state is evidence only, never grounds for a close — surface it regardless, with its title and one-line ask. A review item with no actionable ask at all (e.g. a reading note that was never really a task) is surfaced as mis-statused so Nic can re-file or drop it.
Guards, both passes: never close on doubt (an unresolved condition flagged in the task body beats a MERGED PR); never cascade-close a parent whose children are still open; never touch academic, peer-review, or Nic-decision items — these are always surfaced, never auto-closed.
Report in the daily note: tasks auto-closed against merged PRs, review tasks re-surfaced awaiting a decision, tasks surfaced for a call.
This is the scheduled-sweep counterpart to the task-lifecycle skill's point-of-claim gates ([[aops-pkb/skills/task-lifecycle/SKILL.md]] §2b Freshness pre-check) — those check a task once, at the moment something tries to select it; this catches claims made and then silently dropped, and stale premises on tasks nobody has tried to select since they went stale. Owned here, not in /sleep: /daily runs on Nic's actual cold-open cadence — a habitual, human-triggered surface that fires whether or not any automation does — while GHA cron cadence is known-unreliable (aops-bdfb52d4: the merge-prep cron drifted to ~hourly and stalled outright for 5h on a 30m schedule) and /sleep's own loop fires only on manual invocation or that same class of cron. A reconcile step that lives only where it might not fire closes no loops. This complements, does not replace, /sleep's longer-horizon checks — Phase 6 Activity 2 (90-day evidence-based staleness verification) and Phase 7 Gate-1 (14-day artifact-rot check on ready/queued) stay owned by /sleep; do not re-implement them here.
Stale-claim pass. mcp__pkb__list_tasks(status="in_progress", before=<today - 2 days>, format="json") (cap 30/run). For each candidate:
type is epic or the task has children (a parent task spanning multi-session work), skip it this run unless it has also been untouched for ≥14 days — 2 days of quiet on a container task is normal, not abandonment.in_progress across sessions; a long gap is not abandonment./sleep Phase 6 Activity 2. Decide exactly one:
mcp__pkb__complete_task(id, completion_evidence="<what was found>", pr_url=<if any>).mcp__pkb__update_task(id, updates={status: "queued", assignee: null}), then mcp__pkb__append(id, content="Released by /daily stale-claim reconcile YYYY-MM-DD: in_progress since <date>, no activity or completion evidence found — returned to queue for redispatch."). Return it to queued — the state it was dispatched from, already past the premise gate — never promote it further.mcp__pkb__update_task(id, updates={needs_triage: true}), then mcp__pkb__append(id, content="Flagged by /daily stale-claim reconcile YYYY-MM-DD: premise appears superseded/gone — <one-line reason>. Needs a human close, not auto-cancel.").Ready-queue premise pass. Runs once per calendar day, not every /daily invocation (guard: skip if $ACA_DATA/state/ready-queue-reconcile-cursor.json already records today's date; write today's date after running). mcp__pkb__list_tasks(status="ready", before=<today - 2 days>) and mcp__pkb__list_tasks(status="queued", before=<today - 2 days>) (cap 30 each). For each candidate, check the two signals the point-of-claim gate can only catch when a select is actually attempted:
superseded_by set but status is still ready/queued — should have moved to cancelled at supersession time and didn't.done/cancelled (via mcp__pkb__get_task_children on the parent) and this task's body reads like it belonged to the same finished batch — likely a leftover from a completed decomposition (same heuristic as the task-lifecycle stale-leftover check, applied proactively instead of waiting for a select attempt).Artifact-existence rot (named file/symbol no longer present) is not re-checked here — that stays /sleep Phase 7 Gate-1's job at its own cadence. For every match: mcp__pkb__append(id, content="Flagged by /daily ready-queue reconcile YYYY-MM-DD: <reason>. Left as-is for human review."). Flag, never hard-delete or auto-cancel.
Report in the daily note: one summary line in ## Work Log (Stale-claim reconcile: N closed, M released, K flagged. Ready-queue reconcile: J flagged.) plus every flagged item (both passes) listed under "Needs your call" in ## What Needs Attention, with task ID and the one-line reason.
You may append a ## Progress note or tick checklist items on a task that today's accomplishment maps to. Never mark a parent task done, never delete task content.
Commit the note (don't leave it for the sync): cd "$ACA_DATA" && git add "daily/$(date +%Y%m%d)-daily.md" daily.md && { git diff --cached --quiet || git commit -m "daily: note for $(date +%Y-%m-%d)"; } — the guard makes no-op re-runs exit 0. If a pre-commit hook fails, let it surface; don't bypass it. Then end with a one-line confirmation: "Daily note updated. Use /pull to start work." and halt.
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.
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.
development
Judgement-based QA pass. Does this artifact meet its goal and serve its user? Demands excellence, not compliance. Owned by marsha; reads the spec's Fitness Rubric (designed upstream via /design-rubric).