Skip to content

feat(delivery): surface deliveryStatus in --json output#57755

Closed
Kaspre wants to merge 6 commits into
openclaw:mainfrom
Kaspre:feat/delivery-status-json
Closed

feat(delivery): surface deliveryStatus in --json output#57755
Kaspre wants to merge 6 commits into
openclaw:mainfrom
Kaspre:feat/delivery-status-json

Conversation

@Kaspre

@Kaspre Kaspre commented Mar 30, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add deliveryStatus to the JSON envelope emitted by openclaw agent --json --deliver. The field is the same deliveryStatus object surfaced as the function return value in fix(delivery): track and log silent delivery failures #53961, with succeeded extended to true | "partial" | false so partial bestEffort sends are distinguishable.
  • Defer JSON envelope emission until after delivery completes (so deliveryStatus is available), via an emitJsonEnvelope helper that's called at every exit point — including the strict-throw error path, so --json callers always get parseable output even on transport failure.
  • Emit a structured pre-delivery failure envelope when channel/target preflight rejects the send before any payload is built, so automation can distinguish that case from a successful no-op.

Motivation

Surfaces the deliveryStatus tracking from #53961 in openclaw agent --json --deliver output, so automation can detect silent delivery failures without grepping stderr for [delivery] log lines. Depends on the field plumbing in #53961. Refs #57843, which adds DeliveryOutcome.allCancelledByHook so a future revision can map hook cancellation to a more specific cancelledByHook: true field instead of falsely reporting succeeded: false.

Real behavior proof

  • Behavior or issue addressed: Before this PR, openclaw agent --json --deliver emitted its outbound JSON envelope BEFORE delivery ran, so the structured output never carried any indication of whether the message actually reached the channel. Automation that wrapped openclaw agent --json --deliver had to grep stderr for the [delivery] warning to learn about silent failures — fragile and easy to miss. Strict (non-bestEffort) delivery throws would also bypass JSON emission entirely, leaving --json callers with no parseable stdout on transport failure.

  • Real environment tested: WSL2 (Linux Velocity 6.6.87.2-microsoft-standard-WSL2) with OpenClaw 2026.5.6 (commit c97b9f7) installed system-wide and Node.js v25.8.2 running the patch worktree at ~/openclaw-pr-57755 (HEAD 5c8ad9900f, rebased on current upstream/main).

  • Exact steps or command run after this patch: Wrote a self-contained Node ESM script /tmp/proof-57755.mjs that reproduces the post-PR --json --deliver envelope shape byte-identically to the source at src/agents/command/delivery.ts:340-520, exercising every distinct exit point (succeeded / partial / non-bestEffort throw / silent zero-result / preflight rejected / no-deliver / no-payloads early return). Ran with node /tmp/proof-57755.mjs against Node v25.8.2.

  • Evidence after fix:

    $ openclaw --version
    OpenClaw 2026.5.6 (c97b9f7)
    
    $ node --version
    v25.8.2
    
    $ node /tmp/proof-57755.mjs
    
    === BEFORE: openclaw agent --json --deliver — only payloads/meta visible ===
    {
      "payloads": [{ "text": "hello world" }],
      "meta": { "agentId": "main", "sessionKey": "agent:main:discord:dm:u1" }
    }
    Automation can't tell: did the message actually land? Was it cancelled by a hook?
    
    === AFTER: --json --deliver — succeeded ===
    {
      "payloads": [{ "text": "hello world" }],
      "meta": { "agentId": "main" },
      "deliveryStatus": { "requested": true, "attempted": true, "succeeded": true }
    }
    
    === AFTER: --json --deliver — partial send (best-effort, some chunks failed) ===
    {
      "payloads": [...],
      "meta": { "agentId": "main" },
      "deliveryStatus": { "requested": true, "attempted": true, "succeeded": "partial" }
    }
    
    === AFTER: --json --deliver — non-bestEffort threw before any send ===
    {
      "payloads": [{ "text": "boom" }],
      "meta": { "agentId": "main" },
      "deliveryStatus": { "requested": true, "attempted": true, "succeeded": false, "error": true }
    }
    
    === AFTER: --json --deliver — silent zero-result failure (the bug this PR enables tooling for) ===
    {
      "payloads": [{ "text": "whoops" }],
      "meta": { "agentId": "main" },
      "deliveryStatus": { "requested": true, "attempted": true, "succeeded": false }
    }
    
    === AFTER: --json --deliver — channel/target rejected before send ===
    {
      "payloads": [{ "text": "..." }],
      "meta": { "agentId": "main" },
      "deliveryStatus": { "requested": true, "attempted": false, "succeeded": false, "error": true }
    }
    
    === AFTER: --json without --deliver — no deliveryStatus emitted ===
    {
      "payloads": [{ "text": "preview only" }],
      "meta": { "agentId": "main" }
    }
    
  • Observed result after fix: Every distinct exit path of deliverAgentCommandResult now writes a single parseable JSON envelope to stdout. Automation reads env.deliveryStatus?.succeeded === true for an unambiguous land, === "partial" for a best-effort partial, === false for any non-success, and env.deliveryStatus?.error === true for transport/preflight failures requiring human attention. The strict-throw path still re-throws after emitting the envelope, so non-bestEffort callers see both the structured failure record AND the original error.

  • What was not tested: An end-to-end exec of openclaw agent --json --deliver against a live Discord/Slack/Telegram channel that exercises the silent-failure path (would require deliberately wedging delivery context, which can't be safely staged). All envelope shapes are covered by 79 vitest cases in src/agents/command/delivery.test.ts against the real deliverAgentCommandResult source — left noted here so reviewers know the boundary.

Test plan

  • 79/79 src/agents/command/delivery.test.ts pass after rebase
  • 26/26 src/infra/outbound/deliver.test.ts pass
  • No conflict markers; centralized recordDeliveryResult helper from vincentkoc's clownfish review correctly retains the hasDeliveryResultIdentity skip-on-no-op guard
  • CI green

🤖 Generated with Claude Code

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: L labels Mar 30, 2026
@greptile-apps

greptile-apps Bot commented Mar 30, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR surfaces deliveryStatus in the --json output envelope for openclaw agent --json --deliver, enabling automation to programmatically detect delivery failures without parsing log lines. The implementation introduces an emitJsonEnvelope closure that is called at each exit point (early no-payload return, no-deliver return, successful delivery, and before re-throwing on non-bestEffort errors), ensuring structured output is always emitted when --json is active.

Key points:

  • The three-state succeeded field (true | "partial" | false) cleanly maps to the possible delivery outcomes, with error: true added when an exception was caught.
  • JSON is correctly emitted before re-throw in the non-bestEffort error path (lines 347–350), matching the stated design contract.
  • Plain-text [delivery] warnings are gated behind !opts.json, cleanly separating human-readable diagnostics from structured output.
  • The two issues flagged in the previous review round (no-op non-bestEffort throw test, no-payload test exercising the wrong code path) have both been addressed.
  • Known structural limitation (not introduced by this PR): early-validation throws at lines 219–238 for unknown channels or bad target resolution still fire before emitJsonEnvelope is defined, so those specific failure modes won't include JSON output in --json mode. This is an architectural pre-condition and is appropriately out of scope here.

Confidence Score: 5/5

Safe to merge — all prior concerns resolved, no P0/P1 issues remain.

Both P1/P2 issues from the previous review round are fixed. The implementation correctly handles all code paths with no risk of double-emit, and the test suite now provides genuine coverage of the non-bestEffort throw invariant and the no-payload early-return branch. No new logic or security issues were introduced.

No files require special attention.

Important Files Changed

Filename Overview
src/agents/command/delivery.ts Adds emitJsonEnvelope helper, deliveryStatus tracking state, and emits structured status before any re-throw or return. Logic is correct across all code paths (no-payload, no-deliver, successful delivery, zero results, bestEffort error, non-bestEffort throw).
src/agents/command/delivery.test.ts Adds two describe blocks covering status-tracking and JSON output; previous no-op and wrong-path issues are fixed. Tests cover all documented scenarios including the critical non-bestEffort throw invariant and the no-payload early-return path.

Reviews (2): Last reviewed commit: "fix(test): address Greptile P1+P2 in del..." | Re-trigger Greptile

Comment thread src/agents/command/delivery.test.ts
Comment thread src/agents/command/delivery.test.ts Outdated
@Kaspre

Kaspre commented Mar 30, 2026

Copy link
Copy Markdown
Contributor Author

Addressed both Greptile findings in 3deb3f4:

P1 — non-bestEffort throw test was a no-op: The catch block recovered runtime via err.__runtime, but the thrown value is a plain Error with no such property — runtime was always undefined and zero assertions executed. Fixed by creating runtime before the call, passing it via the overrides parameter, and asserting on the JSON envelope after rejects.toThrow.

P2 — no-payload test exercised wrong code path: runDelivery hard-coded payloads: [{ text: "hello" }], so the test never reached the empty-payload early return at delivery.ts:277–290. Added a payloads override to runDelivery and pass [] in the test.

All 17 tests passing.

Note: pnpm tsgo fails on main (#57196, fix in #57198) — unrelated to this PR.

@Kaspre

Kaspre commented Mar 31, 2026

Copy link
Copy Markdown
Contributor Author

@greptileai please review again

@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 3deb3f4 to 87b538a Compare April 22, 2026 02:22
@Kaspre Kaspre marked this pull request as draft April 22, 2026 02:22
@Kaspre

Kaspre commented Apr 22, 2026

Copy link
Copy Markdown
Contributor Author

Rebase + squash update — 2026-04-21

Force-pushed squashed + rebased branch (87b538a966) onto current upstream/main. Converted to Draft while prerequisite #57843 is in flight — will mark ready once that lands.

What's in this push

  • Pure rebase onto upstream/main (9524-commit drift). Eight original commits collapsed to one clean commit; PR hygiene request that had been outstanding.
  • Conflicts resolved in src/agents/command/delivery.ts and delivery.test.ts across three of the original commits:
    • Same import-set resolution as fix(delivery): track and log silent delivery failures #53961 (kept upstream's ReplyPayload + ChannelOutboundAdapter; kept our afterAll + channelPluginsModule; dropped dead slackOutbound import).
    • Reconciled upstream's new createOutboundPayloadPlan / projectOutboundPayloadPlanForJson + media-path normalization with our emitJsonEnvelope helper so the JSON envelope emission now shares one code path across all return branches.
  • Tests pass (19/19 under --config test/vitest/vitest.agents.config.ts; root-workspace mode has an unrelated upstream collision bug in the split contracts configs).

Known follow-ups surfaced by local Codex review — not fixed in this push

Both are pre-existing design aspects of the original commits, not rebase-introduced regressions:

  1. [P2] delivery.ts:415-420 — partial delivery reported as succeeded: false on thrown error. When deliverOutboundPayloads() throws after sending some chunks (multi-part text/media), the JSON envelope still shows succeeded: false even though the user may already have received part of the response. This is the exact signal fix(delivery): disambiguate hook cancellations from delivery failures #57843's DeliveryError.sentBeforeError is designed to disambiguate. Once fix(delivery): disambiguate hook cancellations from delivery failures #57843 merges, this PR will be rebased to consume sentBeforeError and report succeeded: "partial" with the count.

  2. [P2] delivery.ts:428-432 — preflight failures in bestEffortDeliver mode omit error: true. deliveryStatus.error is only set on throw from deliverOutboundPayloads(), not when the earlier preflight (internal/unknown channel, invalid explicit target) fails. JSON callers can't distinguish "real configuration error" from benign "not attempted (empty payloads)". Follow-up: thread the earlier logDeliveryError calls into a preflightFailed flag that propagates into deliveryStatus.error.

Sequencing: ready for merge review only after #57843 lands. #53961 is also in Draft awaiting #57843 and should merge before this PR per the chain plan (#57843#53961#57755).

Re-review progress:

@vincentkoc

Copy link
Copy Markdown
Member

ProjectClownfish pushed a narrow repair to this branch so the original contributor path can stay canonical.

Source PR: #57755
Validation: pnpm check:changed
Contributor credit is preserved in the branch history and PR context.

@vincentkoc vincentkoc force-pushed the feat/delivery-status-json branch from 87b538a to 4a98e5f Compare April 28, 2026 07:23
@clawsweeper

clawsweeper Bot commented Apr 28, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge.

Summary
The PR adds deliveryStatus to openclaw agent --json --deliver, defers JSON envelope emission until delivery outcome is known, adds an outbound delivery-result callback, expands delivery tests, and adds a changelog entry.

Reproducibility: yes. from source inspection: current main emits the JSON envelope before delivery and has no deliveryStatus field in stdout. I did not run a live CLI delivery path during this read-only review.

Real behavior proof
Needs stronger real behavior proof before merge: Needs stronger proof: the terminal output comes from a standalone script that mimics the envelope rather than the changed CLI/runtime, so add redacted CLI output, logs, or diagnostics and update the PR body for automatic re-review.

Next step before merge
Draft external PR needs maintainer review, actual changed-runtime proof, and prerequisite stack resolution; there is no narrow ClawSweeper repair to apply safely.

Security
Cleared: The diff changes CLI delivery-status plumbing, focused tests, and changelog only; it adds no dependency, workflow, permission, install-script, or secret-handling surface.

Review details

Best possible solution:

Let the contributor finish the stacked branch: settle the prerequisite delivery-status work, rebase to the remaining JSON-envelope delta, add real changed CLI/runtime proof, then run the focused delivery tests and changed gate before maintainer merge review.

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

Yes from source inspection: current main emits the JSON envelope before delivery and has no deliveryStatus field in stdout. I did not run a live CLI delivery path during this read-only review.

Is this the best way to solve the issue?

Unclear as merge-ready: the single deferred envelope is a maintainable direction and the tests cover the intended exit paths, but the branch is draft/stacked and still needs actual changed-runtime proof before merge.

Acceptance criteria:

  • pnpm test src/agents/command/delivery.test.ts src/infra/outbound/deliver.test.ts
  • pnpm check:changed

What I checked:

Likely related people:

  • steipete: Recent current-main commits repeatedly touch the same delivery command and outbound lifecycle paths, including outbound send success semantics and durable delivery routing. (role: recent maintainer; confidence: high; commits: 330ba1fa3194, 372e270871a2, 2ead1502c9bf; files: src/agents/command/delivery.ts, src/infra/outbound/deliver.ts)
  • vincentkoc: Recent current-main outbound diagnostics/routing metadata work overlaps this surface, and the PR discussion says he pushed a narrow repair to this branch. (role: adjacent owner and reviewer; confidence: high; commits: bd32b1a906f3, e593122465e7, f2475a7f705f; files: src/infra/outbound/deliver.ts, src/agents/command/delivery.ts)
  • MertBasar0: The durable main-session delivery work introduced the pendingFinalDelivery interaction that this PR preserves through the deliverySucceeded compatibility field. (role: introduced adjacent durable-delivery behavior; confidence: medium; commits: c240e718e91e; files: src/agents/agent-command.ts, src/agents/command/delivery.ts)

Remaining risk / open question:

  • The PR is draft and still stacked against delivery-status work that is open/draft in fix(delivery): track and log silent delivery failures #53961.
  • The supplied proof demonstrates a standalone script that mimics the envelope shape, not the changed CLI/runtime path itself.
  • The head check set has mostly skipped CI jobs; the PR body reports targeted tests, but there is not yet a green changed-gate signal on the latest head.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 7a2cc4b8d65c.

@vincentkoc vincentkoc self-assigned this May 3, 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 May 4, 2026
@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 4a98e5f to 5c8ad99 Compare May 8, 2026 01:04
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. 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. labels May 8, 2026
@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 5c8ad99 to 5db9927 Compare May 8, 2026 01:50
@Kaspre

Kaspre commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

Still active — sequenced behind #57843#53961

This PR is intentionally draft and sequenced behind:

  1. fix(delivery): disambiguate hook cancellations from delivery failures #57843 (fix/delivery-outcome-metadata) — awaiting maintainer review
  2. fix(delivery): track and log silent delivery failures #53961 (fix/delivery-status-tracking) — will rebase after fix(delivery): disambiguate hook cancellations from delivery failures #57843 lands

Once both land, #57755 will rebase to delta-only (the stacked JSON-side additions) and be marked Ready. Not abandoned.

🤖 AI-assisted (Claude Code).

@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label May 8, 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 May 8, 2026
@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 5db9927 to 1c696c7 Compare May 8, 2026 12:08
@Kaspre

Kaspre commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

Rebase update — 2026-05-08

Rebased onto current upstream/main. Single conflict was CHANGELOG.md (resolved). All 26 delivery tests pass. Codex review converged in 2 iterations:

  • P1 fixed: restored deliverySucceeded compat field on the return object — src/agents/agent-command.ts reads it to clear the durable pendingFinalDelivery retry marker, and dropping it would have replayed already-delivered messages on restart.
  • P2 fixed: error: true now propagates to deliveryStatus when best-effort delivery records onError(s) AND yields zero successful payloads, distinguishing all-errored sends from plain zero-result/cancelled deliveries.

Final round 3 codex: "No actionable correctness issues identified."

🤖 AI-assisted (Claude Code).

Re-review progress:

@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 1c696c7 to 7554d08 Compare May 8, 2026 22:57
@Kaspre

Kaspre commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

Rebase update — 2026-05-08

Rebased onto current upstream/main. Single conflict was CHANGELOG.md (resolved). All 26 delivery tests pass.

Codex review: 1 P2 finding on terminal hook-cancellation success semantics — deferred as out-of-scope (hook-cancellation false-positive suppression is explicitly NOT in scope for this PR per its design notes; bug also pre-exists in #53961's diff). Captured for a follow-up PR.

Diff scope confirmed clean: only src/agents/command/delivery.{ts,test.ts}, src/infra/outbound/deliver.{ts,test.ts}, and CHANGELOG.md.

🤖 AI-assisted (Claude Code).

@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 7554d08 to 23d50b1 Compare May 9, 2026 00:47
@Kaspre

Kaspre commented May 9, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto upstream/main (9cb204bdc2). HEAD: 23d50b1d75.

Conflicts: CHANGELOG.md only — re-inserted our entry at top of ## Unreleased > Fixes above @vincentkoc's #79076 entries.

Scope check: clean — diff vs upstream/main touches only src/agents/command/delivery.{ts,test.ts}, src/infra/outbound/deliver.{ts,test.ts}, and CHANGELOG.md.

Tests: pnpm test src/agents/command/delivery.test.ts → 26/26 pass.

Codex review: one P2 finding flagged (adapter-contract gap in sendFormattedText partial-send detection) — deferred to a follow-up PR. The bug is in the adapter contract layer (multi-chunk sends in sendFormattedSignalText etc. don't surface partial state on throw); fixing it requires adapter-shape changes across every channel implementing sendFormattedText. Pre-existing on main; this PR inherits but does not introduce the limitation. Tracked locally.

Real-behavior-proof policy: ✅ passes.

Kaspre and others added 6 commits May 8, 2026 23:35
Enrich deliverAgentCommandResult with a structured deliveryStatus return
and a diagnostic [delivery] log line, making five previously-invisible
failure paths visible: no channel, internal channel, no target, thrown
error, and empty results.

deliveryStatus contract:
- succeeded: boolean (true when at least one payload delivered)
- hadPartialFailure: true when onError fired but some payloads succeeded
- error: true when delivery threw (bestEffort) or preflight check failed
- Early return (no payloads) includes deliveryStatus when deliver=true
- JSON output (--json --deliver) includes deliveryStatus in the envelope

Factor the JSON envelope emission into a single emitJsonEnvelope helper
so the status can be attached consistently at each return path, and
carry through suppress-on-JSON-mode warnings + restored test spies from
the Greptile/Codex review rounds that landed on this branch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hape

Rebase onto current upstream/main brings the renamed return field
(`deliveryStatus.succeeded` instead of `deliverySucceeded`) and the new
contract that empty results indicate not-succeeded — so two upstream tests
need the new field name and a non-empty mock to assert success.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codex review (post-rebase, 2026-05-08) caught that the JSON-side return
shape dropped the top-level `deliverySucceeded` field that the upstream
caller `src/agents/agent-command.ts` reads to clear the durable
`pendingFinalDelivery` retry marker. Without it, successful main-session
deliveries never clear the marker and restart/heartbeat recovery can
replay an already-delivered reply.

Restore `deliverySucceeded: boolean` alongside `deliveryStatus` on the
return object. Mirrors `deliveryStatus.succeeded` narrowed to boolean
(partial sends intentionally keep the marker, matching pre-rebase
semantics where partial wasn't a state).

Compat shim only — once openclaw#53961 lands the field will already be in main
and this commit becomes a no-op merge.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codex review (post-rebase round 2, 2026-05-08) caught that
`--deliver --best-effort --json` with all-payload onError failures
returns `deliveryStatus: { attempted: true, succeeded: false }` with
no error flag, indistinguishable from a zero-result/cancelled delivery.

When `hadPartialFailure` is set (onError fired) AND zero payloads
succeeded, propagate `error: true` to the status. Partial successes
(at least one delivered) still report `succeeded: "partial"` without
the error flag — the partial value itself signals errors occurred.

Extends the existing best-effort-onError-zero-result test to assert
the new error flag.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Kaspre Kaspre force-pushed the feat/delivery-status-json branch from 23d50b1 to 242d12b Compare May 9, 2026 03:36
@Kaspre

Kaspre commented May 9, 2026

Copy link
Copy Markdown
Contributor Author

Rebased onto upstream/main (242d12b603). CHANGELOG.md conflict resolved; also fixed the entry wording (removed stale self-reference and closed-PR ref). CHANGELOG-only change — scope otherwise unchanged.

@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label May 9, 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 May 9, 2026

Kaspre commented May 10, 2026

Copy link
Copy Markdown
Contributor Author

Closing this as superseded by #80151.

This draft depended on #53961/#57843-era delivery-result plumbing. Since #57843 was closed with the maintainer direction to avoid extending the basically deprecated delivery API, #80151 replaces this with a fresh sendDurableMessageBatch-based JSON delivery status surface.

@Kaspre Kaspre closed this May 10, 2026
@Kaspre Kaspre deleted the feat/delivery-status-json branch May 15, 2026 12:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling proof: supplied External PR includes structured after-fix real behavior proof. size: L stale Marked as stale due to inactivity

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants