aops-cowork/skills/cowork-sync/SKILL.md
Mirror PKB tasks onto the Cowork native task list at claim time and sync completion back to PKB. Cowork-only; ships only in the cowork build of aops-core.
npx skillsauth add nicsuzor/academicops cowork-syncInstall 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.
Defines procedures for aligning the Personal Knowledge Base (PKB) with the Cowork harness-native task list.
/pull claim time.in_progress, completed) to the native list.mcp__pkb__complete_task in real time. Parent task sync is deferred to /end_session's release_task.description (e.g. "PKB task-acba1234 — Implement X")./pull and /end_session drive this mirror; supervisor ticks and ad-hoc PKB writes bypass it and won't appear on the native list until the next /pull.Before calling native task tools, ensure schemas are loaded:
ToolSearch(query="select:TaskCreate,TaskUpdate,TaskList,TaskGet", max_results=4)
Invoked by /pull claim step.
parent = mcp__pkb__get_task(id="<pkb-id>")
leaves = mcp__pkb__get_task_children(id="<pkb-id>")
parent_native = TaskCreate(
subject="<short-title>",
description="PKB <pkb-id> — <full-title>",
activeForm="Implementing <subject>"
)
leaves, create a native task and block the parent:
child_native = TaskCreate(
subject="<child-title>",
description="PKB <child-id> — <child-title>",
activeForm="Implementing <child-title>"
)
TaskUpdate(taskId=child_native, addBlocks=[parent_native])
in_progress:
TaskUpdate(taskId=parent_native, status="in_progress")
Execute immediately when setting a native task to completed:
TaskUpdate(taskId="<native-id>", status="completed")
nt = TaskGet(taskId="<native-id>")
PKB <id> prefix from nt.description./end_session).mcp__pkb__complete_task(id="<pkb-id>", summary="<native-subject>")
Invoked during /end_session before calling release_task.
tasks = TaskList().PKB <id> from description for all tasks.completed whose PKB ID is NOT the bound parent:
mcp__pkb__get_task(id="<pkb-id>").mcp__pkb__complete_task(id="<pkb-id>", summary="reconciled at session close").If /pull is run again in the same session, cancel the prior parent native task before mirroring the new task:
tasks = TaskList()
for t in tasks:
if t.status == "in_progress" and t.description.startswith("PKB <previous-pkb-id>"):
TaskUpdate(taskId=t.id, status="deleted")
| Symptom | Cause | Recovery |
| :---------------------------------------------- | :-------------------- | :--------------------------------------------------------- |
| TaskCreate errors with "tool not loaded" | Bootstrapping skipped | Run ToolSearch first. |
| Native task lacks PKB <id> | Bypassed mirror step | Treat as session-local task; do not sync. |
| complete_task fails with terminal state error | Row already updated | Ignore and continue. |
| Sync call failed mid-session | Server disconnect | Final reconciliation at session close will correct status. |
| Native task cancelled (deleted) | Task aborted | Do not sync to PKB. |
This skill is exclusive to the cowork build of aops-core. Keep files clean of other platform references.
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.