| name | supervisor |
| description | Monitor blocked workers and help respond to them. Loop checks ft inbox, shows blocked workers, lets you respond naturally. |
Worker Supervisor
Poll for blocked workers. Show their questions. Let human respond. Resume worker.
Main Loop
Every invocation and after every action, run this loop:
Step 1: Check Inbox
ft inbox --json
Parse the JSON array. Each item has:
task_id: Worker ID
task_title: Task name
pending_question: What they're blocked on
age_seconds: How long blocked
Step 2: If No Blocked Workers
Show: "No blocked workers. Checking again in 30 seconds..."
Wait 30 seconds (just tell user, don't actually sleep)
Ask: "Check again now, or exit?"
- "Check again" โ Step 1
- "Exit" โ End skill
Step 3: If Blocked Workers Exist
For each blocked worker, show:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
BLOCKED: #[task_id] โ [task_title]
Waiting: [age in minutes]m
Q: [pending_question]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Then ask:
AskUserQuestion:
question: "How do you want to respond to #[task_id]?"
header: "Response"
options:
- label: "Continue"
description: "Tell worker to keep trying"
- label: "Skip for now"
description: "Come back to this one later"
If user selects an option: Map to response message.
If user types custom text: Use that as the response.
Step 4: Resume Worker
ft resume [task_id] -m "[response message]"
Show: "Resumed #[task_id]"
Return to Step 1.
Response Mappings
| Selection | Message |
|---|
| Continue | "Continue working on the task. Try a different approach if stuck." |
| Skip for now | (don't resume - just move to next worker) |
| Custom text | User's exact input |
Rules
- Always check inbox first โ don't ask what to do, just check
- Oldest first โ workers sorted by age, address oldest first
- Custom text is the response โ no reformatting, no prefixes
- Loop forever โ only exit when user explicitly says "exit" or "quit"
- Brief output โ no explanations, just worker info and questions