Multi-agent support for Signet Solvr deployment requires multi-agent support for Signet, which currently only supports a single agent per install. The gap will be closed by implementing agent definitions, a registry with identity inheritance, and database schema changes to scope memories by agent_id and scope flag, with a hybrid memory model using a single SQLite DB and shared skills pool. Multi-agent support for Signet Context Solvr deployment needs 3 agents Dot, Rose, Miles running on a single Mac Studio with one Signet daemon and one OpenClaw gateway. Today Signet is single-agent only — one identity, one memory pool, one personality per ~/.agents/ install. OpenClaw already supports multi-agent natively agents.list + bindings in openclaw.json , so the gap is entirely on the Signet side. User decisions: Memory : Hybrid — single SQLite DB, daemon enforces scope at API level agent id column + scope flag: global vs private Directory : ~/.agents/agents/{name}/ subdirectories, each with their own identity files SOUL.md, IDENTITY.md, etc. Skills : Shared pool at ~/.agents/skills/ , per-agent allowlist in agent.yaml Harness scope : OpenClaw + Compass only. Claude Code stays single-agent it’s the operator’s personal agent . Critical files platform/daemon/src/daemon.ts — HTTP server, memory schema, file watcher, harness sync ~4650 LOC platform/daemon/src/hooks.ts — Request/response interfaces platform/daemon/src/memory-config.ts — Config loading platform/core/src/types.ts — AgentManifest, Memory types platform/core/src/identity.ts — Identity file detection, IDENTITY FILES spec line 56-97 , loadIdentityFiles line 206 platform/core/src/skills.ts — Skill registry, unification surfaces/cli/src/cli.ts — CLI commands ~4650 LOC surfaces/dashboard/src/ — SvelteKit dashboard integrations/openclaw/connector/src/index.ts — OpenClaw sync integrations/openclaw/memory-adapter/src/index.ts — Runtime plugin ~/.agents/agent.yaml — User config manifest Implementation phases Phase 1: Core types — AgentDefinition + roster File: platform/core/src/types.ts interface AgentDefinition { readonly name: string; readonly model?: string; readonly skills?: readonly string ; readonly personality?: string; // relative path to SOUL.md } Extend AgentManifest with optional agents field: readonly agents?: { readonly roster: readonly AgentDefinition ; }; Phase 2: Agent registry — discovery + scaffold + inheritance New file: platform/core/src/agents.ts discoverAgents agentsDir — scan ~/.agents/agents/ / for subdirs, return AgentDefinition scaffoldAgent name, agentsDir — create directory + template SOUL.md, IDENTITY.md getAgentIdentityFiles name, agentsDir — resolve identity file paths with inheritance fallback : check agent subdir first, fall back to root-level ~/.agents/ for any missing file. Only SOUL.md and IDENTITY.md are expected to be overridden per agent. AGENTS.md, USER.md, TOOLS.md inherit from root by default. resolveAgentSkills agent, sharedSkills — filter shared pool by agent’s allowlist. Empty/missing list = all skills. Identity inheritance addresses current gap in identity.ts where loadIdentityFiles only checks one basePath : resolve file, agentName : 1. ~/.agents/agents/{agentName}/{file} ← agent override 2. ~/.agents/{file} ← root default Phase 3: DB schema — add agent scoping columns File: platform/daemon/src/daemon.ts Add to requiredColumns array at line ~4509: { table: 'memories', column: 'agent id', type: 'TEXT DEFAULT "default"' } { table: 'memories', column: 'scope', type: 'TEXT DEFAULT "global"' } Existing memories get agent id=‘default’, scope=‘global’. Fully backwards compatible via ALTER TABLE — no migration. FTS5 handling — the FTS5 virtual table does NOT get an agent id column. Instead, agent scoping is done as a post-join filter on the memories table after the FTS5 MATCH: SELECT m. FROM memories fts JOIN memories m ON memories fts.rowid = m.rowid WHERE memories fts MATCH ? AND m.scope = 'global' OR m.agent id = ? ORDER BY bm25 memories fts LIMIT ? This avoids rebuilding the FTS5 virtual table and its 3 triggers INSERT/UPDATE/DELETE at lines 4560-4584 , which would be a breaking migration for existing databases. The post-join filter is slightly less efficient but the memories table is small enough 3441 rows currently that it won’t matter. Vector search sqlite-vec already joins through the embeddings table, so adding the same WHERE clause to the final JOIN is trivial. Orphaned memory cleanup : When an agent is removed via CLI, don’t auto-delete memories. Instead mark them scope=‘archived’. A signet agent purge