Closes the gap that ADR-102 left open: snapshot-only manifests can't
answer "when did this fix regress?" Adds a JSONL temporal log + extracts
the witness toolkit into ruflo-core as an optional plugin asset that
any project can adopt — not just ruflo's own monorepo.
What's new
──────────
1. verification-history.jsonl — one append-only line per regen with
{ commit, issuedAt, manifestHash, summary, fixes: { id: {sha256,
markerVerified} } }. Format choices: JSONL for cheap appends and
minimal git diffs; per-fix object for O(1) lookup.
2. plugins/ruflo-core/scripts/witness/ — project-agnostic toolkit
- lib.mjs shared regen + history primitives
- init.mjs bootstrap empty manifest into any repo
- regen.mjs sign + append history
- verify.mjs validate signature + markers (no ruflo CLI dep)
- history.mjs query temporal log (summary, regressions, timeline)
3. plugins/ruflo-core/{skills,commands,agents}/witness*
Slash command + skill doc + curator agent — Claude Code surface area.
4. scripts/regen-witness.mjs — thin wrapper, delegates to plugin lib.
Reads project-specific NEW_FIXES from a committed witness-fixes.json
instead of inline literals. Single source of truth in the plugin.
5. .github/workflows/v3-ci.yml — witness-verify job gains a follow-on
`history.mjs summary` step that surfaces transitions since the last
snapshot (newly regressed / passing / added / removed fixes).
Empirically verified
────────────────────
Before refactor: 81/81 verified, 1 history entry
After refactor: 81/81 verified, 1 history entry, signature reproducible
signature, marker, sha256 all match across the move.
Plugin scripts run standalone without ruflo CLI installed — only
@noble/ed25519 required. Adopters get full witness capability by
copying plugins/ruflo-core/scripts/witness/ into their repo.
Refs #1868 — implementation issue
ADR-103 — design + rationale + residual risk
Co-Authored-By: RuFlo <ruv@ruv.net>
Closes the gap between the two regression layers:
- Behavioral smokes (smoke-install-no-bsqlite, plugin-hooks-smoke)
exercise the user-visible failure path against fresh installs.
- Cryptographic witness manifest (verification.md.json) attests
the marker substring + sha256 of every documented fix.
Both now block `publish`. A regression in either layer fails CI.
Changes
-------
1. scripts/regen-witness.mjs — committed regen tool replacing the
prior inline-script pattern (~/.claude/.../project_verification_process.md).
Loads existing fixes, appends entries from NEW_FIXES, refreshes
sha256 + markerVerified, signs with deterministic Ed25519 seed.
2. NEW_FIXES populated with #1867, #1859, #1862. Witness now covers
81 fixes (was 78) with 81/81 markerVerified, 0 missing.
3. verification.md sidecar refreshed (count + embedded JSON).
4. .github/workflows/v3-ci.yml — new `witness-verify` job that runs
`ruflo verify --manifest verification.md.json --json` against the
local build and exits non-zero on any regressed fix or invalid
signature. `publish` depends on it.
5. v3/@claude-flow/security/dist rebuilt: src had completed the
bcrypt → bcryptjs migration (#1608, PR #1818) but dist still
shipped the pre-migration bcrypt import. Caught by the regen
dry-run as 80/81 verified — fixed by `npm run build` in the
security pkg, restoring 81/81.
Verification
------------
$ node v3/@claude-flow/cli/bin/cli.js verify --manifest verification.md.json
Manifest signature
manifest hash matches: yes
public key reproducible from gitCommit: yes
Ed25519 signature valid: yes
Summary
pass: 81 drift: 0 regressed: 0 missing: 0
[OK] All fixes verified.
Refs #1867#1859#1862
Co-Authored-By: RuFlo <ruv@ruv.net>
Audit (via goal-planner agent) flagged 6 stale entries: 5 new MCP tools
in browser-session-tools.ts + 1 new agent (dossier-investigator in
ruflo-goals). Counts now 305 MCP / 49 CLI / 32 plugins / 44 agents.
Also fixes a latent bug in scripts/inventory-capabilities.mjs that
extractAgents() never extracted anything on Windows checkouts because
the frontmatter regex `/^---\n([\s\S]*?)\n---/` requires LF. On a
CRLF working tree it returns 0 agents while silently treating the
result as authoritative. Made the regex CRLF-tolerant
(`/^---\r?\n([\s\S]*?)\r?\n---/`) so the script is platform-portable;
this is what unblocked today's regen on a Windows machine.
Three files updated in lockstep:
- scripts/inventory-capabilities.mjs — CRLF-tolerant frontmatter
- verification-inventory.json — re-extracted, sorted, deterministic
- verification.md — narrative coverage line + the
full embedded markdown tables (lines 410+) regenerated from the
same run. The signed JSON witness manifest above (lines 70-317,
Ed25519 sig at line 313) is untouched, so the cryptographic
signature remains valid.
The cli-core split (#1764) created v3/@claude-flow/cli-core/src/mcp-tools/
with 13 hooks_*/memory_* defs, but every name there is a duplicate of
what the umbrella's hooks-tools.ts / memory-tools.ts already register —
no new MCP surface, so the script's hard-coded MCP_TOOLS_DIR pointing
at v3/@claude-flow/cli/src/mcp-tools is currently correct. If cli-core
ever ships a unique tool, the script will silently miss it; worth a
follow-up to scan both dirs and de-duplicate.
Co-Authored-By: RuFlo <ruv@ruv.net>
Extends verification.md.json from 27 fix-witnesses to 55 by adding 28
capability-witnesses — one per source file under
v3/@claude-flow/cli/src/mcp-tools/. Each new entry hashes the
compiled dist .js and pins a marker tool name that must remain
defined for the witness to verify.
scripts/sign-witness-from-inventory.mjs (new):
Reads verification-inventory.json, groups MCP tools by source file,
maps each src/mcp-tools/foo.ts → dist/src/mcp-tools/foo.js, and
appends a `CAP-MCP-foo` fix entry. Idempotent — re-running replaces
any pre-existing CAP-MCP-* entries instead of duplicating.
Pipeline:
1. node scripts/inventory-capabilities.mjs --json > verification-inventory.json
2. npm run build (in v3/@claude-flow/cli)
3. node scripts/sign-witness-from-inventory.mjs # plant CAP-MCP-* entries
4. node scripts/regenerate-witness.mjs # re-hash + re-sign
Result for 3.6.25:
preserved fix entries: 27 (F1..F12, G1..G7, #1697/#1698/#1691/#1721, ADR-094)
CAP-MCP entries added: 28 (300 tools across 28 source files)
total fixes: 55
verified: 55 / 55 (all green)
End-to-end smoke test of the published 3.6.25 (npx -y ruflo@3.6.25):
- MCP server initializes cleanly in stdio mode
- tools/list returns 239 tool definitions
- All major categories present: agent_*, memory_*, hooks_*, github_*,
aidefence_*, federation_*, workflow_*, swarm_*, browser_*, terminal_*,
ruvllm_*
Bridge integration validated locally (ruflo/src/mcp-bridge):
- npm install in bridge dir → 69 packages clean
- bridge spawns `npx -y ruflo mcp start` → 238 ruflo tools loaded
- HTTP /mcp endpoint round-trips initialize, tools/list, tools/call
- Real tool invocation: tools/call ruflo__agent_list returns
{agents: [], total: 0, filters: {}} — expected empty-state shape
- /health reports 3 builtin + 51 external = 54 total exposed
- Clean shutdown on SIGTERM
Task #26 (functional smoke tests for `ruflo verify --functional`)
remains the next iteration: bake this manual smoke into a verify
subcommand that round-trips each MCP tool through the in-process
server.
GCP Cloud Run rebuild (which would pull 3.6.25 via `npm install -g
ruflo`) is out of scope here — no cloudbuild.yaml in the bridge dir
and config/config.json is a per-deployment secret. Local validation
above proves the publish is consumable; container rebuild on the
deployment side picks it up automatically.
Expands verification.md from a 27-fix regression witness into a
full capability map per the user request. Iteration 1 of task #24:
ship the auto-extracted inventory; per-capability witness signing
(#25) and functional smoke tests (#26) follow.
scripts/inventory-capabilities.mjs (new, 200 lines):
- Parses MCP tool definitions out of v3/@claude-flow/cli/src/mcp-tools/*.ts
by matching the literal `name: '...'` pattern; pairs each with the
nearest `description: '...'` and the source file path.
- Parses CLI commands out of src/commands/*.ts via the
`export const fooCommand: Command = { name, description }` shape.
- Parses plugin manifests from plugins/ruflo-*/.claude-plugin/plugin.json.
- Parses agent definitions from plugins/*/agents/*.md frontmatter.
- Output is sorted + deterministic so re-running this script never
churns the file.
- --json flag emits a sidecar consumable by the witness signer in #25.
verification.md (358 → 815 lines):
Appended new "Capability inventory (auto-extracted)" section with
four tables — every MCP tool, CLI command, plugin, and agent
cited with source-file references. The existing 27-fix witness
section remains primary; the inventory complements it.
verification-inventory.json (new, 85K):
Machine-readable sidecar. Columns match the markdown tables.
This is the input for iteration 2 (#25) — the witness signer
will SHA-256 each capability's source/dist file and append a
`fixes[].id` entry to verification.md.json so `ruflo verify`
can confirm every capability byte-for-byte.
Today's snapshot:
300 MCP tools across 28 mcp-tools/*.ts files
49 CLI commands across src/commands/*.ts
32 plugins under plugins/ruflo-*
43 agent definitions under plugins/*/agents/*.md
Tasks created:
#24 verification.md: full capability inventory + witness (this iter)
#25 verification: per-MCP-tool witness signing (next)
#26 verification: functional smoke tests for `ruflo verify`
The eventual target — `ruflo verify --functional` — round-trips each
of the 300 MCP tools through the in-process server and checks the
expected response shape, so verification confirms capability not
just bytes.
- #1532: Add getProjectCwd() to all 16 MCP tool files, respecting CLAUDE_FLOW_CWD
env var instead of bare process.cwd(). Fixes macOS global install where cwd='/'.
Install script now passes -e CLAUDE_FLOW_CWD="$HOME" to claude mcp add.
- #1530/#1531: Add 10MB file size guard and 5000-node PageRank cap to
intelligence.cjs. Add 3s timeout wrapper on intelligence.init()/consolidate()
in hook-handler.cjs. Prevents indefinite hang on large graph-state.json.
- #1524: Auto-initialize memory database on MCP server startup in mcp-server.ts
with graceful degradation. Fixes "Database not initialized" for memory_store.
- #1522/#1520/#1523: Detect ruvector extension before falling back to pgvector
in all ruvector CLI commands. Dynamic vector type names in DDL/indexes.
Fix -d flag mapping to --database in benchmark/optimize.
Closes#1532, #1531, #1530, #1524, #1522, #1520, #1523
Co-authored-by: Reuven <cohen@ruv-mac-mini.local>
ADR-058 defines the RVFA (RuVector Format Appliance) — a single .rvf
file containing Linux kernel, Node.js, Claude Code, Ruflo, ruvLLM
(from RuVector), and a 35-category verification suite (127 checks).
Three profiles: offline (4GB, air-gapped), hybrid (2GB), cloud (60MB).
ruvLLM extends @ruvector/core with on-device GGUF inference.
scripts/verify-appliance.sh runs all 35 categories (113 critical
checks, 10 non-critical warnings, 4 skipped) — verified in Docker.
Co-Authored-By: claude-flow <ruv@ruv.net>
Replace all claude-flow references in install.sh with ruflo branding
and change ruflo@alpha to ruflo@latest throughout README.md to match
current package naming and recommended install path.
Co-Authored-By: claude-flow <ruv@ruv.net>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:21:20Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:21:15Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:21:10Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:21:06Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:20:58Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:20:45Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:20:35Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:20:27Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:20:20Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T21:20:16Z
- Changes: 6 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T17:28:32Z
- Changes: 8 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:25Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:23Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:22Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:21Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:18Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:16Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:11Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:08Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:07Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:05Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: rebrand/ruvflow-umbrella
- Timestamp: 2026-02-08T00:12:04Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-27T15:55:59Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-27T15:52:09Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-27T15:44:54Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-27T15:43:32Z
- Changes: 6 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:38:22Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:38:17Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:38:12Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:38:06Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:37:06Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:37:01Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:36:53Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:36:47Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T22:36:39Z
- Changes: 6 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T19:31:03Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T19:30:52Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T19:10:39Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T19:08:45Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T19:03:59Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Automatic checkpoint created by Claude Code
- Branch: main
- Timestamp: 2026-01-26T19:03:44Z
- Changes: 1 file(s)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>