fix: surface hidden-pane steer failures and demote per-turn gateway log noise (#124560)

* fix(ui): surface hidden-pane steer terminal failures globally

Three terminal branches in steer-lifecycle.ts (transport null result,
failed queue-row restore, failed queue-row removal) still gated their
error on itemStillVisible, so a steer that failed after the operator
navigated away parked the error on the queue row with no visible
outcome — the exact invariant #124473 introduced
surfaceChatDeliveryFailure() to protect.

Route all three through the canonical helper and delete the divergent
visibility-only branches. Regression test fails pre-fix
(stash-verified): steer transport failure with the pane hidden now
surfaces the session-named global toast.

* fix(logging): demote per-turn gateway log noise to debug

Live campaign evidence showed three lines dominating operator logs at
info level with no per-turn diagnostic value:

- 'tool policy removed N tool(s)': the policy pipeline runs on every
  turn, so this repeated 42x in one session. Demote to debug and delete
  the now-dead toolPolicyAuditLogLevel/auditLogLevel plumbing that only
  existed to lower diagnostic probes to the level that is now the
  default (net -13 production LOC).
- 'codex app-server one-shot cleanup checked shared client retirement':
  routine per-attempt teardown detail; demote to debug.
- 'codex trajectory capture requires the SQLite host recorder': static
  config condition warned per attempt; warn once per process.

Skipped: the [model-fetch] info carve-out in model-transport-debug.ts is
a named contract (docs/logging.md, #89648) — always-info by design.

* fix(codex): drop test-only trajectory warn-once reset export

Knip's production unused-export gate rejects
resetCodexTrajectoryRecorderWarningForTest — it was a test-only seam in
production code. Reset the process-wide warn-once flag via
vi.resetModules() + fresh dynamic import in the test instead.

* test(cron): wait for backoff re-arm instead of fixed sleep

The 0ms retry timer arms only after async watcher-state persistence, so
'await delay(5)' races it on loaded CI workers (flaked on
checks-node-compact-large-2: spawn called 1 time, expected 2). Replace
both fixed-sleep re-arm waits with vi.waitFor on the spawn count. The
remaining delay(5) guards a negative no-further-spawn assertion after
cancel, where a bounded sleep is the correct shape.

* fix(codex): scope trajectory recorder warn dedupe to session

ClawSweeper P2: the host recorder factory returns null for per-session
target-mapping conflicts, not only static config, so a process-wide
warn-once flag silenced a later distinct session's recorder loss. Warn
once per session (bounded set, cleared past 64 entries) so retries stay
quiet but each newly affected session records its loss. Regression
covers a later distinct session still warning.
This commit is contained in:
Peter Steinberger
2026-08-16 06:23:44 -07:00
committed by GitHub
parent 243f51d314
commit 7173aeb663
17 changed files with 108 additions and 100 deletions
+2 -2
View File
@@ -375,10 +375,10 @@ describe("doctor runtime tool schema checks", () => {
"Disable or update the offending plugin/tool so its parameters are a JSON object schema, then rerun doctor.",
});
expect(mocks.createOpenClawCodingTools).toHaveBeenCalledWith(
expect.objectContaining({ agentId: "main", toolPolicyAuditLogLevel: "debug" }),
expect.objectContaining({ agentId: "main" }),
);
expect(mocks.createOpenClawCodingTools).toHaveBeenCalledWith(
expect.objectContaining({ agentId: "worker", toolPolicyAuditLogLevel: "debug" }),
expect.objectContaining({ agentId: "worker" }),
);
expect(mocks.loadModelCatalog).toHaveBeenCalledTimes(2);
expect(mocks.loadModelCatalog).toHaveBeenNthCalledWith(
-3
View File
@@ -841,7 +841,6 @@ function collectBundleMcpRuntimeToolSchemaFindings(params: {
modelId: params.modelRef.model,
}),
warn: () => {},
toolPolicyAuditLogLevel: "debug",
});
return collectNormalizedToolSchemaFindings({
agentId: params.agentId,
@@ -904,7 +903,6 @@ function collectAgentRuntimeToolSchemaFindings(params: {
modelContextWindowTokens: params.model.contextWindow,
allowGatewaySubagentBinding: true,
emitBeforeToolCallDiagnostics: false,
toolPolicyAuditLogLevel: "debug",
});
} catch (error) {
return [agentRuntimeToolLoadFailureFinding({ agentId: params.agentId, error })];
@@ -1054,7 +1052,6 @@ function shouldReportBundleMcpRuntimeDiagnostic(params: {
modelId: params.modelRef.model,
}),
warn: () => {},
toolPolicyAuditLogLevel: "debug",
}).length > 0
);
}