feat(worker-logs): pool-aware page + codex runs zichtbaar (fase 2) #73

Merged
janpeter merged 1 commit from feat/worker-logs-pools into main 2026-06-11 20:22:23 +02:00
Owner

Fase 2 van het worker-logs-herstelplan (codex-review 2026-06-11). Maakt codex-runs zichtbaar op /worker-logs en filtert per pool.

Wat

  • Pool-dimensie: WORKER_LOGS_DIR → de PARENT /var/worker-logs; discovery loopt over pool-dirs (idea, codex) → per-instance runs/ → legacy flat runs/. Symlink-veilig + strikte segment-regex per pad (zelfde discipline als de API-validatie).
  • UI: pool-filter (alle | idea | codex) + pool-kolom op de tabel; detail-paneel toont de pool. Pool komt uit het PAD, nooit uit loginhoud.
  • Codex-parser (het risicopunt): codex codex exec --json gebruikt een ander event-schema dan Claude stream-json. item.completed agent_message → assistant-text; command_execution + mcp_tool_call → tool-call/tool-result-paren (non-zero exit = error); turn.completed → token-note. Plus codex' spawn codex/codex done-meta voor model/duration/exit. Zo werken zowel de detail-timeline als de DB-ingest zonder codex-specifieke takken.
  • composeRunId: non-idea pools krijgen een codex/…-prefix; idea-run-ids blijven ONgewijzigd → geen backfill, geen dubbele rijen (een echte pool-kolom in de DB is fase 3). Bewuste, gedocumenteerde compat-keuze.
  • Ingester: ENOENT (file door de prune-timer verwijderd tussen listing en read) wordt nu stil geskipt i.p.v. als error gerapporteerd.

Tests / verificatie

  • test/parse-worker-log.test.ts — parser-fixtures idea + codex (summary + event-mapping + composeRunId).
  • test/worker-logs-layout.test.ts — pool/instance-discovery over legacy-flat én nested, pool-narrowing, pad-safety.
  • Volledige suite 71 passed, tsc --noEmit clean, next build groen (NFT-warning op worker-logs.ts is pre-existing — module is inherent een fs-reader).

Deploy-noot

De host-.env (r19) moet van /var/worker-logs/idea/var/worker-logs vóór container-recreate (compose mount is al de parent). DoD-check: ls /var/worker-logs in de container toont idea+codex.

🤖 Generated with Claude Code

Fase 2 van het worker-logs-herstelplan (codex-review 2026-06-11). Maakt codex-runs zichtbaar op /worker-logs en filtert per pool. ## Wat - **Pool-dimensie**: `WORKER_LOGS_DIR` → de PARENT `/var/worker-logs`; discovery loopt over pool-dirs (idea, codex) → per-instance `runs/` → legacy flat `runs/`. Symlink-veilig + strikte segment-regex per pad (zelfde discipline als de API-validatie). - **UI**: pool-filter (alle | idea | codex) + pool-kolom op de tabel; detail-paneel toont de pool. Pool komt uit het PAD, nooit uit loginhoud. - **Codex-parser** (het risicopunt): codex `codex exec --json` gebruikt een ander event-schema dan Claude stream-json. `item.completed` agent_message → assistant-text; command_execution + mcp_tool_call → tool-call/tool-result-paren (non-zero exit = error); turn.completed → token-note. Plus codex' `spawn codex`/`codex done`-meta voor model/duration/exit. Zo werken zowel de detail-timeline als de DB-ingest zonder codex-specifieke takken. - **composeRunId**: non-idea pools krijgen een `codex/…`-prefix; idea-run-ids blijven ONgewijzigd → geen backfill, geen dubbele rijen (een echte pool-kolom in de DB is fase 3). Bewuste, gedocumenteerde compat-keuze. - **Ingester**: ENOENT (file door de prune-timer verwijderd tussen listing en read) wordt nu stil geskipt i.p.v. als error gerapporteerd. ## Tests / verificatie - `test/parse-worker-log.test.ts` — parser-fixtures idea + codex (summary + event-mapping + composeRunId). - `test/worker-logs-layout.test.ts` — pool/instance-discovery over legacy-flat én nested, pool-narrowing, pad-safety. - Volledige suite **71 passed**, `tsc --noEmit` clean, `next build` groen (NFT-warning op worker-logs.ts is pre-existing — module is inherent een fs-reader). ## Deploy-noot De host-`.env` (r19) moet van `/var/worker-logs/idea` → `/var/worker-logs` **vóór** container-recreate (compose mount is al de parent). DoD-check: `ls /var/worker-logs` in de container toont idea+codex. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
WORKER_LOGS_DIR wijst nu naar de PARENT /var/worker-logs; discovery loopt
over pool-dirs (idea, codex) → per-instance runs/ → legacy flat runs/.
Symlink-veilig + strikte segment-regex per pad. De /worker-logs-pagina
krijgt een pool-filter (alle | idea | codex) + pool-kolom; detail-route en
parser dragen pool mee (uit het pad, niet de loginhoud).

Parser leest codex' afwijkende JSON-schema (item.completed agent_message →
assistant-text; command_execution + mcp_tool_call → tool-call/tool-result
paren; turn.completed → token-note) en codex' meta-lijnen (spawn/done) voor
model/duration/exit. Zo werken zowel de detail-timeline als de DB-ingest
zonder codex-specifieke takken.

composeRunId prefixt non-idea pools (codex/…) en laat idea-run-ids
ONgewijzigd → geen backfill, geen dubbele rijen (pool-kolom in DB later).
Ingester skipt ENOENT (door prune-timer verwijderde files) stil i.p.v. als
error. Tests: parser-fixtures (idea + codex) en layout-discovery
(legacy-flat + nested, beide pools). Conform codex-review 2026-06-11.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Ops-dashboard!73
No description provided.