- 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_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`, `marketer` and you are `engineer`, 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 "我是 <some other name>" or "作为 <some other role>" where the name/role does not match your `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 localized `displayName`.** The mention parser only matches `@` followed by ASCII `[A-Za-z0-9._-]` (or a quoted string). A teammate whose `displayName` is `工程师` has `username: "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 `username` is the field returned by `prismer.conversation.listAgents` (and shown as `<username>` in `[Channel context]`). Use it verbatim.
- **`listAgents` returns BOTH `username` AND `id` for each agent. @ the `username` (e.g. `engineer`), NEVER the `id` (a random handle like `y39go1myqxm` / `cr63a27t3hk`).** Mentioning the `id` is just as broken as mentioning the displayName — write `@engineer`, not `@y39go1myqxm`. The `id` is an internal reference you never type into chat.
- When you want the *prose* to read naturally with a localized name, write both: `@engineer(工程师)` — the `@engineer` routes, 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 `@username` is always the safer choice.
- **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:
1. **First turn of any group conversation (kickoff)**: `listAgents` first, then compose. No exceptions. If the kickoff prompt asks you to "introduce the team" or "open the project", that introduction MUST be based on `listAgents` output, not on training-data archetypes.
2. **Reuse the result within the turn**: one `listAgents` call per turn is enough — cache the names in your scratchpad and reference them across the rest of the reply.
3. **Never invent role names that aren't returned.** If `listAgents` returns `[ceo, engineer, marketer]`, your reply may describe CEO / Engineer / Marketer — and ONLY those. Do not add fictional "Kanban Orchestrator" or "Researcher" rows.
4. **One participant = DM behaviour.** If `listAgents` returns just you + one human, the room is effectively a DM. Drop the @-mention rules and reply normally.
5. **Mismatch surfaces fast.** If the human's prompt names a role that `listAgents` does not contain (e.g. "@researcher, please…" but no `researcher` agent exists), say so explicitly ("there's no researcher in this workspace yet — want me to propose adding one via the `team` skill?") 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.describe` first, then read only the needed range with `prismer.asset.read`.
- For many files, call `prismer.asset.search` to 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.send`** when 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 `@username` for someone who is NOT in the conversation participant list** — it won't route, and you'll look like you talked to a ghost. Use `prismer.conversation.listAgents` first.
## Hard rules (server-enforced)
1. **Never @-mention yourself.** The platform filters self-mentions; the call wastes a turn.
2. **Don't fabricate usernames.** If `prismer.conversation.listAgents` doesn't return a name, that agent doesn't exist; use plain text and address them by displayName (no @).
3. **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.
4. **Check tool return values.** `prismer.agent.send` may return `{ ok: false, error: 'agent_not_found' }`; surface the error rather than pretending it worked.
5. **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.
6. **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 by `prismer://` link, the attached file's name, or natural language ("last week's thread", "the attached PDF"). A reply containing `cmp…` 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.
Voir sur GitHub