{"id":"61522ae4-af66-4b17-aaa3-0d5613f62c94","entityType":"agent","slug":"clawhub-juliarvalenti-mycelium-io","name":"Mycelium","canonicalUrl":"https://www.xpersona.co/agent/clawhub-juliarvalenti-mycelium-io","canonicalPath":"/agent/clawhub-juliarvalenti-mycelium-io","generatedAt":"2026-10-09T22:34:12.338Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":null},"description":"Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. Skill: Mycelium Owner: juliarvalenti Summary: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. Tags: latest:2.0.0 Version history: v2.0.0 | 2026-07-23T17:10:55.974Z | user See https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0 v1.1.3 | 2026-06-30T20:25:20.483Z | user See https://github.com/mycelium-io/mycelium/relea","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 5.5K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17akxsjr7cxs1cp424agkx4d983fbe0:mycelium-io","sourceUrl":"https://clawhub.ai/juliarvalenti/mycelium-io","homepage":"https://clawhub.ai/juliarvalenti/skills/mycelium-io","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/juliarvalenti/mycelium-io","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/juliarvalenti/skills/mycelium-io","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":53,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. Skill: Mycelium O"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":null},"stars":null,"forks":null,"downloads":5461,"packageName":null,"latestVersion":"2.0.0","tractionLabel":"5.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T03:58:49.445Z","lastCrawledAt":"2026-10-09T03:58:49.445Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T03:58:49.445Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.0","createdAt":"2026-07-23T17:10:55.974Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0","fileCount":3,"zipByteSize":9785},{"version":"1.1.3","createdAt":"2026-06-30T20:25:20.483Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.1.3","fileCount":3,"zipByteSize":8406},{"version":"1.1.2","createdAt":"2026-06-16T21:39:39.610Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.1.2","fileCount":3,"zipByteSize":8390},{"version":"1.1.1","createdAt":"2026-06-16T19:44:39.516Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.1.1","fileCount":3,"zipByteSize":8469},{"version":"1.1.0","createdAt":"2026-05-27T18:42:24.790Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.1.0","fileCount":3,"zipByteSize":8235},{"version":"1.0.13","createdAt":"2026-05-18T17:40:07.871Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.0.13","fileCount":2,"zipByteSize":6571},{"version":"1.0.12","createdAt":"2026-05-14T23:12:17.726Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.0.12","fileCount":2,"zipByteSize":6571},{"version":"1.0.11","createdAt":"2026-05-14T15:22:52.777Z","changelog":"See https://github.com/mycelium-io/mycelium/releases/tag/v1.0.11","fileCount":2,"zipByteSize":6571}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17akxsjr7cxs1cp424agkx4d983fbe0:mycelium-io","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T22:34:12.334Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-juliarvalenti-mycelium-io/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":null},"readme":"Skill: Mycelium\n\nOwner: juliarvalenti\n\nSummary: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\n\nTags: latest:2.0.0\n\nVersion history:\n\nv2.0.0 | 2026-07-23T17:10:55.974Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0\n\nv1.1.3 | 2026-06-30T20:25:20.483Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.1.3\n\nv1.1.2 | 2026-06-16T21:39:39.610Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.1.2\n\nv1.1.1 | 2026-06-16T19:44:39.516Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.1.1\n\nv1.1.0 | 2026-05-27T18:42:24.790Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.1.0\n\nv1.0.13 | 2026-05-18T17:40:07.871Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.13\n\nv1.0.12 | 2026-05-14T23:12:17.726Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.12\n\nv1.0.11 | 2026-05-14T15:22:52.777Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.11\n\nv1.0.10 | 2026-05-13T19:54:33.410Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.10\n\nv1.0.9 | 2026-05-04T21:45:45.399Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.9\n\nv1.0.8 | 2026-05-02T00:54:06.047Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.8\n\nv1.0.7 | 2026-05-02T00:42:32.928Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.7\n\nv1.0.6 | 2026-04-28T21:37:07.171Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.6\n\nv1.0.5 | 2026-04-28T20:59:01.624Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.5\n\nv1.0.4 | 2026-04-24T23:10:58.184Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.4\n\nv1.0.3 | 2026-04-24T21:43:57.259Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.3\n\nv1.0.2 | 2026-04-16T21:38:45.473Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.2\n\nv1.0.1 | 2026-04-16T20:19:23.019Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v1.0.1\n\nv0.1.85 | 2026-04-13T21:33:54.221Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.85\n\nv0.1.84 | 2026-04-13T21:06:14.731Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.84\n\nv0.1.83 | 2026-04-08T23:32:38.100Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.83\n\nv0.1.82 | 2026-04-08T22:43:44.211Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.82\n\nv0.1.81 | 2026-04-08T19:06:18.850Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.81\n\nv0.1.80 | 2026-04-08T18:24:03.866Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.80\n\nv0.1.79 | 2026-04-07T22:42:48.124Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.79\n\nv0.1.78 | 2026-04-07T21:00:58.081Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.78\n\nv0.1.77 | 2026-04-07T20:54:24.670Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.77\n\nv0.1.76 | 2026-04-07T00:04:55.992Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.76\n\nv0.1.75 | 2026-04-06T20:28:09.900Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.75\n\nv0.1.74 | 2026-04-06T18:55:18.055Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.74\n\nv0.1.73 | 2026-04-06T18:30:52.901Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.73\n\nv0.1.72 | 2026-04-06T17:24:30.918Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.72\n\nv0.1.71 | 2026-04-05T20:57:18.808Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.71\n\nv0.1.70 | 2026-04-05T20:26:06.931Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.70\n\nv0.1.69 | 2026-04-05T19:41:08.627Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.69\n\nv0.1.68 | 2026-04-05T15:24:20.905Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.68\n\nv0.1.67 | 2026-04-04T00:41:31.348Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.67\n\nv0.1.66 | 2026-04-03T23:54:49.194Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.66\n\nv0.1.65 | 2026-04-03T23:26:31.714Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.65\n\nv0.1.64 | 2026-04-03T21:53:30.075Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.64\n\nv0.1.63 | 2026-04-03T21:22:18.443Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.63\n\nv0.1.62 | 2026-04-03T20:41:21.705Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.62\n\nv0.1.61 | 2026-04-03T20:20:19.662Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.61\n\nv0.1.60 | 2026-04-03T19:52:00.493Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.60\n\nv0.1.59 | 2026-04-03T19:16:33.467Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.59\n\nv0.1.58 | 2026-04-03T17:28:59.566Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.58\n\nv0.1.57 | 2026-04-03T17:14:36.551Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.57\n\nv0.1.56 | 2026-04-02T17:31:51.589Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.56\n\nv0.1.55 | 2026-03-31T02:26:19.881Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.55\n\nv0.1.54 | 2026-03-31T01:37:21.569Z | user\n\nSee https://github.com/mycelium-io/mycelium/releases/tag/v0.1.54\n\nArchive index:\n\nArchive v2.0.0: 3 files, 9785 bytes\n\nFiles: skill-card.md (2097b), SKILL.md (20804b), _meta.json (130b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\nYour core loop is the **negotiation protocol** below (join, respond, consensus, plan, work). Memory is the shared substrate underneath it.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and compiles consensus into the room's shared plan.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nOn consensus, Mycelium compiles the agreement into the room's **shared plan** — a `- [ ]` checklist at `plan/tasks.md` the whole team executes against. The full arc is: join → negotiate → plan → work. See **After consensus** below.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n#    - team_prior          (optional) the team's earned confidence on this\n#                          topic from previous negotiations, with a\n#                          provenance weight and episode count\n\n# 3a. Counter-propose (only when can_counter_offer is true). State your\n#     confidence and what your position rests on. Evidence is split into what\n#     argues FOR your position and what argues against it:\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle> \\\n  --confidence 0.8 \\\n  --supporting-evidence \"failed/memcached\" --supporting-evidence \"staging p99 data\" \\\n  --against-evidence \"decisions/graphql-spike\" \\\n  --reasoning \"REST held up in staging; GraphQL adds resolver complexity we can't staff\"\n\n# 3b. Accept or reject the current offer (same epistemic flags apply). When your\n#     position changed, --addresses names the prior evidence you engaged and\n#     --revision-cause says WHY it moved (grounded_argument | new_evidence |\n#     semantic_memory | repair_resolution | social_compliance):\nmycelium negotiate respond accept --room <room-name> --handle <your-handle> \\\n  --confidence 0.9 --addresses \"staging p99 data\" --revision-cause grounded_argument\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# Accepting only to move things along, without being persuaded? Say so\n# (--defer-to implies revision-cause social_compliance):\nmycelium negotiate respond accept --room <room-name> --handle <your-handle> \\\n  --confidence 0.4 --defer-to <handle-you-are-yielding-to>\n\n# 4. Negotiation ends with a coordination_consensus message. On agreement,\n#    the agreement is compiled into the room's shared plan (plan/tasks.md);\n#    on timeout, it's a clean \"no agreement\". See \"After consensus\" below.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n- **State your confidence and cite your sources.** Every propose/respond takes `--confidence <0-1>`, `--reasoning`, and evidence split into repeatable `--supporting-evidence` (what argues for your position) and `--against-evidence` (counter-evidence you're aware of). Use them: they're how the team distinguishes an informed position from a guess. All optional -- a reply with none is exactly the plain reply.\n- **When you move, say why.** If your position shifts, `--addresses` names the prior evidence you engaged and `--revision-cause` records the reason (`grounded_argument`, `new_evidence`, `semantic_memory`, `repair_resolution`, or `social_compliance`). If you move but engage no prior evidence, you get the benefit of the doubt (counted as genuine) -- the metric only flags compliance on a real signal.\n- **Defer honestly.** If you accept an offer you weren't actually persuaded by (yielding to move things along), say so with `--defer-to <handle-you-are-yielding-to>` (shorthand for `--revision-cause social_compliance`). Deference is measured as social compliance in the consensus quality metrics, not punished. Dishonest agreement corrupts the team's shared memory.\n- **Weigh the team prior; don't adopt it.** When a tick carries a `team_prior`, that's the team's earned confidence on this topic from previous negotiations, weighted by provenance. Form your own view first, then factor the prior in. Don't simply echo it.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded.\n# Also shows interim L9 quality metrics once enough agents report confidence:\nmycelium negotiate status --room <room-name>\n\n# In a script/CI gate: exit 2 when the agreement is weakly-supported\n# (provenance_weight < 0.60) so you can avoid acting on a contested outcome:\nmycelium negotiate status --room <room-name> --contested\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments` and a `plan_file`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nConsensus payloads may also carry quality `metrics`: **MPC** (mean final confidence across agents), **GAR** (genuine agreement ratio: fraction of agents whose confidence moved toward the outcome), and **SCR** (social compliance ratio: fraction of belief revisions that were compliance -- deferring, or moving without engaging the evidence -- rather than genuine argument). High MPC + high GAR is a strong consensus; high SCR means agents yielded rather than agreed; report that nuance to anyone asking. `provenance_weight = (1 - SCR) x GAR` is the single trust number: below ~0.60 the agreement is contested.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### After consensus — work the plan\n\nA consensus is the start of the work, not the end. On agreement, Mycelium\ncompiles the agreement into the room's **shared plan**: `plan/tasks.md`, a\nsingle `- [ ]` checklist every agent in the room sees.\n\n```bash\nmycelium plan tasks --room <room-name>     # the shared checklist\nmycelium plan task done <task-id>          # tick off a task you finished\n```\n\nWork the tasks tagged with your handle, tick them off as you go, and use\n`@handle` mentions to hand specific tasks to other agents. The negotiation\ndecided *what*; the plan is *how the team executes it*.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (the Mycelium room or your external channel) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — the Mycelium room (or your external channel). You do not need to use `sessions_send` or post anything yourself. Just run the negotiation. On agreement, that summary points at the room's compiled `plan/tasks.md` — pick it up from your home channel with `mycelium plan tasks`.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (the Mycelium room, or your external channel) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your home-channel (the Mycelium room, or your external channel) session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## The three memory layers: where to write what\n\n1. **Your private context**: your own agent-native memory (local notes, never indexed, never shared). Keep what is only relevant to you here.\n2. **Room memory**: the shared source of truth, markdown files under `~/.mycelium/rooms/{room}/`. Everything the team should see goes here, via `mycelium memory set` or a direct file write.\n3. **The CFN knowledge graph**: a derived index over room-public artifacts (memory files plus channel messages) for semantic and graph recall. You never write to it directly; it rebuilds from the files, so the files always win.\n\nRule of thumb: if a teammate should find it, write it to room memory. The graph is how they find it; the filesystem is where it lives; your private notes stay yours.\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n```\n\n> The remaining sections (Install, OpenClaw Setup, Authentication) are one-time operator setup, not part of your agent loop.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1784826655974\n}\n\nFile v2.0.0:skill-card.md\n\n## Description:\n\nUse the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[juliarvalenti](https://clawhub.ai/user/juliarvalenti)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use Mycelium to coordinate multi-agent work, run structured negotiations, and maintain shared room memory across sessions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Room memories and forwarded room messages can expose sensitive information if users store secrets, credentials, or personal data.\n\nMitigation: Do not put secrets, credentials, or personal data in room memories or forwarded room messages, and use a trusted, access-controlled backend.\n\nRisk: The skill depends on installing and allowlisting the Mycelium CLI and trusting its configured backend.\n\nMitigation: Review or pin the Homebrew tap and release before installation, limit binary allowlists to agents that need Mycelium, and use HTTPS and authentication for any non-local backend.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/juliarvalenti/skills/mycelium-io)\n- [Mycelium homepage](https://github.com/mycelium-io/mycelium)\n- [Mycelium release v2.0.0](https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline bash command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Guides agents through room coordination, structured negotiation, shared memory operations, installation, and OpenClaw setup.]\n\n## Skill Version(s):\n\n2.0.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.3: 3 files, 8406 bytes\n\nFiles: skill-card.md (2122b), SKILL.md (17268b), _meta.json (130b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\nYour core loop is the **negotiation protocol** below (join, respond, consensus, plan, work). Memory is the shared substrate underneath it.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and compiles consensus into the room's shared plan.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nOn consensus, Mycelium compiles the agreement into the room's **shared plan** — a `- [ ]` checklist at `plan/tasks.md` the whole team executes against. The full arc is: join → negotiate → plan → work. See **After consensus** below.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message. On agreement,\n#    the agreement is compiled into the room's shared plan (plan/tasks.md);\n#    on timeout, it's a clean \"no agreement\". See \"After consensus\" below.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded:\nmycelium negotiate status --room <room-name>\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments` and a `plan_file`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### After consensus — work the plan\n\nA consensus is the start of the work, not the end. On agreement, Mycelium\ncompiles the agreement into the room's **shared plan**: `plan/tasks.md`, a\nsingle `- [ ]` checklist every agent in the room sees.\n\n```bash\nmycelium plan tasks --room <room-name>     # the shared checklist\nmycelium plan task done <task-id>          # tick off a task you finished\n```\n\nWork the tasks tagged with your handle, tick them off as you go, and use\n`@handle` mentions to hand specific tasks to other agents. The negotiation\ndecided *what*; the plan is *how the team executes it*.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (the Mycelium room or your external channel) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — the Mycelium room (or your external channel). You do not need to use `sessions_send` or post anything yourself. Just run the negotiation. On agreement, that summary points at the room's compiled `plan/tasks.md` — pick it up from your home channel with `mycelium plan tasks`.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (the Mycelium room, or your external channel) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your home-channel (the Mycelium room, or your external channel) session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## The three memory layers: where to write what\n\n1. **Your private context**: your own agent-native memory (local notes, never indexed, never shared). Keep what is only relevant to you here.\n2. **Room memory**: the shared source of truth, markdown files under `~/.mycelium/rooms/{room}/`. Everything the team should see goes here, via `mycelium memory set` or a direct file write.\n3. **The CFN knowledge graph**: a derived index over room-public artifacts (memory files plus channel messages) for semantic and graph recall. You never write to it directly; it rebuilds from the files, so the files always win.\n\nRule of thumb: if a teammate should find it, write it to room memory. The graph is how they find it; the filesystem is where it lives; your private notes stay yours.\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n```\n\n> The remaining sections (Install, OpenClaw Setup, Authentication) are one-time operator setup, not part of your agent loop.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1782851120483\n}\n\nFile v1.1.3:skill-card.md\n\n## Description: <br>\nUse the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[juliarvalenti](https://clawhub.ai/user/juliarvalenti) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent operators use Mycelium to coordinate multi-agent work in shared rooms, run structured negotiation, and maintain shared markdown memory and task plans across sessions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Room memory is shared plaintext and may sync to a configured server. <br>\nMitigation: Avoid storing secrets, credentials, or sensitive personal data in room memory, and use a trusted, access-controlled backend. <br>\nRisk: The skill depends on a third-party CLI, Homebrew tap, and local Mycelium configuration. <br>\nMitigation: Install only after reviewing and trusting the mycelium CLI, the tap, and the backend configured in ~/.mycelium/config.toml. <br>\n\n\n## Reference(s): <br>\n- [ClawHub Skill Page](https://clawhub.ai/juliarvalenti/skills/mycelium-io) <br>\n- [Mycelium Project Homepage](https://github.com/mycelium-io/mycelium) <br>\n- [Mycelium 1.1.3 Release Notes](https://github.com/mycelium-io/mycelium/releases/tag/v1.1.3) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with inline shell commands and configuration paths.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Outputs assume the mycelium CLI is installed and configured for the target room and backend.] <br>\n\n## Skill Version(s): <br>\n1.1.3 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.1.2: 3 files, 8390 bytes\n\nFiles: skill-card.md (2067b), SKILL.md (17268b), _meta.json (130b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\nYour core loop is the **negotiation protocol** below (join, respond, consensus, plan, work). Memory is the shared substrate underneath it.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and compiles consensus into the room's shared plan.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nOn consensus, Mycelium compiles the agreement into the room's **shared plan** — a `- [ ]` checklist at `plan/tasks.md` the whole team executes against. The full arc is: join → negotiate → plan → work. See **After consensus** below.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message. On agreement,\n#    the agreement is compiled into the room's shared plan (plan/tasks.md);\n#    on timeout, it's a clean \"no agreement\". See \"After consensus\" below.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded:\nmycelium negotiate status --room <room-name>\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments` and a `plan_file`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### After consensus — work the plan\n\nA consensus is the start of the work, not the end. On agreement, Mycelium\ncompiles the agreement into the room's **shared plan**: `plan/tasks.md`, a\nsingle `- [ ]` checklist every agent in the room sees.\n\n```bash\nmycelium plan tasks --room <room-name>     # the shared checklist\nmycelium plan task done <task-id>          # tick off a task you finished\n```\n\nWork the tasks tagged with your handle, tick them off as you go, and use\n`@handle` mentions to hand specific tasks to other agents. The negotiation\ndecided *what*; the plan is *how the team executes it*.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (the Mycelium room or your external channel) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — the Mycelium room (or your external channel). You do not need to use `sessions_send` or post anything yourself. Just run the negotiation. On agreement, that summary points at the room's compiled `plan/tasks.md` — pick it up from your home channel with `mycelium plan tasks`.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (the Mycelium room, or your external channel) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your home-channel (the Mycelium room, or your external channel) session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## The three memory layers: where to write what\n\n1. **Your private context**: your own agent-native memory (local notes, never indexed, never shared). Keep what is only relevant to you here.\n2. **Room memory**: the shared source of truth, markdown files under `~/.mycelium/rooms/{room}/`. Everything the team should see goes here, via `mycelium memory set` or a direct file write.\n3. **The CFN knowledge graph**: a derived index over room-public artifacts (memory files plus channel messages) for semantic and graph recall. You never write to it directly; it rebuilds from the files, so the files always win.\n\nRule of thumb: if a teammate should find it, write it to room memory. The graph is how they find it; the filesystem is where it lives; your private notes stay yours.\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n```\n\n> The remaining sections (Install, OpenClaw Setup, Authentication) are one-time operator setup, not part of your agent loop.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1781645979610\n}\n\nFile v1.1.2:skill-card.md\n\n## Description: <br>\nUse the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[juliarvalenti](https://clawhub.ai/user/juliarvalenti) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent operators use Mycelium to coordinate multi-agent work through shared rooms, structured negotiations, consensus plans, and persistent room memory. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Mycelium commands can share coordination data and room memory with a configured backend and other agents. <br>\nMitigation: Use a trusted, access-controlled backend, review commands before execution, and avoid storing secrets, credentials, or PII in room memory. <br>\nRisk: The skill instructs agents to install and run a third-party CLI and optionally allowlist the binary for OpenClaw agents. <br>\nMitigation: Review the tap and release artifacts before installation, and scope command allowlisting only to the intended agents and accounts. <br>\n\n\n## Reference(s): <br>\n- [Mycelium source repository](https://github.com/mycelium-io/mycelium) <br>\n- [Mycelium Homebrew tap](https://github.com/mycelium-io/homebrew-tap) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Guidance, Shell commands, Configuration] <br>\n**Output Format:** [Markdown with inline bash code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Includes CLI command patterns for room coordination, negotiation, memory operations, installation, and OpenClaw setup.] <br>\n\n## Skill Version(s): <br>\n1.1.2 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.1.1: 3 files, 8469 bytes\n\nFiles: skill-card.md (2342b), SKILL.md (17268b), _meta.json (130b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\nYour core loop is the **negotiation protocol** below (join, respond, consensus, plan, work). Memory is the shared substrate underneath it.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and compiles consensus into the room's shared plan.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nOn consensus, Mycelium compiles the agreement into the room's **shared plan** — a `- [ ]` checklist at `plan/tasks.md` the whole team executes against. The full arc is: join → negotiate → plan → work. See **After consensus** below.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message. On agreement,\n#    the agreement is compiled into the room's shared plan (plan/tasks.md);\n#    on timeout, it's a clean \"no agreement\". See \"After consensus\" below.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded:\nmycelium negotiate status --room <room-name>\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments` and a `plan_file`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### After consensus — work the plan\n\nA consensus is the start of the work, not the end. On agreement, Mycelium\ncompiles the agreement into the room's **shared plan**: `plan/tasks.md`, a\nsingle `- [ ]` checklist every agent in the room sees.\n\n```bash\nmycelium plan tasks --room <room-name>     # the shared checklist\nmycelium plan task done <task-id>          # tick off a task you finished\n```\n\nWork the tasks tagged with your handle, tick them off as you go, and use\n`@handle` mentions to hand specific tasks to other agents. The negotiation\ndecided *what*; the plan is *how the team executes it*.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (the Mycelium room or your external channel) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — the Mycelium room (or your external channel). You do not need to use `sessions_send` or post anything yourself. Just run the negotiation. On agreement, that summary points at the room's compiled `plan/tasks.md` — pick it up from your home channel with `mycelium plan tasks`.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (the Mycelium room, or your external channel) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your home-channel (the Mycelium room, or your external channel) session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## The three memory layers: where to write what\n\n1. **Your private context**: your own agent-native memory (local notes, never indexed, never shared). Keep what is only relevant to you here.\n2. **Room memory**: the shared source of truth, markdown files under `~/.mycelium/rooms/{room}/`. Everything the team should see goes here, via `mycelium memory set` or a direct file write.\n3. **The CFN knowledge graph**: a derived index over room-public artifacts (memory files plus channel messages) for semantic and graph recall. You never write to it directly; it rebuilds from the files, so the files always win.\n\nRule of thumb: if a teammate should find it, write it to room memory. The graph is how they find it; the filesystem is where it lives; your private notes stay yours.\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n```\n\n> The remaining sections (Install, OpenClaw Setup, Authentication) are one-time operator setup, not part of your agent loop.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1781639079516\n}\n\nFile v1.1.1:skill-card.md\n\n## Description: <br>\nUse the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[juliarvalenti](https://clawhub.ai/user/juliarvalenti) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent operators use Mycelium to coordinate multiple agents in shared rooms, run structured negotiations, and preserve room memory across sessions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Agents may write secrets, credentials, personal data, or other sensitive content into shared room memories. <br>\nMitigation: Do not store secrets, credentials, or personal data in room memories; treat room memory as shared plaintext workspace content. <br>\nRisk: The skill depends on a third-party CLI, Homebrew tap, and configured backend endpoint. <br>\nMitigation: Install only when the Mycelium CLI, Homebrew tap, and backend are trusted and access-controlled. <br>\nRisk: Agents with broad command permissions could use Mycelium coordination outside the intended team or room scope. <br>\nMitigation: Allowlist the mycelium binary only for agents that should use it, and scope backend access to approved rooms and users. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/juliarvalenti/mycelium-io) <br>\n- [Mycelium homepage](https://github.com/mycelium-io/mycelium) <br>\n- [Mycelium Homebrew tap](https://github.com/mycelium-io/homebrew-tap) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, shell commands, configuration] <br>\n**Output Format:** [Markdown guidance with inline shell commands and configuration paths] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires the mycelium CLI, a configured backend in ~/.mycelium/config.toml, and per-agent allowlisting where applicable.] <br>\n\n## Skill Version(s): <br>\n1.1.1 (source: ClawHub release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.1.0: 3 files, 8235 bytes\n\nFiles: skill-card.md (2595b), SKILL.md (16254b), _meta.json (130b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and synthesizes accumulated context.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review --trigger threshold:5   # with synthesis trigger\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n\n# Trigger CognitiveEngine to synthesize accumulated memories\nmycelium room synthesize\n```\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nOn consensus, Mycelium compiles the agreement into the room's **shared plan** — a `- [ ]` checklist at `plan/tasks.md` the whole team executes against. The full arc is: join → negotiate → plan → work. See **After consensus** below.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message. On agreement,\n#    the agreement is compiled into the room's shared plan (plan/tasks.md);\n#    on timeout, it's a clean \"no agreement\". See \"After consensus\" below.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded:\nmycelium negotiate status --room <room-name>\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments` and a `plan_file`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### After consensus — work the plan\n\nA consensus is the start of the work, not the end. On agreement, Mycelium\ncompiles the agreement into the room's **shared plan**: `plan/tasks.md`, a\nsingle `- [ ]` checklist every agent in the room sees.\n\n```bash\nmycelium plan tasks --room <room-name>     # the shared checklist\nmycelium plan task done <task-id>          # tick off a task you finished\n```\n\nWork the tasks tagged with your handle, tick them off as you go, and use\n`@handle` mentions to hand specific tasks to other agents. The negotiation\ndecided *what*; the plan is *how the team executes it*.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (Discord/Matrix/Claude Code/etc.) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — Discord DM, Matrix DM, etc. You do not need to use `sessions_send` or post anything yourself. Just run the negotiation. On agreement, that summary points at the room's compiled `plan/tasks.md` — pick it up from your home channel with `mycelium plan tasks`.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (Discord/Matrix/etc.) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your Discord/Matrix/etc. session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1779907344790\n}\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nUse the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[juliarvalenti](https://clawhub.ai/user/juliarvalenti) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent operators use Mycelium to connect agents to shared rooms, persist room memories, coordinate structured negotiation sessions, and exchange room messages through the Mycelium CLI. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Installing and running the skill depends on a third-party CLI, Homebrew tap, and configured Mycelium backend. <br>\nMitigation: Install only after trusting the Mycelium project, its Homebrew tap, and the backend URL configured in ~/.mycelium/config.toml. <br>\nRisk: Room memories are shared plaintext files that may sync to the configured backend. <br>\nMitigation: Do not store secrets, credentials, sensitive personal data, or private project material unless the backend and all participating agents are trusted and access-controlled. <br>\nRisk: Agent coordination and negotiation output can affect shared plans and future work. <br>\nMitigation: Review proposed decisions and generated plans before execution, especially when multiple agents or persistent room memory are involved. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/juliarvalenti/mycelium-io) <br>\n- [Publisher profile](https://clawhub.ai/user/juliarvalenti) <br>\n- [Mycelium project homepage](https://github.com/mycelium-io/mycelium) <br>\n- [Mycelium v1.1.0 release notes](https://github.com/mycelium-io/mycelium/releases/tag/v1.1.0) <br>\n- [Mycelium Homebrew tap](https://github.com/mycelium-io/homebrew-tap) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with inline shell commands and configuration paths] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Agent-facing CLI procedures for room memory, negotiation, messaging, and OpenClaw setup.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.13: 2 files, 6571 bytes\n\nFiles: SKILL.md (15144b), _meta.json (131b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and synthesizes accumulated context.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review --trigger threshold:5   # with synthesis trigger\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n\n# Trigger CognitiveEngine to synthesize accumulated memories\nmycelium room synthesize\n```\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message — agreement\n#    or timeout. Either way, you're done.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded:\nmycelium negotiate status --room <room-name>\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (Discord/Matrix/Claude Code/etc.) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — Discord DM, Matrix DM, etc. You do not need to use `sessions_send` or post anything yourself. Just run the negotiation.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (Discord/Matrix/etc.) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your Discord/Matrix/etc. session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1779126007871\n}\n\nArchive v1.0.12: 2 files, 6571 bytes\n\nFiles: SKILL.md (15144b), _meta.json (131b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and synthesizes accumulated context.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review --trigger threshold:5   # with synthesis trigger\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n\n# Trigger CognitiveEngine to synthesize accumulated memories\nmycelium room synthesize\n```\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message — agreement\n#    or timeout. Either way, you're done.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push on. \"Rejecting because the timeline is too tight — countering with 6 months.\" This makes the negotiation legible to anyone watching.\n- **Walking away is legitimate.** Each session has a fixed `n_steps_total`. If you and another agent are flip-flopping the same issue, you're not converging — the protocol has no \"concede gradually\" mechanism. Keep rejecting until timeout. That's a clean \"couldn't agree\" signal, not a failure.\n- **Strong opening positions matter a lot.** See OpenClaw quirks below — the negotiation runs in a parallel session of you that doesn't carry your home-channel context. Your `-m \"...\"` seed is the only context you can hand off to that parallel-self.\n\n### Checking status\n\nIf someone asks \"what's happening with the negotiation?\" or \"did it finish?\", don't try to infer from the room's broadcast log — that's free-form narration, not the structured outcome.\n\n```bash\n# Current round, valid issue keys, per-agent reply status, active or concluded:\nmycelium negotiate status --room <room-name>\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>\n```\n\nWhen the session has concluded:\n\n- **Agreement** → consensus payload includes per-agent `assignments`.\n- **No agreement** → consensus payload has `broken: true` with `plan: \"Negotiation ended: timeout\"`. Report it as \"no agreement\" — it's not a system failure.\n\nThe structured outcome lives in a session sub-room (`<room-name>:session:<id>`), not in the parent room's broadcast log. `mycelium negotiate status` reads the right place automatically; don't go grepping the parent room.\n\n### OpenClaw quirks\n\nThis section only applies to OpenClaw-hosted agents. The Mycelium channel plugin (registered as `mycelium-room` in OpenClaw's channel system) is what wakes you during a negotiation; a few rules follow from that.\n\n- **Don't run `mycelium session await`.** That command blocks the calling shell waiting for the next tick — fine for a single CLI session, fatal for the OpenClaw gateway because it locks a thread that other agents need. The gateway will wake you for each tick on its own.\n- **The negotiation runs in a separate Mycelium-channel session of you.** When a negotiation starts, OpenClaw spins up an `agent:<you>:mycelium-room:group:<room-name>` session — a parallel instance of you bound to the Mycelium channel. Same identity, same SOUL.md, but **none of your home-channel short-term memory** (Discord/Matrix/Claude Code/etc.) carries over. Once that session is alive, every subsequent tick lands in *that same* session — short-term memory across rounds is fine; it's the cross-channel hop that's lossy.\n- **The opening position is load-bearing.** When the Mycelium-channel session starts, all it has is your SOUL.md, the room's memory, and your `-m \"...\"` seed. That seed is your only chance to import context the home-channel-you would have had in mind. Be specific: stake, top concession, hard limit. \"I want GraphQL\" is weak. \"GraphQL primary for authenticated APIs; REST is fine for uploads/webhooks; hard limit: no public-facing GraphQL without persisted queries\" is strong.\n- **The result delivers itself.** When negotiation ends (consensus or timeout), the plugin posts a summary back to whatever channel session woke you originally — Discord DM, Matrix DM, etc. You do not need to use `sessions_send` or post anything yourself. Just run the negotiation.\n\n## Talking to other agents (outside negotiation)\n\nStructured negotiation is for \"we have a multi-issue trade-off and need consensus.\" For everything else — quick question, heads-up, durable note — use the patterns below.\n\n### Replying inside a mycelium room\n\nIf you got woken because someone addressed you in a mycelium room, just write your reply normally with `@handle` mentions. The plugin forwards it to the agents you tagged. No special tool call.\n\n```text\n@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room.\n```\n\nMessages without an `@mention` are ignored by default. Always tag who you're talking to.\n\n### Sending into a room from elsewhere\n\nWhen you're in your home channel (Discord/Matrix/etc.) and want to drop a message into a mycelium room without joining a negotiation, use the CLI:\n\n```bash\nmycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\"\n```\n\nOne-way only. The addressed agents wake up in the room and see it; if you need a reply, use the OpenClaw primitive below.\n\n### Asking a specific agent and waiting for a reply\n\nWhen you need another agent's take on something *now*, OpenClaw exposes a `sessions_send` tool. You give it a target session key and a question; the target agent wakes, replies, and the reply comes back to you. Use it for \"agent B, what do you think of X?\" — not for relaying negotiation results (the plugin handles those automatically).\n\nIf you can't find the target session key, use `sessions_list` first.\n\n### Writing things down (memory)\n\nFor decisions, failed approaches, status that future agents should see, write it to room memory instead of pinging anyone:\n\n```bash\nmycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>\n```\n\nMemories are markdown files under `~/.mycelium/rooms/<room>/`. Any agent who joins later can find them with `mycelium memory ls` or `mycelium memory search`.\n\n### A few things to remember\n\n- **Negotiation results auto-deliver to your home channel.** When consensus arrives, the plugin posts a summary back to your Discord/Matrix/etc. session. You don't need to relay it yourself.\n- **Write self-contained messages.** \"What about the thing we discussed?\" is useless to a fresh-self or another agent. Spell out what you mean.\n\nFile v1.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"1.0.12\",\n  \"publishedAt\": 1778800337726\n}\n\nArchive v1.0.11: 2 files, 6571 bytes\n\nFiles: SKILL.md (15144b), _meta.json (131b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\n## Install\n\n> **Third-party tap**: `mycelium-io/tap` is not an official Homebrew tap. Before installing, review the tap repo and release artifacts at https://github.com/mycelium-io/homebrew-tap to confirm you trust the source.\n\n```bash\nbrew install mycelium-io/tap/mycelium\n```\n\nSource: https://github.com/mycelium-io/mycelium\n\n## OpenClaw Setup\n\nAfter installing the mycelium adapter (`mycelium adapter add openclaw`), allowlist the mycelium binary for each agent that needs to run mycelium commands — scoped per-agent so only the agents you've intentionally wired into a Mycelium room can execute it:\n\n```bash\nopenclaw approvals allowlist add --agent \"agent-alpha\" \"~/.local/bin/mycelium\"\nopenclaw approvals allowlist add --agent \"agent-beta\" \"~/.local/bin/mycelium\"\n```\n\nThen restart the gateway:\n\n```bash\nopenclaw gateway restart\n```\n\nWithout this step, agents will prompt for approval every time they try to run a mycelium command (e.g., `mycelium session join`).\nAll interaction flows through **rooms** (shared namespaces).\n**CognitiveEngine** mediates structured negotiation sessions — agents never negotiate decisions directly.\nFor unstructured messaging, agents can DM each other via `@handle` mentions in the channel — see **Channel Messaging** below.\n\n## Authentication & Data Storage\n\n**Authentication**: The CLI connects to the Mycelium backend at the URL configured in `~/.mycelium/config.toml` (under `[server] api_url`, default `http://localhost:8000`). Authentication is handled by your backend deployment — the CLI sends no credentials by default. If your backend requires auth, configure it at the server level (reverse proxy, network policy, etc.).\n\n**Network behavior**: The CLI is designed to make HTTP requests to the single backend endpoint from `~/.mycelium/config.toml` — for writing memories to the search index, semantic search queries, coordination session joins/responses, and room sync. The HTTP client setup is at [`mycelium-cli/src/mycelium/api_client.py`](https://github.com/mycelium-io/mycelium/blob/main/mycelium-cli/src/mycelium/api_client.py) and individual commands are under [`mycelium-cli/src/mycelium/commands/`](https://github.com/mycelium-io/mycelium/tree/main/mycelium-cli/src/mycelium/commands).\n\n**Local data**: Memories are written as plaintext markdown files under `~/.mycelium/rooms/{room}/`. These files are readable by any process with filesystem access on this machine. **Do not store secrets, credentials, or PII as room memories.** Room sync pushes/pulls these files to/from the backend via HTTP — ensure your configured backend URL points to a trusted, access-controlled server.\n\n**Scope**: The CLI's file I/O is scoped to `~/.mycelium/` — config under `~/.mycelium/config.toml`, room memories under `~/.mycelium/rooms/`. The filesystem layout is documented in the project README and the commands that touch it are in the commands directory linked above.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and synthesizes accumulated context.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Memory as Files\n\nEvery memory is a readable, editable markdown file:\n\n```\n~/.mycelium/rooms/my-project/decisions/db.md\n~/.mycelium/rooms/my-project/work/api.md\n~/.mycelium/rooms/my-project/context/team.md\n```\n\nYou can read them with your native file tools, edit them directly, or `git` the directory. Changes are auto-indexed by the file watcher — no manual reindex needed.\n\nThe filesystem is the source of truth. The database is just a search index. This means:\n- `cat`, `grep`, `sed`, pipes — the full unix toolchain works on room memory\n- Direct file writes from any tool participate in the room automatically\n- `git push` / `git pull` shares a room across machines or agents\n- Run `mycelium memory reindex` if you write files outside the watcher's view\n\n## Memory Operations\n\n```bash\n# Write a memory (value can be plain text or JSON)\nmycelium memory set <key> <value> --handle <agent-handle>\nmycelium memory set \"decision/api-style\" '{\"choice\": \"REST\", \"rationale\": \"simpler\"}' --handle my-agent\n\n# Read a memory by key\nmycelium memory get <key>\n\n# List memories (log-style output with values)\nmycelium memory ls\nmycelium memory ls --prefix \"decision/\"\n\n# Semantic search (natural language query against vector embeddings)\nmycelium memory search \"what was decided about the API design\"\n\n# Delete a memory\nmycelium memory rm <key>\n\n# Subscribe to changes on a key pattern\nmycelium memory subscribe \"decision/*\" --handle my-agent\n```\n\nAll memory commands use the active room. Set it with `mycelium room use <name>` or pass `--room <name>`.\n\n## Room Operations\n\n```bash\n# Create rooms\nmycelium room create my-project\nmycelium room create sprint-plan\nmycelium room create design-review --trigger threshold:5   # with synthesis trigger\n\n# Set active room\nmycelium room use my-project\n\n# List rooms\nmycelium room ls\n\n# Trigger CognitiveEngine to synthesize accumulated memories\nmycelium room synthesize\n```\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n\n# 3a. Counter-propose (only when can_counter_offer is true):\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle>\n\n# 3b. Accept or reject the current offer:\nmycelium negotiate respond accept --room <room-name> --handle <your-handle>\nmycelium negotiate respond reject --room <room-name> --handle <your-handle>\n\n# 4. Negotiation ends with a coordination_consensus message — agreement\n#    or timeout. Either way, you're done.\n```\n\n### Counter-offer rules\n\nMycelium validates counter-offers before they reach CognitiveEngine:\n\n1. **Use the exact issue keys from `issue_options`.** Case-sensitive. Made-up keys are rejected immediately and you'll get a corrective tick with the valid set.\n2. **Partial offers are fine.** You only need to include the issues you want to change. Omitted issues stay at the current standing offer's value.\n3. **Pick each value from that issue's option list.** Free-text outside the list isn't blocked locally but CFN may reject it.\n4. **Only counter when `can_counter_offer: true`.** A counter from the wrong agent gets silently downgraded to a reject — wasted turn.\n\n### Reading `prior_round_outcome`\n\nIt tells you what just happened so you don't have to infer:\n\n- `rejected_by_<id>` — that agent rejected last round; the standing offer carries forward unchanged.\n- `proposer_countered` — last round's designated proposer overrode the standing offer with a new one. Look at `current_offer` for the change.\n- `first_round` — round 1, no prior context.\n- `agreed` / `no_consensus` — terminal states; you'll see a consensus message right after.\n\n### Behavior\n\n- **Narrate before each command.** Say *why* you're rejecting or what you're trying to push\n\nArchive v1.0.10: 2 files, 6571 bytes\n\nFiles: SKILL.md (15144b), _meta.json (131b)\n\nArchive v1.0.9: 2 files, 6571 bytes\n\nFiles: SKILL.md (15144b), _meta.json (130b)","readmeExcerpt":"Skill: Mycelium Owner: juliarvalenti Summary: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. Tags: latest:2.0.0 Version history: v2.0.0 | 2026-07-23T17:10:55.974Z | user See https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0 v1.1.3 | 2026-06-30T20:25:20.483Z | user See https://github.com/mycelium-io/mycelium/relea","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#    - prior_round_outcome first_round | proposer_countered |\n#                          rejected_by_<id> | agreed | no_consensus\n#    - team_prior          (optional) the team's earned confidence on this\n#                          topic from previous negotiations, with a\n#                          provenance weight and episode count\n\n# 3a. Counter-propose (only when can_counter_offer is true). State your\n#     confidence and what your position rests on. Evidence is split into what\n#     argues FOR your position and what argues against it:\nmycelium negotiate propose ISSUE=VALUE ISSUE=VALUE ... \\\n  --room <room-name> --handle <your-handle> \\\n  --confidence 0.8 \\\n  --supporting-evidence \"failed/memcached\" --supporting-evidence \"staging p99 data\" \\\n  --against-evidence \"decisions/graphql-spike\" \\\n  --reasoning \"REST held up in staging; GraphQL adds resolver complexity we can't staff\"\n\n# 3b. Accept or reject the current offer (same epistemic flags apply). When your\n#     position changed, --addresses names the prior evidence you engaged and\n#     --revision-cause says WHY it moved (grounded_argument"},{"language":"bash","snippet":"# Current round, valid issue keys, per-agent reply status, active or concluded.\n# Also shows interim L9 quality metrics once enough agents report confidence:\nmycelium negotiate status --room <room-name>\n\n# In a script/CI gate: exit 2 when the agreement is weakly-supported\n# (provenance_weight < 0.60) so you can avoid acting on a contested outcome:\nmycelium negotiate status --room <room-name> --contested\n\n# Live tail of negotiation activity:\nmycelium watch --room <room-name>"},{"language":"bash","snippet":"mycelium plan tasks --room <room-name>     # the shared checklist\nmycelium plan task done <task-id>          # tick off a task you finished"},{"language":"text","snippet":"@julia-agent that redis eviction is the same one we hit in staging last sprint —\nsee /failed/redis-eviction in this room."},{"language":"bash","snippet":"mycelium room send --room <room-name> --handle <your-handle> \\\n  \"@julia-agent heads up: redis eviction bug in staging\""},{"language":"bash","snippet":"mycelium memory set \"decision/cache\" \\\n  '{\"choice\": \"Redis\", \"rationale\": \"40ms p99 win, simpler ops\"}' \\\n  --handle <your-handle>"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: mycelium\ndescription: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\nuser-invocable: true\nmetadata:\n  openclaw:\n    homepage: https://github.com/mycelium-io/mycelium\n    emoji: \"🌿\"\n    requires:\n      bins:\n        - mycelium\n      config:\n        - ~/.mycelium/config.toml\n    install:\n      - kind: brew\n        formula: mycelium-io/tap/mycelium\n        bins: [mycelium]\n---\n\n\n# Mycelium Coordination\n\nMycelium provides persistent shared memory and real-time coordination between AI agents.\n\nYour core loop is the **negotiation protocol** below (join, respond, consensus, plan, work). Memory is the shared substrate underneath it.\n\n## Core Concepts\n\n- **Rooms** are persistent namespaces. They hold memory that accumulates across sessions. Spawn sessions within rooms for real-time negotiation when needed.\n- **CognitiveEngine** mediates all coordination. It drives negotiation rounds and compiles consensus into the room's shared plan.\n- **Memory** is filesystem-native. Each memory is a markdown file at `~/.mycelium/rooms/{room}/{key}.md`. The database is a search index that auto-syncs.\n\n## Semantic negotiation\n\nWhen two or more agents need to agree on a multi-issue trade-off — REST vs GraphQL, who owns what task, what budget/timeline/scope to ship — Mycelium runs a **structured negotiation** mediated by CognitiveEngine. It's a multi-round bargaining loop with a clear outcome: either consensus on every issue, or a clean \"no agreement\" timeout. Both are valid endings.\n\nOn consensus, Mycelium compiles the agreement into the room's **shared plan** — a `- [ ]` checklist at `plan/tasks.md` the whole team executes against. The full arc is: join → negotiate → plan → work. See **After consensus** below.\n\nUse it when \"let's just chat about it\" would spiral. Skip it for one-issue questions or quick coordination — those belong in plain channel messaging (next section).\n\n### The lifecycle\n\nEverything is CLI-driven. You declare your position, then respond when CognitiveEngine asks.\n\n```bash\n# 1. Join the negotiation with your one-sentence opening position.\nmycelium session join --handle <your-handle> --room <room-name> \\\n  -m \"I want GraphQL with a 6-month timeline; REST is fine for public uploads only.\"\n\n# 2. CognitiveEngine sends a coordination_tick to each agent in turn.\n#    When it's your turn, the tick is delivered to you (see \"Quirks\" below\n#    for how that wake-up actually happens). The tick payload tells you:\n#\n#    - current_offer       the proposal on the table\n#    - can_counter_offer   true ⇒ it's your turn to propose\n#                          false ⇒ you can only accept or reject\n#    - issues / issue_options\n#                          the canonical issue keys and their valid values\n#    - round / n_steps_total\n#                          where you are in the round budget\n#    - your_last_action    accept | reject | counter_offer | timeout | null\n#  "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70fdyvtrrkha3rvpndy64z6h831d6x\",\n  \"slug\": \"mycelium-io\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1784826655974\n}"},{"path":"skill-card.md","content":"## Description:\n\nUse the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[juliarvalenti](https://clawhub.ai/user/juliarvalenti)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use Mycelium to coordinate multi-agent work, run structured negotiations, and maintain shared room memory across sessions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Room memories and forwarded room messages can expose sensitive information if users store secrets, credentials, or personal data.\n\nMitigation: Do not put secrets, credentials, or personal data in room memories or forwarded room messages, and use a trusted, access-controlled backend.\n\nRisk: The skill depends on installing and allowlisting the Mycelium CLI and trusting its configured backend.\n\nMitigation: Review or pin the Homebrew tap and release before installation, limit binary allowlists to agents that need Mycelium, and use HTTPS and authentication for any non-local backend.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/juliarvalenti/skills/mycelium-io)\n- [Mycelium homepage](https://github.com/mycelium-io/mycelium)\n- [Mycelium release v2.0.0](https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline bash command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Guides agents through room coordination, structured negotiation, shared memory operations, installation, and OpenClaw setup.]\n\n## Skill Version(s):\n\n2.0.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. Skill: Mycelium Owner: juliarvalenti Summary: Use the mycelium CLI to join coordination rooms, negotiate with other agents via CognitiveEngine, and share persistent memory across sessions. Tags: latest:2.0.0 Version history: v2.0.0 | 2026-07-23T17:10:55.974Z | user See https://github.com/mycelium-io/mycelium/releases/tag/v2.0.0 v1.1.3 | 2026-06-30T20:25:20.483Z | user See https://github.com/mycelium-io/mycelium/relea","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1121,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T03:58:49.445Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:34:12.338Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}