Files
kandev/docs/specs/platform/requirements/expected-runtime-log-severity.md
T
2026-09-06 11:35:51 +01:00

148 lines
9.9 KiB
Markdown

---
status: active
system: platform
created: 2026-08-23
updated: 2026-09-05
owners:
- kandev
---
# Expected runtime log severity Requirements
## Overview
Expected runtime conditions and forwarded child logs can use the wrong severity.
This behavior obscures actionable errors and makes diagnostic bundles harder to triage.
## Requirements
### REQ-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001: Expected runtime log severity
**Intent:** Normal review and first-launch timing conditions currently look like backend failures in the logs. This obscures actionable errors and makes diagnostic bundles harder to triage.
#### Acceptance criteria
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.1:** A `workspace.file.get` request for a path that is absent from the current checkout returns the existing `not_found` WebSocket error code and records a debug entry. It does not record an error entry.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.2:** A `workspace.file.get` failure that is not a missing-file condition keeps the existing `internal_error` response and error-level log entry.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.3:** When initial worktree materialization runs before its task environment exists, the typed `ErrEnvironmentNotResolved` condition records a debug entry. The physical worktree remains available and the existing launch transaction still owns persistence of its record.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.4:** Other worktree persistence failures keep their existing return, cleanup, and logging behavior.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.5:** **GIVEN** an active session and an absent current-checkout path, **WHEN** `workspace.file.get` requests that path, **THEN** the response has the `not_found` error code and exactly one debug-level missing-file entry is emitted.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.6:** **GIVEN** an active session and a dependency failure unrelated to a missing file, **WHEN** `workspace.file.get` requests a path, **THEN** the response has the `internal_error` error code and an error-level entry is emitted.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.7:** **GIVEN** a physical worktree has been materialized before its task environment row exists, **WHEN** worktree persistence receives `ErrEnvironmentNotResolved`, **THEN** the call succeeds, emits a debug-level deferred-persistence entry, and does not remove the physical worktree.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.8:** **GIVEN** worktree persistence receives any other store error, **WHEN** the manager handles it, **THEN** the existing error and cleanup behavior remains unchanged.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.9:** The launcher shall preserve a recognized child log level from Zap console records and Go `slog` text records.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.10:** The launcher shall record unrecognized child stderr at warning level so that unstructured panics and tracebacks remain visible.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.11:** A missing task environment referenced by a session shall use the existing task fallback without a warning entry.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.12:** A task-environment lookup error that is not a typed not-found condition shall retain its warning entry.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.13:** **GIVEN** a child emits a recognized `INFO` record, **WHEN** the launcher forwards stderr, **THEN** the parent records the line at info level.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.14:** **GIVEN** a child emits unstructured stderr, **WHEN** the launcher forwards the line, **THEN** the parent records it at warning level.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.15:** **GIVEN** a session references a missing task environment, **WHEN** workspace information is loaded, **THEN** the task fallback succeeds without a warning entry.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.16:** **GIVEN** a task-environment lookup returns another error, **WHEN** workspace information is loaded, **THEN** the existing fallback and warning behavior remains unchanged.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.17:** **GIVEN** an open page detects a changed backend `boot_id`, **WHEN** its recovery report is accepted, **THEN** the backend records one info-level reload entry. It records no `frontend error toast` error entry.
- **AC-PLATFORM-EXPECTED-RUNTIME-LOG-SEVERITY-001.18:** **GIVEN** Sonner or the legacy toast provider displays an error toast, **WHEN** its report is accepted, **THEN** the backend records one `frontend error toast` error entry.
## Migrated source detail
## Why
Normal review and first-launch timing conditions currently look like backend
failures in the logs. This obscures actionable errors and makes diagnostic
bundles harder to triage.
## What
- A `workspace.file.get` request for a path that is absent from the current
checkout returns the existing `not_found` WebSocket error code and records a
debug entry. It does not record an error entry.
- A `workspace.file.get` failure that is not a missing-file condition keeps the
existing `internal_error` response and error-level log entry.
- When initial worktree materialization runs before its task environment exists,
the typed `ErrEnvironmentNotResolved` condition records a debug entry. The
physical worktree remains available and the existing launch transaction still
owns persistence of its record.
- Other worktree persistence failures keep their existing return, cleanup, and
logging behavior.
- Forwarded child stderr keeps recognized Zap and Go `slog` levels. Unknown
stderr stays at warning level.
- A missing session task environment uses the existing task fallback without a
warning. Other lookup errors keep their warning.
## API surface
The existing `workspace.file.get` WebSocket action keeps its request and
response shapes. Only the response classification for a missing current file
is made explicit as `not_found`; no new action or payload field is added. The
agentctl file-content endpoint carries this classification with HTTP 404 and a
typed client sentinel. Other file-content failures keep their existing error
status and message path.
## Failure modes
- Missing files are expected during deleted-file review and stale diff
requests. They are handled as not-found results and are not promoted to
application failures.
- Permission, transport, malformed-response, and other non-missing failures
remain internal errors and continue to be logged at error level.
- A worktree store that reports `ErrEnvironmentNotResolved` is a normal launch
ordering condition. The manager skips that persistence attempt and does not
remove the newly created physical worktree.
- Any other worktree store failure remains an actual persistence failure and
follows the current cleanup and retry boundary.
- The launcher accepts only anchored child log formats. Unrecognized stderr
remains visible at warning level.
- A typed missing task environment is an expected stale-reference condition.
The task fallback remains authoritative for workspace information.
- Other task-environment lookup errors can indicate a storage problem and
remain warnings.
- A changed backend generation is an expected lifecycle condition. Its browser
report remains diagnostic evidence, but it is not an error-toast report.
- Actual error toasts keep their error-level records.
## Persistence guarantees
This repair changes log severity and missing-file classification only. The
agentctl file-content transport now distinguishes missing files with HTTP 404;
it does not change task-environment ownership, worktree creation, launch
persistence, or cleanup behavior across backend restarts.
## Scenarios
- **GIVEN** an active session and an absent current-checkout path, **WHEN**
`workspace.file.get` requests that path, **THEN** the response has the
`not_found` error code and exactly one debug-level missing-file entry is
emitted.
- **GIVEN** an active session and a dependency failure unrelated to a missing
file, **WHEN** `workspace.file.get` requests a path, **THEN** the response
has the `internal_error` error code and an error-level entry is emitted.
- **GIVEN** a physical worktree has been materialized before its task
environment row exists, **WHEN** worktree persistence receives
`ErrEnvironmentNotResolved`, **THEN** the call succeeds, emits a debug-level
deferred-persistence entry, and does not remove the physical worktree.
- **GIVEN** worktree persistence receives any other store error, **WHEN** the
manager handles it, **THEN** the existing error and cleanup behavior remains
unchanged.
- **GIVEN** a child emits a recognized `INFO` record, **WHEN** the launcher
forwards stderr, **THEN** the parent records the line at info level.
- **GIVEN** a child emits unstructured stderr, **WHEN** the launcher forwards
the line, **THEN** the parent records it at warning level.
- **GIVEN** a session references a missing task environment, **WHEN** workspace
information is loaded, **THEN** the task fallback succeeds without a warning
entry.
- **GIVEN** a task-environment lookup returns another error, **WHEN** workspace
information is loaded, **THEN** the existing fallback and warning behavior
remains unchanged.
- **GIVEN** an open page detects a changed backend `boot_id`, **WHEN** its
recovery report is accepted, **THEN** one info entry records the event and no
`frontend error toast` error entry is emitted.
- **GIVEN** an actual error toast is displayed, **WHEN** its report is accepted,
**THEN** the existing `frontend error toast` error entry remains unchanged.
## Out of scope
- Changing frontend diff rendering or review-file status behavior.
- Changing worktree ownership, task-environment transactions, cleanup policy,
or startup reconciliation.
- Reclassifying integration failures, raw ACP frames, host-utility idle repair,
network disconnects, or authentication warnings.
- Changing backend-restart detection, the reload-required state, or the reload
alert.