Commit Graph
398 Commits
Author SHA1 Message Date
Dragan Spiridonov f18ff4c427 fix(policy): authenticate retained ledgers and stream full audits with fenced writers (#4216)
* fix(policy): preserve authenticated ledger receipts across crash recovery

* Register operator policy ledger limits in environment precedence audit

* test(policy): assert bounded retention work instead of shared-runner latency
2026-10-17 23:10:58 +01:00
akushonkamen 87d8687f3f fix(ruflo-agentdb): stop the secret screen treating a hyphen-named memory key as a credential field (#4202) (#4211)
* fix(ruflo-agentdb): stop the secret screen treating a hyphen-named memory key as a credential field

assignmentSecret() ran the KEY_NAME key-assignment check on every match, so
any entry whose name starts with auth (auth-flow-notes) plus up to 40 name
characters looked like a config field, and keyedSecret()/plausibleSecret()
then judged the entry's value as a credential: a write of
{ key: 'auth-flow-notes', value: 'getUser-not-getSession' } was refused
(#4202). A key that is itself a multi-word hyphenated name is an entry's
name, not a field, so the keyed check now skips it; the secret shapes still
screen the whole text, and single-word credential keys (auth, api_key,
token) keep blocking keyed literals.

Synced to the 39 plugin copies with scripts/sync-mod-screen.mjs.

Fixes #4202
Assisted-by: AI (automated contributor session, disclosed on the issue)

* chore(ci): exclude plugins/ruflo-agentdb/tests/guard-keys.test.ts from the root vitest run

The new test imports claude-code/testing like its six siblings, so the root
ratchet run (scripts/ci-test-ratchet.mjs) cannot collect it outside Claude
Code; list it in scripts/ci-test-excluded.txt per the documented convention
so ci.yml stays green until 'claude plugin test plugins/ruflo-agentdb' runs
it in all-plugins-smoke.

Follow-up to #4202
Assisted-by: AI (automated contributor session, disclosed on the issue)
2026-10-17 14:58:08 +01:00
randRuFlo a230b7b9fe chore(ci): RUFLO_DAEMON_LOCK_WAIT_MS is an env-only tuning knob in the precedence audit
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-14 10:40:17 -04:00
rUv 2ec9c05104 Merge pull request #4181 from ruvnet/g3/skills-contracts
fix: skills, plugin contracts and ruvector/neural/kg surfaces (#4126 #4133 #4135 #4149 #4156 #4157 #4158 #4159 #4161)
2026-10-14 05:25:24 -07:00
randRuFlo 08fa73eadb fix(ruflo-adr): read the leading status keyword, skip index/template files, report Unknown in adr-verify (#4126)
ruflo-adr 0.5.8.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-14 05:37:35 -04:00
randRuFlo b98935f34f fix(core,cli): record failed tool outcomes, run hooks from the project root, keep telemetry off the tool path
- #4127: PostToolUseFailure registered for Bash and Write|Edit|MultiEdit and forwarded with -s false and the real exit code (builds on #4170 by @rudycelekli; payload shape verified against Claude Code 2.1.289)
- #4176: the hook shim starts the CLI from CLAUDE_PROJECT_DIR; the CLI only adopts a proven config in a directory that carries ruflo init's markers, not a bare .claude/ that Claude Code created
- #4128: the shim starts the CLI detached and returns at once (about 25 ms instead of 0.2-4 s per hook), bounded to 4 concurrent telemetry CLIs per project, Stop never dropped, RUFLO_HOOK_SYNC=1 for the old path
- ruflo-core 0.2.9

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-14 05:28:12 -04:00
Muhammad Zubair 20b9451f8d test(skills): check that every MCP tool a shipped skill names exists in the registry (#4141) 2026-10-13 13:38:45 +05:00
r dcf79b15bc Merge origin/main into pr-4112 2026-10-12 15:34:02 -04:00
rUv c4bfd1d47a Merge pull request #3522 from rudycelekli/codex-mcp-backend
fix(bridge): retire unsupported Codex MCP backend without startup stall
2026-10-12 12:10:55 -07:00
Dragan SpiridonovandRuflo & AQE d89973b4dc fix(console): draw pictures on Claude Code Desktop as Svg, decide by surface
On Claude Code Desktop every picture was missing: no banner, no title
art, no topology, map, gauge or chart, and not even the text lines meant
to stand in for them. The host completes every resolved table with every
element name, and on the desktop its Raster draws an empty fragment, so
`kit.Raster !== undefined` always held and the console drew empty boxes.

- kitForSurface(): the terminal gets its Raster and no Svg; every other
  surface (desktop, vscode, mobile) gets Svg and no Raster. Applied to the
  Pane and the band. On the terminal nothing changes: the same Rasters,
  keys, text and fallbacks.
- gfx/svg.ts: the same Grid as one SVG document. Every Block Elements
  glyph (U+2580 to U+259F) and every braille glyph is drawn as
  rectangles; other glyphs are placed cell by cell (a control character,
  a value past Unicode or a character XML cannot hold is a blank cell);
  colours are kept, the default background stays transparent, text is
  escaped. A picture that would pass the host's 131,072-character Svg
  limit is not sent, so one large picture cannot invalidate the whole
  tree; it then falls back as on a surface with no pictures (its text line
  where it has one).
- A surface that draws Svg gets still frames, since nothing blits an Svg:
  nothing strikes in and the motion stops, as with fps 0, and the
  decorative light (the header's sweep, the title's shimmer, the palette's
  sweep) is off instead of caught mid-way. The boot keeps its real time so
  its progress shows, and a picture of data is drawn as of the render. The
  terminal keeps its moving light, with fps 0 too.
- art(): one helper for every picture site (header, title art, boot,
  Orbital art, picture(), learning, memmap, palette). An Svg's alt is the
  picture's fallback line without "needs a terminal".
- The frame loop runs while the view has pictures, as before, so the
  menu entry and the Learning pulse still move on the desktop; it only
  rebuilds and blits when a Raster is mounted, so the desktop no longer
  rebuilds every picture per frame and blits keys that were never mounted.
  The band's mark animates on the terminal only.
- tests: svg-pictures.spec.ts (vitest) for the writer, the kit, the still
  frames (on every page in every look: header, title and palette the same
  at any moment, every other picture equal to fps 0's) and the frame loop
  by surface; surface-pictures.test.ts mounts the 33 main views and the
  agent drill-down of a fixture agent in the bbs, plain and orbital looks
  on terminal and desktop (7 tests, all fail on the parent commit). It
  imports claude-code/testing, so it is listed in
  scripts/ci-test-excluded.txt with the console's other kit tests. The old desktop test only asserted "no Raster",
  which held while every picture was gone; it now asserts the Svgs arrive.

Fixes #4111

Co-Authored-By: Ruflo & AQE
2026-10-12 19:38:12 +02:00
rUv ba93ca51a3 Merge branch 'main' into fix/codex-mcp-backend-retirement 2026-10-12 10:38:11 -07:00
r f183b82e13 Merge pull request #4005 (rudycelekli) into batch 2026-10-12 13:32:49 -04:00
r 2814a10881 Merge pull request #3994 (rudycelekli) into batch 2026-10-12 13:32:49 -04:00
r aec93509e9 Merge pull request #3993 (rudycelekli) into batch 2026-10-12 13:32:49 -04:00
rUv f2ae86269b Merge pull request #4103 from ruvnet/docs/readme-tui
docs: mention the optional standalone ruflo tui (README, user guide, animated SVGs)
2026-10-12 09:44:23 -07:00
rUv 740d17f71e Merge pull request #4097 from ruvnet/fix/oct12-verified-issues
fix: accurate coverage reports and reliable SPARC/TDD workflow instructions
2026-10-12 08:56:43 -07:00
r 1ed13b37c9 Merge origin/main into docs/readme-tui 2026-10-12 11:56:41 -04:00
randRuFlo 72c3905e4d docs: mention the optional standalone ruflo tui in the README, with a user-guide section and animated SVGs
README gets a short optional pointer (npx ruflo tui, --plain) and one small animated SVG. docs/USERGUIDE.md gets a
Terminal UI (optional) section: requirements, commands, keys, exit codes, what each page shows, the AI page's ask-first
card and its Codex/OpenRouter rules, the honest limits and a pointer to the Orbital theme. Both SVGs are built from real
frames of ruflo-tui 3.56.7 in a throwaway sample project; scripts/render-tui-svg.mjs rebuilds them (CSS animation only,
no scripts or external references, prefers-reduced-motion shows the first frame).

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-12 11:41:11 -04:00
randRuFlo c84a6d0a18 chore(shared): 3.0.4 (RVF tail recovery + runtime dependencies), CLI/root pins, fresh-consumer smoke
Carries #4031 (rudycelekli) and #4091 (proffesor-for-testing); oversized-tail and permission-safe
recovery per rUv's review and martinvlad's fresh-consumer finding. Adds scripts/smoke-shared-fresh-consumer.mjs
(packed tarball, plain Node) and a CI step for it.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-12 11:21:58 -04:00
RuFlo b4cbd4be9f review(#4097): CI test ratchet exclusion, coverage report size cap and count clamping, sparc 0.3.5 / testgen 0.3.3, sanitize receipts
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-12 11:15:50 -04:00
randRuFlo 7718a142b4 feat(tui): the AI page: ask Codex (read-only, pinned) or OpenRouter, each question after a card (ADR-489 phase 3)
Page 6. Reuses harness.send and the conversation bridge's sendTo, not a second harness. Host.spawn runs only the pinned Codex 0.162.0
release (never current or PATH), read-only, from a fixed argument allow-list; Host.httpSend sends only https POST to openrouter.ai or a
convoTargets host, never follows a redirect, and a key is read by variable name and never drawn. Enter shows a card of exactly what would be
sent; a lone y answers it only while it was drawn in full (#3983); spend cap from the provider-reported cost. e2e host matrix gets a tui leg
(keyless in CI, live gated). Not in this PR: the workspace-write toggle.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 16:54:16 -04:00
rUv 228d578173 Merge pull request #4072 from ruvnet/fix/memory-purge-native-4057-hooklog-4056
fix(memory,hooks): keep on-disk format on sql.js write-back (#4057); command-recording off switch, redaction, expired-row cleanup (#4056)
2026-10-11 12:40:18 -07:00
rUv f9732f1c81 Merge pull request #4073 from ruvnet/feat/mods-hardening-toast
feat(mods): doctor repairs that repair, --strict, atomic install, startup self-check (mods 0.6.0) + toast spike
2026-10-11 12:25:06 -07:00
RuFlo 5061ae1ef0 chore(ci): list the node:test shim test in ci-test-excluded (it has its own runner)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 14:25:59 -04:00
randRuFlo 33cbdc76fe chore(ci): keep the new ruflo-mods kit test out of the root vitest
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 14:12:33 -04:00
randRuFlo 2bf5b1c9c9 chore(e2e): report the CI-only init observation as flaky with evidence; record it in ADR-490
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 13:40:10 -04:00
randRuFlo e8adb06a11 chore(e2e): replay the initializer's exact which-codex call in the sandbox env
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 13:35:40 -04:00
randRuFlo 4f00df535a chore(e2e): allow one row to carry long evidence
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 13:28:17 -04:00
randRuFlo 7e30957a32 chore(e2e): include the tail of init output in the failing plugin-install row
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 13:28:07 -04:00
randRuFlo 5b2390912d chore(e2e): record what the sandbox shell resolves for codex when the init row fails
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 13:10:04 -04:00
randRuFlo 760b4cd0b3 chore(e2e): show the Codex lines of init output when the plugin install row fails
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 13:06:45 -04:00
randRuFlo 589111a20f chore(e2e): say why the init --dual plugin install row failed
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 12:59:56 -04:00
randRuFlo 9022af133e chore(e2e): build the status regex instead of a literal with an interpolation
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 12:43:48 -04:00
r b0a35764f3 Merge remote-tracking branch 'origin/main' into feat/e2e-host-matrix 2026-10-11 12:43:22 -04:00
randRuFlo 3da68a735a chore(e2e): use an obviously fake stub key so secret scanners stay quiet
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 12:43:22 -04:00
randRuFlo 98f2eb5213 feat(e2e): three-host integration loop (Claude Code, Codex, OpenRouter); fix MCP resources capability and Codex plugin clone budget
ADR-490 (loop), ADR-491 (mods host integration, Proposed). The loop's first run found two defects, fixed test-first:
- ruflo mcp start advertised resources but answered resources/* with -32601 (3 stdio servers).
- init --dual's marketplace clone ran under a 20 s budget (17.5 s measured), swallowing the real error.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 12:43:14 -04:00
randRuFlo bb6a958c53 fix(plugins): review of 9 plugins (group D) - verified against the real CLI/MCP, bump versions
Checked every CLI command, flag and MCP tool the skills tell the model to use
against ruflo 3.56.5 and the tool registry. Fixed what was false:

- workflows 0.6.6: MCP tool names with underscores that do not exist; gaia-bench
  has no --dry-run/--task-id (unknown flags are ignored, so the documented cost
  estimate started a billed run); opt-in guard for native workflows; stale smoke
- security-audit 0.3.4: non-existent `security report`, wrong `audit` usage,
  scan depth table that described phases the scanner lacks; --fix gated
- swarm 0.3.7: `swarm watch/health/shutdown` do not exist; swarm-watch.mjs poller
- rag-memory 0.3.5: `ruflo recall`/`memory bridge` do not exist; shell-quoting
  of user text in /recall
- testgen 0.3.2: tdd-repair now enforces that the test is not edited; shell
  quoting; invalid --limit
- rvf 0.3.6: export went through the public IPFS marketplace; now memory export
- ruvllm 0.3.4: provider claims and persistence claims corrected
- observability 0.3.4: no invented traces when nothing wrote spans
- plugin-creator 0.4.3: required plugin.json fields and tool existence check

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 11:33:24 -04:00
rUv 47ad62e5af Merge pull request #4054 from ruvnet/fix/win-hooks-4045
fix(init): Windows hooks launch through node -e, not cmd /c (#4045)
2026-10-11 07:48:54 -07:00
randRuFlo a606b3cfeb fix(init): Windows hooks launch through node -e, not cmd /c (#4045)
Under Git Bash MSYS rewrote the /c of the generated cmd /c IF EXIST hook, so cmd
started interactively, executed the hook's stdin JSON and created zero-byte files
from text after a >. The Windows hook is now a single node -e with no cmd, no
%VAR%, and none of < > | & $ or inner double quotes. It keeps the project-first
then user-profile fallback (#1943), user scope never reads the project, and the
helper runs as a child with inherited stdio so stdin and the exit status pass
through. pinToUserHelpers recognises the new form (exact match only) as well as
the old ones.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 09:31:30 -04:00
randRuFlo 57c71dbbd1 test: exclude the node:test codex-swarm manifest test from root vitest
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-11 09:30:22 -04:00
rUv ba26d996bb Merge pull request #4038 from ruvnet/docs/compact-live-validation
docs(mods): compactCarry live canary evidence + ADR-488 compactKeep design
2026-10-10 17:24:01 -07:00
rUv ebea43a793 Merge pull request #3990 from ruvnet/sec/helper-cli-from-helper-root
fix(helpers): resolve the ruflo CLI from the helper root, not the project (replaces #3953)
2026-10-10 15:54:07 -07:00
randRuFlo 9ff0ae3d69 fix(scripts): unbiased canary id generation in the compact live driver (CodeQL)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-10 17:48:37 -04:00
randRuFlo f9627d8f3b docs(mods): live canary evidence for compactCarry (ADR-451 item 7) and ADR-488 compactKeep design
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-10 17:48:37 -04:00
rUv 570392602a Merge pull request #3952 from ruvnet/fix/user-settings-pin-home-helpers
fix(init): pin user-level hook and statusline commands to $HOME helpers (security review in PR comments)

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-10 11:54:50 -07:00
Rudy Celekli d38c56337a fix(metaharness): fail unreadable oracle pin audits
Signed-off-by: Rudy Celekli <rudy@gradiahq.com>
2026-10-10 11:36:33 -04:00
Rudy Celekli 41dfba5245 Merge current main to recheck Codex MCP backend retirement
Signed-off-by: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com>
2026-10-10 11:30:31 -04:00
Rudy Celekli 2c23959367 fix(scripts): run tool guard through symlinked paths
Signed-off-by: Rudy Celekli <rudy@gradiahq.com>
2026-10-10 11:23:58 -04:00
Rudy Celekli 84f1b14390 fix(release): reject missing umbrella package identities
Signed-off-by: Rudy Celekli <rudy@gradiahq.com>
2026-10-10 11:20:45 -04:00
randRuFlo 72d895a81d fix(helpers): never interpolate a shell-active install-root path; run the delegation smoke from a helper root
The statusline now builds shell command lines from HELPER_ROOT (the checkout's
directory, chosen by whoever made it). A directory named p$(...) was expanded
inside the double-quoted command; shell-active paths are now skipped.

The statusline-generator delegation smoke ran the generated helper from tmpdir,
so with CLI resolution moved to the helper root it fell through to the registry's
published CLI (intelligencePct null). It now writes the helper into a throwaway
helper root whose v3/@claude-flow/cli is the repo's built CLI.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-10 10:54:15 -04:00