LearnNewsExamplesServices
Frontmatter
id14149
titleOrchestrator log hygiene: ProcessSupervisor mis-stamps child progress stderr as ERROR (camouflages real errors)
stateClosed
labels
bugaimodel-experience
assigneesneo-opus-ada
createdAtJun 26, 2026, 11:47 PM
updatedAtJun 27, 2026, 12:30 AM
githubUrlhttps://github.com/neomjs/neo/issues/14149
authorneo-opus-ada
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 27, 2026, 12:30 AM

Orchestrator log hygiene: ProcessSupervisor mis-stamps child progress stderr as ERROR (camouflages real errors)

Closed v13.1.0/archive-v13-1-0-chunk-7 bugaimodel-experience
neo-opus-ada
neo-opus-ada commented on Jun 26, 2026, 11:47 PM

Context (V-B-A'd against the live orchestrator.log, 2026-06-26)

ProcessSupervisor.writeChildStderr logs each child stderr line at the severity from getChildLogLevel(line) (ProcessSupervisorService.mjs:323), which maps [LOG]/[INFO]→INFO, [WARN]→WARN, and defaults everything else to ERROR (line 332).

The kbSync / githubWorkflowSync children emit unprefixed progress to stderr — ✅ Services Ready. Starting Synchronization..., ⏳ Initializing Knowledge Base Services..., Waiting for Lifecycle Service..., [reconcileActiveChunks] removed duplicate pr-N.md — all mis-stamped ERROR.

Impact: the ERROR stream is polluted with routine progress, which (a) inflates the apparent error rate and (b) camouflages real errors — the genuine ❌ Synchronization Failed... batch 214 embedder-404 abort sits in the same ERROR stream as ✅ Services Ready, so a human or alarm scanning ERROR can't separate them.

The fix (producer-side, NOT the default)

The getChildLogLevel default-ERROR is a correct fail-safe — an unrecognized line might be a real error, so erring toward ERROR is right. The bug is the child not honoring the prefix contract: the kbSync / githubWorkflowSync scripts (+ the KB services emitting Waiting for... etc.) should prefix progress/status lines with [LOG]/[INFO]/[WARN]. Then real errors (unprefixed or [ERROR]) correctly stay ERROR.

Delicate: do NOT demote the default to INFO — that would hide genuine unprefixed errors (the batch-214 abort). Fix the producers; keep the fail-safe.

Acceptance criteria

  • kbSync + githubWorkflowSync progress/status stderr lines carry a [LOG]/[INFO]/[WARN] prefix → classified at the right severity.
  • A genuine unprefixed error line still classifies as ERROR (fail-safe preserved).
  • Verified against a live sync: the ERROR stream no longer contains routine progress; the real batch-failure line still shows ERROR.

Refs #14147 (sibling log-hygiene fix), #14039 (Agent OS Stability & Self-Healing), #14124 (embedding-write-canary domain). Discovered alongside #14147. Authored by Ada (Claude Opus 4.8, Claude Code).

tobiu referenced in commit d05a971 - "fix(ai): prefix supervised-child progress stderr so it classifies INFO/WARN, not ERROR (#14149) (#14152) on Jun 27, 2026, 12:30 AM
tobiu closed this issue on Jun 27, 2026, 12:30 AM