Monitorowanie Statusu Tasków
Przegląd
System Task Status Monitoring automatycznie monitoruje taski w statusie in_progress i wysyła okresowe aktualizacje statusu na webhook n8n. Pozwala na śledzenie postępu pracy nad taskami w czasie rzeczywistym.
┌─────────────────────────────────────────────────────────┐
│ Dagu Flow (co 1 minutę) │
│ task_status_monitor.yaml │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ Script: task_status_monitor.sh │
│ - Skanuje tasks/in_progress/ │
│ - Sprawdza monitoring config w task.json │
│ - Zbiera kontekst (logs, subtaski) │
│ - Generuje AI summary (Claude Haiku) │
│ - Wysyła na n8n webhook │
│ - Aktualizuje last_status_update │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ n8n Webhook (N8N_WEBHOOK_URL) │
│ Otrzymuje: task_id, title, message, current_work │
└─────────────────────────────────────────────────────────┘Kiedy się uruchamia?
Dagu Scheduler: Co 1 minutę (*/1 * * * *) Wysłanie update: Gdy status_update_interval_minutes minęło od last_status_update
Przykład timingu:
10:00 - Task przechodzi do in_progress
10:01 - Monitor wykrywa task (last_status_update = null)
10:01 - WYSYŁA pierwszy status update
10:02 - Monitor pomija (tylko 1 min minęła)
10:03 - Monitor pomija (tylko 2 min minęły)
10:04 - Monitor pomija (tylko 3 min minęły)
10:05 - Monitor pomija (tylko 4 min minęły)
10:06 - WYSYŁA drugi status update (5+ min minęło)Konfiguracja
1. Konfiguracja globalna (.env)
# n8n Webhook URL dla notyfikacji
N8N_WEBHOOK_URL=https://n8n.sembot.ovh/webhook/
# Domyślne ustawienia (nadpisywane przez task.json)
STATUS_UPDATE_INTERVAL_MINUTES=5
STATUS_AI_PROVIDER=claude
STATUS_AI_MODEL=haiku2. Konfiguracja per-task (task.json)
{
"task_id": "DEV-1_10",
"status": "in_progress",
"monitoring": {
"status_update_interval_minutes": 5,
"status_ai_provider": "claude",
"status_ai_model": "haiku",
"last_status_update": "2026-01-06T10:06:00Z"
}
}Pola konfiguracji:
status_update_interval_minutes(WYMAGANE)- Interwał między aktualizacjami w minutach
- Jeśli brak → task jest pomijany
- Przykład:
5= status update co 5 minut
status_ai_provider(opcjonalne, fallback:ai.provider)- Provider AI do generowania podsumowania
- Obsługiwane:
claude,mock - Przykład:
"claude"
status_ai_model(opcjonalne, fallback:"haiku")- Model AI do użycia
- Przykład:
"haiku","sonnet"
last_status_update(automatyczne)- Timestamp ostatniej aktualizacji (ISO 8601)
- Aktualizowane automatycznie przez monitor
null= nigdy nie wysłano aktualizacji
Przepływ monitorowania
1. Skanowanie tasków (task_status_monitor.sh)
# Uruchamiane przez Dagu co 1 minutę
bash $DAGS_DIR/scripts/task_status_monitor.shProces:
FOR każdy task w tasks/in_progress/:
1. READ task.json
2. CHECK monitoring.status_update_interval_minutes
- Jeśli brak → SKIP (monitoring wyłączony)
3. CHECK monitoring.last_status_update
- Jeśli null → WYSYŁAJ (pierwsza aktualizacja)
- Jeśli < interval → SKIP (za wcześnie)
- Jeśli >= interval → WYSYŁAJ (czas na update)
4. GENERUJ status summary przez AI
5. WYSYŁAJ webhook
6. AKTUALIZUJ last_status_update w task.json2. Zbieranie kontekstu dla AI
Monitor zbiera:
# Podstawowe informacje
TASK_TITLE=$(jq -r '.title' task.json)
WORKER_TYPE=$(jq -r '.worker.type' task.json)
STARTED_AT=$(jq -r '.started_at' task.json)
# Aktualny subtask (jeśli team mode)
CURRENT_SUBTASK=$(find subtasks/*/in_progress/ -name "*.md")
# Ostatnie logi (30 linii)
RECENT_LOGS=$(tail -n 50 artifacts/logs/*.log | head -n 30)Kontekst dla AI:
Task: Kolor paska pod navbar (ID: DEV-1_10)
Worker Type: sembot_frontend
Started: 2026-01-06T10:00:00Z
Current Work: P0: dev_a1b2c3d4 - Change SCSS color
Recent Activity (last 30 lines of logs):
[2026-01-06 10:05] Building Angular project...
[2026-01-06 10:05] Compiling SCSS files...
[2026-01-06 10:05] ✓ SCSS compiled successfully
[2026-01-06 10:06] Running tests...
---
Using /status_update command, generate a concise status update (2-3 sentences) suitable for Mattermost notification.3. Generowanie AI Summary
Claude (przez Claude Code CLI):
echo "$STATUS_CONTEXT" | claude --model haiku /status_updatePrzykład wygenerowanego summary:
Currently changing admin bar color from red to dark blue (#1a3a5c).
SCSS compilation completed successfully, running build verification tests.Fallback (jeśli AI nie działa):
Currently working on: P0: dev_a1b2c3d4 - Change SCSS color4. Wysyłanie webhook (send_webhook.sh)
bash "$DAGS_DIR/scripts/send_webhook.sh" "task_status_update" "$WEBHOOK_PAYLOAD"Payload:
{
"event_type": "task_status_update",
"timestamp": "2026-01-06T10:06:00Z",
"task_id": "DEV-1_10",
"title": "Kolor paska pod navbar",
"status": "in_progress",
"current_work": "P0: dev_a1b2c3d4 - Change SCSS color",
"message": "Currently changing admin bar color from red to dark blue (#1a3a5c). SCSS compilation completed successfully, running build verification tests.",
"worker_type": "sembot_frontend"
}Retry logic:
- Max 3 próby
- Timeout 2s między próbami
- Success: HTTP 200, 201, 204
5. Aktualizacja last_status_update
CURRENT_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
jq --arg ts "$CURRENT_TIMESTAMP" \
'.monitoring.last_status_update = $ts' \
task.json > task.json.tmp
mv task.json.tmp task.jsontask.json po aktualizacji:
{
"monitoring": {
"status_update_interval_minutes": 5,
"status_ai_provider": "claude",
"status_ai_model": "haiku",
"last_status_update": "2026-01-06T10:06:00Z" ← ZAKTUALIZOWANE
}
}Dagu Flow Configuration
task_status_monitor.yaml
name: "task_status_monitor"
description: "Monitors in_progress tasks and sends AI-generated status updates to n8n webhook"
schedule: "*/1 * * * *" # Co 1 minutę
steps:
- name: monitor_task_status
command: |
# Load environment
ENV_FILE="$DAGU_HOME/.env"
export $(grep -v '^#' "$ENV_FILE" | grep -v '^$' | xargs)
# Execute monitoring script
bash "$DAGS_DIR/scripts/task_status_monitor.sh"Uruchomienie:
# Automatyczne (przez Dagu scheduler)
dagu start task_status_monitor
# Ręczne (debug)
bash dags/scripts/task_status_monitor.shObsługa subtasków (Team Mode)
Monitor rozpoznaje aktualny subtask w Team mode:
Struktura subtasków:
tasks/in_progress/DEV-1_10/
subtasks/
START/
done/
init_a1b2c3d4.md
P0/
in_progress/
dev_b2c3d4e5.md ← AKTUALNY SUBTASK
done/
dev_a1b2c3d4.md
P1/
todo/
dev_c3d4e5f6.mdWykrywanie aktualnego subtasku:
for PRIORITY in START P0 P1 P2 P3 END; do
PRIORITY_IN_PROGRESS="subtasks/$PRIORITY/in_progress"
if [ -d "$PRIORITY_IN_PROGRESS" ]; then
for SUBTASK_DIR in "$PRIORITY_IN_PROGRESS"/*; do
SUBTASK_ID=$(basename "$SUBTASK_DIR")
SUBTASK_TITLE=$(jq -r '.title' "$SUBTASK_DIR/task.json")
CURRENT_SUBTASK="$PRIORITY: $SUBTASK_ID - $SUBTASK_TITLE"
break 2 # Znaleziono pierwszy in_progress subtask
done
fi
doneRezultat:
CURRENT_SUBTASK="P0: dev_b2c3d4e5 - Change SCSS color"Przykład: Pełny cykl monitorowania
Scenariusz: Task DEV-1_10 w Team Mode
10:00 - Task rozpoczęty:
{
"task_id": "DEV-1_10",
"status": "in_progress",
"started_at": "2026-01-06T10:00:00Z",
"monitoring": {
"status_update_interval_minutes": 5,
"status_ai_provider": "claude",
"status_ai_model": "haiku",
"last_status_update": null
}
}10:01 - Pierwszy status update:
🔍 Task Status Monitor - checking for tasks requiring status updates
📝 DEV-1_10 - First status update (interval: 5min, AI: claude/haiku)
🤖 Generating status update for DEV-1_10...
Context:
Task: Kolor paska pod navbar
Worker: sembot_frontend
Current Work: P0: dev_a1b2c3d4 - Change SCSS color
Recent logs: [Building project...]
Status generated:
"Starting implementation of admin bar color change from red to dark blue."
✅ Webhook sent successfully (HTTP 200): task_status_update
✅ Status update sent for DEV-1_10
📊 Status Monitor Summary:
Tasks scanned: 1
Updates sent: 110:02-10:05 - Monitoring (skip):
🔍 Task Status Monitor - checking for tasks requiring status updates
⏭️ DEV-1_10 - Only 1 minutes since last update (threshold: 5), skipping
⏭️ DEV-1_10 - Only 2 minutes since last update (threshold: 5), skipping
⏭️ DEV-1_10 - Only 3 minutes since last update (threshold: 5), skipping
⏭️ DEV-1_10 - Only 4 minutes since last update (threshold: 5), skipping
📊 Status Monitor Summary:
Tasks scanned: 1
Updates sent: 010:06 - Drugi status update:
⏰ DEV-1_10 - 5 minutes since last update (threshold: 5)
🤖 Generating status update for DEV-1_10...
Context:
Task: Kolor paska pod navbar
Worker: sembot_frontend
Current Work: P1: dev_b2c3d4e5 - Add design token
Recent logs: [SCSS compiled successfully, running tests...]
Status generated:
"Completed color change implementation. Now adding design token for maintainability."
✅ Webhook sent successfully (HTTP 200): task_status_update
✅ Status update sent for DEV-1_10Integracja z n8n
Webhook Endpoint
POST https://n8n.sembot.ovh/webhook/
Content-Type: application/jsonPayload Format
{
"event_type": "task_status_update",
"timestamp": "2026-01-06T10:06:00Z",
"task_id": "DEV-1_10",
"title": "Kolor paska pod navbar",
"status": "in_progress",
"current_work": "P1: dev_b2c3d4e5 - Add design token",
"message": "Completed color change implementation. Now adding design token for maintainability.",
"worker_type": "sembot_frontend"
}n8n Workflow (przykład)
1. Webhook Trigger
↓
2. Filter (event_type = "task_status_update")
↓
3. Format Mattermost message
↓
4. Send to Mattermost channelMattermost notification (przykład):
📊 Task Status Update
Task: DEV-1_10 - Kolor paska pod navbar
Status: in_progress
Worker: sembot_frontend
Current Work:
P1: dev_b2c3d4e5 - Add design token
Update:
Completed color change implementation. Now adding design token for maintainability.
⏰ 2026-01-06 10:06:00 UTCKonfiguracja monitoring per-task
Wyłączenie monitoringu
{
"monitoring": {
"status_update_interval_minutes": null ← Task pomijany
}
}lub brak sekcji monitoring → task pomijany
Niestandardowy interwał
{
"monitoring": {
"status_update_interval_minutes": 15, ← Co 15 minut
"status_ai_provider": "claude",
"status_ai_model": "sonnet" ← Lepszy model (droższy)
}
}Mock provider (testing)
{
"monitoring": {
"status_update_interval_minutes": 1, ← Co minutę (dla testów)
"status_ai_provider": "mock", ← Bez AI, prosty message
"status_ai_model": "mock"
}
}Mock message:
Working on P0: dev_a1b2c3d4 - Change SCSS color for task DEV-1_10Monitoring Statistics
Monitor wyświetla statystyki na końcu każdego uruchomienia:
📊 Status Monitor Summary:
Tasks scanned: 3
Updates sent: 1Przykład output (3 taski in_progress):
🔍 Task Status Monitor - checking for tasks requiring status updates
📝 DEV-1_7 - First status update (interval: 5min, AI: claude/haiku)
🤖 Generating status update for DEV-1_7...
✅ Status update sent for DEV-1_7
⏭️ DEV-1_8 - Only 2 minutes since last update (threshold: 5), skipping
⏭️ DEV-1_9 - No monitoring.status_update_interval_minutes configured, skipping
📊 Status Monitor Summary:
Tasks scanned: 3
Updates sent: 1Troubleshooting
Problem: Webhook nie działa
Symptom:
❌ Webhook failed after 3 attempts (HTTP 000)Rozwiązanie:
- Sprawdź
N8N_WEBHOOK_URLw.env - Zweryfikuj dostępność webhook (curl test)
- Sprawdź logi n8n
Problem: AI nie generuje summary
Symptom:
⚠️ Failed to generate AI summary (using fallback)Rozwiązanie:
- Sprawdź czy
claudeCLI jest zainstalowany - Sprawdź autoryzację:
CLAUDE_CODE_OAUTH_TOKEN - Użyj mock provider dla testów
Problem: last_status_update nie aktualizuje się
Symptom:
⏰ DEV-1_10 - 45 minutes since last update (threshold: 5)Rozwiązanie:
- Sprawdź uprawnienia do task.json (write)
- Sprawdź logi:
jqcommand errors - Ręcznie popraw task.json
Problem: Monitoring wysyła za często
Symptom:
✅ Status update sent for DEV-1_10 (every minute)Rozwiązanie:
- Zwiększ
status_update_interval_minutesw task.json - Sprawdź czy
last_status_updatejest poprawnie zapisywane
Best Practices
1. Dobór interwału
Krótkie taski (< 30 min):
"status_update_interval_minutes": 5Średnie taski (30 min - 2h):
"status_update_interval_minutes": 10Długie taski (> 2h):
"status_update_interval_minutes": 152. Wybór modelu AI
Haiku (szybki, tani):
"status_ai_model": "haiku" ← DomyślnieSonnet (dokładniejszy, droższy):
"status_ai_model": "sonnet" ← Jeśli potrzebujesz lepszych opisów3. Optymalizacja kosztów
- Używaj
haikudla standardowych tasków - Używaj większego interwału dla długich tasków
- Wyłącz monitoring dla tasków < 10 minut
4. Debugging
Ręczne uruchomienie:
# Z environment loaded
source .dagu/.env
bash dags/scripts/task_status_monitor.shTest webhook:
bash dags/scripts/send_webhook.sh "test" '{"message":"test"}'Mock AI (bez Claude):
{
"monitoring": {
"status_update_interval_minutes": 1,
"status_ai_provider": "mock"
}
}FAQ
Q: Co jeśli task przejdzie do done przed wysłaniem update? A: Monitor skanuje tylko in_progress, więc update nie zostanie wysłany.
Q: Czy mogę zmienić interwał w trakcie wykonania taska? A: Tak. Edytuj task.json → zmiana będzie uwzględniona w następnym cyklu.
Q: Jak wyłączyć monitoring dla konkretnego taska? A: Ustaw status_update_interval_minutes: null lub usuń pole.
Q: Czy monitoring wpływa na wydajność taska? A: Nie. Monitor tylko czyta logi i wysyła webhook. Nie blokuje wykonania taska.
Q: Jak często działa Dagu scheduler? A: Co 1 minutę. Ale update wysyłany tylko gdy interval minął.
Q: Gdzie są logi monitora? A: W Dagu UI → "task_status_monitor" flow → execution logs
Q: Co jeśli n8n webhook jest niedostępny? A: Monitor retry 3x, potem skip (task.json nie aktualizuje last_status_update).
Q: Czy mogę mieć różne interwały dla różnych tasków? A: Tak. Każdy task ma własną konfigurację monitoring w task.json.