Skip to content

docs(ops): runbook for triaging ERROR lines in the OODA daemon log - #4846

Open
rysweet wants to merge 1 commit into
mainfrom
docs/ooda-log-error-signatures-runbook
Open

docs(ops): runbook for triaging ERROR lines in the OODA daemon log#4846
rysweet wants to merge 1 commit into
mainfrom
docs/ooda-log-error-signatures-runbook

Conversation

@rysweet

@rysweet rysweet commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Investigation: root cause of recent ERROR lines in ooda.log

This PR delivers the investigation of the ERROR line(s) in the daemon logs
(~/.simard/ooda.log and ~/.simard/state/ooda.log) and adds an operator
runbook capturing the findings + remediation.

The four ERROR signatures found (located & quoted)

  1. Legacy DB-backup — "DB file does not exist" (10× on 2026-05-21)

    ERROR: DB backup failed 3..12 consecutive times — ... 'cognitive-memory' failed to initialize: DB file does not exist, nothing to back up

  2. Legacy DB-backup — "No space left on device (os error 28)" (2026-05-29)

    ERROR: DB backup failed 3 consecutive times — ... 'backup-copy-tmp': No space left on device (os error 28)

    • Root cause: environmental ENOSPC — home partition was full; WAL write, checkpoint, and backup-copy all failed. Same legacy path.
    • Impact then: backups stopped and the OODA cycle errored (cognitive-memory WAL unwritable).
    • Status: historical; disk now at 74% and managed by tiered disk-health (emergency cleanup + disk-health-check recipe + reclaim).
  3. recipe_runner_rs::runner ... check-and-clean failed (2× on 2026-07-20, the most recent ERROR token)

    [simard] WARN: disk health check failed: ... [... ERROR recipe_runner_rs::runner] Step 'check-and-clean' failed: ... amplihack copilot failed (exit 1)

  4. Legacy python-bridge — "Suite progressive failed" (state/ooda.log, 2026-04-17)

    __main__ ERROR Suite progressive failed ... BrokenPipeError: [Errno 32] Broken pipe

    • Root cause: BrokenPipeError — the retired python bridge_server tried to flush a progressive-suite result to a stdout pipe whose reader had already exited (during teardown).
    • Status: legacy; state/ooda.log has not been written since a mid-May shutdown. The live daemon is the Rust OODA loop.

Scope & impact assessment

All four signatures are historical/legacy or transient; none indicate a live fault in the current daemon (cycle #2645 healthy, verified backups OK, disk-health OK, disk at 74%). No code fix is warranted — the code paths that emitted signatures 1–4 are already removed/reworked in the current tree.

Remediation delivered

Adds docs/howto/triage-ooda-log-error-lines.md (+ mkdocs nav): maps each signature to root cause, current status, impact, and remediation, with a decision checklist and guidance to key telemetry on daemon-emitted severity (the [simard] ERROR: tag) rather than a bare ERROR substring — which avoids the false positives caused by nested child-process log lines.

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Investigation of the ERROR lines in ~/.simard/ooda.log and
~/.simard/state/ooda.log found four recurring signatures, all either
legacy/historical or a nested child-process ERROR token inside a daemon
WARN message (the common cause of false-positive 'recent ERROR in
ooda.log' telemetry alerts):

1. Legacy 'DB backup failed N consecutive times ... DB file does not
   exist' — old native file-copy backup path (removed #2307, replaced by
   verified backup #2420).
2. Legacy 'DB backup failed ... No space left on device (os error 28)' —
   environmental disk-full event; disk now handled by tiered disk-health.
3. 'recipe_runner_rs::runner ... check-and-clean failed: amplihack
   copilot failed (exit 1)' — daemon-level WARN whose body embeds the
   child recipe-runner's own ERROR line; transient agent-invocation
   failure, self-limiting (next cycle re-runs).
4. Legacy python-bridge 'Suite progressive failed' BrokenPipeError in
   state/ooda.log — retired code path, stale file.

Adds an operator runbook mapping each signature to root cause, current
status, impact, and remediation, plus a decision checklist and guidance
to match daemon-emitted severity rather than a bare ERROR substring.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant