Commit Graph
17 Commits
Author SHA1 Message Date
ruv 668ee8d1e9 fix(ci): the test ratchet no longer runs files vitest cannot run (71 plugin kit tests and node:test files)
`Test Suite (ubuntu-latest)` failed with "71 unexpected failing file(s)": 66 plugin kit tests that import `claude-code/testing` (only
resolvable inside Claude Code) and 5 node:test files vitest finds no suite in. None is a regression; each has its own gate
(`claude plugin test` in every plugin smoke, `node --test` in all-plugins-smoke). They are now listed in scripts/ci-test-excluded.txt and
passed to vitest as excludes. A listed file that no longer exists fails the ratchet, and the baseline stays untouched and shrink-only.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 13:21:43 -04:00
ruv 0bae1e47e7 fix(mods): a domain plugin's refusal of another plugin's memory_store no longer claims the write (variant B, review #8)
Every guard still refuses exactly the same inputs (4752-case A/B against origin/main: 0 decision diffs, 744 message-only diffs).
When music, neural-trader, migrations, observability, rvf or ruvector refuse a memory_store whose namespace they do not own, the
message now says a secret-shaped value was found in a memory write and which namespace was targeted (short plain text, stripped and cut,
dropped if secret-shaped), never an owner and never content. Patch bumps: music 0.2.3, neural-trader 0.3.4, migrations 0.3.3,
observability 0.3.3, rvf 0.3.5, ruvector 0.3.4.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 04:07:46 -04:00
ruv d855f75264 Merge remote-tracking branch 'origin/main' into loop/cap-r3 2026-10-05 00:14:43 -04:00
ruv 1ff11ce4e8 test(mods): fleet guard probe covers structured credentials and walker budgets
Adds structured (name/value pair) and budget (past the node and character
caps) probe classes. Finds 32 guards that pass a secret past the 25000-node
walker budget; recorded in the known-holes baseline, not fixed here (the
root cause is the vendored shared region owned by the sync generator).

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 00:11:15 -04:00
ruv 21adb5ce28 feat(mods): vendor the flag option parser from one origin with the screen sync and drift check (review #2)
Extend scripts/sync-mod-screen.mjs to a second kit: the flag() helper in hooks/options.ts of 38 mods now sits between SHARED FLAG markers and is
rewritten/checked from ruflo-agentdb. Drift, a lost marker or zero copies fails --check. Bump the 39 touched plugin versions and their version pins.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-04 23:46:06 -04:00
ruv ed6af7710e Merge remote-tracking branch 'origin/main' into loop/cap-audit 2026-10-04 22:22:39 -04:00
ruv 41358126ab Merge remote-tracking branch 'origin/main' into loop/guard-probe 2026-10-04 21:29:59 -04:00
ruv a98f66344f docs(mods): capability review 2026-10 and matrix generator
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-04 21:19:34 -04:00
ruv 5d8ab06dc4 test(mods): guard probe timing is a hang gate (median of 3 > 1000 ms), 50 ms/50x advisory; bare --known-holes; wider watchdog
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-04 20:34:20 -04:00
ruv bf84712833 test(mods): probe gate fails on lost calibration; --report splices below the marker
A baselined guard that stops refusing anything is now a failure, not 26 fixes;
fixed holes need an actual pass. --report preserves hand-written text above the
generated marker. Two tests added; report regenerated.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-04 19:40:23 -04:00
ruv 7de1657db8 test(mods): fleet adversarial probe for every plugin guard (W6)
scripts/probe-mod-guards.mjs bundles each hooks/guard.ts with esbuild and runs a
97-probe corpus through its verdict: invisible/bidi splits, nesting to 5000,
wide/huge inputs, secrets in object keys, encodings, regex-DoS stress timed per
call (50 ms gate), benign look-alikes. Calibrates each guard's real secret
surface first so a miss is a real bypass. A fast subset runs last in
smoke-all-plugins against a known-holes baseline. Findings (4 root causes across
32 guards, no ReDoS/crash/hang) are in v3/docs/validation/mod-guard-probe-2026-10.md.
No plugin code changed.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-04 19:35:38 -04:00
ruv 71bf281bf0 refactor(mods): one source for the secret screen — sync-mod-screen.mjs regenerates the shared region of 37 screen.ts copies, --check in all-plugins-smoke (ADR-445)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-04 19:03:37 -04:00
Mr. MakandClaude Opus 5 b02d936935 fix(ci): print the failing assertion, not just the filename, on a ratchet failure (#3208)
The ratchet runs vitest with `--reporter=json --outputFile=…`, so nothing
vitest prints reaches the job log and the only record of an unexpected
failure is the file name. Recovering the assertion means downloading the
`test-results-ubuntu-latest` artifact — and a rerun replaces it, so after a
rerun attempt 1's assertion is gone for good.

The failure messages are already in the report this process parsed. Printing
them costs nothing, needs no new artifact, and survives a rerun, because job
logs are per-attempt.

`formatUnexpectedFailures()` is exported and pure so it unit-tests alongside
`evaluateTestReport()`. Every field it reads is optional by design: a
file-level abort ("No test suite found in file") carries `message` and no
assertions, and a report from another reporter version may carry neither. In
both cases the filename still prints, exactly as before, and the PASS path is
untouched.

Verified against a real failing run rather than a fixture: replaying run
35521170139's `vitest.json` through this script turns

      + v3/@claude-flow/cli/__tests__/memory-search-scores-3327.test.ts

into that same line plus

      ✗ memory_search score contract (#3327 Finding B) preserves standard fallback on import failure
        AssertionError: expected [ { key: 'a', …(5) } ] to deeply equal [ { key: 'a', …(4) } ]

which is the line that would have identified the failure in #3208 without a
second run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KTedGmPKpEdArVBMMn3JaP
2026-09-20 13:49:32 -04:00
ruv 13cbd697db fix(release): enforce CI and idle assignment safety 2026-08-15 11:14:06 -04:00
ruv 21f7c0adb8 fix(release): align bundled runtime metadata 2026-08-14 19:21:33 -04:00
rUv ddd27576cb fix(release): ship Capability Brain as a self-contained 3.32.30 train (#2829)
* fix(release): bundle policy and Codex runtimes

* fix(release): verify self-contained three-package archives
2026-07-29 01:30:53 -04:00
ruv 0181fb85c2 ci: #2046 supply-chain hardening — five-layer audit + dependency review + CODEOWNERS
After ADR-122 + ADR-123 expanded ruflo's published-package surface
(@claude-flow/browser, ruflo-graph-intelligence) the supply-chain attack
surface grew alongside it. This commit puts five layers of defence on
every PR + push that touches package.json, lockfiles, or the audit
itself.

New files:

  .github/supply-chain/allowed-deps.json
    Whitelist of direct deps per audited package (ruflo-graph-intelligence,
    @claude-flow/browser). New top-level deps require an explicit edit here.
    Also lists policies.rejectInRegistry (typosquat block-list — ruflo-graph-
    intellligence, sublinear-time-solvor, agent-browse, etc.) and
    publisherTrust.criticalUpstreamPackages (upstream identities snapshotted
    in CI logs so maintainer takeovers are visible).

  .github/supply-chain/accepted-findings.json
    Triaged findings the audit currently tolerates. Each entry cites a
    tracking issue or ADR and carries an expiresAt date so the audit
    re-fails after triage window closes. CODEOWNER review required to
    edit.

  .github/supply-chain/README.md
    Operator guide: how to run the audit locally, how to triage new
    findings, how to add a new package to coverage.

  .github/CODEOWNERS
    Workflows / lockfiles / plugin manifests / supply-chain config now
    require explicit maintainer review. Pairs with the automated audit.

  scripts/audit-supply-chain.mjs
    Five-layer audit:
      [1/5] CVE — npm audit --audit-level=high, fail on HIGH/CRITICAL in
            DIRECT deps unless accepted
      [2/5] Lockfile integrity — every downloaded entry must carry
            SHA-512 in `integrity` (skip pnpm-shadow + workspace-link
            entries by construction)
      [3/5] Top-level allowlist — package.json deps must match
            allowed-deps.json
      [4/5] Typosquat reject — names matching policies.rejectInRegistry
            fail regardless of upstream status
      [5/5] Publisher trust — npm view maintainers, log-only (informational)

  scripts/__tests__/audit-supply-chain.test.mjs
    Smoke test for the audit itself (full-run / --json / each --scope).

Workflow additions in .github/workflows/v3-ci.yml:

  supply-chain-audit job — runs the audit + the smoke test on every PR
    and push that touches package.json, lockfile, allowed-deps,
    accepted-findings, or the audit script.

  dependency-review job — actions/dependency-review-action@v4 (PR-only)
    flags any new vulnerable dep added by the PR vs base, fails on
    `high` severity, denies known-bad licenses (AGPL/GPL/SSPL) and
    blocks specific compromised versions (event-stream, flatmap-stream,
    ua-parser-js@0.7.29 / 0.8.0 / 1.0.0, colors@1.4.1, faker@6.6.6).

  Path filter expanded to include **/package.json, **/package-lock.json,
    **/pnpm-lock.yaml, .github/supply-chain/**, scripts/audit-supply-chain.mjs

Dependabot additions in .github/dependabot.yml:

  Per-plugin npm stanzas for ruflo-graph-intelligence and
  @claude-flow/browser. Major-version bumps are blocked from auto-PR
  (they require allowlist re-approval); patch + minor auto-PR'd.

One real-world finding the audit caught on first run + how it was
triaged (recorded in accepted-findings.json):

  - HIGH CVE on @claude-flow/browser → agentic-flow (via @xenova/
    transformers, agentdb). Already tracked in ADR-121 Phase 4
    (Xenova retirement migration). Marked accepted with expiresAt
    2026-08-19 so the audit re-fails if the migration hasn't
    landed by then.

Audit run on this branch: PASS (0 unaccepted CVE / 0 lockfile issue
/ 0 allowlist violation / 0 typosquat / 5 publisher-trust entries
logged). Audit smoke test: 5/5 passing.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-05-19 08:23:30 -04:00