Releases: poggufanz/rocky
Release list
v0.7.6
0.7.6 — 22 August 2026
A minor release adding a full terminal dashboard surface and a retrieval bug fix:
rocky dashgrows a real surface line. Home, browse, and compare now share one renderer core built on a pure cell buffer (wide-glyph/emoji-aware, SGR run collapse), a single-axis flex solver, and a keymap registry with layer resolution. Barerockyon an interactive terminal opens the home surface directly; dash, repl, and compare all route through it.- Compare surface: mark-then-pick timeline with per-side diffs, a file index, and a git-diff correlation ladder that resolves the change nearest a chosen moment.
rocky dashopens compare directly; the separate compare CLI alias is dropped. - Rendering honesty: why-card reason text is redacted at the render boundary, golden frames cover every surface at three sizes, mouse wheel scrolling and ascii-mode border degradation are in, and
ROCKY_TUI_MOTION=offfreezes motion for accessibility and deterministic tests. recalland the dashboard's list filter stop surfacing agent transcript envelopes as rationale. A triple's intent text was sometimes a whole captured<task-notification>envelope rather than the user's stated reason; a document containing everything matched every query. Envelope text is now excluded from the retrieval token bag and the list label, read-side only — stored evidence andmemory.jsonlare untouched.- Public attribution notes (README, docs) no longer name the specific work Rocky's character is inspired by; the non-affiliation and originality framing stays, the title doesn't.
v0.7.5
A patch release from the first day of dashboard dogfood:
rocky dashnow shows the reason text it was hiding. Rows labeled barerationale/tripleand an empty Rationale tab were a display bug, not missing data: rationale records keep their text inexcerpt, and triples nestintent/rationaleas{ text }objects — field shapes the dashboard never read. Rows now label from the real text, and the Rationale tab renders the intent plus the stated why.- The rationale gate's own retry instruction now works. Comply with
run: rocky hook agent-event claude-code --rationale ... --files ...after a deny, and the gate recognizes that evidence: it reads memory for a fresh, file-linked rationale before denying a first-touched file, instead of relying purely on deny-once-then-fail-open.--filesis now actually stored — it was parsed and silently dropped before. - Any harness can now grow a why-trail with Rocky, not just Claude Code.
rocky checkspeaks one non-blocking line before a push naming changed files with no fresh stated reason and the exact command to record one — universal becausegit pushis universal, and silent in repos with no recent agent activity. A harness that can block its own tool calls may opt into the same deny-once gate Claude Code uses viarocky hook gate-event generic. Fixed alongside: the notify command could hang forever when stdin was an interactive terminal instead of a vendor payload pipe.
Full Changelog: v0.7.4...v0.7.5
v0.7.4
A minor release adding an interactive terminal dashboard, phase 1:
rocky dashbrowses memory (failures, fixes, triples, sessions, invariants) in a two-pane terminal UI: a records list and an inspector with Info, Rationale, Diff, and JSON tabs. Fuzzy search (/), a filter cycle (f), and a lazygit-style keymap (j/k,Ctrl+d/Ctrl+u,[/],?for help) — read-only, zero runtime dependencies, and built on a pure render loop so every frame is unit-tested.- Bare
rockyon an interactive terminal now opens the dashboard directly — the same idiom asclaude,lazygit, andk9s. Barerockyin a script or CI pipe keeps printing today's usage text unchanged, androcky --helpis untouched. - Non-TTY, Git Bash/MinTTY, and legacy consoles without VT processing all fall back to
rocky statswith a plain explanation instead of painting garbage or hanging.
Full Changelog: v0.7.3...v0.7.4
v0.7.3
A patch release closing a gap the 0.7.2 hook fix left open:
- Hook speech never touches the console device directly anymore.
speakTtykept a fallback that wrote straight to/dev/tty(POSIX) or\.\CON(Windows) whenever the speech-file environment variable was unset. On Windows that write lands on screen instead of throwing, so any process inheriting the console host — including a test run — could paint Rocky's hook output over whatever else owned the terminal. Both shipped hooks have set the speech-file variable since 0.7.2, so the fallback only ever served stray non-hook invocations; it is gone, and hook speech is silently discarded without a speech file instead.
Full Changelog: v0.7.2...v0.7.3
v0.7.2
0.7.2 — 20 August 2026
A patch release cleaning up the passive hook lane — the path that runs at every prompt, on every command, without you typing anything:
- Bash hook no longer writes over your prompt. The detached handler wrote straight to the console device, racing the shell's prompt draw and your own typing. It now buffers into a per-spawn speech file and prints it at the next prompt, the same mechanism the PowerShell hook has used since 0.5.2. Each session only ever prints speech files it claimed itself, so two open terminals never steal each other's messages.
- No more deep-memory hint on typos. Repeating a misspelled command no longer asks you to wrap the misspelling in
rocky run. Detected by exit 127, the command-not-found code Bash sends natively and that the PowerShell hook now reports for a command PowerShell could not find. Only command-not-found is covered — a missing file is indistinguishable from an ordinary failure without stderr, and the passive handler never receives stderr. rocky hook statusnow says when your installed hook is out of date and namesrocky hook installas the fix. Hook protocol version moves to 0.4.0. Existing installs keep the old behaviour until reinstalled.
v0.7.1
0.7.1 — 20 August 2026
Release: v0.7.1
A patch release adding native Git Diff Correlation to Rocky's memory evidence:
Added
rocky why <file> [--diff]&rocky how <query> [--diff]. Renders bounded, secret-redacted git patches correlated with remembered rationale and mechanism evidence.- Multi-tier git diff correlation. Intelligently resolves changes using a 3-tier fallback strategy:
- Explicit commit SHA (
git diff-tree -p -U2 <sha> -- <file>) when available from record pointers. - Timestamp window lookup (
git log -n 1 --since/--until -p -U2 -- <file>) within $\pm 60$s of the memory event. - Working-tree uncommitted changes (
git diff -U2 HEAD -- <file>) if no historical commit matches.
- Explicit commit SHA (
- Fail-open & boundary safety guarantees. Subprocesses run with
shell: false, a strict 5-second timeout (GIT_DIFF_TIMEOUT_MS = 5000), and a 32 KB max output buffer (GIT_DIFF_MAX_BYTES = 32768). Outside a git repository or upon timeout, it falls back to(git diff unavailable)without throwing. - Automatic secret scrubbing. All git diff lines undergo credential and secret redaction (
redactSecretsAtBoundary) before being printed or returned over MCP. - MCP Tool enhancement (
why_file). Thewhy_fileMCP tool accepts an optionaldiff?: booleanargument to include projected, bounded, and secret-redacted diff content in tool results.
v0.7.0
0.7.0 — 20 August 2026
Release: v0.7.0
A minor release: Rocky now remembers why, not just what and how. Two new evidence kinds, rationale and alias, join the schema envelope documented in docs/schema.md. Stated-rationale evidence arrives through four lanes ranked by fidelity — log-thinking from bounded log adapters (Claude Code session transcripts, and DSH session logs where the runtime has zstd), log-response as Claude Code's own fallback when a turn has no thinking block (DSH never emits this lane), notify from any agent that calls the generic hook endpoint with --rationale, and human from rocky why --add. A deterministic concept lexicon and matcher build a derived, never-persisted concept index over existing memory, surfaced through rocky concepts, rocky concept <id>, and rocky concept alias. rocky sessions and rocky repl read that same memory as derived work sessions and a single interactive loop, so recall/what/why/how/concepts stop paying a fresh process start per call. A new PreToolUse gate, dispatched through rocky hook gate-event claude-code and installed by default from rocky setup --agent-hooks, nudges an editing agent to state a rationale once per session per file before an edit, then fails open; it never blocks twice for the same file, and it can be turned off at install with --no-rationale-gate or at runtime with ROCKY_RATIONALE_GATE=off. Codex has no deny hook, so it reaches the notify lane only. Alongside the new capture surfaces, resolution phrasing across run, watch, recall, and brief was corrected: Rocky no longer claims "I remember the fix" or offers a circular "you fix with: <the same command that just failed>" — a resolution line now says only that some later command succeeded and that the fix method itself was not heard.
Added
rationaleandaliasevidence kinds.rationalecarriescwd, agent, rationale_fidelity (raw|summary|none), source (log-thinking|log-response|notify|human), excerpt, and optional links back to a triple/fix/failure;aliascarriesalias, concept, action (add|retract). Both are append-only, bounded, and redact secrets the same way triples do. Reclaim tombstones now unlink and sweep leftovers after a successful write instead of leaving orphaned lock artifacts behind.- Deterministic concept lexicon and matcher (
rocky concepts,rocky concept <id>,rocky concept alias). A fixed lexicon and bounded phrase matcher fold memory into a derived concept index at read time — counts, active aliases, and newest-first evidence per concept. Nothing here is written back into evidence; the index is a replaceable view, matching the schema's derived-data rule. Alias matching and phrase length are bounded; malformed alias arguments and incomplete memory coverage are disclosed, not silently dropped. - Bounded JSONL log scanner with adapter offsets, and a Claude Code transcript adapter.
src/agent/logs/scan.tsreads a vendor session log from a stored byte offset, capped per read, and restarts cleanly from zero when a log has been truncated since the last scan.src/agent/logs/claude-code.tsreads Claude Code's own transcript for thinking and reply lanes; a robust discovery probe compares cwd rather than trusting a path a vendor could have moved. - DSH session log adapter, feature-detected (
src/agent/logs/dsh.ts). Reads~/.dsh/sessions/<project>/<session>/session.jsonl.zstdwhen the runtime Node ships built-in zstd (Node 22.15+); on an older Node the adapter reports zero discovered logs instead of failing. Decompression runs under a dedicated budget with a tolerant header and a file-descriptor-stable size cap. - Rationale capture pipeline with conservative correlation. New evidence only links to a triple, fix, or failure when the correlation is structurally sound; a merely plausible time-window match is treated as no link rather than a guessed one. Adapter failures are isolated per adapter and never abort the rest of the capture pass.
rocky why --add "<text>"and per-record source labels. Lets you teach Rocky your own stated rationale for a file directly, recorded asagent: "human",source: "human",rationale_fidelity: "summary".rocky whynow shows each rationale's source (you said/agent said/ log-derived) and id alongside its age.- Generic agent notify endpoint (
rocky hook agent-event generic --rationale "<text>" [--files a.ts,b.ts]). Any agent, without a vendor-specific log adapter, can hand Rocky one line of stated rationale directly;claude-codeandcodexgained the same--rationale/--filesflags on their existing endpoints. The notify write path is decoupled from vendor payload parsing, so a malformed vendor argument never blocks a plain rationale notification. - PreToolUse rationale gate (
rocky hook gate-event <vendor>). A small, generic check registry reads one hook payload from stdin against bounded per-session state under~/.rocky/gate-state/, and always exits 0. The one shipped check denies once per session per file when no rationale evidence exists yet for that file, then fails open for later touches of the same file — deny-once, evidence-shaped enforcement, not a hard block.rocky setup --agent-hooksinstalls it by default;--no-rationale-gateat install andROCKY_RATIONALE_GATE=offat runtime both opt out. An unrecognized vendor or tool, or a gate-state directory Rocky cannot write to, allows outright rather than blocking. rocky sessions [n]androcky sessions <index>. Lists work sessions derived from memory at read time, grouped by directory and split on a 30-minute gap, newest-first; interpolated evidence fields shown in the detail view are bounded.rocky repl [--ai]. One deterministic loop over the existing recall/what/why/how/concepts/sessions commands, so an interactive session stops paying a fresh process start per lookup.--aipasses through only torecall/what, matching their own opt-in AI behavior; quote-aware tokenizing keeps multi-word arguments intact.rocky briefgained repeated-concept and rationale lines, androcky statsgained rationale/alias counts. Brief now surfaces concepts that recur across the window and ranks which rationale to show by fidelity.rocky statsreports rationale counts by fidelity (raw/summary/none) and a remembered-alias count; both stay CLI-only — the MCPstatstool's projection deliberately omitsrationaleByFidelityandbyKindfor now.
Changed
- Resolution phrasing across
run,watch,recall, andbriefno longer overclaims. Rocky confirms only that some later command succeeded for the same reliable identity; he no longer says he remembers the fix, and no longer echoes the failed command back as if it were the fix itself. The mechanism behind a fix stays the agent's own unread history unless arationalerecord says otherwise.
Not in this release
- Codex and Gemini log adapters remain deferred. Codex's local session-log format has drifted to a SQLite hybrid since this project last checked it, and Gemini persists no thoughts to read — neither has a
log-thinkinglane; both still reach Rocky only through the universalnotifylane. - BYOK annotation,
attest, and the memory circuit breaker remain deferred, unchanged from 0.6.0.
v0.6.0
0.6.0 — 18 August 2026
Release: v0.6.0
A minor release: validation and accountability surfaces on top of the v0.5 memory. rocky brief reads local git history and remembered failures/fixes since your last look and reports what changed, with optional loopback-Ollama narrative polish. rocky journal writes one dogfood note at a time to a local, append-only file. rocky invariants parses .rocky/invariants.md guard blocks with an in-house glob matcher and discloses any glob that currently matches nothing. rocky stats gained per-kind record counts, memory age, and journal count. The record schema envelope is documented in docs/schema.md, including the reserved rationale and guard kinds for future writers.
Added
rocky brief [--since <ref|24h>] [--quiet] [--ai]. Deterministic five-block composition — window state, commit churn, remembered failures/fixes, touched invariant guards, and a closing line — scoped to the current directory and a--sincewindow that accepts a git ref or a duration (90m,24h,7d), defaulting to 24 hours since the last brief or first run.--airequires exact line-count parity with the deterministic output before accepting loopback-Ollama polish, and falls back to the deterministic text on any mismatch or when Ollama is unavailable. Reads local git log and memory only;--aistays on loopback.rocky journal "<note>". Appends one line to a local dogfood journal. Local file write only, no network.rocky invariants. Lists remembered invariant notes parsed from.rocky/invariants.mdand reports which guard globs match zero files in the current tree, so a stale guard doesn't silently protect nothing. Malformed blocks are never silently dropped.- Extended
rocky stats. Per-kind record counts, memory age, and journal entry count join the existing totals and coverage summary. - Schema envelope documentation.
docs/schema.mddocuments the record envelope discriminated bykind, including reservedrationaleandguardkinds for writers that don't exist yet.
Not in this release
- The reserved
rationalekind has no writer yet — decided during design, tracked for a later release. - No recall-hit or guard-trigger counter in
rocky statsyet: no evidence for either is recorded today (journal covers "Rocky helped" moments manually), so the per-kind block will pick both up automatically once a writer exists. scripts/release-check.mjs'sRELEASE_TAG/RELEASE_COMMITstill point at v0.5.5. They are re-pinned to v0.6.0 in a separate commit once the tag exists, so this branch's own CI does not go red before the tag is cut.
v0.5.5
A patch release closing the three findings still open from the 0.5.1 and 0.5.3 stress-test audits: recall dying on the exact recurring-error case it exists for, the PowerShell hook ignoring a sandboxed USERPROFILE, and v2 error text outside signal lines being unfindable.
Fixed
rocky recalllost results the moment the same error was recorded twice. Document frequency was counted once per stored record, so the second occurrence of the same failure pushed its own distinctive token (enospc, a package name) past the rare-token floor and recall said nothing matches. Frequency is now counted once per canonical fingerprint, in bothqueryRecallandsearchKnowledge.rocky hook install/uninstallcould reach the real PowerShell profile whileUSERPROFILE/HOMEpointed at a sandbox. Probed hosts are now admitted only when$PROFILEresolves under the active home directory; a host outside it is dropped with a one-line disclosure.ROCKY_HOOK_ALLOW_PROFILE_OUTSIDE_HOME=1is the explicit-consent escape hatch for Folder-Redirection setups; theROCKY_TEST_POWERSHELL_HOSTSseam keeps its precedence.- Error detail outside signal lines was unfindable for current-format records. v2 non-hook excerpts now feed recall's retrieval evidence under the same bounded token budget, so
rocky recall "left-pad"findsnpm ERR! No matching version found for left-pad@^99.0.0. Hook-origin and unproven legacy v1 excerpts stay excluded. - Containment test fixtures now speak each platform's own path dialect; Windows-only semantics (drive letters, backslash normalization) skip on POSIX.
Full details: CHANGELOG.
v0.5.4
Release: v0.5.4
A patch release. rocky hook install could install the Windows-only PowerShell hook into a non-Windows user's shell profile — a defect shipped in both 0.5.2 and 0.5.3. It is fixed here, alongside a test-only flake in the release suite found while verifying the fix.
Fixed
rocky hook installcould install the Windows-only PowerShell hook on Linux and macOS.detectPwshHost()insrc/commands/hook.tsprobed for apwshbinary with no platform gate, unlike itsdetectWindowsPowerShellHost()sibling. PowerShell 7 (pwsh) is a real, cross-platform binary — it ships preinstalled on GitHub's hostedubuntu-latestandmacos-latestrunners and is common on developer machines that use PowerShell as a cross-platform shell — so on any of those hosts,rocky hook installwould genuinely try to write the Windows-only$PROFILEhook. This shipped broken in both 0.5.2 and 0.5.3. The same missing gate also let three real-host PowerShell tests run on Linux and macOS instead of being skipped there, which is how the defect was caught: CI was red on every POSIX job and green only on Windows.detectPwshHost()now gates onprocess.platform === "win32"first, matchingdetectWindowsPowerShellHost().- A memory-settling wait in the release test suite could pass one record short.
readMemoryRecordsSettleddeclared a memory file settled as soon as two consecutive polls read identical content, with no notion of how many records the scenario actually expected, so a still-in-flight detached write could read as "done" a record early. Test-only; nothing shipped changed. It now waits for a known record floor before declaring settled. Reproduced under synthetic load at 4 failures in 20 runs before the fix, 20 of 20 passing after.
Not in this release
scripts/release-check.mjs'sRELEASE_TAG/RELEASE_COMMITstill point at v0.5.3. They are re-pinned to v0.5.4 in a separate commit once the tag exists, so this branch's own CI does not go red before the tag is cut.