Commit Graph

5 Commits

Author SHA1 Message Date
rUv f074987ea0 feat(security): implement ADR-377 — AgentDB Retrieval Security Layer (#2874)
Implements all 3 phases of ADR-377 (ruvnet/ruflo#2516, tracked in #2873):
AgentDB's retrieval and write paths had zero certified defenses against
memory poisoning — SMSR (arXiv:2606.12703) shows 93-100% undefended attack
success. All three phases are off by default; enabling each is opt-in via
env flag until independently benchmarked, per the ADR's own gate criteria.

Phase 1 — AgentDbRetrievalGuard (@claude-flow/memory)
- New `agentdb-retrieval-guard.ts`, wired into `AgentDBBackend.search()`
  (covers `query()`'s semantic path too, since it calls `search()`
  internally). Reuses `@claude-flow/security`'s `ToolOutputGuardrail`
  (ADR-131) for the actual OWASP LLM01/LLM08 pattern scan rather than
  duplicating it — `@claude-flow/memory` now depends on
  `@claude-flow/security` (no cycle: security has zero workspace deps).
- Size gate + guardrail scan per retrieved chunk. Flag-only by default;
  `CLAUDE_FLOW_RETRIEVAL_GUARD_STRICT=true` drops unsafe/oversized chunks
  instead of just annotating them. Both flags off by default
  (`CLAUDE_FLOW_RETRIEVAL_GUARD=true` to enable scanning at all).

Phase 2 — MemoryPoisonForensics (@claude-flow/hooks)
- New `workers/memory-poison-forensics.ts`: rolling-window z-score anomaly
  detection on write-interval and content-length features per
  (agentId, namespace), reproducing the Forensic Trajectory Signatures
  (arXiv:2606.30566) shape (behavioral features on write *sequences*, not
  content). Opt-in `HookEvent.PostToolUse` handler for memory-write tools;
  `CLAUDE_FLOW_POISON_FORENSICS=0` disables recording.
- NOT wired into any of this repo's three separate "worker" dispatch
  systems (hooks' own workers/index.ts codebase-analyzers,
  @claude-flow/swarm's worker-dispatch.ts 12-trigger table, or the CLI's
  scheduled daemon) — @claude-flow/swarm is a deliberately
  zero-workspace-dependency package and adding hooks there would break
  that property; picking the wrong one of three ambiguous dispatch tables
  seemed worse than leaving that integration as an explicit follow-up.
  See the file header for detail.

Phase 3 — McpCallerIdentity (@claude-flow/security)
- New `mcp-caller-identity.ts`: per-invocation Ed25519-signed capability
  tokens (callerId + toolName + nonce + 30s TTL by default), native
  node:crypto sign/verify following the same pattern already used by
  `@claude-flow/browser`'s witness-signer.ts (reimplemented rather than
  cross-imported — a security-primitives module depending on the browser
  package would be a backwards layering dependency).
- Standalone issue/verify API; deliberately NOT wired into
  `AgentAuthorizationPropagator.checkToolCall` (ADR-144) or any tool
  dispatcher — this repo has at least 3 distinct `ToolRegistry`
  implementations and guessing which is authoritative risked silently
  wiring the wrong path. `CLAUDE_FLOW_MCP_CALLER_AUTH` defaults to
  disabled, matching the ADR's own text: key distribution needs a
  follow-on ADR before this ships enabled.

Deviations from the ADR's guessed file paths/class names (documented
inline where relevant): the ADR was written against aspirational paths
(`agentdb/retrieval-guard.ts`, a `BackgroundWorker` interface,
`SafeExecutor`) that don't match the real repo layout — implementation
targets the actual `AgentDBBackend`, the actual worker systems, and the
actual `AgentAuthorizationPropagator`/tool-registries respectively.

Tests: 31 new tests across the three packages (9 + 11 + 11), all passing;
full existing suites re-run clean (memory 451, hooks 145, security 570 —
zero regressions).
2026-07-30 14:09:34 -04:00
rUv 27410d402b feat(security): ADR-320 — MCP Composition Inspector v2 + ChannelGuard v2 (#2791)
Follow-up from dream-cycle issue #2783 / PR #2784. Implements the v2 that the already-shipped v1 (commits 381b7ebcc/581cd2bf3) explicitly deferred: SimHash-based cross-tool fragment detection for MCP composition, and a ChannelGuard reusing the real InputValidator instead of a reinvented catalog. 29 new tests, 134/134 existing hooks tests passing, 0 regressions, clippy clean.
2026-07-27 17:03:26 -07:00
rUv eddfb0f709 fix(statusline): avoid Claude Code collision zone with safe multi-line output (#986)
Claude Code writes its internal status (e.g., "7s • 1p") at absolute terminal
coordinates (columns 15-25 on second-to-last line), causing character bleeding
when our statusline has content there.

Changes:
- Add generateSingleLine() for single-line output (complete avoidance)
- Add generateSafeStatusline() with 24-space padding after emoji (2+24=26)
- Make safe mode the default, add --single/--unsafe/--legacy options
- Add comprehensive tests for collision zone avoidance

The collision zone is cols 15-25 on the second-to-last line of output.
By padding with 24 spaces after the emoji (2 cols), content starts at
column 26, safely past the collision zone.

Fixes #985
2026-01-22 16:07:50 -05:00
rUv 6046e1cdd3 checkpoint: File edit:
🚀 Generated with [Claude Code](https://claude.com/claude-code)
📊 V3 Development Progress Checkpoint

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-01-06 01:04:53 +00:00
rUv 4ff3e7632b checkpoint: File edit:
🚀 Generated with [Claude Code](https://claude.com/claude-code)
📊 V3 Development Progress Checkpoint

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-01-05 20:29:32 +00:00