Skip to content

fix(voice-call): auto-respond on the webhook event transcript path#79336

Closed
dvy wants to merge 1 commit into
openclaw:mainfrom
dvy:fix/79118-telnyx-auto-response
Closed

fix(voice-call): auto-respond on the webhook event transcript path#79336
dvy wants to merge 1 commit into
openclaw:mainfrom
dvy:fix/79118-telnyx-auto-response

Conversation

@dvy

@dvy dvy commented May 8, 2026

Copy link
Copy Markdown
Contributor

Closes #79118.

Summary

  • Wire processParsedEvents (the generic webhook event path used by providers without OpenClaw streaming integration — Telnyx and Plivo today) to fire handleInboundResponse after a final call.speech event for inbound or conversation-mode calls, mirroring the path that already runs for Twilio Media Streams in the onTranscript callback. Gated on manager.processEvent actually appending a user transcript entry so replays and turn-token mismatches stay idempotent.
  • Expose a small public CallManager.hasTranscriptWaiter(callId) so the webhook layer can avoid double-firing when a programmatic turn-aware flow (e.g. continueCall) is already lined up to consume the transcript.
  • Lookup tolerates both event.callId shapes: the manager UUID (outbound calls carry it via client_state) and the providerCallId fallback (inbound Telnyx calls don't echo client_state, so the normalized event's callId is the call control ID).

Why

Reported in #79118: on Telnyx (and any provider whose final user transcripts arrive through OpenClaw's generic webhook event path rather than a media-stream onTranscript callback), inbound calls answer, the greeting plays, the user transcript is captured to the call record, and then nothing — the bot never speaks again. The call sits in listening until the caller hangs up. Note that Telnyx and Plivo are streaming-capable carriers; OpenClaw's plugin just doesn't wire up streaming integration for them today (see #79324 for the in-flight Telnyx streaming work).

Root cause is a single missing call-site. handleInboundResponse had exactly one invocation, gated behind the Twilio Media Streams onTranscript callback (webhook.ts:391). The generic webhook call.speech handler in manager/events.ts:238 records the transcript and transitions to listening but never invokes the auto-response. Provider webhook events flow through processParsedEventsmanager.processEvent, missing the auto-response handoff entirely.

The fix is the smallest viable change: a peek at waiter state before manager.processEvent (which clears the waiter), then fire handleInboundResponse afterward when no programmatic flow is waiting and the call is inbound or in conversation mode. Path-1 (Twilio Media Streams) is intentionally untouched — no behavior change for streaming providers.

Real Behavior Proof

  • Behavior or issue addressed: Telnyx inbound calls (and any provider whose final user transcripts arrive through OpenClaw's generic webhook event path rather than a media-stream onTranscript callback) answer and play the configured greeting, capture the user's final speech transcript to the call record, but the bot never replies — processParsedEvents only forwards the event to the manager and never invokes handleInboundResponse. This PR mirrors the Twilio media-stream auto-response handoff into the webhook event path, gated on actual transcript persistence to preserve manager replay/dedupe semantics. Telnyx and Plivo are streaming-capable carriers; OpenClaw's plugin just doesn't wire up streaming integration for them today (feat(voice-call): add Telnyx realtime media streams #79324 is the in-flight Telnyx streaming work).

  • Real environment tested: Linux home server running OpenClaw 2026.5.7 gateway with @openclaw/[email protected] plugin, configured for provider Telnyx (Call Control v2). Regulated DE DID, BNetzA-cleared, Telnyx number status active. Inbound webhook served at 127.0.0.1:3334/voice/webhook and exposed publicly via Cloudflare Tunnel with full Telnyx signature verification active (TELNYX_PUBLIC_KEY). Inbound policy allowlist, German inboundGreeting, per-number responseSystemPrompt, streaming.enabled: false, realtime.enabled: false. Because npm only ships the bundled plugin, the source-equivalent fix was applied as a small local patch to the dist/runtime-entry-*.js chunk file carrying the exact same processParsedEvents logic this PR adds.

  • Exact steps or command run after this patch:

    1. Apply the source-equivalent patch to ~/.openclaw/npm/node_modules/@openclaw/voice-call/dist/runtime-entry-*.js (idempotent shell tool, refuses to apply if upstream pattern shifts).
    2. systemctl --user restart openclaw-gateway.service.
    3. Dial the DID from the allowlisted mobile.
    4. Wait for the German greeting, then speak in English.
    5. Continue a multi-turn conversation; hang up.
  • Evidence after fix: redacted runtime logs from journalctl --user -u openclaw-gateway.service after the test call. The [voice-call] Auto-responding to inbound call … line is the exact log statement that never appears on current main for the generic webhook event path; with the patch it appears once per final user transcript and the bot's reply is rendered through Telnyx-hosted TTS and audible to the caller.

    [voice-call] Inbound call accepted: +49***REDACTED*** is in allowlist
    [voice-call] Created inbound call record: c7be1d4a-…-… from +49***REDACTED***
    [voice-call] Speaking initial message for call c7be1d4a-…-… (mode: conversation)
    [voice-call] Auto-responding to inbound call c7be1d4a-…-…: "hi which Step are you using"
    [voice-call] Auto-responding to inbound call c7be1d4a-…-…: " and is this um 5 and 5 through the API or through a subscription"
    

    Persisted multi-turn call record copied live from ~/.openclaw/voice-calls/calls.jsonl (redacted, four user turns each followed by a bot reply):

    {
      "callId": "9df40ff1…",
      "provider": "telnyx",
      "direction": "inbound",
      "state": "completed",
      "from": "+49***REDACTED***",
      "to": "+49***REDACTED***",
      "endReason": "completed",
      "transcript": [
        { "speaker": "bot",  "text": "Hallo, was kann ich für dich tun?",                       "isFinal": true },
        { "speaker": "user", "text": "hello how are you",                                        "isFinal": true },
        { "speaker": "bot",  "text": "I'm good, thanks. How can I help you today?",             "isFinal": true },
        { "speaker": "user", "text": " right now",                                               "isFinal": true },
        { "speaker": "bot",  "text": "What would you like me to do right now?",                  "isFinal": true },
        { "speaker": "user", "text": " I want you to tell me which large language model are you","isFinal": true },
        { "speaker": "bot",  "text": "I'm running on OpenAI GPT 5.5 right now, inside OpenClaw.","isFinal": true },
        { "speaker": "user", "text": " okay thank you bye bye",                                  "isFinal": true },
        { "speaker": "bot",  "text": "You're welcome. Bye!",                                     "isFinal": true }
      ]
    }

    Before the fix, only the first two transcript entries existed (the bot greeting and one user turn) and endReason came from the caller hanging up after silence rather than from the bot saying goodbye.

  • Observed result after fix: caller heard each bot reply audibly through the call. Multi-turn conversation worked end-to-end. Conversation ended naturally (caller said "okay thank you bye bye" → bot replied → caller hung up). No regressions observed in outbound calling or any other voice-call flow on the same gateway during the test session.

  • What was not tested:

    • Plivo (the other provider currently using the generic webhook event path). The same processParsedEvents code path covers it and the fix is provider-agnostic, but I don't have a Plivo number to dial.
    • Twilio Media Streams (path-1) regression. The diff makes no behavioral change to that path, but I don't have a Twilio number to dial either. Unit coverage in webhook.test.ts > VoiceCallWebhookServer media stream auto-response continues to pass.
    • Live race between an active transcriptWaiter and a webhook transcript event. Covered by the unit test "does not fire handleInboundResponse when a transcript waiter is pending" but not exercised live.

Verification

  • pnpm test extensions/voice-call/src/webhook.test.ts — 38/38 pass (34 pre-existing + 4 new under the webhook event path auto-response (#79118) describe block)
  • pnpm test extensions/voice-call/src/manager/events.test.ts extensions/voice-call/src/manager.closed-loop.test.ts extensions/voice-call/src/providers/telnyx.test.ts — all pass
  • Whole voice-call extension test run (44 files, 377 tests) — all pass; no regressions
  • pnpm check:changed — exit 0 (typecheck extensions, typecheck extension tests, lint extensions via oxlint, runtime sidecar loader guard, runtime import cycles, duplicate scan target coverage)

Notes

@openclaw-barnacle openclaw-barnacle Bot added channel: voice-call Channel integration: voice-call size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 8, 2026
@clawsweeper

clawsweeper Bot commented May 8, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs changes before merge. Reviewed July 3, 2026, 5:04 PM ET / 21:04 UTC.

Summary
The branch adds a generic voice-call webhook call.speech auto-response handoff, exposes a CallManager transcript-waiter query, and adds webhook-path regression coverage for Telnyx/Plivo-style speech events.

PR surface: Source +57, Tests +202, Docs +1. Total +260 across 4 files.

Reproducibility: yes. by source inspection: Telnyx and Plivo provider callbacks can emit final call.speech, current processParsedEvents only forwards to manager state handling, and only the media-stream sibling path calls handleInboundResponse. I did not run a live carrier call in this read-only review.

Review metrics: 1 noteworthy metric.

  • Release-Owned Changelog Edit: 1 added entry. Contributor PRs should keep release-note context in the PR body or squash message while release generation owns CHANGELOG.md.

Stored data model
Persistent data-model change detected: vector/embedding metadata: extensions/voice-call/src/webhook.ts. Confirm migration or upgrade compatibility proof before merge.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #79118
Summary: This PR is the active candidate fix for the canonical Telnyx generic webhook transcript auto-response bug; related realtime and double-greeting work are adjacent but do not replace it.

Members:

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

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦞 diamond lobster
Patch quality: 🦐 gold shrimp
Result: needs maintainer review before merge.

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

Rank-up moves:

  • Refresh the branch against current main and resolve the dirty merge state.
  • Remove the CHANGELOG.md hunk and update the Telnyx streaming comment.
  • Rerun focused voice-call validation after the refresh.

Risk before merge

  • [P1] GitHub currently reports the PR as dirty and not rebaseable, so the exact current-main merge result needs a branch refresh before maintainers can rely on the patch.
  • [P1] The change intentionally adds bot-reply side effects to the generic provider webhook speech path; Telnyx live proof is strong, but Plivo remains shared-path source/test evidence rather than carrier-tested proof.
  • [P1] The branch still includes release-owned CHANGELOG.md churn and a stale Telnyx streaming comment that should be cleaned up before merge.

Maintainer options:

  1. Refresh And Repair The Branch (recommended)
    Resolve the current conflict, remove the release-owned changelog hunk, update the stale Telnyx streaming note, and re-review the exact merged webhook reply path.
  2. Accept Shared-Path Plivo Proof
    Maintainers may accept the supplied Telnyx live proof plus provider-agnostic webhook-path tests for Plivo instead of requiring another live carrier call.
  3. Replace If Refresh Stalls
    If the contributor branch cannot be refreshed cleanly, preserve the runtime/test logic in a narrow replacement PR and credit this source PR.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Resolve merge conflicts against current main, remove the CHANGELOG.md hunk, update the processParsedEvents comment so Telnyx realtime support is not described as absent, preserve the webhook auto-response logic/tests, and rerun focused voice-call validation.

Next step before merge

  • [P2] A narrow automated repair can refresh the branch, remove release-owned changelog churn, update the stale Telnyx comment, and preserve the validated runtime fix.

Security
Cleared: The diff does not add dependencies, workflows, package metadata, secret handling, or new external code execution paths; no concrete security or supply-chain concern was found.

Review findings

  • [P2] Remove the release-owned changelog entry — CHANGELOG.md:80
  • [P3] Update the stale Telnyx streaming note — extensions/voice-call/src/webhook.ts:857-859
Review details

Best possible solution:

Refresh this PR or a narrow replacement on current main, preserve the webhook auto-response handoff with waiter/replay guards, drop the changelog hunk, update the Telnyx comment, and rerun focused voice-call validation.

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

Yes, by source inspection: Telnyx and Plivo provider callbacks can emit final call.speech, current processParsedEvents only forwards to manager state handling, and only the media-stream sibling path calls handleInboundResponse. I did not run a live carrier call in this read-only review.

Is this the best way to solve the issue?

Yes, with cleanup: adding the missing webhook-server handoff after final speech is the narrow owner-boundary fix, while moving response generation into manager events would couple manager state handling to runtime response side effects. The branch still needs refresh and small cleanup before it is the best merge artifact.

Full review comments:

  • [P2] Remove the release-owned changelog entry — CHANGELOG.md:80
    AGENTS.md and CONTRIBUTING.md say normal contributor PRs should not edit CHANGELOG.md; release generation owns that file. Keep this release-note context in the PR body or eventual squash message and drop this hunk.
    Confidence: 0.93
  • [P3] Update the stale Telnyx streaming note — extensions/voice-call/src/webhook.ts:857-859
    Current main includes merged Telnyx realtime media streaming, so this new comment would be stale on arrival. Reword it to describe the generic webhook transcript path when streaming/realtime is disabled or unavailable, without claiming Telnyx lacks OpenClaw streaming integration.
    Confidence: 0.88

Overall correctness: patch is incorrect
Overall confidence: 0.87

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 010b61746379.

Label changes

Label justifications:

  • P1: The PR addresses a real voice-call workflow where Telnyx inbound conversations can capture caller speech but fail to deliver any bot reply.
  • merge-risk: 🚨 message-delivery: The diff changes the generic webhook transcript path that decides whether voice-call users receive a bot response after speaking.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦞 diamond lobster and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Sufficient (logs): The PR body includes after-fix Telnyx live-call logs and a redacted persisted multi-turn call record showing user turns followed by audible bot replies.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix Telnyx live-call logs and a redacted persisted multi-turn call record showing user turns followed by audible bot replies.
Evidence reviewed

PR surface:

Source +57, Tests +202, Docs +1. Total +260 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 2 57 0 +57
Tests 1 202 0 +202
Docs 1 1 0 +1
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 4 260 0 +260

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs extensions/voice-call/src/webhook.test.ts.
  • [P1] node scripts/run-vitest.mjs extensions/voice-call/src/manager/events.test.ts extensions/voice-call/src/manager.closed-loop.test.ts extensions/voice-call/src/providers/telnyx.test.ts.
  • [P1] node scripts/run-oxlint.mjs --tsconfig config/tsconfig/oxlint.extensions.json extensions/voice-call/src/webhook.ts extensions/voice-call/src/webhook.test.ts extensions/voice-call/src/manager.ts.
  • [P1] git diff --check.

What I checked:

  • Repository policy read: Root AGENTS.md and extensions/AGENTS.md were read fully; their PR review, extension-boundary, merge-risk, and changelog guidance apply to this bundled plugin review. (AGENTS.md:29, 010b61746379)
  • Current main missing generic handoff: processParsedEvents on current main only forwards parsed provider webhook events to manager.processEvent; it does not call handleInboundResponse after final speech. (extensions/voice-call/src/webhook.ts:972, 010b61746379)
  • Sibling streaming path auto-responds: The media-stream transcript callback processes a call.speech event and then calls handleInboundResponse for inbound or conversation-mode calls, showing the behavior missing from the generic webhook path. (extensions/voice-call/src/webhook.ts:424, 010b61746379)
  • Manager speech handling is state-only: The manager call.speech branch resolves waiters, appends the user transcript, ensures timers, and transitions to listening; it does not generate or speak a bot response. (extensions/voice-call/src/manager/events.ts:295, 010b61746379)
  • Telnyx reaches call.speech: Telnyx call.transcription webhooks normalize to final call.speech events and fall back to call_control_id when client_state is absent, matching the reported non-streaming webhook path. (extensions/voice-call/src/providers/telnyx.ts:154, 010b61746379)
  • Plivo shares the generic speech path: Plivo extracts speech input from provider callbacks and emits final call.speech events through the same parsed-webhook path, so the PR affects a shared delivery surface. (extensions/voice-call/src/providers/plivo.ts:254, 010b61746379)

Likely related people:

  • steipete: Git history shows repeated work on the voice-call webhook server, handleInboundResponse, manager split, replay/stale transition handling, and inbound policy hardening that shape this path. (role: feature-history contributor; confidence: high; commits: 42c17adb5e4d, 439a7732f478, b5f7ba502de2; files: extensions/voice-call/src/webhook.ts, extensions/voice-call/src/manager.ts, extensions/voice-call/src/manager/events.ts)
  • vincentkoc: Recent release and voice-call retry/replay work touched the same webhook/event delivery area and latest-release provenance. (role: recent area contributor; confidence: medium; commits: e085fa1a3ffd, 20248c475f18, 0369bd75c1cd; files: extensions/voice-call/src/webhook.ts, extensions/voice-call/src/manager/events.ts, extensions/voice-call/src/providers/telnyx.ts)
  • vrknetha: History shows the Plivo provider speech surface was added in the Plivo provider commit, which matters because this PR changes the generic parsed-webhook speech path shared with Plivo. (role: provider-surface introducer; confidence: medium; commits: 946b0229e8a4; files: extensions/voice-call/src/providers/plivo.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.

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 8, 2026
@openclaw-barnacle openclaw-barnacle Bot added size: M and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. size: S labels May 8, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 8, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 8, 2026
@dvy
dvy force-pushed the fix/79118-telnyx-auto-response branch from bbf7101 to 50e320a Compare May 8, 2026 10:42
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 8, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 8, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 8, 2026
@dvy
dvy force-pushed the fix/79118-telnyx-auto-response branch from 50e320a to 96c1520 Compare May 9, 2026 20:55
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 9, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 9, 2026
@dvy
dvy force-pushed the fix/79118-telnyx-auto-response branch 2 times, most recently from b1de31b to e1d519f Compare May 9, 2026 21:49
@dvy dvy changed the title fix(voice-call): auto-respond to non-streaming provider transcripts fix(voice-call): auto-respond on the webhook event transcript path May 9, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 9, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 9, 2026
@dvy
dvy force-pushed the fix/79118-telnyx-auto-response branch from e1d519f to 0e9ba4a Compare May 10, 2026 08:34
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 10, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 10, 2026
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Jun 1, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 1, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Jun 2, 2026
@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. P1 High-priority user-facing bug, regression, or broken workflow. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 2, 2026
@clawsweeper clawsweeper Bot added 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. and removed 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. labels Jun 20, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. label Jun 29, 2026
@steipete steipete self-assigned this Jul 5, 2026
@steipete

steipete commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Landed the maintained replacement in #100255, preserving your contribution credit and consolidating webhook/media transcript auto-response into one guarded handoff path.

Canonical merge: c3b479b8e2cc0ba04d29a88db77a4319f8f4d12c

The original fork history was no longer practical to refresh safely across rewritten main, so I am closing this superseded PR. Thank you, @dvy, for finding the missing webhook transcript response loop.

@steipete steipete closed this Jul 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: voice-call Channel integration: voice-call merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[voice-call] Telnyx inbound calls answer and greet, but bot never replies — auto-response loop missing for webhook call.speech path

2 participants