Skip to content

feat: / Skill Invocation in Group Channels - #4259

Open
DoodleBears wants to merge 7 commits into
claude/bot-skill-trigger-e16a1ffrom
claude/skills-s2-group
Open

DoodleBears wants to merge 7 commits into
claude/bot-skill-trigger-e16a1ffrom
claude/skills-s2-group

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Nov 15, 2026 •

Copy link
Copy Markdown
Contributor

#4233 | hub #4231 | stacked on #4252 | Agent tasks: claude-code/local/b7955cb7-65c2-4b41-bafd-b18256e4a38b (UI, integration, review), codex/local/01a1e0df-afbe-7283-bd17-0b534bc78f98 (ranking, routing, digests)

Closes #4233

Why the change

S1 made / Skill Invocation work in a Bot DM. A Group Channel holds several PersonaBots, so its / menu must list every member's Skills, let a Human find a Bot's Skills by its name, and keep routing driven by mentions only.

Special things to note

  • Stacked on feat: invoke a Bot's Skills from / in a Human DM #4252 (S1). Retarget to main after feat: invoke a Bot's Skills from / in a Human DM #4252 merges so Closes #4233 takes effect.
  • Merge risk: two-way door, revert the PR; no schema change. Small blast radius: the Group composer menu, skills-list ranking, and the Group digest / pending-context text a Bot reads.
  • A Skill Invocation still addresses no one (ADR-0346): picking Alice's Skill and mentioning Bob wakes only Bob, and Bob reads Alice's snapshot with owner bot:alice.
  • Ordinary Group digests and pending context now carry the <skill_invocation> snapshot too; before, a Bot woken by digest instead of a mention saw only /name.
  • External IM mirrors (Discord/Lark) already receive the message body, so a chip shows as plain /name. A unit test covers the outbound payload. The real-IM browser check (AC-4) needs the signed-in IM QA browser and is tracked in QA: Skill chip falls back to /name in Discord/Lark mirrors (Skills S2 AC-4) #4260.
  • The sent chip in the timeline now shows its owning Bot's avatar, as the composer chip and the menu already did, since a Group message can carry another Bot's Skill.

Change outline

/ menu in a Group Channel: Before (S1 head), a Group's / offered only commands.

Before: typing / in a Group lists only commands

After: commands, then Skills. Alice's /qa-echo and Bob's /triage-bugs carry their avatars; each Host Skill is listed once.

After: Group / menu lists Alice's and Bob's Skills with their avatars, then Host Skills

Bot name ranking: /bob finds Bob's Skill through its owner.

After: /bob lists Bob's /triage-bugs

Alice's Skill, addressed to Bob: the composer holds an @Bob mention and Alice's /qa-echo chip.

After: composer with @Bob and Alice's /qa-echo chip

Only Bob replies (real model, both wake policies mentions-only). The sent chip shows Alice's avatar.

After: Bob alone replies SKILL_QA_7731; the sent chip shows Alice's avatar

Isolated Host, viewport 1440×900 cropped to the conversation pane, light theme, English, AX model from ax-model.json. Canonical read (channelTimeline): the Human message stores skillInvocations[0] = {name: qa-echo, owner: {kind: bot, botSlug: <Alice>}, path: <Alice memory>/.agents/skills/qa-echo/SKILL.md, content} with a single mention of Bob; the only Bot entry is Bob's SKILL_QA_7731. channelSkillCatalog returned both Project Skills and each Host Skill once.

Ranking: rankSkillEntries(entries, query, ownerNames?) gains a Bot-name tier: name prefix > name subsequence > owning Bot display name or slug > description. The composer passes each Bot Skill's display name and slug; skills-list --query does the same through the list RPC, so CLI and menu agree.

Group catalog: the Group composer loads channelSkillCatalog and reloads when the Bot roster changes. Host Skills appear once; each Bot Skill row shows its Bot's avatar.

Same name: a bare /name that matches a command still runs the command; the same-named Skill row stays selectable with the arrow keys.

/alice  →  /alice-intro · Bob   (name prefix)
           /triage · Alice      (owner name)
           /notes · Host        (description)

Tests: packages/core/test/skill-invocation.test.ts (Group routing independence, digest snapshots, plain IM payload), packages/core/test/bot-live-cli.test.ts (CLI ranking), packages/client/test/skill-composer.test.ts (owner-name ranking, command precedence). Codex ran the ci-plan affected suites (4,040 passed, 16 skipped) before integration; pnpm lint and tsc are clean on the integrated head.

🤖 Generated with Claude Code

DoodleBears and others added 6 commits November 16, 2026 04:49
Load the catalog for Group Channels too and reload it when the bot roster
changes.

Issue: #4233
Agent-Task: claude-code/local/0d4a6a9f-6296-49dd-b14c-6789efa657c3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Match owner display names and slugs between Skill name and description matches,
and use the same ranking in skills-list. Preserve sent Skill snapshots in
ordinary Group digests and pending context without changing routing.

Cover owner-independent delivery, plain external IM text, and bare command
precedence; document the Group verification journey.

Issue: #4233
Agent-Task: codex/local/01a1e0df-afbe-7283-bd17-0b534bc78f98
…stays selectable

Issue: #4233
Agent-Task: claude-code/local/b7955cb7-65c2-4b41-bafd-b18256e4a38b

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…group

# Conflicts:
#	.agents/skills/verify-deepseekbot/features/skill-invocation.md
#	docs/bot-cli.md
#	docs/bot-cli.zh.md
Pass each Bot Skill's display name and slug to the shared ranking so typing
a Bot name lists its Skills before description matches.

Issue: #4233
Agent-Task: claude-code/local/b7955cb7-65c2-4b41-bafd-b18256e4a38b

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 15, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f7d69d30-0a2c-44d9-8708-3ae3593ed416

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

A Group message can carry another Bot's Skill, so the sent chip shows its
owner the same way the composer chip and the / menu do.

Issue: #4233
Agent-Task: claude-code/local/b7955cb7-65c2-4b41-bafd-b18256e4a38b

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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