Commit Graph
427 Commits
Author SHA1 Message Date
randRuFlo f047a545f0 fix(console): fold the Sessions list, honest wording, read budget for first reads, Codex sub-agent lineage
- Sessions list starts folded; jumping from the queue opens it.
- First reads past a pass's byte budget wait for the next pass ("not read yet").
- A Codex sub-agent rollout's trailing parent session_meta is lineage, not a second identity.
- ADR/CHANGELOG/README say discovery spawns nothing; the only write is the four-count summary.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 17:24:09 -04:00
randRuFlo c53bed71e3 feat(console,mods): session workspace on the Room: attention queue, session browser, preview (ADR-486)
Needs-you queue (approvals, questions, failures, finished-unread) across Claude Code, Codex and Ruflo
sessions, a browser grouped by repository and worktree, and a preview of the selected session. Local,
read-only discovery (no model call, no process); ambiguous identity goes to an unassigned bucket;
finished work clears only after its preview was drawn; transcript text never reaches a model, the
state, the disk or a text answer. ruflo-mods gains an optional counts-only attention row.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 17:18:27 -04:00
randRuFlo 733596cc1f feat(x-gateway): read-only GitHub/npm query tools on /mcp (ADR-485)
Adds ruv_github_search, ruv_github_repo, ruv_github_file and ruv_registry_latest
to the legacy /mcp surface: allowlisted owner (default ruvnet), public repos only,
SSRF-pinned URLs, redirects refused, size/time caps, TTL+ETag cache, per-client
and shared upstream budgets, results fenced as untrusted GitHub data. Directory
profiles (/chatgpt/mcp, /claude/mcp) are unchanged at twelve tools.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 14:28:35 -04:00
randRuFlo ba810a05fb fix(console): approvals badge counts only rows with an approve/deny action (0.40.3, #3920)
A refused mod or a permission deny has no action, so it held 'n to approve' up
with nothing to press. The band, menu badge, change notices and the Approvals
header now count waitingApprovalsOf(); notices stay listed, named apart.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 22:54:19 -04:00
3991f40670 fix(console): card-bound confirm, one model-facing sanitiser, linear escape stripping, own-key lookups, wrapped Approvals (0.40.2)
- A Yes runs only the card it was pressed on: every pending card has an id,
  the Yes / Always allow / Always accept buttons carry it, runner.confirm(seen)
  runs nothing (and says so) when another card took its place. A card Claude
  raised is re-checked against the level and Stop when it lands and when the
  Yes arrives.
- Everything returned to the model goes through modelLine (escapes, then
  control and invisible characters removed, cut, withheld whole when it holds
  a secret shape or an invite code) and every answer leaves through
  modelLines; a version such as v2.1.0-beta.3 is not an invite.
- ESCAPES is linear: an unterminated OSC ends at the next introducer or the
  end of the text (7.7 s on the old pattern became milliseconds on 1 MB).
- Mission state/status, hive role, audit severity and Settings plugin names
  that are Object.prototype keys read as unknown (own()).
- Approvals and a mission objective wrap at 80 columns instead of being cut
  with an ellipsis (#3899).

Specs ported from #3820, #3821 and #3822, adapted to main.

Co-authored-by: Dragan Spiridonov <spiridonovdragan@gmail.com>
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 17:38:02 -04:00
ruv 56a638190d fix(console): CLI launcher resolution and cold-start handling for settings writes (fixes #3914)
With the ruflo CLI option on npx, a confirmed action ran a cold online npx under the 90 s default and aborted with 'still running after 90000ms'. Resolve ruflo on PATH, a project-local bin or the cached npx copy first; give a cold download a 300 s limit and a first-run label; turn a timeout or ENOTCACHED into an error naming the fix. Console 0.40.1; ADR-407 update.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 15:25:08 -04:00
ruv aeaa51e99a feat(console): advisor checkpoints for mission loops (ADR-483)
Default-off Settings rows: a read-only claude -p consult (asked first, exact argv, turn budget, mission spend cap) before a plan locks, when the same check fails twice in a row, and before done; a third failure pauses the mission. Honest about not being the in-session advisor tool. Console 0.40.0.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-08 12:20:26 -04:00
ruv 817dcfe0e3 fix(console): manually entered text is never silently truncated (ADR-481)
The mission goal was cut at 500 characters and drawn on one clipped line; the host Input is one line and hides the rest. A live mirror
under every field shows all lines, views draw text in full with an explicit marker, limits are checked before sending with the exact
count, and every silent slice/plain cap on typed text is removed or made a counted refusal. console 0.39.1.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 18:20:32 -04:00
ruv b62b7d334c fix(console): keep the swarm ADR digest true to the active mission; verify's confirm names its git reads; real-pane ADRs test (ADR-480)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 17:16:11 -04:00
ruv aed428c43e feat(console,adr): ADR management registry, page and mission/loop/swarm integration (ADR-480)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 17:08:41 -04:00
ruv 9648758050 docs(adr): ADR-478 What's new page and plugin changelogs; ADR-428 note closed
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 14:40:09 -04:00
ruv 3ab89ab38e docs(adr): update 407, 428, 474, 475, 476, 477 to what shipped; add ADR-479 (MCP HTTP bearer auth); index 477-479
Repairs ADR-477, whose section 3 had been overwritten by a replacement-string accident (the document was pasted into it three times).

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 14:37:56 -04:00
rUv 5dbf119c59 Merge pull request #3889 from ruvnet/feat/mod-toasts
feat(mods): shared toast system with levels, dedupe, persistence and Settings (ADR-477)
2026-10-07 10:23:51 -07:00
ruv 04ff98bb32 fix(mods): a toast needs no engine.create (bind at session.start too), a throwing clock falls back to the wall clock; update the cost ladder expectation in the v3 mods contract
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 13:08:53 -04:00
rUv 7d971363a3 Merge pull request #3886 from ruvnet/fix/policy-ledger-anchor-3602
fix(policy): ledger anchor can no longer be deleted and silently re-established (#3602)
2026-10-07 10:01:32 -07:00
ruv 24806b7e78 fix(mods): console toasts release held errors on a timer; settings section names toasts; ADR wording
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 12:54:37 -04:00
ruv 9fc4d3226a Merge origin/main into feat/mod-toasts 2026-10-07 12:53:12 -04:00
ruv 146febd999 feat(mods): shared toast system with levels, dedupe, persistence and Settings (ADR-477)
One dependency-free policy (canonical in ruflo-mods, byte-identical copies in console,
swarm and protector, checked by scripts/sync-toast-policy.mjs and each smoke.sh): level
prefixes, one washed line of at most 120 characters, 60 s de-duplication, four toasts a
minute per source with errors held and counted, the person's all/important/off setting and
per-source mute (console Settings, mirrored to a file the others read), and a digest of
every toast kept for the console's Events page. All call sites migrated; new toasts for a
mission that finishes or fails and a swarm subagent that fails or a loop that is stuck.

Versions: console 0.37.0, swarm 0.3.4, protector 0.1.1, mods 0.3.16.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 12:50:30 -04:00
ruv 8f4b47af16 fix(security): migration-safe hive-mind gating by caller transport (ADR-476, #3338)
Gate hive-mind init/join/leave/spawn/propose/vote/broadcast/shutdown/
memory set+delete/optimize-memory for remote (HTTP/WebSocket) callers only;
local stdio, ruflo mcp exec, the CLI and in-process callers keep working
with no extra step. hive-mind_init never returns hiveToken. Operator secret
from RUFLO_HIVE_BOOTSTRAP_SECRET or a 0600 bootstrap.secret created by the
first local init. state.json is written 0600 atomically (dir 0700).
Constant-time compare. RUFLO_HIVE_REQUIRE_AUTH=1 for bridged stdio.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 10:18:44 -04:00
ruv b256de3bdb docs(adr): ADR-475 note enforce-mode HMAC, corrupt-log repair and pre-anchor behaviour
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 10:16:33 -04:00
ruv 8446702423 fix(policy): ledger anchor can no longer be deleted and silently re-established (#3602)
verify never re-anchors receipts that have no anchor (anchor-missing); appending refuses too.
Adds a hash-chained second anchor log in the project dir plus a mirror of its newest entry under
~/.config/ruflo/policy-trust, an explicit interactive --establish-anchor repair that is logged,
and migration of older state.json anchors. Threat model in ADR-475.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 10:16:05 -04:00
ruv 1ac200432c feat(console): 0.36.0 integration: eventsPersist option, shared whole-batch append argv, hostile-time hardening, init ignores console/
- plugin.json declares eventsPersist (default true); version 0.36.0 in plugin.json, version.ts, smoke.sh
- data/append-argv.ts: one dd argv (bs=1M iflag=fullblock) shared by the Events store and the autopilot journal; real-dd 8-writer test fails on the old argv
- history decoders and Events/Timeline displays use #3874's timeOf/countOf/isoOf, so a hostile time or count cannot throw
- cli init: .claude-flow/.gitignore template lists console/
- ADR-474 updated to the reviewed behaviour and the open low items

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 02:19:20 -04:00
ruv 0406f27b4b merge feat/recall-log-vectors-0.35 2026-10-06 19:17:27 -04:00
ruv 128266082b merge feat/autopilot-complete-0.35 2026-10-06 19:17:27 -04:00
ruv 978572d731 merge fix/control-verified-0.35 2026-10-06 19:17:27 -04:00
ruv 7f560f7d72 merge fix/console-layout-0.35 2026-10-06 19:17:27 -04:00
ruv b531aa9279 perf(console): incremental transcript parsing, kit-seq runner, tsc clean for specs (ADR-473)
A transcript that grew is parsed from where its last parse ended, not from its
first line: checked resume (head + anchor), unfinished last line taken back,
bounded ring and id set, LRU memo, tail windows by unique anchor. Reference
parsers untouched and used as the oracle by a seeded property test plus
mutation checks. Refresh warms the parse memo for the search (400k chars a tick).

scripts/kit-seq.sh runs the 25 kit tests one file at a time in a temp copy;
scripts/typecheck.sh makes tsc find the ambient types in a fresh worktree; the
specs' type errors are fixed (sources of other lanes listed in the report).

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 19:16:55 -04:00
ruv 75b0188e0d feat(ruflo-console): autopilot envelope editor, parallel hand-over, spend windows, band segment, and the first live run (ADR-470)
- list editor for folders, repos, hosts, secret names and verify commands, every edit checked by the loader's own validator, shown as a diff against the approved envelope
- bounded parallel hand-over up to min(envelope concurrency, adaptation) through a narrow startable() beside nextTask; a park no longer holds the other tasks back
- spend: windows never start before Start, Claude Code only, unpriced models and old trackers say why the reading is unknown
- the band segment is drawn through registerBarSource
- ruflo autopilot_* tools: probed, not used (ADR-470 section 2.5)
- live run in a scratch repo found and fixed: dead 8/9 hotkeys, Start unreachable without a run, an input-less permission probe that parked every task, a failed record for a step that finished after Stop, a lost step retried without a question, a false "allow every class"

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 19:14:02 -04:00
ruv a6f35488df fix(ruflo-console): control plane measured in an interactive session (ADR-471)
Replaces every "unverified" label with what Claude Code 2.1.289 actually answered:
- Stop a run: TaskStop takes the Workflow TASK id (read from the session transcript, last launch wins); the wf_ run id and a workflow agent's id are "No task found", so Stop-one-agent is removed and shows the engine's refusal.
- Message: delivered mid-task to a running workflow agent; to a named Agent-tool agent it arrives when its turn ends (161-165 s measured).
- $.tool.call opens the engine's real dialog for ask-class tools; deny resolves {deny}; never bypassed.
- Codex "tokens used" is a total (tokensTotal), stdout trimmed; federation argv checked against the helper's parser; stub OpenAI endpoint receives the card's exact bytes; the engine does not block link-local, so isBaseUrl is the only SSRF gate.
- Real answers are fixtures (tests/fixtures/control-real.ts); new wf-send-stub spec uses a real HTTP server.

Mutation check: 13 mutations (first-launch task id, run id passed to TaskStop, deny ignored, tool_use_error kept, stop-agent spec, codex total as output, untrimmed error, link-local allowed, plain http, transcript path unchecked, huge transcript unread, task id never re-read, usage field on every endpoint) each killed.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 19:02:33 -04:00
ruv 0d94fdb4dd feat(ruflo-console): recorded recalls, real vectors on the memory map, log-based stale (ADR-472)
Learning Lab explains a recall from the hook's recall log (scores as recorded,
recomputation kept as the labelled fallback) and shows real surfaced counts.
The memory map reads stored vectors (memory list --embeddings, int8+scale) and
drops 'NOT similarity' only when they drove the layout. Memory health judges
stale by the log where it can speak and adds similar-by-meaning clusters when
vectors were read. ADR-472 documents the log schema, privacy, vector path and
rollback.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 18:34:43 -04:00
ruv 6206c11617 fix(console): Workflows layout at every dock width, replay play loop, quiet stale presses (ADR-469)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 18:28:31 -04:00
ruv d4e85e087a fix(console): triage re-run text no longer says the console cannot stop a run (0.34.1)
The Control tab's Stop asks first and calls TaskStop; it is unverified for a
workflow run's own id, so the text names Claude Code's Workflows panel as the
sure way. Found by looking at the demo GIF frames.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 09:36:40 -04:00
ruv 6b17188cad merge verify/bench; ADR-468 for the bench optimisations; console 0.34.0
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 01:23:57 -04:00
ruv 83e0a77dc5 Merge verify/review into verify/security (autopilot: union of both hardening sets)
ap-guard: PATH/RELATIVE_PATH/UNPLACED/NFKC from security plus URL host and GitHub repo extraction from review.
ap-loop: all paths, hosts, repos checked; deny not liftable; lost-on-restart park; sleep slack; clock-set-back fix.
ap-live: pin + held stop + slack + verifyPermission + startedCount hand-over check; rotate and adaptPass moved to ap-maint.ts (500-line limit).
ap-panel: Start card lists verify commands, repos and secret env names.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 01:14:57 -04:00
ruv 15933793f1 perf(console): fix per-frame transcript re-parse, quadratic journal fold, repeated tail reads; add workflow and autopilot benchmarks (ADR-467)
Frame 64 ms -> 0.06 ms, drill/search frames 1.4 s -> 0.1 ms, foldJournal 100k events 15 s -> 53 ms,
unchanged journal not replayed, unchanged oversized transcripts not re-read. Digests identical before/after.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 01:12:01 -04:00
ruv 19fbfdc120 fix(console): pin the recorded stop, bound the hand-over read, mask zero-width-split keys at parse, ADR-467
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 01:00:24 -04:00
ruv 7fbb456969 fix(console): autopilot adversarial review - stop wins races and a full disk, sleep/clock-safe timeouts, envelope checks every path/host/repo, deny is not liftable, narrow-width rows, verify commands on the confirm card (ADR-466)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 00:48:17 -04:00
ruv 7befcbd963 merge feat/mission-autopilot (ADR-466)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 00:22:43 -04:00
ruv d7a642aa46 feat(console): interactive control plane and multi-model bridge (ADR-465)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 00:17:28 -04:00
ruv 1a4eecada9 docs(adr): ADR-466 mission autopilot
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 00:10:10 -04:00
ruv 907710b15a merge feat/wf-worktrees 2026-10-05 22:46:42 -04:00
ruv e45ea295bc merge feat/wf-cost 2026-10-05 22:46:42 -04:00
ruv 0e658e4200 merge feat/wf-replay 2026-10-05 22:46:41 -04:00
ruv 9e94787e4f merge feat/wf-links 2026-10-05 22:46:41 -04:00
ruv 604dfa9932 feat(console): Workflows drill-down (ADR-459): levels, activity, log, files, result, cross-level search
Plugged in through the page's slot seams only: a board slot for the panel, eight key slots, a search slot and a follow tick.
Reads are capped and path-checked; loaders need the host bound (bindWorkflowDrill), unbound the drill states what it cannot read.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 22:46:09 -04:00
ruv a753bf87f0 feat(console): Workflows cost, failure triage and alert guards (ADR-462)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 22:38:12 -04:00
ruv 2db7fe2a40 feat(console): Workflows worktree manager, templates and Anatole per agent (ADR-463)
Worktree list with ahead/behind, dirty, age and maker, plus a confirm-gated removal of merged,
clean, idle worktrees that re-checks each one before it goes; four workflow templates with a
dry-run estimate launched through the existing prompt path; Project Anatole verdicts matched to
runs and agents from the files alone, with 'not attributed' where they cannot be placed.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 22:36:45 -04:00
ruv ef867aa200 feat(console): Workflows replay, compare, export and saved views (ADR-461)
Four board slots behind one import: scrub a finished run through its agents' start and end moments, compare two runs of one workflow, export a masked markdown summary through the confirm card, and remember the cursor and pins across restarts. No shell in any write; no hotkey taken.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 22:32:05 -04:00
ruv d3767df09a feat(console): workflow links, run events, mission-as-workflow and guidance (ADR-460)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 22:30:22 -04:00
ruv dab6c087cb feat(console): wire the Workflows page (ADR-464): view, nav, menu, live refresh, keys, slot seams
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 22:16:35 -04:00