feat(worker-logs): parser leert het run-log van agent-harness #273
No reviewers
Labels
No labels
severity/s2
severity/s3
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/Ops-dashboard!273
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/harness-run-logs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
M4 (agent-harness run-logging), Taak 9 / T-40: Worker Logs en Worker Insights leren het run-log van agent-harness lezen, zodat een harness-job er net zo uitziet als een Claude- of Codex-job.
Wat verandert
lib/parse-worker-log.tsMETA_REherkent naast[run-one-job]ook[harness]; de done-regel accepteertharness done.pushHarnessEvent(vóórpushCodexEvent) zet elkharness.*-type om naar bestaande LogEvent-soorten volgens de mapping in plan §Taak 9:run_start→ system-init,turn→ thinking/assistant-text/meetregel,tool_call/tool_result→ tool-call/tool-result,container→ tool-call + tool-result (prepare/gate) of meetregel (run_tests),run_end→ result, onbekendharness.*→ raw.exit code=; een groeiend bestand blijftrunning.matchMeta: een JSON-regel is nooit een meta-regel (dicht ook de oudere[run-one-job]-variant van die bug).timestamp − durationMs), zodat Worker Insights hun echte duur toont in plaats van 0 ms.test/parse-worker-log.test.ts+ fixturetest/fixtures/worker-logs/harness-idea-chat.log: de fixture is het echte run-log van een idea-chat-job op max2 (Taak 8, sha2563db769d9…), met tool-calls, één TOOL_ERROR en een op 8192 tekens afgekapt resultaat. Elke rij van de mapping heeft een test.Geen wijziging aan ingest, schema, triage of UI;
summarizeRunLogenparseRunLoghouden hun handtekening.Verificatie
npm run typecheckgroen;npm test: alleen de twee bekende macOS-platformbestanden falen (caddy-write-wrapper,db-access-policy-bundle-flow), zoals op main.running(ofidlevóór de job-id) tot het cijfer vanexit code=landt; niets gooit.Uitgesteld (bewust)
errorSummarywordtresult: failed). Fix hoort in de writer van agent-harness, mee met de volgende harness-uitrol.Uitrol
Niet vanzelf: Taak 10 rolt de parser uit op max2 via de ops-agent-flow
redeploy_ops_dashboard, op JP's go.🤖 Generated with Claude Code
Derde logformaat naast Claude en Codex (agent-harness M4, spec §5 en §7): - META_RE kent naast [run-one-job] ook [harness]; de tag markeert een harness-log - `harness done` telt als claude-done, in classifyMeta en summarizeRunLog - een harness-log is alleen afgesloten bij `exit code=`: harness.run_end en de ERROR-regel sluiten hem niet af; de regel voor Claude en Codex blijft gelden - pushHarnessEvent zet de harness.*-regels om naar dezelfde eventsoorten als Claude en Codex; toolargumenten die geen JSON-object zijn worden {"arguments": ...}, zodat de ingest ze als JSON-waarde kan opslaan - fixture: echte idee-chat-run op max2 (test/fixtures/worker-logs) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>META_RE draait over de ruwe regel en `\S+` stopt bij de eerste witruimte, die in compacte JSON binnen een stringwaarde ligt. Een tool-result dat met een run-log-regel begint (`<tijd> [harness] claimed job_id=...`) werd daardoor als meta-regel gelezen: jobId werd de rest van de JSON-regel, een Claude-log werd een harness-log (en bleef `running` zonder `exit code=`), en het tool-result verdween. matchMeta() weigert een eerste token dat met `{` begint (een meta-regel begint altijd met een tijd) en wordt op beide plekken gebruikt, in summarizeRunLog en parseRunLog. META_RE zelf is ongewijzigd. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>Verdict: REQUEST_CHANGES
Findings
lib/parse-worker-log.ts:559: bij eenharness.tool_resultmet zowelerrorCodealscontentLengthwordtfullLengthovergenomen uitcontentLength, terwijlbodyeerst de prefix[<errorCode>]krijgt. Daardoor kanfullLengthkleiner zijn dan de weergegeven/opgeslagen body (zoals de fixture metTOOL_ERROR); de UI en ingest tonen dan foutieve lengte-/truncatiemetadata. Tel de prefix bij de gedeclareerde lengte op (of sla de onbewerkte foutcode apart op) en voeg een test toe voor de combinatieerrorCode + contentLength.Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Reactie op review 856 (
fullLengthbijharness.tool_resultmeterrorCode+contentLength):Niet overgenomen zoals voorgesteld. Spec §5.4 (agent-harness
docs/specs/2026-09-28-harness-run-logging-design.md, rijharness.tool_result) legt vast:fullLength = contentLength, de lengte van de volledige tooluitvoer. De tag[<errorCode>]is een annotatie van de parser, geen tooluitvoer. DatfullLengthbij een foutresultaat kleiner is dan de getoonde body, is dus bedoeld: in de fixture 71 tekens uitvoer, 84 met de tag.truncatedvergelijktcontentLengthmet de content zónder tag.fullLengthversus de body: beide UI's tonen "N chars" en "afgekapt (N chars totaal)", en ingest slaat de waarde alleen op.errorCode+contentLengthzat al in de fixture-test (call_uwrob4gs:fullLength71, body met tag).Wel gefixt, de omgekeerde inconsistentie (
7d1dcceed): zondercontentLengthtelde de terugval de tag wél mee (17 voor[TOOL_ERROR] boom). De terugval is nu ook de lengte van de content, dusfullLengthbetekent op beide paden de lengte van de tooluitvoer. Er is ook een inline test bij voorerrorCode+contentLength, niet afgekapt en door de writer afgekapt.🤖 Generated with Claude Code