Smith Task Queue
SkillProductivityManage a deferred task queue — add, list, process, remove, batch-execute, schedule, prioritize, and browse history of tasks stored in the vault.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Smith Task Queue skill
What this skill tells your AI
The instructions your AI receives, as published by attckdigital/smith in skills/smith-queue/SKILL.md and read by ahel’s review.
Manage deferred work through a persistent task queue in .smith/vault/queue/. Supports priority ordering, dependency tracking, scheduled execution, status lifecycle management, and batch processing with git worktree isolation.
Arguments: $ARGUMENTS
Vault Logging
Throughout this action, log significant events to the vault session log. Read the session log path from .smith/vault/.current-session. If the file is missing or the vault is not initialized, skip all logging silently.
Append entries using this format:
### [HH:MM:SS] /smith-queue <event>
**User Request:**
> <verbatim user message that triggered this action>
**Synthesized Input:** <brief summary>
**Outcome:** <what happened>
**Artifacts:** <files created/modified>
**Systems affected:** <system IDs>
Log at these points:
- On invocation — which subcommand was used
- After task added/removed/processed/scheduled — task description, queue file path, status change
Queue Entry Format
All queue entries are markdown files in .smith/vault/queue/ with this frontmatter:
---
task: "<task description>"
branch: "<feature branch name — the queue processor checks out this branch via worktree>"
spec_path: "<path to the feature spec folder on the feature branch>"
primary_system: "<system ID, e.g., system-13-trend-intelligence>"
created: "YYYY-MM-DDTHH:MM:SS"
project: "<project directory basename>"
complexity: autonomous|interactive|review
priority: critical|high|medium|low
status: pending|scheduled|in-progress|completed|failed|blocked
depends_on: []
scheduled_for: ""
---
## Context
<brief description of what this feature does and key decisions>
## Artifacts on branch
- spec.md — feature specification
- plan.md — implementation plan
- questions.md — clarification questions (all answered)
- <any other artifacts>
## Execution Instructions
Run `/smith-build` from the `<branch>` branch with feature dir `<spec_path>`.
Required fields: task, branch, spec_path, status, complexity, priority.
Backwards compatibility:
- Entries without
priority,depends_on, orscheduled_for→ treated aspriority: medium,depends_on: [],scheduled_for: "" - Entries with
descriptioninstead oftask→ readdescriptionas the task name - Entries with
status: queued→ treated asstatus: pending
Status Lifecycle
pending → scheduled → in-progress → completed
→ failed → pending (via requeue)
→ blocked (if dependency failed)
Every status change MUST append to the ## Status History section in the queue file body:
- `[YYYY-MM-DD HH:MM]` <Status> — <reason or details>
Subcommands
Parse the first word of $ARGUMENTS to determine the subcommand.
add "<description>" [--priority ] [--depends-on ]
Creates a new task entry in .smith/vault/queue/.
-
Capture context:
- Task description (from arguments after
add, excluding flags) - Current project directory (
$CLAUDE_PROJECT_DIR) - Current git branch:
git rev-parse --abbrev-ref HEAD - Active feature spec (if on a feature branch, check
.specify/systems/) - Timestamp (UTC)
- Task description (from arguments after
-
Parse flags:
--priority <level>— set priority (critical/high/medium/low). Default:medium--depends-on <filename>— add dependency on another queue entry. Can be specified multiple times.
-
Determine complexity flag from the description:
autonomous— task can run without user input (default for clear, specific instructions)interactive— task needs user decisions or clarificationreview— run autonomously but stage results for approval- If unclear, ask the user
-
Generate queue file at
.smith/vault/queue/YYYY-MM-DD_HHMMSS-<slug>.md:--- task: "<task description>" created: "YYYY-MM-DDTHH:MM:SS" project: "<project name>" branch: "<current branch>" spec_path: "<spec path or empty>" complexity: <flag> priority: <level> status: pending depends_on: [<filenames>] scheduled_for: "" --- # Task: <description> ## Context - **Project:** <project name> - **Branch at creation:** <branch> - **Active spec:** <spec path or "none"> - **Priority:** <level> - **Dependencies:** <list or "none"> ## Instructions <full task description> ## Notes <additional context from the conversation> ## Status History - `[YYYY-MM-DD HH:MM]` Created — priority: <level>, complexity: <flag> -
Confirm: "Queued:
<filename>(priority:<level>, complexity:<flag>)"
list
Show all pending/scheduled queue items sorted by priority then date.
-
Read all
.mdfiles in.smith/vault/queue/(excludinghistory/subdirectory and.batch-progress.md) -
Parse frontmatter for
task,created,complexity,priority,status,depends_on -
Sort: critical → high → medium → low, then oldest first within each level
-
Display:
## Queue — N items | # | Priority | Created | Complexity | Status | Description | File | |---|----------|---------|------------|--------|-------------|------| | 1 | 🔴 critical | 04-05 08:30 | autonomous | pending | Fix auth bypass | ... | | 2 | 🟠 high | 04-05 09:00 | review | scheduled 04-06 02:00 | Add rate limiting | ... | | 3 | 🟡 medium | 04-05 09:15 | interactive | pending | Redesign popup | ... | | 4 | 🔵 low | 04-05 10:00 | autonomous | pending | Update docs | ... | Total: 4 items (2 autonomous, 1 interactive, 1 review) Dependencies: #4 depends on #1 Process a specific task with `/smith-queue process <filename>`, or run all with `/smith-queue process --all`. -
If empty: "Queue is empty. Use
/smith-queue add \"<description>\"to add a task."
status
Display all queue items grouped by status.
-
Read all files in
.smith/vault/queue/(includinghistory/) -
Group by status and display:
## Queue Status ### In Progress - <task> (started <time>) ### Blocked - <task> — blocked by: <dependency filename> (status: failed) ### Scheduled - <task> — scheduled for <datetime> ### Pending (by priority) - 🔴 <task> - 🟡 <task> ### Recently Completed (last 5) - <task> — completed <date> ### Recently Failed (last 5) - <task> — failed <date>: <error summary>
process [] [--all] [--next] [--dry-run] [--limit N] [--priority ] [--project ] [--all-projects] [--model ] [--abort]
The primary command for running queued tasks. Supports interactive selection, specific file processing, and batch execution.
process (no arguments) — Interactive Picker
- Scan
.smith/vault/queue/for all processable tasks:complexity: autonomous,status: pendingorstatus: queued - Sort by priority (critical → high → medium → low), then oldest first
- Skip items with unmet dependencies
- Display the list numbered:
## Pending Autonomous Tasks | # | Priority | Task | Branch | File | |---|----------|------|--------|------| | 1 | 🟡 medium | Trends Article Explorer Tab | 057-trends-article-explorer | 057-trends-article-explorer.md | Which task would you like to process? Enter a number, or "all" to process everything. - Wait for user to select a number. Then process that single task (see execution steps below).
- If user says "all", behave as
process --all.
process <filename> — Specific Task
Process a specific queue entry by filename. Accepts full filename or partial match.
process --next — Next Highest Priority
Process only the single highest-priority autonomous pending task, then stop. No prompt — just picks the top item and runs it.
process --all — All Pending Tasks
Process all autonomous + pending tasks sequentially in priority order. This is the batch execution mode.
Accepts all batch flags:
--dry-run— show what would be processed without executing--limit <N>— process only the first N items after ordering--priority <level>— process only items at or above the given priority (--priority high= critical + high only)--project <name>— process queue for a specific project (from~/.smith/projects.json)--all-projects— process across all registered projects, most recently active first--model <model>— override model for processing. Default:sonnet. Options:haiku,sonnet,opus--abort— if processing is running, create.smith/vault/queue/.abort-batchflag. Current task finishes; remaining return topending.
Full Pipeline Steps (per task)
These steps apply whether processing a single task or batch. The queue entry is only marked completed after the PR is merged. If any step fails, the entry is marked failed with error details and the branch is left intact for manual review.
- Read the queue file, parse frontmatter
- Validate: Cannot process if status is
completed,in-progress, orblocked. Treatstatus: queuedasstatus: pending. - Check dependencies: If
depends_onhas entries, verify all arecompleted. If any are not, show which are blocking and abort. - Update frontmatter:
status: in-progress - Append status history:
- [YYYY-MM-DD HH:MM] In Progress — processing started - Create a git worktree from the queue entry's
branchfield:
Do NOT checkout the branch in the main working directory — the worktree is an isolated copy.git worktree add /tmp/smith-queue-<slug> <branch> - Run
/smith-buildwithin the worktree directory, usingspec_pathfrom the queue entry frontmatter to locate spec artifacts. This handles task generation, implementation, and initial testing. - Rebuild affected Docker services. Identify which services were modified (diff against the configured base branch):
For each affected service:git diff "$(.specify/scripts/bash/get-base-branch.sh)" --name-only | grep '^services/' | cut -d'/' -f2 | sort -udocker compose up -d --build <service-name>. Wait for healthy status. If Docker build fails: markfailed, STOP. - Run final tests to verify the build is healthy:
- Frontend changed →
cd services/command-center && pnpm test - Python service changed →
cd services/<service> && poetry run pytest - Playwright tests for changed components if applicable
If tests fail: mark
failed, STOP.
- Frontend changed →
- Push the branch if not already pushed:
git push -u origin <branch> - Create PR via
gh pr create --base "$(.specify/scripts/bash/get-base-branch.sh)"(the actual PR creation is performed by/smith-build, which already targets the configured base branch; if creating it here directly, pass--baseexplicitly). If fails: markfailed, STOP. - Merge PR via
gh pr merge <number> --squash --delete-branch. If fails (conflicts, checks): markfailed, leave PR open, STOP. - Return to the base branch:
BASE_BRANCH=$(.specify/scripts/bash/get-base-branch.sh); git checkout "$BASE_BRANCH" && git pull origin "$BASE_BRANCH" - Update system specs, CHANGELOG.md, STATUS.md:
- Read
primary_systemandalso_affectsfrom queue entry - Update
.specify/systems/<system>/spec.mdwith dated implementation history - Update CHANGELOG.md and STATUS.md
- Commit and push spec updates to the base branch
- Read
- Mark completed and archive:
- Update frontmatter:
status: completed - Append:
- [YYYY-MM-DD HH:MM] Completed — PR #<number> merged, specs updated - Add
## Resultsection with PR link, files changed, services rebuilt, test results - Move file to
.smith/vault/queue/history/ - Log results to vault session log
- Update frontmatter:
- Clean up worktree:
git worktree remove /tmp/smith-queue-<slug>
Failure Handling
If ANY step 8-12 fails:
- Update frontmatter:
status: failed - Append:
- [YYYY-MM-DD HH:MM] Failed — <step name>: <error summary> - Move file to
.smith/vault/queue/history/ - Check dependents → mark as
blocked - Do NOT remove worktree — leave for debugging
- Do NOT continue to subsequent steps
- Log failure to vault session log
Batch Progress (for --all mode)
During batch processing, write a live progress file at .smith/vault/queue/.batch-progress.md:
# Processing Progress — YYYY-MM-DD HH:MM
| # | Task | Priority | Status | Duration |
|---|------|----------|--------|----------|
| 1 | Fix auth | critical | completed | 4m 32s |
| 2 | Add filters | medium | in-progress | 2m 15s... |
| 3 | Update docs | low | pending | — |
**Started:** HH:MM:SS
**Completed:** 1 of 3
**Failed:** 0
After processing completes, move progress file to .smith/vault/queue/history/batch-YYYY-MM-DD_HHMMSS.md.
remove <filename>
Remove a task from the queue.
- Check file exists in
.smith/vault/queue/ - Validate: Cannot remove
in-progressitems. Warn if removing a task that others depend on. - Show task description and ask: "Remove task:
<description>? [y/n]" - If confirmed, delete the file
prioritize
Interactive reordering of pending items.
- List all pending items in current priority order (numbered)
- Ask: "Which item number would you like to reprioritize?"
- After selection, ask: "New priority for
<task>? (critical/high/medium/low)" - Update the item's
priorityfield in frontmatter - Append status history:
- [YYYY-MM-DD HH:MM] Edited — priority changed from <old> to <new> - Show the reordered list
schedule <filename> --at "<datetime>"
Schedule a task for future processing.
- Read the queue file
- Validate: Must be
pendingorscheduledstatus - Parse
--atvalue:- ISO datetime:
2026-04-07T02:00:00 tonight→ next occurrence of 02:00 local timeoff-peak→ same astonighttomorrow→ next day at 02:00 local time
- ISO datetime:
- Update frontmatter:
status: scheduled,scheduled_for: "<ISO datetime>" - Append:
- [YYYY-MM-DD HH:MM] Scheduled — processing at <datetime>
schedule-batch --at "<datetime>"
Schedule all autonomous + pending tasks for batch processing.
- Find all queue items with
complexity: autonomousandstatus: pending - Parse
--atvalue (same rules as above) - Update each item:
status: scheduled,scheduled_for: "<datetime>" - Append status history to each
- Show count: "Scheduled N tasks for "
unschedule <filename>
Remove schedule from a task.
- Read the queue file
- Validate: Must be
scheduledstatus - Update frontmatter:
status: pending,scheduled_for: "" - Append:
- [YYYY-MM-DD HH:MM] Unscheduled — returned to pending
edit <filename>
Modify task properties.
- Read the queue file
- Validate: Cannot edit
in-progressorcompleteditems - Present current properties: task description, priority, complexity, dependencies
- Ask what to change (allow multiple changes at once)
- Update frontmatter fields
- Append:
- [YYYY-MM-DD HH:MM] Edited — <list of changes> - If editing a
scheduleditem, preserve the schedule unless explicitly changed
promote <filename>
Shorthand to change complexity from autonomous → interactive.
- Read file, validate not
in-progress/completed - Update
complexity: interactive - Append:
- [YYYY-MM-DD HH:MM] Promoted — complexity changed from autonomous to interactive
demote <filename>
Shorthand to change complexity from interactive → autonomous.
- Read file, validate not
in-progress/completed - Update
complexity: autonomous - Append:
- [YYYY-MM-DD HH:MM] Demoted — complexity changed from interactive to autonomous
requeue <filename>
Reset a failed task back to pending.
- Read file from
.smith/vault/queue/history/(failed items are archived) - Validate: Must be
failedstatus - Update:
status: pending - Append:
- [YYYY-MM-DD HH:MM] Requeued — reset to pending for retry - Move file back from
history/to.smith/vault/queue/
history [] [--status completed|failed] [--since ""]
Browse completed and failed task archives.
No arguments — list all items in .smith/vault/queue/history/ sorted by completion date (most recent first):
## Queue History
| # | Task | Status | Priority | Completed | File |
|---|------|--------|----------|-----------|------|
| 1 | Add email filters | ✅ completed | medium | 04-05 14:30 | ... |
| 2 | Fix auth bypass | ❌ failed | critical | 04-05 12:00 | ... |
Total: 2 archived (1 completed, 1 failed)
With filename — show full contents of a specific history entry including all status history.
With --status — filter to completed or failed only.
With --since — filter to items completed/failed after a date. Supports:
- ISO date:
2026-04-01 - Natural language:
last week,this month,yesterday
history clear --before "<date>"
Remove history entries older than a date. Requires user confirmation:
- Count matching entries
- Ask: "Delete N history entries from before ? This cannot be undone. [y/n]"
- If confirmed, delete the files
batch [flags]
Alias for /smith-queue process --all. All flags accepted (--dry-run, --limit, --priority, --project, --all-projects, --model, --abort). See process --all above for full documentation.
Batch execution per task
Each task runs through the Full Pipeline Steps defined above (steps 1-16: implementation → Docker rebuild → tests → PR → merge → spec updates → archive).
Between tasks, check for the .abort-batch flag — if present, stop and return remaining tasks to pending.
Update the batch progress file after each task completes or fails. 10. Update progress file
scheduler install|uninstall|status|logs|set-time
Manage the macOS launchd scheduler for automatic daily queue processing.
The scheduler is optional. Users who prefer manual processing can use /smith-queue batch directly.
-
scheduler install— copies~/.smith/scheduler/com.smith.scheduler.plistto~/Library/LaunchAgents/and loads it withlaunchctl load. Creates~/.smith/scheduler/and the plist if they don't exist. The scheduler runs daily at 2:00 AM local time, processing all autonomous pending tasks across all registered projects. -
scheduler uninstall— runslaunchctl unloadand removes the plist from~/Library/LaunchAgents/. -
scheduler status— checks if the scheduler is loaded (launchctl list | grep com.smith.scheduler), shows the configured run time, and displays last 10 lines of~/.smith/scheduler/scheduler.log. -
scheduler logs— tails~/.smith/scheduler/scheduler.log(last 50 lines). -
scheduler set-time <HH:MM>— updates the daily run time. Parses the hour and minute from the argument, updates~/.smith/scheduler/com.smith.scheduler.plist(replaces theStartCalendarIntervalHour and Minute values), then reloads the agent if installed:- Parse
<HH:MM>(e.g.,03:30,23:00,00:15) - Update the plist file using
sedorpython3to replace the Hour integer and Minute integer - If the plist is loaded in launchd (
launchctl list | grep com.smith.scheduler), runlaunchctl unloadthenlaunchctl loadto pick up the new time - Confirm: "Scheduler updated to run daily at HH:MM. Next run: ."
- Parse
The scheduler script (~/.smith/scheduler/smith-scheduler.sh) is a thin launcher that delegates to this skill. It:
- Reads
~/.smith/projects.jsonto find all project vaults - Scans each project's
.smith/vault/queue/forautonomoustasks withstatus: pendingorstatus: scheduled(skips items scheduled for a future date beyond today) - Sorts tasks by priority (critical → high → medium → low), then by creation date
- Checks dependency chains — skips tasks whose dependencies aren't completed
- For each processable task: invokes this skill via
claude -p "/smith-queue process <filename>"and lets the skill own the pipeline (status updates, worktree, tests, PR, merge, spec updates, history archival) - Captures the skill's exit code and verifies outcome by checking whether the queue entry was moved to
history/(the skill is responsible for that move; the scheduler does NOT mutate queue files itself) - Logs all activity to
~/.smith/scheduler/scheduler.log
Scheduler invocation contract
When the scheduler dispatches a queued task, the exact invocation is:
"$CLAUDE_BIN" --model "$CLAUDE_MODEL" --permission-mode bypassPermissions \
-p "/smith-queue process <filename>"
Run from the project root directory (so .smith/vault/queue/<filename> resolves). CLAUDE_BIN is resolved in the scheduler via (1) explicit CLAUDE_BIN env override, (2) PATH lookup, then (3) the Claude Code VM bundle under ~/Library/Application Support/Claude/claude-code-vm/<version>/claude (version read from .sdk-version).
Responsibilities are partitioned to avoid double-writes:
| Step | Owner |
|---|---|
Read ~/.smith/projects.json, iterate project vaults | scheduler |
Filter queue: complexity: autonomous, status pending/scheduled, deps met, scheduled_for ≤ today | scheduler |
| Priority-sort, dispatch order | scheduler |
Resolve claude binary, capture exit code | scheduler |
Update queue frontmatter status: in-progress and append history line | skill |
Create git worktree from the entry's branch field | skill |
Run /smith-build, Docker rebuild, tests, git push, gh pr create, gh pr merge | skill |
Update status: completed or status: failed and append history | skill |
| Update system specs, CHANGELOG.md, STATUS.md | skill |
Move queue entry to history/ | skill |
| Clean up the worktree | skill |
| Verify archival, tally dispatched/failed counters | scheduler |
Non-interactivity: when invoked as process <filename> for a task whose complexity is autonomous, the skill must not prompt for user input. Resolve any ambiguity by marking the task failed with a descriptive status-history entry rather than blocking on a question.
Never let the scheduler reimplement pipeline steps. The pipeline lives here in SKILL.md; if scheduler logic starts doing sed 's/status: pending/status: in-progress/' or mv ... history/, that's a regression — it's the exact class of bug that caused the 2026-04-23 silent-completion incident (scheduler pre-mutated state, then claude: command not found prevented any real work, but the script still moved entries to history/).
No Arguments
If invoked with no arguments, show usage:
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 52
- Forks
- 8
- Last commit
- Jul 2026
Advanced
- Catalog kind
- skill
- Gateway key
smith-queue- Source
- github.com/attckdigital/smith