Skip to content

fix: handle Claude CLI synthetic placeholders#90799

Merged
shakkernerd merged 1 commit into
openclaw:mainfrom
wangwllu:fix/90789-claude-cli-synthetic-placeholder
Jul 17, 2026
Merged

fix: handle Claude CLI synthetic placeholders#90799
shakkernerd merged 1 commit into
openclaw:mainfrom
wangwllu:fix/90789-claude-cli-synthetic-placeholder

Conversation

@wangwllu

@wangwllu wangwllu commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes #99131.

Related #90789.

Claude CLI resumed processes can emit an exact synthetic assistant placeholder followed by an empty result, then continue the same prompt and emit the real response later. OpenClaw previously finalized the turn on that first empty result, ignored the later stdout, and cleared the reused session through the ordinary empty-response path.

What Changed

  • Recognize only Claude's exact synthetic placeholder records in the Claude live-session owner.
  • Apply continuation grace only to the first turn of a newly created resumed process; fresh processes and already-running live sessions keep existing behavior.
  • Defer the following empty success result for at most 30 seconds, bounded by the configured no-output timeout while the overall turn timeout remains active.
  • Cancel the grace as soon as later stdout arrives and continue the same process and turn so the real result can be delivered.
  • If no continuation arrives, expire through the existing empty-response, fallback, and session-clear path.
  • Pause and rearm the no-output watchdog around the grace window so short configured timeouts cannot race the deferred result.

Regression Coverage

The focused suite covers:

  • synthetic placeholder followed by a real result
  • terminal placeholder grace expiry
  • short no-output timeout ordering
  • fresh and warm live-process behavior
  • exact-marker matching and user-message lookalikes
  • non-empty results and explicit error results
  • existing background-task result deferral

Evidence

  • Blacksmith Testbox tbx_01kxpnrhyje1er0j8afmjpnvwt: pnpm test src/agents/cli-runner/claude-live-session.background-tasks.test.ts — 14/14 passed on Linux/Node 24.
  • Same Testbox: pnpm check:changed — formatting, lint, typecheck, dependency, boundary, and changed-surface gates passed.
  • Blacksmith Testbox tbx_01kxppc7c4d4mfdrek1wxexm1y: pnpm test:docker:live-cli-backend:claude-subscription — release-shaped Docker build, Claude Code 2.1.211 OAuth probe, and live resume pipeline passed.
  • Auto-review: clean after resolving the overloaded-sentinel and short-timeout race findings.
  • Rebased onto current origin/main; git range-diff marked the verified patch unchanged.

The live subscription lane cannot deterministically force Claude's internal queued-notification placeholder. The exact captured JSONL lifecycle and timer behavior are covered by the focused regression suite; the live lane proves the ordinary Claude subscription resume path remains intact.

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 16, 2026, 8:42 AM ET / 12:42 UTC.

Summary
Detects two Claude CLI <synthetic> placeholder messages, propagates that state through CLI run metadata, and classifies placeholder-only turns as fallback-worthy empty_result outcomes.

PR surface: Source +97, Tests +383. Total +480 across 7 files.

Reproducibility: no. live current-main reproduction was run here, but the parser path, captured JSONL fixture, and repeated timestamped logs in #99131 provide a high-confidence source reproduction of both the placeholder and the late-answer hazard.

Review metrics: 2 noteworthy metrics.

  • Fallback classifications: 1 added. A new dependency-specific terminal outcome now enters the existing model/provider fallback pipeline.
  • Terminal metadata kinds: 1 added. The new run-result state crosses parser, runner, and fallback-classifier boundaries and therefore needs one consistent lifecycle meaning.

Stored data model
Persistent data-model change detected: serialized state: src/agents/cli-output.test.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #90789
Summary: This PR is the direct candidate for the silent-placeholder report; the later reused-session report shares the placeholder but adds a distinct lifecycle consequence that the current fallback policy must account for.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🦐 gold shrimp
Result: blocked until real behavior proof from a real setup is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P2] Gate fallback on proven terminal lifecycle state and add regressions for a late real result after the synthetic marker.
  • [P1] Provide redacted after-fix proof from an actual reusable Claude CLI session showing delivery and session behavior.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The TSX fixture harness and mocked runner test do not exercise an actual Claude CLI reusable session or user delivery; add redacted live terminal/log proof covering placeholder-only and placeholder-then-late-real sequences, update the PR body, and request @clawsweeper re-review if automatic review does not run.

Risk before merge

  • [P2] A reused Claude CLI session can emit this placeholder before its real answer; starting fallback immediately can race the original process, duplicate work, or discard the eventual response.
  • [P1] The recognized strings and their lifecycle meaning are based on captured behavior rather than a verified upstream Claude CLI contract, so future or context-dependent uses may not share one recovery policy.
  • [P2] No after-fix proof exercises an actual Claude CLI reusable session, session binding, fallback decision, and resulting user delivery together.

Maintainer options:

  1. Prove terminality before fallback (recommended)
    Revise the lifecycle so fallback starts only when the Claude turn cannot still produce a real answer, then cover both terminal and late-result sequences.
  2. Own the immediate-fallback tradeoff
    Merge only with explicit owner approval and real reusable-session proof showing that late output, duplicate delivery, and session cleanup remain safe.
  3. Pause for the session-lifecycle fix
    Keep this PR open or narrow it to metadata until the overlapping lifecycle behavior in [Bug]: Claude CLI reused session emits synthetic empty result before real response, causing OpenClaw session discard and background task cascade #99131 has one canonical recovery design.

Next step before merge

  • [P1] An owner must choose the terminal-versus-continuation policy and require live reusable-session proof before the branch can safely merge; this is not a mechanical repair decision.

Maintainer decision needed

  • Question: Should a recognized Claude CLI synthetic placeholder immediately terminate the OpenClaw attempt and start model fallback, or should reusable sessions continue waiting for a later real result from the same process?
  • Rationale: The same dependency-emitted marker is observed in both terminal no-output cases and nonterminal reused-session cases, so code inspection cannot safely choose one recovery policy without owner intent and live lifecycle proof.
  • Likely owner: steipete — The adjacent merged parser rewrite is the strongest current-main policy precedent for empty Claude CLI results.
  • Options:

Security
Cleared: The diff changes internal CLI parsing, metadata, and fallback classification without adding dependencies, downloaded code, broader permissions, secret access, or package-resolution changes.

Review findings

  • [P1] Do not fallback before the Claude turn is terminal — src/agents/embedded-agent-runner/result-fallback-classifier.ts:256-266
Review details

Best possible solution:

Preserve the placeholder as parser metadata, but trigger fallback only after the owning CLI lifecycle proves the turn is terminal; reusable sessions should keep reading or enter a dedicated continuation state, with regressions for both synthetic-only termination and synthetic-then-late-real output.

Do we have a high-confidence way to reproduce the issue?

No live current-main reproduction was run here, but the parser path, captured JSONL fixture, and repeated timestamped logs in #99131 provide a high-confidence source reproduction of both the placeholder and the late-answer hazard.

Is this the best way to solve the issue?

No. Detecting the placeholder is appropriate, but treating it alone as proof of terminal failure is broader than the observed dependency behavior; terminal-state gating is the safer fix.

Full review comments:

Overall correctness: patch is incorrect
Overall confidence: 0.94

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 2848acbbaa18.

Label changes

Label changes:

  • add P1: The affected path can suppress a real channel reply or race continuing Claude session work for active users.
  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦐 gold shrimp. Replaced prior rating: 🐚 platinum hermit.
  • remove proof: sufficient: Current real behavior proof status is mock_only, not sufficient.
  • remove P2: Current review triage priority is P1, so this older priority label is no longer current.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🧂 unranked krab, so this older rating label is no longer current.

Label justifications:

  • P1: The affected path can suppress a real channel reply or race continuing Claude session work for active users.
  • merge-risk: 🚨 message-delivery: Immediate fallback can lose the original late answer or produce competing replies when the Claude process continues.
  • merge-risk: 🚨 session-state: The classification influences reused-session completion and can overlap with session clearing, preservation, or continued background work.
  • merge-risk: 🚨 auth-provider: The new terminal classification can reroute a Claude CLI turn through configured model/provider fallback based on an upstream-generated marker.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦐 gold shrimp. Replaced prior rating: 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Needs real behavior proof before merge: The TSX fixture harness and mocked runner test do not exercise an actual Claude CLI reusable session or user delivery; add redacted live terminal/log proof covering placeholder-only and placeholder-then-late-real sequences, update the PR body, and request @clawsweeper re-review if automatic review does not run.
Evidence reviewed

PR surface:

Source +97, Tests +383. Total +480 across 7 files.

View PR surface stats
Area Files Added Removed Net
Source 4 115 18 +97
Tests 3 383 0 +383
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 7 498 18 +480

What I checked:

Likely related people:

  • steipete: The merged fix(agents): preserve streamed assistant text when Claude CLI result event is empty #90450 describes a maintainer rewrite of the same Claude CLI empty-result parser path and is the closest current-main policy precedent. (role: merger and adjacent parser owner; confidence: high; commits: 3c2316c43cd2; files: src/agents/cli-output.ts, src/agents/cli-output.test.ts)
  • totobusnello: Authored the merged streamed-text/empty-result work that now owns the parser state this PR extends. (role: introduced adjacent behavior; confidence: high; commits: 3c2316c43cd2; files: src/agents/cli-output.ts, src/agents/cli-output.test.ts)
  • ai-hpc: Authored merged CLI resume-timeout reliability work in the same runner lifecycle and reused-session area. (role: recent CLI reliability contributor; confidence: medium; commits: 0328ca53cded; files: src/agents/cli-runner.ts, src/agents/cli-runner/reliability.ts)
  • joshavant: Authored merged work affecting synthetic CLI continuation delivery and runPreparedCliAgent context behavior. (role: adjacent delivery-semantics contributor; confidence: medium; commits: 584fa3215c19; files: src/agents/cli-runner.ts, src/auto-reply/reply/agent-runner-utils.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

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 keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (2 earlier review cycles)
  • reviewed 2026-07-03T00:55:34.446Z sha b8128be :: needs maintainer review before merge. :: none
  • reviewed 2026-07-16T12:02:16.585Z sha 9912196 :: found issues before merge. :: [P1] Handle intermediate live-session results before fallback

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jun 6, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. labels Jun 6, 2026
@wangwllu
wangwllu marked this pull request as ready for review June 6, 2026 01:51
@wangwllu

wangwllu commented Jun 6, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Updated since prior review (which timed out before completing):

  1. Reachability fix: executeCliAttempt previously threw FailoverError(empty_response) on every empty-text turn, swallowing the syntheticPlaceholder marker before buildCliRunResult could attach terminalReplyKind. The classifier hook was therefore unreachable from runPreparedCliAgent — the very path Telegram/auto-reply dispatch take. Fixed in 8d6f1a7 by skipping the throw when output.syntheticPlaceholder === true.
  2. Integration test: new src/agents/cli-runner.synthetic-placeholder.test.ts drives runPreparedCliAgent end-to-end with a synthetic-placeholder CLI output and asserts both metadata propagation (terminalReplyKind) and the classifier verdict (empty_result). Addresses the prior P1 reachability feedback.
  3. Real behavior proof: PR body now contains a populated ## Real behavior proof section with side-by-side baseline (upstream/main) vs candidate (PR head) terminal output captured from pnpm exec tsx running against the real source tree, plus the integration test live output. The Mantis 'agentic native Telegram proof' was capture-infrastructure-blocked (mock provider does not yet emit <synthetic> stream-json); that is documented as an out-of-scope follow-up.

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 6, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 6, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@wangwllu

wangwllu commented Jun 6, 2026

Copy link
Copy Markdown
Contributor Author

Ready for maintainer review

ClawSweeper verdict: 🐚 platinum hermit (overall + patch quality) / 🦞 diamond lobster (proof) — "ready for maintainer review", no rank-up moves outstanding.

The current head cd1b3211 applies the patch that classifies Claude CLI <synthetic> no-output JSONL records as empty_result so the model-fallback path catches them instead of silently dropping the turn.

Remaining gates are both maintainer-side:

[P2] Merging changes delivery recovery semantics for a narrow Claude CLI no-output case: known <synthetic> placeholders become fallback-worthy empty results instead of generic empty CLI failures.
[P1] Native Telegram proof remains unavailable until qa-lab can emit this Claude stream-json shape; the supplied proof validates the runtime parser/classifier path rather than a full transport recording.

ClawSweeper's recommended landing option is "accept that exact Claude CLI synthetic placeholders with no visible assistant text should route through existing model fallback as empty results", which matches the PR's narrow scope. The qa-lab transport-fixture work is a separate proof gap that this PR can't unblock.

@jalehman / @steipete — pinging since you've recently reviewed and merged adjacent cli-runner.ts work. Happy to add any narrower regression case you'd like before merge.

@wangwllu

Copy link
Copy Markdown
Contributor Author

Friendly bump — this has been sitting since 2026-06-06 with all gates green and no maintainer review yet.

State at head cd1b3211:

  • mergeStateStatus: CLEAN, mergeable: MERGEABLE, no conflicts
  • All required CI checks passing (Real behavior proof ✅)
  • ClawSweeper: 🐚 platinum hermit (overall + patch quality), 🦞 diamond lobster (proof) — "ready for maintainer review", no rank-up moves outstanding
  • Scope is narrow: +83 source / +303 tests across 7 files, only the Claude CLI <synthetic> no-output JSONL path

@vincentkoc / @joshavant — pinging since you've recently merged adjacent src/agents/cli-runner.ts work (#90912, #88161). Happy to scope down further or add any regression case you'd like before merge.

@openclaw-barnacle openclaw-barnacle Bot added scripts Repository scripts docker Docker and sandbox tooling channel: qqbot extensions: copilot size: XL and removed size: L labels Jun 19, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. labels Jun 19, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 20, 2026
@wangwllu

Copy link
Copy Markdown
Contributor Author

@shakkernerd could I ask you to take a look at this, or point me to the right owner?

It fixes a small Claude Code CLI runtime edge case: on timeout/wedge the runtime can emit a <synthetic> "No response requested" placeholder that OpenClaw doesn't recognize, so the agent turn ends silently with no reply to the user.

Asking you specifically because I noticed you recently worked on the adjacent CLI empty-response diagnostics path — same area as the main review surface here: cli-runner.ts / cli-output.ts.

CI is green and tests are included. The diff looks bigger than the bug because it bundles test coverage + some cleanup; the functional surface is really just those two files. Happy to rebase whenever it's useful for review/merge.

@clawsweeper clawsweeper Bot added status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 25, 2026
@wangwllu
wangwllu force-pushed the fix/90789-claude-cli-synthetic-placeholder branch from e8ac706 to 8706888 Compare June 26, 2026 09:00
@wangwllu

Copy link
Copy Markdown
Contributor Author

Rebased onto latest main and force-pushed a cleaned branch (8706888).

An earlier merge resolution had accidentally reverted an upstream repo-wide import-ordering autofix across ~100 files, which is what had turned this PR conflicting and inflated the diff to 107 files. That churn is gone — the PR is back to the intended 7-file diff (+387/−4) and MERGEABLE again.

The real review surface is unchanged:

  • src/agents/cli-output.ts — detect the Claude CLI <synthetic> "No response requested." placeholder, flag it instead of swallowing the turn
  • src/agents/cli-runner.ts — route flagged turns through the fallback classifier instead of throwing the generic empty-response failover
  • src/agents/embedded-agent-runner/result-fallback-classifier.ts + types.ts — classify it as empty_result
  • plus targeted parser/runner/classifier tests

Local verification on the rebuilt branch: tsgo:core clean, and the three affected test files pass (cli-output.test.ts, cli-runner.synthetic-placeholder.test.ts, result-fallback-classifier.test.ts — 70 tests). CI is re-running.

@wangwllu

wangwllu commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Updated this PR to address ClawSweeper's P2 ordering concern.

What changed at head eb2ab0a2:

  • Synthetic-placeholder fallback now only classifies empty_result after stronger terminal semantics are respected: committed delivery, hook_block, generic external failure, visible user-facing output, and fallback-safe incomplete_turn all keep their existing precedence.
  • Added regressions for:
    • synthetic-placeholder marker + non-empty finalAssistantVisibleText → no fallback
    • synthetic-placeholder marker + visible payload → no fallback
    • synthetic-placeholder marker + hook_block → no fallback
    • synthetic-placeholder marker + fallback-safe incomplete_turnincomplete_result with preservation metadata

Local verification:

  • node scripts/run-vitest.mjs src/agents/embedded-agent-runner/result-fallback-classifier.test.ts src/agents/cli-runner.synthetic-placeholder.test.ts src/agents/cli-output.test.ts — 74 tests passed
  • pnpm exec oxlint src/agents/embedded-agent-runner/result-fallback-classifier.ts src/agents/embedded-agent-runner/result-fallback-classifier.test.ts src/agents/cli-runner.ts src/agents/cli-runner.synthetic-placeholder.test.ts src/agents/cli-output.ts src/agents/cli-output.test.ts src/agents/embedded-agent-runner/types.ts — 0 warnings/errors
  • pnpm exec oxfmt --check src/agents/embedded-agent-runner/result-fallback-classifier.ts src/agents/embedded-agent-runner/result-fallback-classifier.test.ts src/agents/cli-runner.ts src/agents/cli-runner.synthetic-placeholder.test.ts src/agents/cli-output.ts src/agents/cli-output.test.ts src/agents/embedded-agent-runner/types.ts — clean
  • git diff --check — clean
  • Independent Oracle review of the final patch: OK, no blocking issues, safe to commit/push.

@wangwllu

wangwllu commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

Heads up on CI: the only failing check (CI / checks-node-compact-small-whole-2) is inherited main breakage, not from this PR.

  • It fails in test/scripts/render-maturity-docs.test.ts (maturity scorecard HTML): the renderer now emits maturity-summary-grid / 68%, while the test still asserts the old <span className="maturity-summary-value">67%</span>.
  • The same test fails with the identical assertion on main's own push CI — run 7fa26e088, job checks-node-core-tooling.
  • This PR's diff only touches src/agents/embedded-agent-runner/result-fallback-classifier.ts and its test, which cannot affect the maturity-docs renderer/test.

Head eb2ab0a2 is green on the relevant surface:

  • node scripts/run-vitest.mjs src/agents/embedded-agent-runner/result-fallback-classifier.test.ts src/agents/cli-runner.synthetic-placeholder.test.ts src/agents/cli-output.test.ts — 74 tests passed
  • oxlint / oxfmt --check on the 7 touched-area files — clean
  • git diff --check — clean

The Real behavior proof / auto-response CANCELLED entries are superseded older runs. I'll rerun / rebase once main is green again on the tooling shard.

@shakkernerd

Copy link
Copy Markdown
Member

Merged using squash.

What changed after review:

Verification:

  • Rebased/refreshed onto current origin/main before pushing.
  • Blacksmith Testbox tbx_01kxpnrhyje1er0j8afmjpnvwt: focused 14-test suite and pnpm check:changed passed.
  • Blacksmith Testbox tbx_01kxppc7c4d4mfdrek1wxexm1y: live Claude subscription Docker resume pipeline passed with Claude Code 2.1.211.
  • Auto-review: clean after accepted lifecycle and timer-race findings were resolved.
  • GitHub checks: full CI green on the patch-identical pre-rebase head; exact-head real behavior proof green; no required checks configured.

Landed on main:

Thanks @wangwllu!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Claude CLI reused session emits synthetic empty result before real response, causing OpenClaw session discard and background task cascade

2 participants