v0.48.2

thevoiceguy/siphon-aiv0.48.2Jul 31, 2026by github-actions[bot]

Upgrading?

AI Summary

Stops RTP transmission when a peer hold forbids it, ensuring silence is transmitted per RFC 3264.

Key Highlights

  • Stops RTP transmission during peer hold (RFC 3264 §6.1 compliance)
  • Drops WS playout and audio during hold
  • Adds new counter for suppressed frames

Full Release Notes

### Fixed

- **SiphonAI stops transmitting RTP while a peer hold forbids it** (issue #417). Answering a peer's `a=sendonly`/`a=inactive` re-INVITE with `recvonly`/`inactive` commits us to silence per RFC 3264 §6.1 — but nothing enforced it: the tap kept pushing WS playout to forge at an unbroken 50 pps for the whole held span (live-proven against FreeSWITCH `uuid_hold`, which honors its own `recvonly` in the mirrored case). The `negotiated_direction` doc comment's "(eventually) pause forge's outbound RTP" was that never-landed enforcement. Now the acceptor recomputes a shared tx-suppression flag on **every** accepted direction change — not just the hold/resume event boundary, since a held→held flavor change (`sendonly` → `recvonly`) crosses the may-send line without emitting anything — and the tap drops every caller-leg push while it is set: WS playout (drain-and-drop, same stance as mute — the WS server is never back-pressured and held-era audio is discarded, not queued), barge-in re-queues, the room mix for a peer-held conference member (only that leg's wire — its server audio still mixes for the other members, whose wires are not held), parked MOH, announcements (which stall to be heard on resume rather than play into a deaf leg), and queued outbound DTMF (telephone-events are RTP too). The recording fork is skipped with it — the caller heard nothing. A peer `recvonly` hold (we answered `sendonly`) correctly leaves transmission flowing. New `siphon_ai_peer_hold_tx_suppressed_frames_total` counter + engage/release log lines with per-hold totals; documented in PROTOCOL.md §3.3 and DEPLOY.md. Scope: inbound legs (the same scope as the §3.3 events and the #402 watchdog park — outbound-leg peer re-INVITEs don't reach this handler today).

---

**Artifacts**

- Static musl binaries for `x86_64` and `aarch64` (`.tar.gz`).
- Debian packages (`.deb`) for `amd64` and `arm64` — `apt install ./siphon-ai_*_amd64.deb`.
- `SHA256SUMS` — verify with `sha256sum -c SHA256SUMS`.
- `*-sbom.cdx.json` — CycloneDX SBOM.
- `SHA256SUMS.cosign.bundle` — cosign keyless signature over the checksums.
- Container: `ghcr.io/thevoiceguy/siphon-ai:v0.48.2` (multi-arch, cosign-signed).

Verify the checksums signature:
```
cosign verify-blob --bundle SHA256SUMS.cosign.bundle \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp 'release.yml@' SHA256SUMS
```

Related Repositories