Progress Monitoring Skill
Overview
This skill defines how the Orchestrator (EOA) monitors agent progress. Monitoring is based on state transitions and response order - not fixed time intervals. Agents collaborate asynchronously and may be hibernated for extended periods. The orchestrator tracks agent states (Acknowledged, Active, No Progress, Stale, Unresponsive, Blocked, Complete) and escalates through ordered steps when issues are detected.
Prerequisites
- •Read AGENT_OPERATIONS.md for orchestrator workflow
- •Read eoa-label-taxonomy for status labels and workflow states
- •Read eoa-messaging-templates for message formats and escalation templates
- •Access to AI Maestro API for agent message history
- •Access to GitHub CLI for issue status queries
- •Understanding of agent lifecycle and state transitions
1. Agent States
Monitor agents based on their current state:
| State | Definition | Action |
|---|---|---|
| Acknowledged | Agent sent ACK for assigned task | Normal monitoring |
| No ACK | Task assigned but no acknowledgment received | Send reminder |
| Active | Agent sending progress updates | Continue monitoring |
| No Progress | Agent acknowledged but no updates since | Send status request |
| Stale | Agent's last update predates significant events | Escalate priority |
| Unresponsive | Multiple reminders without any response | Consider reassignment |
| Blocked | Agent reported blocker | Address blocker |
| Complete | Agent reported task done | Verify and close |
2. State Detection
2.1 Check Agent State
# Get agent's last message timestamp from AI Maestro curl -s "$AIMAESTRO_API/api/messages?agent=$AGENT_NAME&action=list" | jq '.messages[0].timestamp' # Get task assignment event gh issue view $ISSUE --json timelineItems | jq '.timelineItems[] | select(.label == "assign:$AGENT_NAME")'
2.2 State Transitions
Assigned → (ACK received) → Acknowledged Acknowledged → (progress update) → Active Acknowledged → (no updates) → No Progress Active → (no updates after activity) → Stale No Progress/Stale → (reminder sent, no response) → Unresponsive Any → (blocker reported) → Blocked Active → (completion reported) → Complete
3. Escalation Order
Escalation follows a strict order, not time-based triggers:
| Step | Trigger State | Action | Priority |
|---|---|---|---|
| 1 | No ACK | Send first reminder | Normal |
| 2 | Still No ACK after Step 1 | Send urgent reminder | High |
| 3 | Unresponsive after Step 2 | Notify user, consider reassignment | Urgent |
3.1 First Reminder
When state = No ACK or No Progress:
{
"from": "orchestrator",
"to": "<agent-name>",
"subject": "Status Request: <task-id>",
"priority": "normal",
"content": {
"type": "request",
"message": "What is your current status on <task-id>? Report progress, blockers, and next steps.",
"data": {
"task_id": "<task-id>"
}
}
}
3.2 Urgent Reminder
When state = Unresponsive (no response to first reminder):
{
"from": "orchestrator",
"to": "<agent-name>",
"subject": "URGENT: <task-id> - Response Required",
"priority": "urgent",
"content": {
"type": "escalation",
"message": "No response received. Please provide status immediately or task may be reassigned.",
"data": {
"task_id": "<task-id>",
"escalation_level": 2
}
}
}
3.3 Reassignment Decision
When still unresponsive after urgent reminder:
- •Check if user is available → Present options (wait, reassign, abort)
- •If user unavailable → Auto-reassign to available agent
- •Notify original agent of reassignment
- •Transfer all context to new agent
4. Progress Report Format
Agents should report progress using this format:
4.1 Status Update
[IN_PROGRESS] <task-id> - <brief-description> Progress: <percentage or milestone> Next: <next-step> Blockers: <none or blocker-list>
4.2 Completion Report
[DONE] <task-id> - <result-summary> Output: <file-path or PR-number> Tests: <passed/failed>
4.3 Blocker Report
[BLOCKED] <task-id> - <blocker-description> Waiting on: <dependency or resource> Impact: <what cannot proceed> Suggested resolution: <if any>
5. Blocker Handling
When agent reports [BLOCKED]:
| Blocker Type | Resolution |
|---|---|
| Dependency on another task | Check blocking task status, expedite if possible |
| Missing information | Route to appropriate source (user, architect, etc.) |
| Technical issue | Escalate to ECOS or user |
| Resource contention | Coordinate with other agents |
5.1 Update Labels
# Mark task as blocked gh issue edit $ISSUE --remove-label "status:in-progress" --add-label "status:blocked" # Add blocker details as comment gh issue comment $ISSUE --body "BLOCKED: <blocker-description>"
5.2 When Blocker Resolved
# Mark task as in-progress again gh issue edit $ISSUE --remove-label "status:blocked" --add-label "status:in-progress" # Notify agent # (send message via AI Maestro)
6. Completion Verification
When agent reports [DONE]:
6.1 Verification Checklist
Copy this checklist and track your progress:
- • PR exists and is linked to issue
- • Tests pass (CI status)
- • Code review approved (if required)
- • Documentation updated (if required)
- • Issue checklist items complete
6.2 If Verification Passes
# Update status gh issue edit $ISSUE --remove-label "status:in-progress" --add-label "status:done" # Remove assignment (task complete) gh issue edit $ISSUE --remove-label "assign:$AGENT_NAME" # Close issue if all criteria met gh issue close $ISSUE
6.3 If Verification Fails
Send clarification request to agent:
{
"type": "request",
"message": "Completion verification failed. Missing: <list>. Please address and report again."
}
7. Dashboard View
Track all active tasks:
| Task | Agent | State | Last Update | Priority |
|---|---|---|---|---|
| #42 | impl-01 | Active | Recent | High |
| #43 | impl-02 | No Progress | Stale | Normal |
| #44 | reviewer | Blocked | Recent | High |
Query active tasks:
# All in-progress tasks gh issue list --label "status:in-progress" --json number,title,labels # Blocked tasks gh issue list --label "status:blocked" --json number,title,labels # Tasks by agent gh issue list --label "assign:impl-01" --json number,title,labels
Instructions
Follow these steps to monitor agent progress:
- •Query all issues with
status:in-progresslabel - •For each assigned task:
- •Determine current agent state (section 1)
- •Check AI Maestro for agent's last message timestamp
- •Compare task assignment time vs. last agent update
- •If state is "No ACK", send first reminder (section 3.1)
- •If state is "No Progress" or "Stale", send status request
- •If state is "Unresponsive" after reminders, send urgent escalation (section 3.2)
- •If state is "Blocked", handle blocker (section 5)
- •If state is "Complete", verify completion (section 6)
- •Update issue labels to reflect current state
- •Log all state transitions and escalations
- •Reassign tasks only after full escalation order (section 3.3)
Output
| Output Type | Format | Example |
|---|---|---|
| Agent state report | Markdown table | Task #42, impl-01, Active, last update 2h ago |
| Escalation message | AI Maestro JSON | Reminder or urgent message sent to agent |
| Dashboard view | Markdown table | All in-progress tasks with states |
| Blocker report | Issue comment | "BLOCKED: Waiting on API design approval" |
| Completion verification | Boolean + checklist | PR exists ✓, tests pass ✓, docs updated ✓ |
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Agent never ACKs | Agent offline, hibernated, or unaware | Send reminder, escalate to ECOS if no response |
| Agent stops responding mid-task | Agent crashed, hibernated, or blocked | Follow escalation order (sections 3.1-3.3) |
| Blocker reported but not resolved | Dependency on external event | Coordinate with other agents or escalate to user |
| Completion reported but verification fails | Missing tests, failing CI, or incomplete requirements | Send REVISE message (see eoa-implementer-interview-protocol) |
| Multiple agents updating same task | Concurrent work or reassignment conflict | Check assign:* label, coordinate via AI Maestro |
| Stale state but agent actually hibernated | Normal hibernation, not a failure | Distinguish hibernation from unresponsiveness via ECOS |
Examples
Example 1: Query Agent State via AI Maestro
# Get agent's last message timestamp AGENT="implementer-1" LAST_MESSAGE=$(curl -s "$AIMAESTRO_API/api/messages?agent=$AGENT&action=list" | \ jq -r '.messages[0].timestamp') echo "Agent $AGENT last seen: $LAST_MESSAGE" # Get task assignment timestamp ISSUE=42 ASSIGNED_AT=$(gh issue view $ISSUE --json timelineItems | \ jq -r '.timelineItems[] | select(.label.name == "assign:'$AGENT'") | .createdAt') echo "Task #$ISSUE assigned at: $ASSIGNED_AT"
Example 2: Send First Reminder
# Send normal priority status request
curl -X POST "$AIMAESTRO_API/api/messages" \
-H "Content-Type: application/json" \
-d '{
"from": "orchestrator",
"to": "implementer-1",
"subject": "Status Request: #42",
"priority": "normal",
"content": {
"type": "request",
"message": "What is your current status on #42? Report progress, blockers, and next steps.",
"data": {
"task_id": "42"
}
}
}'
Example 3: Escalate to Urgent
# After no response to first reminder
curl -X POST "$AIMAESTRO_API/api/messages" \
-H "Content-Type: application/json" \
-d '{
"from": "orchestrator",
"to": "implementer-1",
"subject": "URGENT: #42 - Response Required",
"priority": "urgent",
"content": {
"type": "escalation",
"message": "No response received. Please provide status immediately or task may be reassigned.",
"data": {
"task_id": "42",
"escalation_level": 2
}
}
}'
Example 4: Handle Blocker Report
ISSUE=42 # Agent reports blocker via message # Update issue labels gh issue edit $ISSUE --remove-label "status:in-progress" --add-label "status:blocked" # Add blocker comment to issue gh issue comment $ISSUE --body "BLOCKED: Waiting on API endpoint design approval. Cannot proceed until #38 is resolved." # Query the blocking issue BLOCKER_STATUS=$(gh issue view 38 --json state,labels | jq -r '.state') echo "Blocking issue #38 status: $BLOCKER_STATUS" # If blocker is resolved, notify agent if [ "$BLOCKER_STATUS" = "closed" ]; then gh issue edit $ISSUE --remove-label "status:blocked" --add-label "status:in-progress" # Send message to agent fi
Example 5: Verify Completion
ISSUE=42
# Check PR existence
PR_NUMBER=$(gh issue view $ISSUE --json body | jq -r '.body | match("PR #([0-9]+)") | .captures[0].string')
if [ -z "$PR_NUMBER" ]; then
echo "VERIFICATION FAILED: No PR linked"
else
# Check CI status
CI_STATUS=$(gh pr view $PR_NUMBER --json statusCheckRollup | jq -r '.statusCheckRollup[] | select(.conclusion) | .conclusion')
if [ "$CI_STATUS" = "SUCCESS" ]; then
echo "VERIFICATION PASSED: PR #$PR_NUMBER exists and CI passed"
# Update to done
gh issue edit $ISSUE --remove-label "status:in-progress" --add-label "status:done"
gh issue edit $ISSUE --remove-label "assign:implementer-1"
else
echo "VERIFICATION FAILED: CI status is $CI_STATUS"
fi
fi
Resources
- •AGENT_OPERATIONS.md - Core orchestrator workflow
- •eoa-label-taxonomy - Status labels and workflow states
- •eoa-messaging-templates - Escalation message templates
- •eoa-task-distribution - Assignment protocol and agent states
- •eoa-implementer-interview-protocol - Post-task verification protocol