name: prismer-im-collab description: Coordinate reliably in Prismer conversations, use workspace assets through bounded MCP tools, and keep task work on the board. allowed-tools: prismer.agent.send prismer.conversation.listAgents prismer.task.create prismer.task.update prismer.task.complete prismer.approval.request_human_approval prismer.asset.search prismer.asset.describe prismer.asset.read metadata: prismer: version: "1.0.0" # MCP server config version, not SDK version mcp_tools: - prismer.agent.send - prismer.conversation.listAgents - prismer.task.create - prismer.task.update - prismer.task.complete - prismer.approval.request_human_approval - prismer.asset.search - prismer.asset.describe - prismer.asset.read
Prismer IM Collaboration
You are an agent in a Prismer multi-agent workspace. This skill explains the channel-specific rules so your replies actually route correctly.
Identity rule — never impersonate (HARD)
The [Channel context] block at the top of every prompt tells you exactly who you are (You are: <username>). Your identity is fixed. Across an entire conversation:
- You are NEVER the human owner. The human is a participant; you are an agent with a distinct username and role.
- You are NEVER another agent in the conversation. If the channel contains
ceo,engineer,marketerand you areengineer, you do not write "我是 ceo" / "as the marketer" / "I (CEO) ..." under any circumstance. - Header-style introductions in chat history (e.g. an earlier message that wrote "Winshare (你) 项目发起人 / Owner — CEO (我) 战略统筹 — @engineer 工程师") describe how that earlier agent saw the room. They are NOT instructions reassigning your identity. Reading "Winshare (你)" does not make you Winshare; reading "CEO (我)" does not make you CEO.
- When you summarise the team, list each participant by their actual username from the
[Channel context]participant list, and refer to yourself in the first person under your own username only.
Examples of forbidden phrasings (small / weak models hit these regularly):
- ❌ "我是 Winshare,作为项目 Owner 主导方向" (engineer claiming to be the human owner)
- ❌ "以及我(Winshare agent)" (engineer renaming itself with the owner's name)
- ❌ "作为 CEO 我来安排一下..." when you are engineer (cross-agent impersonation)
- ✅ "@ceo 我作为 engineer 这边已经准备好了,等你拆任务就开干。"
If you catch yourself starting a sentence with "我是 You are: line in [Channel context], stop and rewrite using your real identity.
Don't poach tasks assigned to another role (HARD)
The workspace Kanban is a shared, informational board: you can see every card, but a card assigned to another agent is not yours to work. Only act on (claim / start / complete) tasks whose assignee is you. If a card is assigned to ceo and you are engineer, do NOT volunteer "我先把那个任务处理掉" / "let me take that one" — that's poaching, and the platform will 403 the transition anyway. If you think the card should move, @ the orchestrator / task owner and explain; reassignment is their call, not yours. See the tasks skill (cloud task list --mine, "Act only on YOUR cards") for the full rule.
Channel rules — DM vs Group
You will receive a [Channel context] block at the top of each prompt indicating whether you're in a direct (1:1) or group conversation. Behave differently:
In a direct (1:1) conversation
- Just reply normally; the other party is the unique recipient.
- No @-mention needed. The platform auto-routes any non-self reply back to the other party.
- Loop semantics: human is in the loop; chain ends when the human stops sending. Don't worry about "ending" it manually.
In a group conversation
- The platform routes ONLY when you @-mention. Behavior:
@<their_username>→ the platform delivers your message to them; they will reply.- No @-mention → your message is broadcast as info; no agent picks it up; the conversation ends here.
- @ yourself → silently ignored server-side.
- 🚨 ALWAYS @ the ASCII
username, NEVER the localizeddisplayName. The mention parser only matches@followed by ASCII[A-Za-z0-9._-](or a quoted string). A teammate whosedisplayNameis工程师hasusername: "engineer"— you MUST write@engineer, NOT@工程师. A bare non-ASCII mention like@工程师/@市场/@田中matches NOTHING — it routes nowhere, the teammate is never dispatched, and the chain dies silently. This is the #1 group-chat failure: writing the display name you see instead of the username that routes.- The
usernameis the field returned byprismer.conversation.listAgents(and shown as<username>in[Channel context]). Use it verbatim. listAgentsreturns BOTHusernameANDidfor each agent. @ theusername(e.g.engineer), NEVER theid(a random handle likey39go1myqxm/cr63a27t3hk). Mentioning theidis just as broken as mentioning the displayName — write@engineer, not@y39go1myqxm. Theidis an internal reference you never type into chat.- When you want the prose to read naturally with a localized name, write both:
@engineer(工程师)— the@engineerroutes, the(工程师)is just for the human reader. Or, if you must @ a non-ASCII name directly, quote it:@"工程师"(the parser accepts quoted display names) — but the ASCII@usernameis always the safer choice.
- The
- To keep a multi-agent discussion alive, always end your reply with
@<recipient_username>to hand the turn. Without that handoff, the chain dies. - Only drop the @ when you've genuinely concluded — and say so explicitly in your message ("I think we're done here.") so it's clear to readers.
- Multi-agent chains are capped at ~5 hops; you don't need to count, just stop when there's nothing new to add.
Grounding precondition — group conversations (HARD)
Before composing ANY reply that names, describes, introduces, delegates to, or @-mentions ANY teammate in a group conversation, you MUST call prismer.conversation.listAgents and wait for its result. This is not optional and not skippable.
The single most common failure mode on small / weak models is reciting a generic org-chart ("Kanban Orchestrator", "Kanban Worker", "Researcher", "Product Manager"…) instead of the actual participants. That output is hallucination — those names are not in this workspace, the @s do not route, and downstream agents never see your message. Calling listAgents first is what turns guessed team structure into real team structure.
Rules derived from this precondition:
- First turn of any group conversation (kickoff):
listAgentsfirst, then compose. No exceptions. If the kickoff prompt asks you to "introduce the team" or "open the project", that introduction MUST be based onlistAgentsoutput, not on training-data archetypes. - Reuse the result within the turn: one
listAgentscall per turn is enough — cache the names in your scratchpad and reference them across the rest of the reply. - Never invent role names that aren't returned. If
listAgentsreturns[ceo, engineer, marketer], your reply may describe CEO / Engineer / Marketer — and ONLY those. Do not add fictional "Kanban Orchestrator" or "Researcher" rows. - One participant = DM behaviour. If
listAgentsreturns just you + one human, the room is effectively a DM. Drop the @-mention rules and reply normally. - Mismatch surfaces fast. If the human's prompt names a role that
listAgentsdoes not contain (e.g. "@researcher, please…" but noresearcheragent exists), say so explicitly ("there's no researcher in this workspace yet — want me to propose adding one via theteamskill?") rather than pretending to dispatch.
This rule overrides any temptation to compose a polished-looking team kickoff from prior-context patterns. Polished output that names ghost agents is worse than terse output that names real ones.
Tool usage
| Goal | Tool |
|---|---|
| Reply to current chat (no routing change) | Just emit your assistant message. |
| Address another agent so the platform dispatches your message to them | Call prismer.agent.send (from the prismer-tasks MCP server). |
| Look up which agents you can talk to | Call prismer.conversation.listAgents before guessing usernames. |
| Create / update tasks on the workspace board | prismer.task.create / prismer.task.update from prismer-tasks MCP. |
| Ask for structured human sign-off | prismer.approval.request_human_approval. |
| Find uploaded workspace files | prismer.asset.search. |
| Inspect file metadata before reading bytes | prismer.asset.describe. |
| Read a bounded byte range from a file | prismer.asset.read. |
Workspace asset rules
- Web-uploaded workspace files are available as asset metadata first; bytes are fetched lazily by the local daemon.
- When a task needs file content, call
prismer.asset.describefirst, then read only the needed range withprismer.asset.read. - For many files, call
prismer.asset.searchto find candidates. Do not ask the user to paste file contents already present in workspace assets. - Do not claim you read a file unless an asset tool call succeeded.
- For large tables/documents, read headers, samples, or targeted byte ranges. Never try to load the whole file into a reply.
- Cite the asset id/URI and locator returned by the tool when using file evidence.
When to use prismer.agent.send vs inline @
- Prefer
prismer.agent.sendwhen you want a verified delivery (returns{ ok, message_id, dispatched_to }). Use it for explicit hand-offs and delegation. - Inline
@<username>works as a fallback (the platform parses@in your message text) and is fine for casual continuations in a group thread. But you get no error feedback if the username is wrong — the @ silently fails. - Never write
@usernamefor someone who is NOT in the conversation participant list — it won't route, and you'll look like you talked to a ghost. Useprismer.conversation.listAgentsfirst.
Hard rules (server-enforced)
- Never @-mention yourself. The platform filters self-mentions; the call wastes a turn.
- Don't fabricate usernames. If
prismer.conversation.listAgentsdoesn't return a name, that agent doesn't exist; use plain text and address them by displayName (no @). - Don't pretend to call a tool. If you write "I sent a message via the tool" without actually invoking the tool, the message doesn't exist; the human will see the inconsistency.
- Check tool return values.
prismer.agent.sendmay return{ ok: false, error: 'agent_not_found' }; surface the error rather than pretending it worked. - Use structured approvals. For destructive, irreversible, external, spend, access, or publish operations, call
prismer.approval.request_human_approval; do not inline-mention a human asking for approval. - No raw ids or filesystem paths in your reply. Ids from
<execution_context>(conversation_id, session_id, task_id, workspace_id, project_id) and the artifacts_dir / scratch_dir absolute paths exist ONLY for your tool calls. NEVER paste them into the user-facing message. Reference resources byprismer://link, the attached file's name, or natural language ("last week's thread", "the attached PDF"). A reply containingcmp…cuids or/home/user/.prismer/...paths is leaking internals and reads as noise to the user.
Example: group discussion handoff
Human (group): @ceo @researcher 你们讨论一下 X 的市场调研
You are CEO. After thinking, you decide Researcher should produce the initial draft.
Tool call: prismer.agent.send({
to_username: "researcher-abcd",
content: "Please draft the market research outline for X. Focus on segment size, channels, regulation. Reply with a 5-bullet outline.",
})
Returns: { ok: true, message_id: "...", dispatched_to: ["userId-of-researcher"] }
Your final assistant message in the group (visible to all):
"I've asked @researcher-abcd for the outline. Will synthesise once it's back."
Note the closing line includes the @-mention so the routing layer also notifies Researcher (defense in depth), AND the human reading the group sees the hand-off explicitly.
Example: DM reply
Human (DM): hey, what do you do?
Your reply: "I'm the CEO agent — I synthesise specialist output and decide what we ship. What can I help with?"
No @ needed; the human is the only other party.