Commit Graph
130 Commits
Author SHA1 Message Date
randRuFlo 9a70d78e5a chore(console): 0.42.2 version and changelog for #3822 and #3823
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-10 10:58:58 -04:00
randRuFlo b35caec0f3 chore(console): 0.42.1 version and changelog for #3945
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-10 10:38:02 -04:00
randRuFlo 72f789254e feat(console,mods): optional detect-only ruvnet-brain grounding (ADR-487)
Console 0.42.0: Overview "Grounding" line (on / not installed / installed, disabled / unknown), a default-on nudge setting that adds one fixed line pointing at search_ruvnet to the mission context when the brain is on and the mission names the ruvnet stack (through modelLine, nothing interpolated), and a default-off, dismissible once-per-session install hint. Mods 0.5.0: option `grounding` (default off) adds a read-only /ruflo-mods row.

Detect-only: never calls, installs, gates, blocks or copies anything of the third-party plugin; ruflo behaves identically without it (smoke steps console 20, mods 15).

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 18:02:44 -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 0e99d1961a chore(console,swarm): console 0.40.8 and swarm 0.3.6 changelog and versions; merge main
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 12:49:55 -04:00
randRuFlo 5e6e454ee5 chore(console): 0.40.7 changelog; merge main
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 12:33:15 -04:00
r 88bdd80977 Merge remote-tracking branch 'origin/main' into w3939 2026-10-09 12:32:12 -04:00
randRuFlo f407072f35 chore(console): 0.40.6 changelog; keep perf probe entries gated as delete (do not lower the gate); reduce instead of Math.max spread
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 12:14:54 -04:00
randRuFlo 41b2175901 chore(console): 0.40.5 changelog; bound the answer scan on unclosed openers; merge main
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 12:11:58 -04:00
randRuFlo 555ee880e7 chore(console): 0.40.4 changelog and version, drop regex fallback in isOpenTask, test wf-links isOpen
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-09 11:43:41 -04:00
Dragan SpiridonovandRuflo & AQE f598890888 fix(console): disk writes work on macOS/BSD (append, exclusive create, create-with-folders, copy)
The console wrote every file through GNU-only argv: dd oflag=append
iflag=fullblock, dd conv=excl, install -D and cp --no-clobber. BSD dd,
install and cp (macOS) refuse all of them, so on a Mac events never
persisted ("345 waiting to write · write failed: the write exited 1"), ADR
initialise/propose never created a file (and blamed a race), exports and
first-time state files failed, the autopilot journal was never appended or
rotated, and its cross-session kill switch was never written.

- data/write-flavor.ts detects the platform once (uname -s, own 3 s
  deadline, process.platform fallback) before the controller exists; every
  flavor-dependent write awaits it and its builder requires the flavor.
- Linux keeps the GNU argv byte for byte.
- macOS/BSD use a frozen set of seven constant sh scripts with the path as
  "$1" (and "$2" for the copy source), never interpolated: each sets its
  umask, refuses a link or a non-regular target, uses noclobber for
  exclusive creates and creates missing folders. smoke.sh enforces the set.
- adr.ts reports the real write failure; worktree /proc specs skip off Linux.

