Skip to content

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)

bash
# 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=haiku

2. Konfiguracja per-task (task.json)

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)

bash
# Uruchamiane przez Dagu co 1 minutę
bash $DAGS_DIR/scripts/task_status_monitor.sh

Proces:

markdown
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.json

2. Zbieranie kontekstu dla AI

Monitor zbiera:

bash
# 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):

bash
echo "$STATUS_CONTEXT" | claude --model haiku /status_update

Przykł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 color

4. Wysyłanie webhook (send_webhook.sh)

bash
bash "$DAGS_DIR/scripts/send_webhook.sh" "task_status_update" "$WEBHOOK_PAYLOAD"

Payload:

json
{
  "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

bash
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.json

task.json po aktualizacji:

json
{
  "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

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:

bash
# Automatyczne (przez Dagu scheduler)
dagu start task_status_monitor

# Ręczne (debug)
bash dags/scripts/task_status_monitor.sh

Obsł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.md

Wykrywanie aktualnego subtasku:

bash
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
done

Rezultat:

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:

json
{
  "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: 1

10: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: 0

10: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_10

Integracja z n8n

Webhook Endpoint

POST https://n8n.sembot.ovh/webhook/
Content-Type: application/json

Payload Format

json
{
  "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 channel

Mattermost 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 UTC

Konfiguracja monitoring per-task

Wyłączenie monitoringu

json
{
  "monitoring": {
    "status_update_interval_minutes": null Task pomijany
  }
}

lub brak sekcji monitoring → task pomijany

Niestandardowy interwał

json
{
  "monitoring": {
    "status_update_interval_minutes": 15,   Co 15 minut
    "status_ai_provider": "claude",
    "status_ai_model": "sonnet" Lepszy model (droższy)
  }
}

Mock provider (testing)

json
{
  "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_10

Monitoring Statistics

Monitor wyświetla statystyki na końcu każdego uruchomienia:

📊 Status Monitor Summary:
   Tasks scanned: 3
   Updates sent: 1

Przykł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: 1

Troubleshooting

Problem: Webhook nie działa

Symptom:

❌ Webhook failed after 3 attempts (HTTP 000)

Rozwiązanie:

  1. Sprawdź N8N_WEBHOOK_URL w .env
  2. Zweryfikuj dostępność webhook (curl test)
  3. Sprawdź logi n8n

Problem: AI nie generuje summary

Symptom:

⚠️  Failed to generate AI summary (using fallback)

Rozwiązanie:

  1. Sprawdź czy claude CLI jest zainstalowany
  2. Sprawdź autoryzację: CLAUDE_CODE_OAUTH_TOKEN
  3. 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:

  1. Sprawdź uprawnienia do task.json (write)
  2. Sprawdź logi: jq command errors
  3. Ręcznie popraw task.json

Problem: Monitoring wysyła za często

Symptom:

✅ Status update sent for DEV-1_10 (every minute)

Rozwiązanie:

  1. Zwiększ status_update_interval_minutes w task.json
  2. Sprawdź czy last_status_update jest poprawnie zapisywane

Best Practices

1. Dobór interwału

Krótkie taski (< 30 min):

json
"status_update_interval_minutes": 5

Średnie taski (30 min - 2h):

json
"status_update_interval_minutes": 10

Długie taski (> 2h):

json
"status_update_interval_minutes": 15

2. Wybór modelu AI

Haiku (szybki, tani):

json
"status_ai_model": "haiku"  ← Domyślnie

Sonnet (dokładniejszy, droższy):

json
"status_ai_model": "sonnet"  ← Jeśli potrzebujesz lepszych opisów

3. Optymalizacja kosztów

  • Używaj haiku dla 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:

bash
# Z environment loaded
source .dagu/.env
bash dags/scripts/task_status_monitor.sh

Test webhook:

bash
bash dags/scripts/send_webhook.sh "test" '{"message":"test"}'

Mock AI (bez Claude):

json
{
  "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.