fix(worker-logs): Claude Code 2.1.283, resultregel los van sleutelvolgorde, alleen init is system-init #276

Merged
janpeter merged 1 commit from fix/claude-code-stream-2-1-283 into main 2026-09-30 13:17:05 +02:00
Owner

Sinds de Claude Code-upgrade van 2.1.197 naar 2.1.283 (±2026-09-27) hebben afgeronde Claude-runs in Worker Logs geen num_turns, total_cost_usd en claude_code_version meer. Het gaat om 58 runs op max2 en srv. Worker Insights telt daardoor de kosten te laag.

Oorzaak

Beide oorzaken zitten in lib/parse-worker-log.ts:

  1. Resultregel. summarizeRunLog herkende die alleen met startsWith('{"type":"result"'). In 2.1.283 begint de regel met {"duration_api_ms":…, dus type staat niet meer vooraan.
  2. Systeemregels. Elke type: system-regel werd een system-init-event, en de ingest neemt het eerste. 2.1.283 schrijft vóór de echte init een commands_changed, en daarna permission_denied en per denkstap thinking_tokens. Het eerste event was dus leeg, en de detailpagina toonde 11 system-init-kaarten.

Fix

  • Resultregel: "type":"result" is een goedkope voorcheck; het top-level type van de geparste regel beslist. Het eerste resultaat telt nog steeds.
  • Systeemregels: alleen subtype: init (of geen subtype, voor oudere logs) is een system-init. Andere systeemregels worden één raw-regel, bijvoorbeeld system commands_changed · 56 commands, system permission_denied · <tool>: <melding> of system thinking_tokens · ~50 tokens.
  • Ongewijzigd: lib/ingest-worker-log.ts, en de Codex- en harness-paden.

Verificatie

  • Fixture: een geschoonde afgeleide van het echte run-log van een IDEA_CHAT-job op max2 met 2.1.283 (33 regels, 13 kB, sha256 73fb60e4…6b8e).
    • Letterlijk behouden: de regelvolgorde en de sleutelvolgorde van elke JSON-regel. Dat zijn de feiten waar de bug om draait.
    • Vervangen door plaatshouders: id's, vrije tekst, toolinvoer en toolresultaten.
    • Weggelaten: de herhalende toolrondes en de lijsten met geïnstalleerde commando's, skills en plugins.
    • De ongewijzigde transcriptie uit de eerste versie van deze PR is vervangen na de review. De branch is herschreven, zodat die niet in de historie van de branch staat.
  • Tests: 28 nieuwe; tegen de oude parser falen de fixture-tests. test/parse-worker-log.test.ts is 105/105 groen en npm run typecheck is groen. In npm test falen alleen de twee bekende macOS-platformbestanden.
  • Taakreview: spec-conform en approved. 11 vijandige invoeren, zoals een user-regel met een genest result-blok en Codex- en harness-regels, tellen niet als resultaat.
  • Oude tegen nieuwe parser op alle echte run-logs sinds 1 september (2.150 bestanden op max2 en srv):
    • Codex (1.055) en harness (4) zijn identiek.
    • Alle 42 logs van 2.1.283 veranderen zoals bedoeld.
    • 129 oudere 2.1.197-logs veranderen alleen in de tijdlijn: losse systeemregels (thinking_tokens, task_*) zijn geen system-init-kaart meer maar een raw-regel. Hun samenvatting, en dus de WorkerRun-kolommen, is identiek.

Na de merge

  1. Deploy op srv (update_ops_dashboard) en max2 (redeploy_ops_dashboard).
  2. Backfill van de 58 runs. De ingest slaat afgeronde runs over. Daarom krijgen precies die rijen (Claude-pools, sinds 2026-09-27, zonder versie) in_progress = true, zodat de gewone ingest-tick ze opnieuw leest en weer afsluit. De rij-id's en gekoppelde insights blijven staan.

Uitgesteld (optioneel, uit de review)

  • Geen test voor een subtype die null, leeg of een getal is; zo'n regel wordt nu een raw-regel.
  • subtype en tool_name in de raw-regel zijn niet afgekapt.
  • Eén doc-comment is iets te stellig.

🤖 Generated with Claude Code

Sinds de Claude Code-upgrade van 2.1.197 naar 2.1.283 (±2026-09-27) hebben afgeronde Claude-runs in Worker Logs geen `num_turns`, `total_cost_usd` en `claude_code_version` meer. Het gaat om 58 runs op max2 en srv. Worker Insights telt daardoor de kosten te laag. ## Oorzaak Beide oorzaken zitten in `lib/parse-worker-log.ts`: 1. **Resultregel.** `summarizeRunLog` herkende die alleen met `startsWith('{"type":"result"')`. In 2.1.283 begint de regel met `{"duration_api_ms":…`, dus `type` staat niet meer vooraan. 2. **Systeemregels.** Elke `type: system`-regel werd een system-init-event, en de ingest neemt het eerste. 2.1.283 schrijft vóór de echte `init` een `commands_changed`, en daarna `permission_denied` en per denkstap `thinking_tokens`. Het eerste event was dus leeg, en de detailpagina toonde 11 system-init-kaarten. ## Fix - **Resultregel:** `"type":"result"` is een goedkope voorcheck; het top-level `type` van de geparste regel beslist. Het eerste resultaat telt nog steeds. - **Systeemregels:** alleen `subtype: init` (of geen subtype, voor oudere logs) is een system-init. Andere systeemregels worden één `raw`-regel, bijvoorbeeld `system commands_changed · 56 commands`, `system permission_denied · <tool>: <melding>` of `system thinking_tokens · ~50 tokens`. - **Ongewijzigd:** `lib/ingest-worker-log.ts`, en de Codex- en harness-paden. ## Verificatie - **Fixture:** een geschoonde afgeleide van het echte run-log van een IDEA_CHAT-job op max2 met 2.1.283 (33 regels, 13 kB, sha256 `73fb60e4…6b8e`). - Letterlijk behouden: de regelvolgorde en de sleutelvolgorde van elke JSON-regel. Dat zijn de feiten waar de bug om draait. - Vervangen door plaatshouders: id's, vrije tekst, toolinvoer en toolresultaten. - Weggelaten: de herhalende toolrondes en de lijsten met geïnstalleerde commando's, skills en plugins. - De ongewijzigde transcriptie uit de eerste versie van deze PR is vervangen na de review. De branch is herschreven, zodat die niet in de historie van de branch staat. - **Tests:** 28 nieuwe; tegen de oude parser falen de fixture-tests. `test/parse-worker-log.test.ts` is 105/105 groen en `npm run typecheck` is groen. In `npm test` falen alleen de twee bekende macOS-platformbestanden. - **Taakreview:** spec-conform en approved. 11 vijandige invoeren, zoals een user-regel met een genest result-blok en Codex- en harness-regels, tellen niet als resultaat. - **Oude tegen nieuwe parser op alle echte run-logs sinds 1 september** (2.150 bestanden op max2 en srv): - Codex (1.055) en harness (4) zijn identiek. - Alle 42 logs van 2.1.283 veranderen zoals bedoeld. - 129 oudere 2.1.197-logs veranderen alleen in de tijdlijn: losse systeemregels (`thinking_tokens`, `task_*`) zijn geen system-init-kaart meer maar een raw-regel. Hun samenvatting, en dus de `WorkerRun`-kolommen, is identiek. ## Na de merge 1. Deploy op srv (`update_ops_dashboard`) en max2 (`redeploy_ops_dashboard`). 2. Backfill van de 58 runs. De ingest slaat afgeronde runs over. Daarom krijgen precies die rijen (Claude-pools, sinds 2026-09-27, zonder versie) `in_progress = true`, zodat de gewone ingest-tick ze opnieuw leest en weer afsluit. De rij-id's en gekoppelde insights blijven staan. ## Uitgesteld (optioneel, uit de review) - Geen test voor een `subtype` die `null`, leeg of een getal is; zo'n regel wordt nu een raw-regel. - `subtype` en `tool_name` in de raw-regel zijn niet afgekapt. - Eén doc-comment is iets te stellig. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
s4m-codex-reviewer requested changes 2026-09-30 12:32:05 +02:00
Dismissed
s4m-codex-reviewer left a comment

Verdict: REQUEST_CHANGES

Findings

  • ERROR — test/fixtures/worker-logs/claude-2.1.283-idea-chat.log:21, 30, 37, 39: de fixture is een ongewijzigde productietranscriptie en bevat volledige interne MCP-toolresultaten, productdocumentinhoud, gebruikers-/token-ID's en sessie-/hostmetadata. Daardoor wordt operationele en mogelijk vertrouwelijke informatie blijvend in de repository opgenomen. Vervang dit door een minimale, gesynthetiseerde en geanonimiseerde fixture die alleen de voor de parser relevante logvorm behoudt.

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

## Verdict: REQUEST_CHANGES ### Findings - **ERROR** — `test/fixtures/worker-logs/claude-2.1.283-idea-chat.log:21, 30, 37, 39`: de fixture is een ongewijzigde productietranscriptie en bevat volledige interne MCP-toolresultaten, productdocumentinhoud, gebruikers-/token-ID's en sessie-/hostmetadata. Daardoor wordt operationele en mogelijk vertrouwelijke informatie blijvend in de repository opgenomen. Vervang dit door een minimale, gesynthetiseerde en geanonimiseerde fixture die alleen de voor de parser relevante logvorm behoudt. Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
janpeter force-pushed fix/claude-code-stream-2-1-283 from 117a9f122a
All checks were successful
CI / Select checks (pull_request) Successful in 39s
CI / Ops-agent checks (pull_request) Successful in 40s
CI / DB access operator (pull_request) Successful in 1m16s
CI / Deploy artifact checks (pull_request) Successful in 38s
CI / Docker image build (pull_request) Successful in 1m26s
CI / Mac foundation hermetic checks (pull_request) Successful in 2m21s
CI / Root app checks (pull_request) Successful in 8m31s
CI / Required checks (pull_request) Successful in 38s
to c6f8d07047
All checks were successful
CI / Select checks (pull_request) Successful in 38s
CI / Ops-agent checks (pull_request) Successful in 40s
CI / DB access operator (pull_request) Successful in 1m14s
CI / Deploy artifact checks (pull_request) Successful in 38s
CI / Docker image build (pull_request) Successful in 1m20s
CI / Mac foundation hermetic checks (pull_request) Successful in 2m12s
CI / Root app checks (pull_request) Successful in 8m33s
CI / Required checks (pull_request) Successful in 41s
2026-09-30 12:45:31 +02:00
Compare
s4m-codex-reviewer left a comment

APPROVED

Findings

  • Geen blokkerende of error-severity findings aangetroffen.
  • Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

De parser herkent nu een top-level Claude-result onafhankelijk van sleutelvolgorde en classificeert uitsluitend system/init als sessie-initialisatie. De toegevoegde 2.1.283-fixture en gerichte randgevaltests dekken de regressies af.

## APPROVED ### Findings - Geen blokkerende of error-severity findings aangetroffen. - Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. De parser herkent nu een top-level Claude-`result` onafhankelijk van sleutelvolgorde en classificeert uitsluitend `system/init` als sessie-initialisatie. De toegevoegde 2.1.283-fixture en gerichte randgevaltests dekken de regressies af.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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!276
No description provided.