Co-Authored-By: Ruflo & AQE
Claude-Session: https://claude.ai/code/session_01CGoza3gyxBjpaiMPhGHcHs
2026-10-09 16:23:20 +02: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 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 9cef4cb070 feat(console): What's new page under TOOLS, plugin changelog parser and marker (ADR-478), console 0.38.0
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 14:37:28 -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 5a0e5bff4a feat(console): Settings puts Claude control and spending first, folds ruflo config and plugin options to the end
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-07 10:29:40 -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 b17a497916 chore(console): 0.35.0; re-sign the helpers manifest for the recall-log hook changes (ADR-472)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 19:19:42 -04:00
ruv 0406f27b4b merge feat/recall-log-vectors-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 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 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 9df7e0f88b bench(console): startup bench separating engine module-load cost from plugin runtime
Measured: the 3-8 kit-test timeouts on this branch are the engine transpiling and scanning the larger value-reachable module graph (189 -> 265 modules, 248k -> 353k AST nodes) on every test's plugin load; plugin-side start, refresh and render are unchanged. The engine refuses dynamic import(), so the graph cannot be loaded lazily.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 01:54:09 -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 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 116ee09a81 feat(console): wire control plane, conversation and mission autopilot into the Workflows page (ADR-465, ADR-466)
Registers the control tab, Conversation board and autopilot panel; wireWfControl/wireWfConvo/wireAutopilot in wf-wire; convoTargets option; /ruflo autopilot command; smoke step 5 now allows the conversation bridge's one extra send; ap-core spec split for the 500-line limit.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-06 00:36:19 -04:00
ruv 107e9aac0a merge feat/swarm-management-ui 2026-10-05 21:57:43 -04:00
ruv 8b4630ccb7 merge feat/mind-memory-health 2026-10-05 21:57:43 -04:00
ruv 793d2e11dc merge feat/mind-explain-recall 2026-10-05 21:57:43 -04:00
ruv d020462392 merge feat/mind-pipeline-router 2026-10-05 21:57:43 -04:00
ruv 2169b620b9 perf(console): memoize transcript parses and bound page cells; add bench-swarmui (ADR-458)
Refresh of 6 runs x 60 agents 158 ms -> 3.4 ms; 10k-agent page draw 1.5 ms -> 0.02 ms.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 21:50:28 -04:00
ruv a8544dfe13 perf(console): memoize recall explain and per-refresh parses; add bench-recall (ADR-456)
Profile showed trigrams() rebuilt per entry on every render with a prompt picked (70% of CPU).

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 21:49:59 -04:00
ruv 67ce7a2c18 perf(console): memory map embedding layout 28x faster, one layout per frame (bench-memmap)
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 21:45:33 -04:00
ruv b0767e0df0 perf(console): bound route-candidate parsing to the five the picture draws; add bench-pipeline (ADR-455)
10k-line route query: 1.03 ms -> 0.0006 ms parse, 1.27 ms -> 0.065 ms parse+draw.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 21:42:39 -04:00
ruv 4355f7bd8b perf(console): memory health analysis computed once per probe result, per-entry key work hoisted; bench-health.mjs
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 21:40:53 -04:00
ruv 616a7ebb01 feat(console): band notices, tone border, /ruflo band|notices|quiet (0.33.23)
The band now announces approvals, alerts, finished missions, long turns
ending and Anatole blocks on a notice row (linked, dismissable, 20s),
colours its border by state, can go compact, and labels subagents by a
short id instead of the raw one.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 20:01:52 -04:00
ruv 6ab6b395f6 merge origin/main (console 0.33.21); version per merge order 2026-10-05 19:18:58 -04:00
ruv b2d030c88d feat(ruflo-console): the band shows how long Claude has been working, the tool-call rhythm and the context gauge (0.33.24)
The two-row band above the prompt now carries three live signals, each shown only while it has something to say:
- "▶ Claude working 41s": how long the current turn has run (the turn's start is now recorded at turn.start);
- a sparkline of tool calls per minute over the last ten minutes ("·▃▅·▃█▃▅█▅ tool calls, 10m"), so an unattended session's rhythm is
  visible at a glance; silent for fewer than three calls, and it counts only what the console observed;
- "ctx 83%" from the session's context fill: quiet under 60%, plain to 79%, amber from 80%, "· /compact soon" from 85%.
Also fixed: the standing row began "↳  · …" with a doubled separator.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 16:54:51 -04:00
ruv 1a2318f084 fix(ruflo-console): smoke step 12 accepts the excluded list as well as the CI baseline for kit tests
A new kit test belongs on scripts/ci-test-excluded.txt (the baseline only shrinks), which step 12 did not know about.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 16:05:48 -04:00
ruv d1d4dab56d fix(ruflo-console): sentries start /loop as a command, and every result is a bordered status card with aligned tables (0.33.21)
Sentry "▶ start" confirmed but created no loop: the console sent "/loop …" with $.prompt.submit, which gives the model a message that merely
looks like a command. It now runs as the /loop command ($.command.run, as if typed); mid-turn it is placed in the prompt box and says so;
a refusal is reported. The Security page shows the outcome under the sentries as a card (✓/✗, title, age, wrapped detail, next step).

Results in general: every view's Result panel (Security, Dev Tools, Automate, Evolve, Memory lab, MetaHarness lab, Vector, x.ruv, Plugin
catalog) is now one round border coloured by how the run went (green, red, amber while running, dim when idle). The CLI's ASCII tables
had lost their padding by the time they were shown; they are read back as cells and drawn again with box characters and aligned columns
at the one place results are stored (runner.ts), and blank-line runs are collapsed.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 15:09:02 -04:00
ruv dc1ada1b12 feat(ruflo-console): the ask-first confirm is one bordered card with a header, a rule and labelled sections (0.33.20)
The confirm that every ask-first action shows was a stack of loose lines: a header, a long "Confirm: …?" line clipped mid-sentence, the
command, the note, and the buttons hard against them. It is now one round bordered box in the warning colour: "▶ CONFIRM NEEDED" with
"click Yes or press y" beside it, a rule, the question, the exact command ("runs: …", wrapped so all of it shows), the note labelled
"Effect:" (wrapped, alarm colour for money or models), and the buttons set apart by a blank line. Text inside is clipped to the width
within the border. Every string the existing kit tests read is unchanged.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 14:36:33 -04:00
ruv e8384b5e56 feat(ruflo-console): Claude can read the console by default — modelControl read, modelConfirm ask (0.33.18)
At the owner's request the four console_* tools are available by default at the read level: Claude can open pages and read console state,
and cannot act. A missing confirm mode is now ask; a saved "off" stays off and a saved "auto" stays auto. ADR-444 and ADR-450 record it and
resolve the open "default to ask" decision.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 12:53:52 -04:00
ruv 8612da1ed9 fix(ruflo-console): a Dev Tools entry's own cost is the floor of its class; jsonAfter stops at the JSON's own end (0.33.17)
#3788: Claude's confirm gate re-derived the action class from English words and ignored each Dev Tools entry's declared cost, so the
network entry dt-prov-test read as a plain write and could auto-run at write + auto. The entry's cost now travels with the ask
(`declared`) and the gate takes the stricter of the two classes. Live drive: at level write the entry is now refused as a network
action (needs manage); before, it was not asked about.

#3789: jsonAfter sliced to the LAST } or ] in the output, so a trailing log line holding one dropped valid JSON. It now finds the
bracket that closes the first one, skipping strings.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 11:51:32 -04:00
ruv 2c5a9f6534 fix(ruflo-console): never read a link, FIFO or folder named status.json (ADR-450 T2, 0.33.16)
Engine probe: fs.read follows symlinks, even outside the project; stat reports isLink and kind.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 06:19:39 -04:00
rUv 5b029146d5 Merge pull request #3783 from ruvnet/loop/t14-attribution
feat(console): a pending confirm says when Claude asked, and the action class (ADR-450 T14, 0.33.15)
2026-10-05 03:15:04 -07:00
ruv c829121b1c fix(console): smoke step 14 retries once and names the failing spec
Co-Authored-By: RuFlo <ruv@ruv.net>
2026-10-05 06:01:25 -04:00