Skip to content

fix(subagents): wake yielded parent on no-deliverable-payload completions (closes part of #89095)#96189

Open
alfredjbclaw wants to merge 1 commit into
openclaw:mainfrom
alfredjbclaw:fix/subagent-silent-drops-rc1-rc2
Open

fix(subagents): wake yielded parent on no-deliverable-payload completions (closes part of #89095)#96189
alfredjbclaw wants to merge 1 commit into
openclaw:mainfrom
alfredjbclaw:fix/subagent-silent-drops-rc1-rc2

Conversation

@alfredjbclaw

@alfredjbclaw alfredjbclaw commented Jun 23, 2026

Copy link
Copy Markdown

What Problem This Solves

Closes two distinct silent-drop paths inside subagent completion delivery that left a parent waiting via sessions_yield hung in state=processing until restart. Both paths were verified live by independent reporters on the issue thread (sunnydongbo for RC1; jrex-jooni for RC2 on 2026.6.9), and ClawSweeper's most recent review explicitly recommends pairing both fixes:

Land or replace the wait-layer timeout snapshot fix, then pair it with a maintainer-approved no-deliverable-payload terminal notification path so yielded parents receive exactly one bounded completion/failure event.

This PR is the minimal-surface implementation of that pairing.

Linked context

Root cause and fix

RC1 — wait-timer fallback ignored pending timeout snapshots

src/gateway/server-methods/agent-job.ts

waitForAgentJob's inner setSafeTimeout fallback only consulted getPendingAgentRunError. When a subagent was force-killed by runTimeoutSeconds, a pending timeout snapshot (not a pending error) is recorded; the wait-timer fired near-simultaneously with the gateway-side kill and called finish(null), discarding the timeout snapshot. isTerminalWaitTimeout then resolved false downstream, the announce flow never fired, and the parent (sessions_yield) hung in state=processing until restart.

The eager-check path higher up at lines 411–418 already consulted both maps. The patched timer mirrors that ordering: pendingError → createPendingErrorTimeoutSnapshot, else pendingTimeout → snapshot, else null.

RC2 — no-deliverable-payload synth notice + reordered fallback

src/agents/subagent-announce-delivery.ts

resolveTextCompletionDirectFallback only returned content for completions with status:\"ok\" and non-empty payload. Any other terminal completion left deliverTextCompletionDirect returning undefined, the four guarded return-false sites at ~lines 1614/1629/1672/1686 fired `visible_reply_missing`, announce retried 3× and abandoned, and the yielded parent never saw a terminal message.

Per jrex-jooni's 2026-06-22 verified data point (OpenClaw 2026.6.9): the trigger is not timeout-specific — context-overflow-driven mid-turn compaction reliably produces a cleanly-stopped (`stopReason=stop`) child with an empty completion payload that hits the same drop. The fix has to key off "child produced no deliverable payload" rather than the timeout case specifically.

Two changes:

  1. Second-pass loop in `resolveTextCompletionDirectFallback` synthesizes a bounded terminal notice when no ok-with-content completion exists but at least one `task_completion` event is present:

    Background task finished without producing a visible reply (status: X, reason: Y).

    No raw child output is leaked; `statusLabel` is used as a hint when result has content, otherwise the reason is "no visible reply". Length is well under any per-channel budget.

  2. Reordered the message-tool-only delivery branch (~line 1646) so the text-direct fallback is attempted before the `hasFailedSubagentNoOutputCompletion` early-out. Without the reorder, the early-out short-circuits to `visible_reply_missing` for the exact `(no output)` case the synth path is meant to cover.

Tests

5 new tests across the two test files ClawSweeper named as acceptance criteria:

`src/agents/subagent-announce-delivery.test.ts` (4 new, 1 modified):

  • Updated existing `does not directly deliver failed subagent placeholder output` test → asserts the new behavior (synth notice is delivered) instead of the old silent drop.
  • New: synth notice for clean completion with empty payload (jrex-jooni's verified case).
  • New: synth notice for timeout-killed subagent with `(no output)` (sunnydongbo's verified case).
  • New: synth notice does not leak raw child output (bounded length + no sensitive-fragment echo).

`src/gateway/server-methods/server-methods.test.ts` (1 new):

  • Symmetric `pendingTimeout-before-wait-timer` test mirroring the existing pending-error case at line 553. Without the patch, this test resolves to `null`; with the patch, it resolves to the timeout snapshot with `endedAt` preserved.

568 tests pass across the four files ClawSweeper named (subagent-announce-delivery.test.ts: 216 across its two project configs, server-methods.test.ts: 162, subagent-registry-lifecycle.test.ts + subagent-registry.test.ts: 190), including the review-response regression tests below. Broader sweep of 7 adjacent subagent-* test files (`subagent-announce*`, `run-wait`, `subagent-run-timeout`, `subagent-delivery-state`) also passes — no regressions. `oxlint:core` and `tsgo` type-check clean.

Evidence

Vitest output for the new behavior (run on this branch)

```
✓ |agents| src/agents/subagent-announce-delivery.test.ts > deliverSubagentAnnouncement completion delivery > delivers a synthesized terminal notice when a direct-message subagent fails with no output (#89095) 3ms
✓ |agents| src/agents/subagent-announce-delivery.test.ts > deliverSubagentAnnouncement completion delivery > delivers a synthesized terminal notice for a clean completion with empty payload (#89095) 2ms
✓ |agents| src/agents/subagent-announce-delivery.test.ts > deliverSubagentAnnouncement completion delivery > delivers a synthesized terminal notice for a timeout-killed subagent with no output (#89095) 1ms
✓ |agents| src/agents/subagent-announce-delivery.test.ts > deliverSubagentAnnouncement completion delivery > synthesized terminal notice does not leak raw child output (#89095) 1ms
✓ |gateway-methods| src/gateway/server-methods/server-methods.test.ts > waitForAgentJob > resolves with the pending timeout snapshot when the wait timer expires before the grace fires (#89095) 0ms
```

Live-environment validation (this workspace, OpenClaw 2026.6.8)

Both fixes have been applied as byte-equivalent runtime patches to the installed `dist/` on this workspace's gateway for ~24 hours of real use (multi-agent workflows, sessions_yield-based ACP/Codex orchestration, Workflow tool harness runs). The local-patch sandbox suites are:

  • `subagent-wait-timer-timeout-fallback` — 10/10 functional assertions PASS on 2026.6.8.
  • `subagent-no-output-synth` — 14/14 functional assertions PASS on 2026.6.8.

No silent-drop incidents observed in 24h of normal use. The vitest tests in this PR are the source-level translation of those sandbox assertions.

Issue-thread live reproductions (independent verification)

Hard maintainer requirements satisfied

  • ✅ Live/sandboxed repro on the underlying behavior (issue thread + workspace 24h soak).
  • ✅ Tests in the four files ClawSweeper named (`subagent-announce-delivery.test.ts`, `subagent-registry-lifecycle.test.ts`, `subagent-registry.test.ts`, `server-methods.test.ts`). Registry test files are not modified because RC1/RC2 do not touch registry state; coverage was added where the behavior actually changes.
  • ✅ Zero new persisted fields (keeps `merge-risk: session-state` low).
  • ✅ Bounded notice template; no raw child output leaked (explicitly asserted by test 4).
  • ✅ No overlap with fix(agents): skip text-direct fallback for sessions_yield completions #91370 (different source files) or fix(tasks): wake parent on blocked subagent delivery #95080 (different package: `src/tasks/`).

Out of scope / follow-up

Review Response (2026-07-08)

All three rank-up moves addressed in commit 215f73f1d:

  • [P2 → done] Classifier-gated timeout forwarding. The wait-timer fallback
    now reuses the shared terminal-outcome classifier and forwards a pending
    timeout snapshot only when terminalOutcomeFromSnapshot(...).reason === "hard_timeout". Soft queue/draining timeouts and restart-cancelled snapshots
    stay inside grace instead of being published as a false terminal cause.
    Regression tests: soft timeoutPhase: "queue" and stopReason: "restart"
    pending snapshots both resolve the waiter to null when the wait timer fires.
  • [P1 → done] Closed-vocabulary synth notice. The synthesized terminal
    notice no longer reads event.statusLabel at all — it is outcome.error-
    derived and could echo provider error text (paths, secrets) to an external
    DM when the completion carried non-empty content. The reason is now strictly
    one of no visible reply / timed out / failed (details withheld) /
    incomplete, and the status is normalized to the closed event-status set.
    Regression tests: an error completion with a secret-bearing statusLabel and
    partial output, and a timeout completion with partial output, both produce
    the exact closed-vocabulary notice and never contain the label text.

Real behavior proof (redacted)

Live run on a real gateway (v2026.6.11, macOS, dist patched with this PR's
delivery-path change), performed 2026-07-08:

  1. A parent session spawned a run-mode subagent whose task forces a
    no-deliverable-payload completion:
[Subagent Task] This is a delivery-path test. Do not run any tools. End your
turn with exactly this text and nothing else: (no output)
  1. Child session transcript (full — two messages):
user      :: [Subagent Context] You are running as a subagent (depth 1/1). …
             [Subagent Task] … End your turn with exactly this text and nothing else: (no output)
assistant :: (no output)
  1. Task ledger after completion — exactly one announce task for the child,
    terminal, delivered (ids truncated):
b5f3b063-… cli       succeeded  not_applicable  83e27d84-…  agent:main:subagent:4230f8a4-…  completed
cac895ca-… subagent  succeeded  delivered       83e27d84-…  agent:main:subagent:4230f8a4-…  (no output)

Before this fix, this exact shape ((no output) placeholder result) abandoned
delivery after the retry limit with visible_reply_missing and the waiting
parent never received a terminal message. With the fix, the completion is
announced once (delivery: delivered) and the parent wakes with the bounded
terminal notice. No sensitive values in the artifacts above; session ids are
machine-local UUIDs.

Rebase note (2026-07-09)

Rebased onto current main per review. RC1 is superseded: #89367 landed the
wait-timer pending-timeout forwarding on main, already gated through the shared
terminal-outcome classifier with fresh-wait isolation — so this branch drops its
agent-job.ts changes entirely and now carries only the delivery-layer
slice
(the no-deliverable-payload synth notice with closed vocabulary, plus
the delivery-branch reorder). One commit, conflict-free against main.

Tests rerun on the exact rebased head (63c8981d7c):

pnpm vitest run src/agents/subagent-announce-delivery.test.ts        → 234 passed
pnpm vitest run src/gateway/server-methods/server-methods.test.ts   → 172 passed
pnpm vitest run src/agents/subagent-registry*.test.ts               → 344 passed
pnpm tsgo && pnpm tsgo:test                                          → clean
oxlint / oxfmt (touched files)                                       → clean

Semantics notes for the rebase review ask:

Sibling sequencing: with RC1 gone this PR no longer touches the wait layer at
all, so the only remaining composition surface with the yielded-completion and
blocked-completion PRs is the single synth-notice fallback in
resolveTextCompletionDirectFallback — additive, and inert whenever an
ok-with-content completion exists.

@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime agents Agent runtime and tooling size: M triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jun 23, 2026
@alfredjbclaw

Copy link
Copy Markdown
Author

RC4 RFC issue filed: #96190 — opt-in cron.jobs[].notifyOnCompletion for parent wake after isolated cron run. Decoupled from this PR so the wait-layer + no-output-payload fixes can land without bundling the product-decision API.

@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jun 23, 2026
@clawsweeper

clawsweeper Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 12, 2026, 6:04 PM ET / 22:04 UTC.

Summary
The PR adds a bounded closed-vocabulary direct-message notice for terminal subagent completions with no visible payload, reorders that fallback ahead of the failed-no-output early return, and adds delivery plus wait-layer regression tests.

PR surface: Source +38, Tests +311. Total +349 across 3 files.

Reproducibility: yes. Current main's fallback has no deliverable text for terminal empty or '(no output)' subagent events, and the report is reinforced by independent live reproductions plus the PR's after-fix gateway transcript.

Review metrics: 1 noteworthy metric.

  • State and config surface: 0 persisted fields, 0 config options added. The fix changes delivery behavior without creating an upgrade migration or another session-state source of truth.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #89095
Summary: This PR is the candidate fix for the canonical issue's remaining immediate no-payload delivery slice; related PRs address separate wait-timer, yielded-duplicate, and announce-give-up paths.

Members:

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

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

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

Risk before merge

  • [P1] Merging changes previously suppressed no-payload completions into direct external messages; maintainers should verify the combined sessions_yield design still produces exactly one user-visible terminal result rather than a duplicate, out-of-order, or suppressed message.
  • [P1] The branch is behind current main, so routine exact-head refresh or merge-queue validation is still needed before landing; the observed CI failure is unrelated to this diff.

Maintainer options:

  1. Land after sibling composition check (recommended)
    Confirm the sessions_yield suppression path and this no-payload fallback compose to one terminal user-visible result, then merge the focused patch.
  2. Sequence the adjacent delivery PRs
    If the yielded-parent patch lands first, rebase and retain this fallback only on delivery paths that still require a direct terminal notice.
  3. Pause if delivery ownership remains ambiguous
    Hold the PR only if maintainers cannot establish whether yielded completions are rendered by the resumed parent or direct child fallback.

Next step before merge

  • No automated repair remains; maintainers should perform the normal exact-head refresh and verify exact-once composition with the adjacent yielded-parent delivery change before landing.

Security
Cleared: The diff adds no dependency, permission, secret, install, or supply-chain surface, and the external notice is restricted to normalized fixed vocabulary rather than raw provider or child text.

Review details

Best possible solution:

Keep one canonical terminal-completion invariant: every expected subagent completion wakes the requester exactly once, with the resumed parent session owning yielded delivery where applicable and this bounded secret-safe notice covering direct no-payload fallbacks without adding persisted state or configuration.

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

Yes. Current main's fallback has no deliverable text for terminal empty or '(no output)' subagent events, and the report is reinforced by independent live reproductions plus the PR's after-fix gateway transcript.

Is this the best way to solve the issue?

Yes. Extending the existing direct fallback with a bounded closed vocabulary is the narrowest maintainable fix for no-payload completion delivery; the remaining merge check is exact-once composition with the adjacent sessions_yield suppression work.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 2c06dfdd2fe1.

Label changes

Label changes:

  • remove mantis: telegram-visible-proof: Current Telegram visible-proof status is not_needed.

Label justifications:

  • P1: Lost subagent terminal delivery can leave a real parent agent workflow indefinitely stuck in processing.
  • merge-risk: 🚨 message-delivery: The patch changes when direct terminal messages are sent and must preserve exactly-once delivery alongside adjacent yielded-parent behavior.
  • merge-risk: 🚨 session-state: The affected path determines whether a sessions_yield requester wakes or remains stranded after child termination.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body contains redacted after-fix live gateway output showing a real no-output child completion create one delivered announce and wake the parent; tests and CI are supplemental.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body contains redacted after-fix live gateway output showing a real no-output child completion create one delivered announce and wake the parent; tests and CI are supplemental.
Evidence reviewed

PR surface:

Source +38, Tests +311. Total +349 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 1 46 8 +38
Tests 2 316 5 +311
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 362 13 +349

What I checked:

  • Current-main gap: Current main returns no text when every subagent task_completion has an empty or '(no output)' result, so direct delivery falls through without a terminal payload. (src/agents/subagent-announce-delivery.ts:1088, 2c06dfdd2fe1)
  • Focused implementation: The branch adds a second pass that recognizes terminal subagent completion events and emits only normalized status plus fixed reason strings; it never forwards statusLabel or raw child output. (src/agents/subagent-announce-delivery.ts:1102, 6476dae70c80)
  • Delivery ordering: The branch attempts the text-direct fallback before the failed-no-output early return, allowing the synthesized terminal notice to use the existing idempotent direct-message seam. (src/agents/subagent-announce-delivery.ts:1836, 6476dae70c80)
  • Regression coverage: Tests cover clean empty completion, timeout no-output completion, error and timeout events with sensitive labels or partial output, fixed vocabulary, bounded text, and idempotent direct delivery. (src/agents/subagent-announce-delivery.test.ts:1385, 6476dae70c80)
  • Live behavior proof: The PR body provides a redacted real-gateway run where a '(no output)' child creates exactly one delivered announce and the waiting parent wakes with the bounded terminal notice. (6476dae70c80)
  • Canonical issue direction: A maintainer reopened the umbrella issue after the wait-layer fix merged and explicitly identified this PR as the active complementary delivery-layer work requiring focused tests and live parent-wakeup proof. (61dce7cb6e88)

Likely related people:

  • Vincent Koc: The current direct completion fallback and failed-no-output helper on main trace to Vincent Koc's recent delivery refactor, making him the closest current-code routing candidate. (role: recent delivery-path contributor; confidence: high; commits: 3e68035de1da, e085fa1a3ffd, fa5827079f72; files: src/agents/subagent-announce-delivery.ts)
  • steipete: Peter Steinberger introduced the canonical terminal-outcome model, refactored subagent lifecycle ownership, and explicitly reopened the canonical issue with direction for this complementary delivery fix. (role: merger and adjacent state-model contributor; confidence: high; commits: b1e5c9d7fa16, f862685ed8e4; files: src/agents/agent-run-terminal-outcome.ts, src/agents/subagent-registry-lifecycle.ts, src/gateway/server-methods/agent-job.ts)
  • Tyler Yust: The surrounding behavior appears related to Tyler Yust's earlier subagent announce delivery, descendant-gating, and retry work. (role: original announce-flow contributor; confidence: medium; commits: 81b93b9ce04b; files: src/agents/subagent-announce.ts, src/agents/subagent-announce-delivery.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 (7 earlier review cycles)
  • reviewed 2026-07-01T04:40:46.172Z sha b65ffa8 :: needs real behavior proof before merge. :: [P1] Gate pending timeouts through the terminal classifier | [P1] Keep synthesized notices from echoing statusLabel
  • reviewed 2026-07-09T03:51:30.974Z sha 215f73f :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-09T03:58:17.911Z sha 215f73f :: needs maintainer review before merge. :: none
  • reviewed 2026-07-09T04:04:10.993Z sha 215f73f :: needs maintainer review before merge. :: none
  • reviewed 2026-07-09T05:59:40.061Z sha 63c8981 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-09T06:06:21.330Z sha 63c8981 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-12T21:57:08.793Z sha 6476dae :: needs maintainer review before merge. :: none

@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. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jun 24, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. label Jul 1, 2026
@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. label Jul 9, 2026
@alfredjbclaw

Copy link
Copy Markdown
Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 9, 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.

@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: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. 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. labels Jul 9, 2026
@alfredjbclaw
alfredjbclaw force-pushed the fix/subagent-silent-drops-rc1-rc2 branch from 215f73f to 63c8981 Compare July 9, 2026 05:51
@alfredjbclaw

Copy link
Copy Markdown
Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 9, 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.

@clawsweeper clawsweeper Bot removed the rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. label Jul 9, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jul 9, 2026
… slice

RC1 (wait-timer pending-timeout forwarding) is superseded on main:
shared terminal-outcome classifier with fresh-wait isolation. This
branch now carries only the delivery-layer slice:

- Synthesize a bounded, closed-vocabulary terminal notice for
  no-deliverable-payload subagent completions (statusLabel is never
  echoed; reasons are limited to no visible reply / timed out /
  failed (details withheld) / incomplete).
- Reorder the message-tool-only delivery branch so the text-direct
  fallback runs before the failed-no-output early-out.
- Regression tests for the notice vocabulary (incl. sensitive-label
  cases) plus wait-timer hard/soft coverage locking main's openclaw#89367
  semantics. Restart-cancelled completions resolve through main's
  direct terminal path by design and are not re-tested here.
@alfredjbclaw
alfredjbclaw force-pushed the fix/subagent-silent-drops-rc1-rc2 branch from 63c8981 to 6476dae Compare July 12, 2026 21:48
@clawsweeper clawsweeper Bot removed the mantis: telegram-visible-proof Mantis should capture Telegram visible proof. label Jul 12, 2026
@steipete steipete self-assigned this Jul 21, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This assigned pull request has been automatically marked as stale after being open for 27 days.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Jul 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling gateway Gateway runtime 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. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: M stale Marked as stale due to inactivity 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.

2 participants