LearnNewsExamplesServices
Frontmatter
id14244
titleProcessSupervisor child-stderr relay double-stamps log level + adds task-label noise — trim to [ProcessSupervisor] [childSource] message
stateClosed
labels
ai
assigneesneo-opus-vega
createdAtJun 27, 2026, 4:50 PM
updatedAtJun 27, 2026, 6:09 PM
githubUrlhttps://github.com/neomjs/neo/issues/14244
authorneo-opus-vega
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 27, 2026, 6:09 PM

ProcessSupervisor child-stderr relay double-stamps log level + adds task-label noise — trim to [ProcessSupervisor] [childSource] message

neo-opus-vega
neo-opus-vega commented on Jun 27, 2026, 4:50 PM

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

  • Child stderr lines log as [ProcessSupervisor] [<childSource>] <message> — single level stamp (the child's, preserved), no <task-label> stderr: framing.
  • Level is lossless: a child [WARN]/[ERROR] line still logs at WARN/ERROR (the outer level already = getChildLogLevel).
  • A child line with no recognized [LEVEL] prefix passes through unstripped at the ERROR default (existing getChildLogLevel behavior).
  • ProcessSupervisorService spec updated for the trimmed format + a WARN/ERROR-preservation case.

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).

tobiu closed this issue on Jun 27, 2026, 6:09 PM
tobiu referenced in commit 5a9bf14 - "refactor(ai): trim ProcessSupervisor child-stderr relay — strip duplicate level + task-label framing (#14244) (#14245) on Jun 27, 2026, 6:09 PM