feat(ST-qfpqpxzy): SSE + NavBar stand-by badge voor worker quota-gate
- SSE route: WorkerHeartbeatPayload type + shouldEmit handler voor worker_heartbeat - solo-store: lowQuotaTokenIds Set<string> + setWorkerLowQuota action - use-solo-realtime: worker_heartbeat event → setWorkerLowQuota; worker_disconnected verwijdert uit set - nav-status-indicators: stand-by badge (bg-warning) als alle workers low quota - docs/runbooks/mcp-integration.md: get_worker_settings + worker_heartbeat tools + pre-flight quota-check sectie Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3a73b4f1c9
commit
661601e833
6 changed files with 114 additions and 10 deletions
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
# Documentation Index
|
||||
|
||||
Auto-generated on 2026-05-05 from front-matter and headings.
|
||||
Auto-generated on 2026-05-06 from front-matter and headings.
|
||||
|
||||
## Architecture Decision Records
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@ Scrum4Me heeft een eigen MCP-server in repo [`madhura68/scrum4me-mcp`](https://g
|
|||
- `mcp__scrum4me__list_open_questions` — eigen vragen, max 50, recente eerst
|
||||
- `mcp__scrum4me__cancel_question` — asker-only annulering van een eigen open vraag
|
||||
|
||||
**Worker-instellingen + quota (M13):**
|
||||
- `mcp__scrum4me__get_worker_settings` — geen args; retourneert `{ min_quota_pct }` afgeleid van het Bearer-token. Gebruik dit voor de pre-flight quota-check.
|
||||
- `mcp__scrum4me__worker_heartbeat` — optionele args: `last_quota_pct` (0-100), `last_quota_check_at` (ISO-8601), `is_low` (boolean). Slaat quota-state op in `ClaudeWorker` en triggert een `worker_heartbeat` SSE-event zodat de NavBar een stand-by badge kan tonen.
|
||||
|
||||
**Job queue — agent worker mode (M13):**
|
||||
- `mcp__scrum4me__wait_for_job` — blokkeert ≤600s, claimt atomisch een QUEUED-job via FOR UPDATE SKIP LOCKED. **Sinds M12** retourneert de payload een `kind`-discriminator:
|
||||
- `kind: 'TASK_IMPLEMENTATION'` (default) — payload met `implementation_plan`, `story`, `pbi`, `sprint`, `repo_url`
|
||||
|
|
@ -73,6 +77,49 @@ Dit blijft gelden als je tussen jobs door commits, branches of pushes hebt gedaa
|
|||
**Code koppelen aan app**
|
||||
- 'Pak de volgende job uit de Scrum4Me-queue' / 'draai de queue leeg' / 'batch agent' — Server-startup registreert een ClaudeWorker-record + heartbeat (5s); SIGTERM/SIGINT ruimt 'm op. UI in NavBar telt actieve workers via `last_seen_at < now() - 15s`.
|
||||
|
||||
## Pre-flight quota-check
|
||||
|
||||
Vóór elke `wait_for_job` kan de worker controleren of er voldoende Claude-quota is. Stappenplan:
|
||||
|
||||
1. Haal de drempel op: `get_worker_settings` → `min_quota_pct` (bijv. 20).
|
||||
2. Probe de Claude API (rate-limit-headers):
|
||||
|
||||
```bash
|
||||
RESPONSE=$(curl -sI https://api.anthropic.com/v1/messages \
|
||||
-H "x-api-key: $ANTHROPIC_API_KEY" \
|
||||
-H "anthropic-version: 2023-06-01")
|
||||
|
||||
REMAINING=$(echo "$RESPONSE" | grep -i "anthropic-ratelimit-tokens-remaining" | awk '{print $2}' | tr -d '\r')
|
||||
LIMIT=$(echo "$RESPONSE" | grep -i "anthropic-ratelimit-tokens-limit" | awk '{print $2}' | tr -d '\r')
|
||||
RESET_EPOCH=$(echo "$RESPONSE" | grep -i "anthropic-ratelimit-tokens-reset" | awk '{print $2}' | tr -d '\r')
|
||||
|
||||
QUOTA_PCT=$(( REMAINING * 100 / LIMIT ))
|
||||
```
|
||||
|
||||
3. Vergelijk met drempel. Bij low quota: rapporteer en slaap:
|
||||
|
||||
```bash
|
||||
if [ "$QUOTA_PCT" -lt "$MIN_QUOTA_PCT" ]; then
|
||||
RESET_MS=$(date -d "@$RESET_EPOCH" +%s%3N 2>/dev/null || echo 0)
|
||||
NOW_MS=$(date +%s%3N)
|
||||
SLEEP_S=$(( (RESET_MS - NOW_MS) / 1000 + 5 ))
|
||||
echo "Wachten tot quota-reset om $(date -d "@$RESET_EPOCH" '+%H:%M')"
|
||||
sleep "$SLEEP_S"
|
||||
fi
|
||||
```
|
||||
|
||||
4. Meld de quota-state via `worker_heartbeat`:
|
||||
|
||||
```
|
||||
worker_heartbeat(
|
||||
last_quota_pct=15,
|
||||
last_quota_check_at="2026-05-06T12:00:00Z",
|
||||
is_low=true
|
||||
)
|
||||
```
|
||||
|
||||
5. Na de sleep: opnieuw controleren (stap 2) voordat `wait_for_job` wordt aangeroepen.
|
||||
|
||||
## Prompt
|
||||
|
||||
- `implement_next_story` (arg: `product_id`) — end-to-end workflow
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue