openclaw - ✅(Solved) Fix [Bug]: CLI JSONL fallback parser drops final-answer semantics and can surface commentary instead [3 pull requests, 1 comments, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#59918Fetched 2026-04-08 02:38:49
View on GitHub
Comments
1
Participants
1
Timeline
4
Reactions
0
Author
Participants
Timeline (top)
cross-referenced ×3commented ×1

In a fallback run using an OpenAI/Codex-style CLI backend with output: "jsonl", OpenClaw can surface commentary/intermediate text instead of the terminal answer.

This looks adjacent to the broader “text between tool calls leaks to messaging channels” issue family, but narrower: in the captured fallback run, the JSONL stream already contained explicit phase markers plus a terminal task_complete.last_agent_message. The failure appears to be that the CLI JSONL parser loses those semantics and collapses the wrong text into the outbound reply.

Root Cause

In a fallback run using an OpenAI/Codex-style CLI backend with output: "jsonl", OpenClaw can surface commentary/intermediate text instead of the terminal answer.

This looks adjacent to the broader “text between tool calls leaks to messaging channels” issue family, but narrower: in the captured fallback run, the JSONL stream already contained explicit phase markers plus a terminal task_complete.last_agent_message. The failure appears to be that the CLI JSONL parser loses those semantics and collapses the wrong text into the outbound reply.

Fix Action

Fix / Workaround

Happy to test a patch build if maintainers want a real-world confirmation case.

PR fix notes

PR #59920: [codex] prefer terminal reply fields in CLI JSONL parser

Description (problem / solution / changelog)

Summary

  • Problem: the CLI JSONL parser only special-cases Claude type:"result" events and otherwise falls back to generic text collection, so OpenAI/Codex-style fallback runs can lose terminal reply semantics.
  • Why it matters: in channel-visible fallback paths, commentary/intermediate text can be surfaced instead of the actual final answer even when the JSONL stream already contains phase:"final_answer" and task_complete.last_agent_message.
  • What changed: parseCliJsonl() now prefers task_complete.last_agent_message, then assistant messages tagged phase:"final_answer", and skips commentary-phase generic item text.
  • What did NOT change (scope boundary): Claude CLI handling is unchanged, no dispatch/channel code changed, and no provider failover logic changed.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

  • Closes #59918
  • Related #25592
  • This PR fixes a bug or regression

Root Cause / Regression History (if applicable)

  • Root cause: parseCliJsonl() was written around Claude type:"result" lines plus a generic parsed.item.text fallback, but it did not understand newer OpenAI/Codex-style JSONL terminal fields.
  • Missing detection / guardrail: there was no parser preference for task_complete.last_agent_message or phase:"final_answer", and no guard against treating commentary item text as the outbound reply.
  • Prior context (git blame, prior PR, issue, or refactor if known): the current behavior is discussed in #59918 as a narrower parser-path issue adjacent to the broader channel-leak family in #25592.
  • Why this regressed now: unknown as a specific regression point; this appears more like a compatibility gap exposed by fallback runs that emit richer JSONL event shapes.
  • If unknown, what was ruled out: this fix does not depend on channel dispatching, failover selection, or Claude stream-json parsing.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: src/agents/cli-output.test.ts
  • Scenario the test should lock in: when JSONL contains commentary, final_answer, and task_complete, the parser returns the terminal answer; when only final_answer is present, it wins over commentary text.
  • Why this is the smallest reliable guardrail: the bug lives entirely inside the JSONL parsing function and can be reproduced with synthetic line fixtures without needing a live provider or channel.
  • Existing test that already covers this (if any): existing Claude result tests in src/agents/cli-output.test.ts cover the Claude-specific path and remain unchanged.
  • If no new test is added, why not: N/A

User-visible / Behavior Changes

  • OpenAI/Codex-style CLI fallback runs now prefer terminal reply fields instead of surfacing commentary when both are present in JSONL.
  • Commentary-only generic item text is no longer treated as the final reply in this parser path.

Diagram (if applicable)

Before:
CLI JSONL -> generic text collection -> commentary can win -> user sees wrong reply

After:
CLI JSONL -> task_complete / final_answer preferred -> terminal answer wins -> user sees final reply

Security Impact (required)

  • New permissions/capabilities? No
  • Secrets/tokens handling changed? No
  • New/changed network calls? No
  • Command/tool execution surface changed? No
  • Data access scope changed? No
  • If any Yes, explain risk + mitigation: N/A

Repro + Verification

Environment

  • OS: Linux (local contributor checkout)
  • Runtime/container: Node.js + pnpm
  • Model/provider: parser coverage for OpenAI/Codex-style CLI JSONL output; Claude path rechecked via existing tests
  • Integration/channel (if any): N/A for unit verification
  • Relevant config (redacted): CLI backend output: "jsonl"

Steps

  1. Feed parseCliJsonl() a JSONL stream containing commentary events plus a terminal task_complete.last_agent_message.
  2. Feed parseCliJsonl() a JSONL stream containing commentary plus assistant phase:"final_answer" content.
  3. Run the targeted parser tests.

Expected

  • Terminal answer fields win over commentary.
  • Claude JSONL result handling still passes unchanged.

Actual

  • Verified with targeted tests after the patch.

Evidence

Attach at least one:

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Human Verification (required)

  • Verified scenarios: pnpm exec vitest run src/agents/cli-output.test.ts src/agents/cli-backends.test.ts
  • Edge cases checked: existing Claude stream-json tests still pass; task_complete outranks final_answer; final_answer outranks commentary; commentary item.text is ignored.
  • What you did not verify: I did not run a live WhatsApp/Telegram fallback end-to-end against a real CLI provider from this branch.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

Compatibility / Migration

  • Backward compatible? Yes
  • Config/env changes? No
  • Migration needed? No
  • If yes, exact upgrade steps: N/A

Risks and Mitigations

  • Risk: a non-Claude JSONL backend could intentionally rely on commentary-phase item.text as the only final output.
    • Mitigation: the parser now only skips explicit commentary phase text and prefers explicit terminal fields; generic non-commentary item.text fallback remains intact.

Changed files

  • src/agents/cli-output.test.ts (modified, +87/-0)
  • src/agents/cli-output.ts (modified, +65/-1)

PR #61463: fix(agents,gateway): phase-aware assistant text extraction — suppress OpenAI commentary leaks in sessions-helpers, TUI, and REST history

Description (problem / solution / changelog)

What this fixes (plain English)

Several places in the codebase that display assistant text were not aware of the phase system (commentary vs. final answer). This meant internal "thinking out loud" commentary could leak into user-visible surfaces like the TUI and HTTP/SSE session history endpoints. This PR makes those surfaces phase-aware, and hardens heartbeat session resolution against subagent key leaks.

Technical details

Follow-up to #59643 and #59150, which fixed phase separation in the core WS path. Post-merge audit found adjacent surfaces still using phase-blind extraction.

Surfaces fixed:

  • src/tui/tui-formatters.ts — assistant text extraction now uses extractAssistantVisibleText() to prefer final_answer over commentary phase blocks
  • src/infra/heartbeat-runner.ts — heartbeat session resolution now rejects subagent session keys, falling back to the main session key instead of leaking into subagent scopes
  • src/gateway/sessions-history-http.test.ts — regression test: REST history applies chat.history sanitization (strips NO_REPLY messages, preserves phase blocks)
  • src/tui/tui-formatters.test.ts — regression test: mixed commentary + final_answer blocks extract only the visible final answer

Explicitly deferred: extractAssistantTextForSilentCheck and buffered delta/final rendering — lower-confidence, more behaviorally sensitive.

Related

  • Follow-up to #59643 and #59150
  • Follow-up issues: #61474, #61475, #61476, #61477, #61478
  • Companion PRs: #61529, #61528, #61527
  • Related PRs: #61855, #61816

Test plan

  • 27/27 TUI formatter tests pass
  • Regression test for mixed commentary + final_answer in TUI extraction
  • HTTP history regression test (REST path shares chat.history sanitization, strips NO_REPLY messages)
  • SSE seq validation for NO_REPLY message stripping
  • sessions-history-http gateway integration tests have 2 pre-existing infra failures (also fail on upstream/main)

Changed files

  • CHANGELOG.md (modified, +1/-0)
  • src/infra/heartbeat-runner.subagent-session-guard.test.ts (added, +72/-0)
  • src/infra/heartbeat-runner.ts (modified, +24/-17)
  • src/tui/tui-formatters.test.ts (modified, +20/-0)
  • src/tui/tui-formatters.ts (modified, +25/-0)

PR #61481: fix(agents): harden OpenAI phase-aware visible text — suppress commentary partials, prevent empty final_answer fallback leak

Description (problem / solution / changelog)

Summary

  • fix phase-aware visible text extraction so an explicit final_answer block never falls back to commentary or legacy unphased text when it sanitizes to empty
  • suppress all commentary-phase partial streaming output regardless of whether extracted visible text is non-empty
  • keep session-history HTTP/SSE sanitization aligned with the hardened chat history path
  • add regression tests covering both leak paths and the session-history follow-through

Context

This hardens the merged #59643 behavior against two P1 leaks:

  • fixes #61474
  • fixes #61475

Related issues / bug family

  • related to #25592
  • related to #59536
  • related to #59918
  • related to #44213
  • related to #49438
  • related to #53960

Parent / sibling PRs

  • parent: #59643 — core phase-separation fix (merged)
  • sibling: #61463 — phase-aware extraction in sessions-helpers, TUI, and history paths

Remaining follow-ups from the same adversarial review

  • #61476 — replay splitting corrupts phase on mixed messages
  • #61477 — late-map buffering gates on key existence, not phase validity
  • #61478 — function-call replay silently loses malformed arguments

Related open PRs

  • #59920 — prefer terminal reply fields in CLI JSONL parser
  • #61151 — drop partialJson streaming artifacts from session history
  • #61337 — disable OpenAI tool-use pairing repair

Testing

  • npm exec -- node --no-maglev ./node_modules/vitest/vitest.mjs run --config vitest.config.ts src/agents/pi-embedded-utils.test.ts src/agents/pi-embedded-subscribe.handlers.messages.test.ts
  • npm exec -- node --no-maglev ./node_modules/vitest/vitest.mjs run --config vitest.config.ts src/gateway/sessions-history-http.test.ts

Changed files

  • .agents/skills/openclaw-parallels-smoke/SKILL.md (modified, +13/-0)
  • .agents/skills/openclaw-qa-testing/SKILL.md (added, +86/-0)
  • .agents/skills/openclaw-qa-testing/agents/openai.yaml (added, +4/-0)
  • .github/labeler.yml (modified, +4/-0)
  • .github/workflows/ci.yml (modified, +7/-1)
  • .github/workflows/control-ui-locale-refresh.yml (modified, +2/-2)
  • .github/workflows/openclaw-npm-release.yml (modified, +1/-1)
  • CHANGELOG.md (modified, +40/-12)
  • appcast.xml (modified, +248/-116)
  • apps/android/app/build.gradle.kts (modified, +2/-2)
  • apps/ios/Config/Version.xcconfig (modified, +3/-3)
  • apps/macos/Sources/OpenClaw/Resources/Info.plist (modified, +2/-2)
  • apps/macos/Sources/OpenClawProtocol/GatewayModels.swift (modified, +14/-0)
  • apps/shared/OpenClawKit/Sources/OpenClawKit/Resources/tool-display.json (modified, +23/-0)
  • apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift (modified, +14/-0)
  • docs/.generated/config-baseline.sha256 (modified, +4/-4)
  • docs/.generated/plugin-sdk-api-baseline.sha256 (modified, +2/-2)
  • docs/automation/tasks.md (modified, +5/-0)
  • docs/channels/discord.md (modified, +1/-1)
  • docs/channels/matrix.md (modified, +29/-5)
  • docs/cli/memory.md (modified, +43/-15)
  • docs/cli/update.md (modified, +3/-1)
  • docs/concepts/dreaming.md (modified, +121/-194)
  • docs/concepts/memory-qmd.md (modified, +17/-1)
  • docs/concepts/memory-search.md (modified, +9/-8)
  • docs/concepts/memory.md (modified, +12/-8)
  • docs/concepts/model-providers.md (modified, +2/-0)
  • docs/concepts/models.md (modified, +2/-0)
  • docs/docs.json (modified, +8/-1)
  • docs/gateway/configuration-reference.md (modified, +31/-12)
  • docs/help/faq.md (modified, +36/-0)
  • docs/help/testing.md (modified, +22/-0)
  • docs/install/updating.md (modified, +1/-0)
  • docs/plugins/architecture.md (modified, +1/-0)
  • docs/plugins/building-plugins.md (modified, +1/-0)
  • docs/plugins/manifest.md (modified, +76/-30)
  • docs/plugins/sdk-migration.md (modified, +11/-1)
  • docs/plugins/sdk-overview.md (modified, +22/-9)
  • docs/providers/bedrock-mantle.md (modified, +20/-7)
  • docs/providers/bedrock.md (modified, +29/-0)
  • docs/providers/comfy.md (added, +201/-0)
  • docs/providers/fal.md (modified, +2/-1)
  • docs/providers/google.md (modified, +30/-0)
  • docs/providers/index.md (modified, +4/-0)
  • docs/providers/minimax.md (modified, +29/-0)
  • docs/providers/models.md (modified, +4/-0)
  • docs/providers/openai.md (modified, +10/-2)
  • docs/providers/runway.md (added, +63/-0)
  • docs/providers/vydra.md (added, +123/-0)
  • docs/reference/memory-config.md (modified, +117/-98)
  • docs/tools/image-generation.md (modified, +21/-17)
  • docs/tools/index.md (modified, +14/-7)
  • docs/tools/lobster.md (modified, +11/-9)
  • docs/tools/music-generation.md (added, +208/-0)
  • docs/tools/plugin.md (modified, +1/-0)
  • docs/tools/slash-commands.md (modified, +1/-1)
  • docs/tools/video-generation.md (modified, +147/-84)
  • docs/web/control-ui.md (modified, +4/-1)
  • docs/web/dashboard.md (modified, +2/-0)
  • dream-diary-preview-v2.html (added, +399/-0)
  • dream-diary-preview-v3.html (added, +323/-0)
  • extensions/amazon-bedrock-mantle/api.ts (modified, +2/-0)
  • extensions/amazon-bedrock-mantle/bedrock-token-generator.d.ts (added, +6/-0)
  • extensions/amazon-bedrock-mantle/discovery.test.ts (modified, +101/-3)
  • extensions/amazon-bedrock-mantle/discovery.ts (modified, +64/-13)
  • extensions/amazon-bedrock-mantle/package.json (modified, +3/-0)
  • extensions/bluebubbles/src/accounts.ts (modified, +5/-1)
  • extensions/bluebubbles/src/monitor.ts (modified, +1/-1)
  • extensions/browser/src/browser/chrome.default-browser.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/client-fetch.loopback-auth.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/control-service.plugin-disabled.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/profiles-service.test.ts (modified, +5/-8)
  • extensions/browser/src/browser/pw-tools-core.clamps-timeoutms-scrollintoview.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/pw-tools-core.interactions.batch.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/pw-tools-core.interactions.evaluate.abort.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/pw-tools-core.interactions.set-input-files.test.ts (modified, +2/-4)
  • extensions/browser/src/browser/pw-tools-core.last-file-chooser-arm-wins.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/pw-tools-core.screenshots-element-selector.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/routes/agent.existing-session.test.ts (modified, +3/-8)
  • extensions/browser/src/browser/routes/basic.existing-session.test.ts (modified, +3/-8)
  • extensions/browser/src/browser/server-context.existing-session.test.ts (modified, +3/-8)
  • extensions/browser/src/browser/server-context.hot-reload-profiles.test.ts (modified, +6/-12)
  • extensions/browser/src/browser/server-context.remote-profile-tab-ops.fallback.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/server-context.remote-profile-tab-ops.playwright.test.ts (modified, +2/-6)
  • extensions/browser/src/browser/server-lifecycle.test.ts (modified, +3/-8)
  • extensions/browser/src/browser/server.control-server.test-harness.ts (modified, +2/-1)
  • extensions/browser/src/browser/server.evaluate-disabled-does-not-block-storage.test.ts (modified, +3/-8)
  • extensions/browser/src/cli/browser-cli.test-support.ts (modified, +1/-1)
  • extensions/browser/src/cli/command-format.ts (modified, +1/-1)
  • extensions/browser/src/config/config.ts (modified, +1/-1)
  • extensions/browser/src/core-api.ts (modified, +25/-20)
  • extensions/browser/src/doctor-browser.ts (modified, +1/-1)
  • extensions/browser/src/gateway/auth.ts (modified, +1/-1)
  • extensions/browser/src/gateway/startup-auth.ts (modified, +1/-1)
  • extensions/browser/src/infra/errors.ts (modified, +1/-1)
  • extensions/browser/src/infra/fs-safe.ts (modified, +1/-1)
  • extensions/browser/src/infra/net/proxy-env.ts (modified, +1/-1)
  • extensions/browser/src/infra/net/ssrf.ts (modified, +1/-1)
  • extensions/browser/src/infra/path-guards.ts (modified, +1/-1)
  • extensions/browser/src/infra/ports.ts (modified, +1/-1)

Code Example

{"type":"event_msg","payload":{"type":"agent_message","phase":"commentary","message":"..."}}
{"type":"response_item","payload":{"type":"message","role":"assistant","phase":"commentary","content":[{"type":"output_text","text":"..."}]}}
{"type":"event_msg","payload":{"type":"agent_message","phase":"final_answer","message":"..."}}
{"type":"response_item","payload":{"type":"message","role":"assistant","phase":"final_answer","content":[{"type":"output_text","text":"..."}]}}
{"type":"event_msg","payload":{"type":"task_complete","last_agent_message":"..."}}
RAW_BUFFERClick to expand / collapse

Summary

In a fallback run using an OpenAI/Codex-style CLI backend with output: "jsonl", OpenClaw can surface commentary/intermediate text instead of the terminal answer.

This looks adjacent to the broader “text between tool calls leaks to messaging channels” issue family, but narrower: in the captured fallback run, the JSONL stream already contained explicit phase markers plus a terminal task_complete.last_agent_message. The failure appears to be that the CLI JSONL parser loses those semantics and collapses the wrong text into the outbound reply.

Why this seems distinct from #25592

#25592 and related reports describe intermediate assistant text leaking from normal multi-turn tool loops.

In this case, the captured fallback JSONL already distinguishes:

  • phase: "commentary"
  • phase: "final_answer"
  • terminal task_complete.last_agent_message

So the problem here seems to be later in the pipeline: the CLI JSONL parser for fallback delivery is not preferring the terminal fields and can therefore surface commentary instead of the final answer.

Verified on

  • OpenClaw 2026.4.2 (d74a122)
  • npm-installed build on macOS arm64
  • Channel: WhatsApp DM
  • Trigger path: primary model stalled after a tool result, then fallback switched to an OpenAI CLI backend configured with output: "jsonl"

Observed chain

  1. Primary model started normally and made one tool call.
  2. The tool result came back.
  3. The primary model then stalled and OpenClaw recorded LLM idle timeout (60s): no response from model.
  4. Fallback switched to an OpenAI CLI backend with output: "jsonl".
  5. The fallback run itself completed successfully.
  6. User-visible delivery surfaced commentary/intermediate text instead of the final answer.

Important evidence

The captured fallback JSONL already had a clean separation between commentary and final answer. Sanitized shape:

{"type":"event_msg","payload":{"type":"agent_message","phase":"commentary","message":"..."}}
{"type":"response_item","payload":{"type":"message","role":"assistant","phase":"commentary","content":[{"type":"output_text","text":"..."}]}}
{"type":"event_msg","payload":{"type":"agent_message","phase":"final_answer","message":"..."}}
{"type":"response_item","payload":{"type":"message","role":"assistant","phase":"final_answer","content":[{"type":"output_text","text":"..."}]}}
{"type":"event_msg","payload":{"type":"task_complete","last_agent_message":"..."}}

So the terminal answer was already present twice:

  • as an assistant message tagged phase: "final_answer"
  • as task_complete.last_agent_message

Current parser gap

In the shipped 2026.4.2 build, the CLI JSONL parsing path still appears to:

  • special-case Claude CLI type: "result" lines
  • otherwise fall back to collecting generic text from parsed items
  • not prefer task_complete.last_agent_message
  • not prefer assistant messages tagged phase: "final_answer"
  • not ignore phase: "commentary" for outbound user delivery

I realize that statement is based on inspection of the installed npm dist build rather than the TypeScript source tree, but it matches the observed runtime behavior on 2026.4.2.

Expected behavior

For JSONL-style CLI backends used as user-visible fallbacks:

  1. Prefer task_complete.last_agent_message when present.
  2. Otherwise prefer assistant messages explicitly tagged phase: "final_answer".
  3. Ignore phase: "commentary" for outbound user delivery.
  4. Preserve current Claude CLI handling separately if needed.

Related

  • Related to #25592, but narrower: this looks like phase-loss in the CLI fallback JSONL parser rather than generic inter-tool narration leakage.
  • #25659 is also related, but it targets streaming/block reply delivery for intermediate tool-call messages.
  • #57914 (replyMode: "tool-only") also does not solve this path; its author already noted that it does not fix commentary / raw-wire-format leaks.

Happy to test a patch build if maintainers want a real-world confirmation case.

extent analysis

TL;DR

Update the CLI JSONL parser to prefer task_complete.last_agent_message and phase: "final_answer" messages for outbound user delivery.

Guidance

  • Review the current parser implementation to identify why it's not preferring the terminal fields (task_complete.last_agent_message and phase: "final_answer") over commentary text.
  • Modify the parser to ignore phase: "commentary" messages for outbound user delivery.
  • Consider adding a special case for Claude CLI type: "result" lines to preserve current behavior.
  • Test the updated parser with the provided sanitized JSONL shape to ensure correct functionality.

Example

No code snippet is provided due to the lack of explicit implementation details in the issue.

Notes

The solution assumes that the issue is solely related to the CLI JSONL parser and not a more complex problem involving multiple components.

Recommendation

Apply a workaround by updating the CLI JSONL parser to correctly handle the terminal fields and ignore commentary text, as this is a more targeted solution than upgrading to a potentially non-existent fixed version.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

For JSONL-style CLI backends used as user-visible fallbacks:

  1. Prefer task_complete.last_agent_message when present.
  2. Otherwise prefer assistant messages explicitly tagged phase: "final_answer".
  3. Ignore phase: "commentary" for outbound user delivery.
  4. Preserve current Claude CLI handling separately if needed.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - ✅(Solved) Fix [Bug]: CLI JSONL fallback parser drops final-answer semantics and can surface commentary instead [3 pull requests, 1 comments, 1 participants]