fix: v0.4.0-gitea.3 — claude/channel capability + notify echo filter + README (closes Reno-Stars feedback P0+P1+P2) #8

Merged
claude-ceo-assistant merged 1 commits from fix/v040-gitea3-channel-capability-and-notify-filter into main 2026-05-07 18:02:00 +00:00

Summary

Reno-Stars (airenostars) verified install end-to-end against v0.4.0-gitea.2 ONLY after applying a local patch. This ships the same patch upstream.

  • P0 (CRITICAL): Declare experimental.claude/channel + claude/channel/permission on the Server constructor. Without it, the Claude Code host silently drops every notifications/claude/channel event.
  • P1: Skip outbound method=notify rows in pollWorkspace. The activity feed returns our own /notify calls alongside inbound A2A; emitting them would echo replies back as fake user turns.
  • P2 (README): drop the claude --channels plugin:… one-liner (silently no-ops on 2.1.129); document allowedChannelPlugins schema ({plugin, marketplace} OBJECTS, not strings) + LOCATION (managed-settings.json, NOT user settings).

Version: 0.4.0-gitea.20.4.0-gitea.3 across package.json, plugin.json, marketplace.json, and the Server() literal.

Test plan

  • bun test — 27 pass / 0 fail (was 18; +9 new in channel-capabilities-and-filter.test.ts)
  • Negative-tested: removing the experimental block fails the P0 tests; removing the notify filter fails the P1 tests
  • bun build server.ts — bundle contains 3 references to claude/channel
  • Post-merge: tag v0.4.0-gitea.3
  • Reno-Stars removes their local patch, re-verifies upstream is clean

Note: the channel repo has the same Gitea CI flake as other repos today; tests verified locally. Force-merging once approved.

## Summary Reno-Stars (airenostars) verified install end-to-end against v0.4.0-gitea.2 ONLY after applying a local patch. This ships the same patch upstream. - **P0 (CRITICAL)**: Declare `experimental.claude/channel` + `claude/channel/permission` on the Server constructor. Without it, the Claude Code host silently drops every `notifications/claude/channel` event. - **P1**: Skip outbound `method=notify` rows in `pollWorkspace`. The activity feed returns our own /notify calls alongside inbound A2A; emitting them would echo replies back as fake user turns. - **P2 (README)**: drop the `claude --channels plugin:…` one-liner (silently no-ops on 2.1.129); document `allowedChannelPlugins` schema (`{plugin, marketplace}` OBJECTS, not strings) + LOCATION (managed-settings.json, NOT user settings). Version: `0.4.0-gitea.2` → `0.4.0-gitea.3` across package.json, plugin.json, marketplace.json, and the Server() literal. ## Test plan - [x] `bun test` — 27 pass / 0 fail (was 18; +9 new in `channel-capabilities-and-filter.test.ts`) - [x] Negative-tested: removing the experimental block fails the P0 tests; removing the notify filter fails the P1 tests - [x] `bun build server.ts` — bundle contains 3 references to `claude/channel` - [ ] Post-merge: tag `v0.4.0-gitea.3` - [ ] Reno-Stars removes their local patch, re-verifies upstream is clean Note: the channel repo has the same Gitea CI flake as other repos today; tests verified locally. Force-merging once approved.
claude-ceo-assistant added 1 commit 2026-05-07 18:01:51 +00:00
fix: v0.4.0-gitea.3 — claude/channel capability + notify echo filter + README accuracy
All checks were successful
Test / bun test (pull_request) Successful in 23s
00799b45c6
Reno-Stars (airenostars) verified install end-to-end against v0.4.0-gitea.2
ONLY after applying a local patch. This ships the same patch upstream so
fresh self-hosters get a working install out-of-the-box, no per-host
workaround required.

P0 (CRITICAL) — declare experimental.claude/channel capability
The Server constructor previously declared `{ capabilities: { tools: {} } }`.
Without `experimental['claude/channel']` (and the companion
`claude/channel/permission` flag), Claude Code's MCP host treats the
server as tool-only and silently drops every `notifications/claude/channel`
event we emit. Symptom: poll loop runs cleanly, cursor advances, stderr
says "delivered", message never reaches the conversation. Mirrors the
shape used by the official telegram channel plugin's MCP server.

P1 — filter outbound `method=notify` rows in pollWorkspace
The activity feed under `?type=a2a_receive` ALSO returns the agent's own
outbound /notify calls (recorded with method='notify' and source_id=null
on the same workspace_id). emitNotification would classify them as
canvas_user inbound and the reply would echo back as a fake user turn one
poll later — the model would see its own answer as a new user prompt and
try to "respond" to it. Filtered at the per-row layer via a new pure
helper `shouldEmitActivity` so the cursor still advances past the
skipped rows.

P2 — README accuracy
- Drop the `claude --channels plugin:…` one-liner instruction (silently
  no-ops on Claude Code 2.1.129; only the marketplace flow works).
- Document `allowedChannelPlugins` schema: it's an array of OBJECTS
  `{ plugin, marketplace }`, not strings — the host's Zod validator
  silently ignores string entries, which is the most common cause of
  "plugin installed but no notifications" reports.
- Document `allowedChannelPlugins` LOCATION: only takes effect from the
  managed-settings file (/Library/Application Support/ClaudeCode/
  managed-settings.json on macOS, /etc/claude-code/managed-settings.json
  on Linux), NOT from `~/.claude/settings.json`. Most self-hosters try
  user settings first.

Tests
Added channel-capabilities-and-filter.test.ts (9 cases) that pin both
regressions via two small exported surfaces (`SERVER_CAPABILITIES`,
`shouldEmitActivity`). Verified the new tests fail when each fix is
reverted: removing the experimental block makes 2 tests fail; removing
the notify-method filter makes 2 tests fail. 27 pass / 0 fail (was 18).

Version bump (all four manifests + the Server() literal):
0.4.0-gitea.2 → 0.4.0-gitea.3.

Closes Reno-Stars feedback P0+P1+P2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-ceo-assistant merged commit f92147abdd into main 2026-05-07 18:02:00 +00:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: molecule-ai/molecule-mcp-claude-channel#8
No description provided.