Skip to content

Add super-tasker skill (opt-in, with responsive-agent dep) - #8

Open
asdigitos wants to merge 3 commits into
victor-develop:ductor-slackfrom
asdigitos:feat/super-tasker-skill
Open

Add super-tasker skill (opt-in, with responsive-agent dep)#8
asdigitos wants to merge 3 commits into
victor-develop:ductor-slackfrom
asdigitos:feat/super-tasker-skill

Conversation

@asdigitos

@asdigitos asdigitos commented May 12, 2026

Copy link
Copy Markdown

Summary

Adds two opt-in skills at repo-root skills/:

  • skills/super-tasker/ — file-backed multi-track task orchestration.
  • skills/responsive-agent/ — pause-and-ask / resume protocol (dependency).

Neither is bundled into ductor_slack/_home_defaults/, so a fresh ductor
install does not pick them up automatically. Install is a deliberate
copy into the live workspace (see skills/README.md).

super-tasker turns the agent into a Lead that walks a file-backed
frontier of tasks and dispatches Executor sessions per leaf via
tools/task_tools/create_task.py. It builds on responsive-agent for
human-in-the-loop continuation — no in-loop budgets, no self-trigger.

What changed since the previous round

Three rounds of review feedback from Victor are folded in:

  1. Opt-in, not auto-install. Skills moved out of
    ductor_slack/_home_defaults/workspace/skills/ into top-level
    skills/. skills/README.md documents the manual install path.
  2. Activation model corrected. Self-messaging does not re-enter a
    ductor session, so the previous "cron sends self a [super-tasker:lead-pass]
    message" framing was wrong. SKILL.md now enumerates the four real
    external triggers for a lead pass:
    • user Slack message,
    • executor completion callback injected into the parent session by
      create_task.py,
    • responsive-agent resume,
    • cron / webhook (an external scheduler firing into the agent, not
      the agent talking to itself).
      The doc explicitly states the agent cannot wake itself.
  3. Split / merge are one-way state transitions. Made explicit in
    SKILL.md: once a → a1, a2, parent a is permanently Splitted and
    stops being tracked; active set replaces it with {a1, a2}. Once
    b1, b2 → b3, sources are permanently Merged and stop being tracked.
    No rollup, no revival. The lead walks the frontier (non-terminal
    tasks whose split_from parent is terminal-or-absent), not "top-level".
  4. resume.py surfaces the executor anchor on the first output line.
    Previously the resumed agent had to scan the body for [stask-exec:<id>]
    to know it should re-enter executor mode. Now resume.py does that
    scan itself and re-emits the anchor as the first line of stdout.
    [stask-exec:<id>] is also the canonical anchor in spawn_executor.py
    and SKILL.md (the old [super-tasker mode=executor task=...] form is
    gone).

File layout

skills/
├── README.md
├── responsive-agent/
│   ├── SKILL.md
│   └── scripts/{cleanup.py,pause_and_ask.py,resume.py}
└── super-tasker/
    ├── SKILL.md
    └── scripts/{tasker.py,spawn_executor.py}

Design decisions worth review

  • Frontier vs. top-level. is_top_level (strict: no SplitFrom parent,
    not in any merged_from) is kept for the user-facing "list my major
    initiatives" view. is_frontier (non-terminal AND parent is
    terminal-or-absent) is what the lead pass walks. Both predicates are
    exposed via list --top-level and list --frontier.
  • Re-evaluation cadence: triggered, not every-pass. Re-eval fires when
    one of: executor appended reeval-request, task was never planned,
    user-note contains a reeval intent, or task is Open for ≥ STASK_STALE_DAYS
    (default 3) with no events. Rationale: each re-eval is a subagent call;
    sweeping every Open task every pass is expensive and noisy.
  • MAX_DEPTH = 3 — enforced in tasker.py (depth-3 tasks reject split).
  • No plan-before-execute confirmation gate. User intervenes
    asynchronously via user-note events; the lead reads them on the next
    pass. The intervention verb table is in SKILL.md.
  • Executor scoping. spawn_executor.py builds a prompt that lists the
    allowed read window (task.json + events.jsonl + context/ + the absolute
    paths in context_files) and rule 1 forbids reading the wider workspace.

Status

Design review, round 2. Not for auto-install — files live at repo-root
skills/ precisely so merging does not push them into anyone's
workspace. Next step after approval: copy into Ethan's running ductor
instance and exercise on a real task.

Test plan

  • tasker.py initaddbrief returns the new task as frontier
  • split creates depth-1 children; parent becomes Splitted and is
    excluded from the frontier; children become the frontier
  • depth-3 task rejects further split
  • merge on terminal task is rejected; merge on two Open tasks
    creates a result and sources go to Merged
  • --text works before or after the subcommand
  • resume.py injects [stask-exec:<id>] as the first stdout line when
    it appears in the saved context (smoke-tested locally)
  • Install on Ethan's ductor instance and run a real lead pass

Ethan Tan (AfterShip) and others added 3 commits May 12, 2026 06:28
A new skill bundled at workspace/skills/super-tasker/ that owns a
file-backed task DB and operates in two modes:

- Lead (default): scans the open frontier, decides per-task whether to
  execute, plan, wait, or ask, and delegates work via background tasks.
- Executor: spawned with [stask-exec:<id>] anchor, scoped strictly to one
  task's context window.

Designed for the ductor / Slack environment — no internal agentic loop,
no time/step/token budgets. Continuation is driven by responsive-agent
resumes and cron ticks. State lives at ~/.ductor-slack/workspace/super_tasker_state/.

Includes:
- SKILL.md spec (modes, data model, transitions, frontier semantics,
  re-eval cadence, executor rules, user intervention verbs)
- scripts/tasker.py — single-file CLI (init/add/list/show/update/event/
  split/merge/brief/gc/rebuild-index)
- scripts/spawn_executor.py — wrapper that builds the executor prompt
  with the right anchor and context window and calls
  tools/task_tools/create_task.py.

Honors Victor's design constraints: Status enum, S/M/L complexity,
SplitFrom/MergedFrom/DependsOn relations, MAX_DEPTH=3, Splitted as a
terminal state, top-level definition for user listing. Re-evaluation
cadence defaults to triggered (reeval-request / never-planned / user-note /
stale) rather than every-pass, with rationale in SKILL.md.

Depends on the responsive-agent skill for human-in-the-loop continuation.
super-tasker depends on responsive-agent for pause/resume continuation
(no in-loop budgets — long work is suspended and resumed via Slack).
Ship them together so a fresh install gets a working super-tasker.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Both skills now live at repo-root skills/<name>/ instead of
ductor_slack/_home_defaults/workspace/skills/, so a fresh ductor install
does not auto-pick them up via the skill-sync mechanism. Per Victor:
the skill should not be installed by default — install is a deliberate
copy into the live workspace.

skills/README.md documents the manual install path.
@asdigitos asdigitos changed the title Add super-tasker skill: file-backed multi-track task orchestration Add super-tasker skill (opt-in, with responsive-agent dep) May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant