Ground truth:
features.android-v6.json(the feature-existence + enablement oracle) + catalogandroid-v6.json+ the live feature pages (core-features,extensions,ai-features,call-features, theguide-*recipes). A feature not in the oracle does NOT exist for this kit — say so; never invent one. Fetch component params from docs (core→references/docs-map.md).
Companion skills (read first)
cometchat-android-v6-core— install, credentials,initFromSettings → login → render, hot-path callbacks, the fetch map. Assumed here, never repeated.- Deeper slices:
cometchat-android-v6-extensions(the 8 Dashboard extensions in detail) ·cometchat-android-v6-calls(voice/video) ·cometchat-android-v6-push(FCM) ·cometchat-android-v6-{kotlin,compose}-customization(styling a feature's UI).
Use this skill when
"add <feature> to my Android chat", "enable <feature>", "does the Android UI Kit support <X>?", "why isn't <feature> showing up?". The job: resolve the ask against the oracle, take the right enablement branch, wire only what needs wiring, and tell the user honestly what it needs (Dashboard? package? code?).
Prerequisites & install
Same kit + initFromSettings → login gate as core. Some features add a Gradle artifact (calls, push) or need a Dashboard toggle — the branch below says which.
Feature lookup — resolve the ask, then branch
- Find the id in
features.android-v6.json(table below). No match ⇒ the kit has no built-in for it: check whether the Chat SDK covers it (core/references/docs-map.md→ SDK section) and say plainly that there's no UI-Kit component. - Read
enablementand take exactly one branch:auto— already ON in v6. Do NOT "add" it; confirm it's there and offer to customize it (cometchat-android-v6-{kotlin,compose}-customization). Applies to reactions, mentions, receipts, typing, presence, quoted replies, rich text, media, mark-as-unread, report.dashboard-toggle/dashboard-extension— enable it in the CometChat Dashboard; the kit auto-integrates it afterinit+login, no client code. Your job: tell the user exactly where it will appear (composer action sheet, message list, bubble) and how to verify. Ask which are already enabled — you cannot read per-app Dashboard state.gradle-package— add the artifact, then wire (calls:com.cometchat:calls-sdk-android+uiKit.enableCallinginassets/cometchat-settings.json; push:com.cometchat:push-notifications-android+ Firebase). Route to the dedicated skill.code-prop— the kit ships the component/affordance but the HOST wires it (a screen, a callback, a formatter). This is real work: build it, wire the round-trip, verify.dashboard-only— no client code at all (moderation, campaigns); explain the effect users will see.
- Check
needs_stitching(⚙ below) — a default-ON affordance that dead-ends until you wire a destination (or hide it). Wire it or hide it; never leave it inert. - Guide-first: if the docs ship a
guide-*recipe for this feature (seecore/references/docs-map.md→ "Task guides"), BUILD FROM the guide, then DIFF your implementation against it, then apply the hardening deltas (credentials via the settings file, init→login gate, thread targets, IME/insets sizing, listener teardown). - Wire the feature's
ui_components— fetch exact params for YOUR cohort from the component page's.mdtwin.
Feature table (BAKED from features.android-v6.json — ⚙ = needs stitching)
| Feature id | Enablement | Components |
|---|---|---|
text-messaging | auto | CometChatMessageList, CometChatMessageComposer |
media-file-attachments | auto | CometChatMessageComposer, CometChatMessageList |
delivery-read-receipts | auto | CometChatMessageList, CometChatReceipts, CometChatConversations |
mark-as-unread | auto | CometChatConversations |
typing-indicators | auto | CometChatMessageList, CometChatConversations |
user-presence | auto | CometChatConversations, CometChatMessageHeader, CometChatStatusIndicator |
reactions | auto | CometChatMessageList |
mentions | auto | CometChatMessageComposer, CometChatMessageList, CometChatMentionsFormatter |
rich-text-formatting | auto | CometChatMessageComposer, CometChatRichTextFormatter |
quoted-replies | auto | CometChatMessageList, CometChatMessageComposer |
users-groups | auto | CometChatUsers, CometChatGroups, CometChatGroupMembers |
report-message | auto | CometChatMessageList |
threaded-replies | code-prop ⚙ | CometChatMessageList, CometChatThreadHeader, CometChatMessageComposer |
message-search | code-prop ⚙ | CometChatSearch |
custom-message-types | code-prop | CometChatMessageList |
text-formatters | code-prop | CometChatTextFormatter, CometChatMentionsFormatter, CometChatRichTextFormatter |
notification-feed | code-prop | CometChatNotificationFeed |
stickers | dashboard-extension | CometChatMessageComposer, CometChatStickerBubble, CometChatStickerKeyboard |
polls | dashboard-extension | CometChatMessageComposer, CometChatCreatePoll, CometChatPollBubble |
collaborative-whiteboard | dashboard-extension | CometChatMessageComposer, CometChatMessageList |
collaborative-document | dashboard-extension | CometChatMessageComposer, CometChatMessageList |
message-translation | dashboard-extension | CometChatMessageList |
link-preview | dashboard-extension | CometChatMessageList |
thumbnail-generation | dashboard-extension | CometChatMessageList |
message-shortcuts | dashboard-extension ⚙ | CometChatTextFormatter |
profanity-filter | dashboard-extension LEGACY | CometChatMessageList |
smart-reply | dashboard-toggle | CometChatMessageComposer |
conversation-starter | dashboard-toggle | CometChatMessageList |
conversation-summary | dashboard-toggle | CometChatMessageComposer |
ai-assistant | dashboard-toggle ⚙ | CometChatAIAssistantChatHistory, CometChatAIAssistantBubble, CometChatMessageList, CometChatMessageComposer |
moderation | dashboard-only | — (dashboard rules; no client code) |
campaigns | dashboard-only | — (authored in Dashboard) |
voice-video-calls | gradle-package ⚙ | CometChatCallButtons, CometChatIncomingCall, CometChatOutgoingCall, CometChatCallLogs, CometChatCallActivity |
push-notifications | gradle-package ⚙ | — (SDK token registration + FCM) |
Enablement rules that trip people up
reactionsandmentionsare ON BY DEFAULT in v6 (core messaging). Never offer to "add" or "enable" them — if asked, say they're already on and offer to customize them.profanity-filteris LEGACY — its guide points at legacy docs; steer tomoderationinstead. Never suggest it as a new feature.- Dashboard-gated ≠ broken: if a toggled feature doesn't appear, the usual cause is the Dashboard toggle or a stale session — re-login after enabling.
- Pinned messages / saved messages / thread subscription are NOT in the current v6 docs set (they're pending on a docs branch). Don't claim them; say they're not documented for v6 yet and offer the SDK path if one exists.
- A feature's UI appears only after
init+loginsucceed — a "missing feature" is often an init/login failure (core/references/troubleshooting.md).
Common pitfalls
Suggesting an auto feature as new work · hand-rolling a feature the kit auto-renders (translation, previews, stickers) · wiring a code-prop feature's entry point but no way back (dead-end) · a thread screen missing the user/group target (replies silently don't send) · assuming Dashboard state instead of asking · adding the calls/push artifact without the Dashboard side · guessing component params instead of fetching.
Verify it works
Every symbol you emitted is in the catalog (Tier-1) and the app compiles (./gradlew :app:assembleDebug # in YOUR app (npm run verify:fences:android-v6 is a pack-repo gate)). On device: the feature's UI appears where the docs say (composer action sheet / message list / bubble / its own screen); a stitched feature round-trips (open AND back); an auto feature was left alone; anything requiring the Dashboard was called out explicitly to the user with where-to-click. If it doesn't show, check init/login, then the Dashboard toggle, then re-login — in that order.

