Skip to content

[RELEASE] Fish Audio is the 24th chat channel (carries #5055) - #5821

Merged
vivekchand merged 1 commit into
mainfrom
release/fish-audio
Sep 11, 2026
Merged

[RELEASE] Fish Audio is the 24th chat channel (carries #5055)#5821
vivekchand merged 1 commit into
mainfrom
release/fish-audio

Conversation

@vivekchand

Copy link
Copy Markdown
Owner

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.py and routes/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-audio becomes the 24th chat channel: transcripts ingest from ~/.openclaw/fish-audio/*.jsonl, live events arrive over the gateway tap as fishaudio, 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

List What it drives Symptom when missing
sync._CHANNEL_DIRS daemon walks ~/.openclaw/<channel>/*.jsonl history never ingests
gateway_tap.CHANNEL_NAMES live WebSocket subscription live messages never arrive; history works
entitlements.ALL_CHANNELS / CHANNEL_LABELS the catalogue UI and entitlement read invisible even with rows in the store
routes/channels.py the /api/channel/* endpoint the tab cannot be served

Each 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.py asserts 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-audio vs fishaudio) — 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_DIRS said 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

@8090-software-factory

Copy link
Copy Markdown

✅ Drift Bot (ClawMetry): no drift detected

Drift Bot analyzed the changed files against this project's blueprints and requirements and found no drift.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant