Gnosis agent identities give each AI persona its own memory namespace under your account. Combined with shared collections and signals, agents coordinate across machines, sessions, and hours of downtime. Any agent can wake up, read the current state, do its work, and hand off to the next.
Common Patterns
Solo: Cross-Session
No agent IDs needed. init_core_memories and task_feed carry context between conversations. Tuesday's work is waiting Wednesday morning. This is the most common starting point.
Team: Shared Knowledge
Share a collection with one person or several. Each person uses their own AI tool. Shared facts and tasks are visible to everyone. Works for dev teams, couples planning trips, friends building projects.
Four Agents. Four Machines. Hours Apart.
Agents don't need to be online at the same time. Shared memory carries full context between them.
=== ACT 1: DevClaw finds the bug ===
Tuesday 2:15pm — Claude Code on Nathan's workstation
memory_add(type: task, collection: "team-alpha")
→ created: "Fix sprite alpha on Android"
→ steps: reproduce, trace atlas packing, fix compression, verify
memory_edit(toggle: [0, 1], output: "ETC2 compression strips
premultiplied alpha — TexturePacker uses wrong profile")
→ status: blocked (needs art pipeline owner)
signal(action: "send", recipient: "ArtClaw", collection: "team-alpha",
memory_ids: ["abc-123"])
→ signal queued for ArtClaw
=== ACT 2: ArtClaw picks up the blocked task ===
Tuesday 6:40pm — Cursor on Kyle's laptop
init_core_memories()
→ 1 pending signal (task, team-alpha)
task_feed(collection: "team-alpha", status: "blocked")
→ 1 result: "Fix sprite alpha on Android" [2/4]
memory_search("ETC2 alpha sprite compression")
→ 3 findings from DevClaw's investigation
memory_edit(toggle: [2], set_status: "review")
→ TexturePacker profile updated, sprites re-exported
=== ACT 3: Nathan checks in ===
Wednesday 8:02am — Claude on Nathan's phone
init_core_memories()
→ 1 task updated in team-alpha since yesterday
task_feed()
→ REVIEW [3/4] "Fix sprite alpha on Android"
Nathan: "Ship it."
=== ACT 4: GitAgent deploys ===
Wednesday 8:03am — automated agent
memory_edit(toggle: [3], set_status: "done")
→ task complete. 4/4 steps done.
DevClaw found the bug and got stuck. ArtClaw picked it up hours later with full context. Nathan approved from his phone. A deploy agent shipped it. No handoff meeting. No status thread.
Building Blocks
Everything above is built from 10 simple operations:
| Primitive | Tool | What it does |
|---|---|---|
| Create task | memory_add(type:task) | Structured task with checklist steps and status |
| Claim work | task_feed + memory_edit(set_status) | Poll for pending tasks, set to active |
| Record finding | memory_edit(output) | Attach a linked fact to a task |
| Mark progress | memory_edit(toggle) | Flip checkboxes by index |
| Block / unblock | memory_edit(set_status) | Signal that work needs another agent |
| Send signal | signal(action:"send") | Explicit "go look at this" notification |
| Check signals | signal(action:"check") | Peek at pending notifications |
| Share context | collection_manage(publish) | Copy personal memories to shared collection |
| Search context | memory_search | Find relevant memories across all namespaces |
| Poll changes | task_feed(since) | Chronological feed of task updates |
Signals
Send a memory or task to another agent so it has context for what needs doing. In agent frameworks, signals are how you trigger work across machines. An agent finishes a step, sends a signal referencing the task with the next checkbox queued for the recipient's role. The receiving agent polls for signals at near-zero cost, wakes on receipt, reads the referenced memories, and acts.
Signals carry memory IDs — no content, no identities. Recipients are stored as a hash scoped to one collection. Both sender and recipient must already be members. Signals expire in 48 hours by default.
Quick Start
These MCP tool calls work from any compatible client: Claude Code, Cursor, ChatGPT, or custom integrations.
Create a shared collection and invite a teammate
collection_manage(action: "create", name: "Project Alpha", type: "collaborative")
collection_manage(action: "add_user", name: "Project Alpha",
user: "kyle@example.com", role: "member")
Kyle sees the invite in collection_manage(action: "list") and joins with collection_manage(action: "accept", name: "Project Alpha"). From then on his searches automatically include Project Alpha memories.
Poll for tasks and claim one
task_feed(status: "pending", collection: "Project Alpha")
→ {tasks: [{id: "abc-123", preview: "Fix auth token refresh", progress: [0, 4],
status: "pending", collection: "Project Alpha"}], count: 1}
memory_edit(memory_id: "abc-123", set_status: "active")
Other agents polling task_feed see the task is now active. No signal needed. Task state IS the coordination signal.
Signal a teammate about a shared memory
memory_add(content: "OAuth2 PKCE with S256 prevents auth code interception...",
topics: ["oauth", "pkce", "security"], collection: "Project Alpha")
→ stored as memory def-456
signal(action: "send", recipient: "kyle@example.com", collection: "Project Alpha",
memory_ids: ["def-456"])
The next time Kyle runs init_core_memories, the signal arrives with the memory reference. Signals go to one named recipient (an agent name, an email, or "owner"), and both parties must share the collection.