Friction (operator-flagged 2026-06-27)
Orchestrator logs are brittle / too long. ProcessSupervisorService.writeChildStderr re-logs each child stderr line by prepending [ProcessSupervisor] ${task.label} stderr: to the raw child line — which already carries its own [LEVEL] [source] prefix. Result: the level is double-stamped and the <task-label> stderr: framing is noise.
[…] [INFO] [ProcessSupervisor] memory miniSummary backfill stderr: [INFO] [MemoryService] miniSummary backfill complete: 9/9 …
should be:
[…] [INFO] [ProcessSupervisor] [MemoryService] miniSummary backfill complete: 9/9 …
Fix
In writeChildStderr (ai/daemons/orchestrator/services/ProcessSupervisorService.mjs), strip the child's leading [LEVEL] from the re-logged message (the outer level already carries it via getChildLogLevel(line)) + drop ${task.label} stderr::
const level = this.getChildLogLevel(line);
this.writeLog?.(level, `[ProcessSupervisor] ${line.replace(/^\[(LOG|INFO|WARN|ERROR)\]\s*/, '')}`);Acceptance Criteria
Avoided trap
- NOT dropping the level entirely — the surviving stamp is the CHILD's parsed level (verified: line 345 already uses
getChildLogLevel), so WARN/ERROR are never masked as INFO.
- Per-line supervised-task attribution is dropped (the
task.label); recoverable from the framed Starting <task> + serial heavy-maintenance + the child source. Decision, not accident.
Authored by Vega (@neo-opus-vega · Claude Opus 4.8); friction→gold from an operator log-readability flag. Filed via gh relay (gh-author neo-opus-ada = shared-token artifact).
Friction (operator-flagged 2026-06-27)
Orchestrator logs are brittle / too long.
ProcessSupervisorService.writeChildStderrre-logs each child stderr line by prepending[ProcessSupervisor] ${task.label} stderr:to the raw child line — which already carries its own[LEVEL] [source]prefix. Result: the level is double-stamped and the<task-label> stderr:framing is noise.should be:
Fix
In
writeChildStderr(ai/daemons/orchestrator/services/ProcessSupervisorService.mjs), strip the child's leading[LEVEL]from the re-logged message (the outer level already carries it viagetChildLogLevel(line)) + drop${task.label} stderr::const level = this.getChildLogLevel(line); this.writeLog?.(level, `[ProcessSupervisor] ${line.replace(/^\[(LOG|INFO|WARN|ERROR)\]\s*/, '')}`);Acceptance Criteria
[ProcessSupervisor] [<childSource>] <message>— single level stamp (the child's, preserved), no<task-label> stderr:framing.[WARN]/[ERROR]line still logs at WARN/ERROR (the outer level already =getChildLogLevel).[LEVEL]prefix passes through unstripped at the ERROR default (existinggetChildLogLevelbehavior).Avoided trap
getChildLogLevel), so WARN/ERROR are never masked as INFO.task.label); recoverable from the framedStarting <task>+ serial heavy-maintenance + the child source. Decision, not accident.Authored by Vega (@neo-opus-vega · Claude Opus 4.8); friction→gold from an operator log-readability flag. Filed via gh relay (gh-author neo-opus-ada = shared-token artifact).