feat(M13): worker-loop pre-flight quota-check

Drukt M13 pre-flight quota-gate op de batch-loop:

- ALLOWED_TOOLS in run-agent.sh uitgebreid met
  mcp__scrum4me__get_worker_settings + worker_heartbeat (anders mag
  Claude ze niet aanroepen ondanks dat ze geregistreerd zijn).
- CLAUDE.md operationele loop krijgt stap 0 vóór wait_for_job:
  get_worker_settings → bin/worker-quota-probe.sh →
  worker_heartbeat → sleep-tot-reset bij low quota.

Hierna draait de complete keten end-to-end: worker meet quota,
rapporteert aan server, NavBar toont stand-by-badge wanneer pct <
user.min_quota_pct.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Madhura68 2026-05-06 04:36:43 +02:00
parent 693ab50457
commit cf6969733c
2 changed files with 12 additions and 1 deletions

View file

@ -26,6 +26,17 @@ in de Scrum4Me-repo.
Wanneer je geseed wordt met *"Pak de volgende job uit de Scrum4Me-queue"*
of equivalent:
0. **Pre-flight quota-check** (M13). Vóór elke `wait_for_job`-aanroep:
1. `mcp__scrum4me__get_worker_settings()``{ min_quota_pct }`
2. `bash /opt/agent/bin/worker-quota-probe.sh` → JSON
`{ pct, reset_at_iso, ... }`
3. `mcp__scrum4me__worker_heartbeat({ last_quota_pct: pct,
last_quota_check_at })` — server stuurt SSE-event zodat NavBar
stand-by-badge live updatet
4. **Als `pct < min_quota_pct`**: log "stand-by, wachten tot
`reset_at_iso`", sleep tot dat tijdstip (cap op 1 uur), spring
terug naar stap 0.2
5. **Anders**: ga door naar stap 1
1. Roep `mcp__scrum4me__wait_for_job` aan. Geen argumenten, geen wait-time
tweaken — de tool blokt zelf tot 600 s.
2. Als er een job geclaimd wordt:

View file

@ -46,7 +46,7 @@ SEED_PROMPT='Pak de volgende job uit de Scrum4Me-queue en draai de queue leeg vo
# Tools-allowlist: alle MCP-tools die scrum4me-mcp aanbiedt + standaard
# file/bash-tools. Geen WebFetch, geen WebSearch — de agent heeft die
# niet nodig en uitsluiting verkleint het surface.
ALLOWED_TOOLS='Read,Edit,Write,Bash,Grep,Glob,mcp__scrum4me__health,mcp__scrum4me__list_products,mcp__scrum4me__get_claude_context,mcp__scrum4me__wait_for_job,mcp__scrum4me__check_queue_empty,mcp__scrum4me__update_job_status,mcp__scrum4me__update_task_status,mcp__scrum4me__update_task_plan,mcp__scrum4me__log_implementation,mcp__scrum4me__log_test_result,mcp__scrum4me__log_commit,mcp__scrum4me__create_pbi,mcp__scrum4me__create_story,mcp__scrum4me__create_task,mcp__scrum4me__create_todo,mcp__scrum4me__ask_user_question,mcp__scrum4me__get_question_answer,mcp__scrum4me__list_open_questions,mcp__scrum4me__cancel_question'
ALLOWED_TOOLS='Read,Edit,Write,Bash,Grep,Glob,mcp__scrum4me__health,mcp__scrum4me__list_products,mcp__scrum4me__get_claude_context,mcp__scrum4me__wait_for_job,mcp__scrum4me__check_queue_empty,mcp__scrum4me__update_job_status,mcp__scrum4me__update_task_status,mcp__scrum4me__update_task_plan,mcp__scrum4me__log_implementation,mcp__scrum4me__log_test_result,mcp__scrum4me__log_commit,mcp__scrum4me__create_pbi,mcp__scrum4me__create_story,mcp__scrum4me__create_task,mcp__scrum4me__create_todo,mcp__scrum4me__ask_user_question,mcp__scrum4me__get_question_answer,mcp__scrum4me__list_open_questions,mcp__scrum4me__cancel_question,mcp__scrum4me__get_worker_settings,mcp__scrum4me__worker_heartbeat'
CONSEC_FAILURES=0
BACKOFF=${AGENT_BACKOFF_START}