fix #97115: classify isolated cron fallback results#99913
Conversation
|
Codex review: needs maintainer review before merge. Reviewed July 4, 2026, 6:13 AM ET / 10:13 UTC. Summary PR surface: Source +25, Tests +64. Total +89 across 4 files. Reproducibility: yes. Source inspection shows current main omits Review metrics: 1 noteworthy metric.
Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land one narrow classifier-hook PR with current real behavior proof, then close the returned-result fallback reports while tracking timeout-abort behavior separately. Do we have a high-confidence way to reproduce the issue? Yes. Source inspection shows current main omits Is this the best way to solve the issue? Yes for the narrow returned-result gap. Reusing the existing embedded classifier and exhaustion merge helper matches sibling agent paths, while the separate timeout-abort claim should stay out of this patch unless maintainers explicitly broaden scope. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 79d2e568a0aa. Label changesLabel justifications:
Evidence reviewedPR surface: Source +25, Tests +64. Total +89 across 4 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
Real behavior proof for #99913: I ran a local loopback cron fallback proof with this PR applied. This uses the real No external provider, API key, account id, phone number, endpoint, or private path is used. Synthetic run/session identifiers are redacted. Conclusion: before the cron result hooks, an empty primary result completed successfully with no visible text. With this PR's hook wiring, the same empty primary result is classified as |
Source: #99913 Co-authored-by: jincheng-xydt <[email protected]>
* fix(agents): harden LSP process failures Source: #100450 Co-authored-by: morluto <[email protected]> * fix(sandbox): report effective workspace layout Sources: #100435, #100439 Co-authored-by: Aniruddha Adak <[email protected]> Co-authored-by: ZengWen-DT <[email protected]> * fix(security): fail install checks on stream errors Source: #100413 Co-authored-by: 陈宪彪0668000387 <[email protected]> * fix(android): normalize all-day calendar events Source: #100032 Co-authored-by: NianJiuZst <[email protected]> * fix(ios): serialize push-to-talk lifecycle Source: #99942 Co-authored-by: NianJiuZst <[email protected]> * fix(talk): reject inherited provider names Source: #99849 Co-authored-by: zenglingbiao <[email protected]> * fix(android): stop voice capture in background Source: #99840 Co-authored-by: xialonglee <[email protected]> * fix(cron): preserve fallback result classification Source: #99913 Co-authored-by: jincheng-xydt <[email protected]> * fix(google): bound Vertex response decompression Source: #99812 Co-authored-by: 黄剑雄0668001315 <[email protected]> * fix(plugins): report malformed discovery JSON Source: #99892 Co-authored-by: 陈宪彪0668000387 <[email protected]> * test(sandbox): configure non-default workspace fixture * test: fix small-fix batch validation --------- Co-authored-by: morluto <[email protected]> Co-authored-by: ZengWen-DT <[email protected]> Co-authored-by: 陈宪彪0668000387 <[email protected]> Co-authored-by: NianJiuZst <[email protected]> Co-authored-by: zenglingbiao <[email protected]> Co-authored-by: xialonglee <[email protected]> Co-authored-by: jincheng-xydt <[email protected]> Co-authored-by: 黄剑雄0668001315 <[email protected]>
|
Thanks @jincheng-xydt — your isolated cron fallback diagnosis was incorporated into #100483, landed as aaf5ab9. The landed version injects the canonical result classifier and exhaustion merge into the isolated fallback runtime, with wiring and empty-success regression coverage. Contributor credit is preserved. Closing this superseded PR. |
* fix(agents): harden LSP process failures Source: openclaw#100450 Co-authored-by: morluto <[email protected]> * fix(sandbox): report effective workspace layout Sources: openclaw#100435, openclaw#100439 Co-authored-by: Aniruddha Adak <[email protected]> Co-authored-by: ZengWen-DT <[email protected]> * fix(security): fail install checks on stream errors Source: openclaw#100413 Co-authored-by: 陈宪彪0668000387 <[email protected]> * fix(android): normalize all-day calendar events Source: openclaw#100032 Co-authored-by: NianJiuZst <[email protected]> * fix(ios): serialize push-to-talk lifecycle Source: openclaw#99942 Co-authored-by: NianJiuZst <[email protected]> * fix(talk): reject inherited provider names Source: openclaw#99849 Co-authored-by: zenglingbiao <[email protected]> * fix(android): stop voice capture in background Source: openclaw#99840 Co-authored-by: xialonglee <[email protected]> * fix(cron): preserve fallback result classification Source: openclaw#99913 Co-authored-by: jincheng-xydt <[email protected]> * fix(google): bound Vertex response decompression Source: openclaw#99812 Co-authored-by: 黄剑雄0668001315 <[email protected]> * fix(plugins): report malformed discovery JSON Source: openclaw#99892 Co-authored-by: 陈宪彪0668000387 <[email protected]> * test(sandbox): configure non-default workspace fixture * test: fix small-fix batch validation --------- Co-authored-by: morluto <[email protected]> Co-authored-by: ZengWen-DT <[email protected]> Co-authored-by: 陈宪彪0668000387 <[email protected]> Co-authored-by: NianJiuZst <[email protected]> Co-authored-by: zenglingbiao <[email protected]> Co-authored-by: xialonglee <[email protected]> Co-authored-by: jincheng-xydt <[email protected]> Co-authored-by: 黄剑雄0668001315 <[email protected]>
What Problem This Solves
Fixes #97115.
Isolated cron runs already use
runWithModelFallback, but they did not pass the embedded runner's result fallback classifier or exhausted-result merge helper. That meant zero-token/empty terminal "success" results could be treated as successful cron turns instead of moving to the configured fallback chain, and exhausted fallback summaries could lose the richer embedded result.Why This Change Was Made
The embedded agent path already has the canonical fallback classifier and exhausted-result merge behavior. This change wires those same helpers through the isolated cron runtime boundary into
createCronPromptExecutorso cron fallback behavior matches normal embedded agent fallback behavior without adding a second classifier.User Impact
Cron agent runs that receive empty/reasoning-only/planning-only terminal results can now continue to configured fallback models instead of silently completing with no useful message. When every fallback is exhausted, cron keeps the embedded runner's richer terminal summary instead of replacing it with a weaker generic result.
Evidence
node scripts/run-vitest.mjs src/cron/isolated-agent/run.payload-fallbacks.test.ts --reporter=verbose— 7 passednode scripts/run-vitest.mjs src/cron/isolated-agent/run*.test.ts --reporter=verbose— 21 files / 198 tests passednode scripts/run-vitest.mjs src/agents/outcome-fallback-runtime-contract.test.ts --reporter=verbose— 10 passednode scripts/run-vitest.mjs src/agents/model-fallback.test.ts --reporter=verbose— 90 passednode scripts/run-oxlint.mjs src/cron/isolated-agent/run-execution.runtime.ts src/cron/isolated-agent/run-executor.ts src/cron/isolated-agent/run.test-harness.ts src/cron/isolated-agent/run.payload-fallbacks.test.tsgit diff --checkReal Behavior Proof
Loopback cron fallback proof was run locally with the PR applied. It uses real
runWithModelFallback,classifyEmbeddedAgentRunResultForModelFallback, andmergeEmbeddedAgentRunResultForModelFallbackExhaustion, with a loopback cron-shaped run function. No external provider, API key, account id, phone number, endpoint, or private path is used. Synthetic run/session identifiers are redacted.Command:
Observed output: