[RELEASE] Fish Audio is the 24th chat channel (carries #5055) - #5821
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xb6A5G74JiMe3zHFs1JZEP
✅ Drift Bot (ClawMetry): no drift detectedDrift Bot analyzed the changed files against this project's blueprints and requirements and found no drift. |
This was referenced Sep 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Publishes #5055 (merged) to PyPI, closing #5045.
Why this needs to ship, not just merge. The channel lives in
clawmetry/sync.py,clawmetry/gateway_tap.py,clawmetry/entitlements.pyandroutes/channels.py— all in the wheel. Ingest runs on the node, so no Fish Audio conversation appears for anyone until the package is on PyPI.What rides this: #5055 only.
What it adds
fish-audiobecomes the 24th chat channel: transcripts ingest from~/.openclaw/fish-audio/*.jsonl, live events arrive over the gateway tap asfishaudio, and/api/channel/*serves the tab.People delegate to agents through chat, so a channel ClawMetry cannot see is a conversation that simply does not exist in the product — the shape of the original report, "I message Diya on Telegram and ClawMetry shows nothing".
A chat channel is four independent lists
sync._CHANNEL_DIRS~/.openclaw/<channel>/*.jsonlgateway_tap.CHANNEL_NAMESentitlements.ALL_CHANNELS/CHANNEL_LABELSroutes/channels.py/api/channel/*endpointEach omission is silent and looks like a different bug. The second row is the nastiest: a reporter says "old messages show up but nothing new", which points at ingest rather than at a missing subscription.
That rule is now a check
tests/test_channel_four_lists.pyasserts every catalogued channel is in both ingest lists, that neither carries an orphan, that each has a label, and that the three lists are the same size. Proven red against a deliberately half-wired channel and green on the tree.Comparison is on a normalised form, because the disk name and the wire name legitimately differ (
fish-audiovsfishaudio) — deriving one list from the other is exactly what the architecture forbids.Also corrected a comment that would have caused the next half-wired channel: the note above
_CHANNEL_DIRSsaid adding a directory needed "no further wiring required" (false), and still said "21 adapter routes" when there are 24.Verification
tests/test_entitlement_channel_catalog.py(27 tests) and the count guard pass, reading 24 across every surface.No-PRD: publishes an already-merged channel adapter; the architecture is documented on the Runtime and Session Observability blueprint.
🤖 Generated with Claude Code
https://claude.ai/code/session_01Xb6A5G74JiMe3zHFs1JZEP