v3/@claude-flow/guidance/docs/adrs/ADR-G007-memory-write-gating.md
Accepted
2026-02-01
In a multi-agent swarm, agents share state through a memory subsystem (AgentDB with HNSW indexing in Claude Flow V3). Without governance, agents can:
The guidance control plane's role is to define policies for memory writes, just as it defines policies for tool calls. Memory is a shared resource that requires governance.
Implement memory write gating through the guidance rule system and enforcement gates, with four governance mechanisms:
Rules in the guidance file can specify which agent types have write access to which memory namespaces. The GuidanceRule.domains and GuidanceRule.repoScopes fields are repurposed for memory governance:
domain: memory and scope: swarm/* applies to all memory writes in the swarm namespacetoolClasses field uses mcp to target memory operations (memory store/search are MCP tool calls)riskClass determines the gate behavior: critical rules block unauthorized writes, high rules require confirmationExample rule in CLAUDE.md:
[R050] Only coordinator agents may write to swarm/task-assignments namespace @security [mcp] #general scope:swarm/task-assignments priority:90 (critical)
The ViolationRateEvaluator in src/ledger.ts tracks violation frequency per rule. When configured with memory-specific rules, it detects agents that produce excessive violations (which correlates with excessive write attempts that are being blocked).
The ledger's computeMetrics() method provides the violation rate per 10 tasks, enabling detection of write storms.
The guidance rule system supports temporal governance through the optimizer loop. Rules tagged with domain: memory can specify decay behavior:
rankViolations() in src/ledger.ts) tracks how often stale-data violations occurverify:memory-fresh) that evaluators use to check data freshnessThe ShardRetriever.areContradictory() method in src/retriever.ts detects contradictory rules using negation patterns:
const negationPatterns = [
{ positive: /\bmust\b/i, negative: /\bnever\b|\bdo not\b|\bavoid\b/i },
{ positive: /\balways\b/i, negative: /\bnever\b|\bdon't\b/i },
{ positive: /\brequire\b/i, negative: /\bforbid\b|\bprohibit\b/i },
];
This same mechanism applies to memory-governing rules. When two rules contradict (e.g., "agents must share state via memory" vs. "agents must not write to shared namespaces"), the higher-priority rule wins during retrieval (selectWithContradictionCheck).
Memory writes flow through the existing gate infrastructure:
evaluateToolAllowlist) can restrict which memory tools are availableevaluateSecrets) scans memory write content for secrets before storageRunLedger.addEvaluator() for memory-specific checks (namespace authorization, rate limits, TTL enforcement)CLAUDE.md. Without these rules, memory writes are ungoverned. Mitigation: the optimizer can propose memory rules based on observed conflicts.Add a memory-write gate alongside the four existing gates. Rejected because it would be a special case of the tool allowlist gate. Memory operations are tool calls; they do not need a separate enforcement path. Adding a fifth gate increases the API surface without proportional benefit.
Implement a full role-based access control system with cryptographic agent identity. Rejected as over-engineered for the current use case. The rule-based approach achieves authority separation without a token infrastructure. RBAC can be layered on if multi-tenant scenarios require it.
Use Conflict-free Replicated Data Types to automatically resolve write conflicts. Rejected because CRDTs solve a different problem (convergence under partition) and do not address authorization or staleness. CRDTs are available in the broader Claude Flow hive-mind system for distributed consensus, but memory governance is about policy, not data structures.
Instruct agents via their prompts to "only write to your assigned namespace." Rejected for the same reason as relying on CLAUDE.md rules: prompts are advisory. Agents can and do ignore them, especially in long sessions.
v3/@claude-flow/guidance/src/gates.ts -- EnforcementGates.evaluateToolUse() for MCP tool gatingv3/@claude-flow/guidance/src/retriever.ts -- areContradictory(), selectWithContradictionCheck()v3/@claude-flow/guidance/src/ledger.ts -- ViolationRateEvaluator, RunLedger.addEvaluator(), computeMetrics()v3/@claude-flow/guidance/src/types.ts -- GuidanceRule.domains, GuidanceRule.repoScopes, GuidanceRule.toolClasses