Skip to content

Releases: poggufanz/rocky

v0.7.6

Choose a tag to compare

@poggufanz poggufanz released this 22 Aug 15:13
e6d4254

0.7.6 — 22 August 2026

A minor release adding a full terminal dashboard surface and a retrieval bug fix:

  • rocky dash grows 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. Bare rocky on 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 dash opens 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=off freezes motion for accessibility and deterministic tests.
  • recall and 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 and memory.jsonl are 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

Choose a tag to compare

@poggufanz poggufanz released this 21 Aug 11:40
d6b21cf

A patch release from the first day of dashboard dogfood:

  • rocky dash now shows the reason text it was hiding. Rows labeled bare rationale/triple and an empty Rationale tab were a display bug, not missing data: rationale records keep their text in excerpt, and triples nest intent/rationale as { 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. --files is 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 check speaks one non-blocking line before a push naming changed files with no fresh stated reason and the exact command to record one — universal because git push is 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 via rocky 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

Choose a tag to compare

@poggufanz poggufanz released this 21 Aug 07:18
3054698

A minor release adding an interactive terminal dashboard, phase 1:

  • rocky dash browses 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 rocky on an interactive terminal now opens the dashboard directly — the same idiom as claude, lazygit, and k9s. Bare rocky in a script or CI pipe keeps printing today's usage text unchanged, and rocky --help is untouched.
  • Non-TTY, Git Bash/MinTTY, and legacy consoles without VT processing all fall back to rocky stats with a plain explanation instead of painting garbage or hanging.

Full Changelog: v0.7.3...v0.7.4

v0.7.3

Choose a tag to compare

@poggufanz poggufanz released this 21 Aug 02:58

A patch release closing a gap the 0.7.2 hook fix left open:

  • Hook speech never touches the console device directly anymore. speakTty kept 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

Choose a tag to compare

@poggufanz poggufanz released this 20 Aug 23:37
3b621ba

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 status now says when your installed hook is out of date and names rocky hook install as the fix. Hook protocol version moves to 0.4.0. Existing installs keep the old behaviour until reinstalled.

v0.7.1

Choose a tag to compare

@poggufanz poggufanz released this 20 Aug 09:07

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:
    1. Explicit commit SHA (git diff-tree -p -U2 <sha> -- <file>) when available from record pointers.
    2. Timestamp window lookup (git log -n 1 --since/--until -p -U2 -- <file>) within $\pm 60$s of the memory event.
    3. Working-tree uncommitted changes (git diff -U2 HEAD -- <file>) if no historical commit matches.
  • 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). The why_file MCP tool accepts an optional diff?: boolean argument to include projected, bounded, and secret-redacted diff content in tool results.

v0.7.0

Choose a tag to compare

@poggufanz poggufanz released this 20 Aug 08:39
a315bfc

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

  • rationale and alias evidence kinds. rationale carries cwd, agent, rationale_fidelity (raw|summary|none), source (log-thinking|log-response|notify|human), excerpt, and optional links back to a triple/fix/failure; alias carries alias, 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.ts reads 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.ts reads 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.zstd when 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 as agent: "human", source: "human", rationale_fidelity: "summary". rocky why now 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-code and codex gained the same --rationale/--files flags 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-hooks installs it by default; --no-rationale-gate at install and ROCKY_RATIONALE_GATE=off at 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] and rocky 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. --ai passes through only to recall/what, matching their own opt-in AI behavior; quote-aware tokenizing keeps multi-word arguments intact.
  • rocky brief gained repeated-concept and rationale lines, and rocky stats gained rationale/alias counts. Brief now surfaces concepts that recur across the window and ranks which rationale to show by fidelity. rocky stats reports rationale counts by fidelity (raw/summary/none) and a remembered-alias count; both stay CLI-only — the MCP stats tool's projection deliberately omits rationaleByFidelity and byKind for now.

Changed

  • Resolution phrasing across run, watch, recall, and brief no 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 a rationale record 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-thinking lane; both still reach Rocky only through the universal notify lane.
  • BYOK annotation, attest, and the memory circuit breaker remain deferred, unchanged from 0.6.0.

v0.6.0

Choose a tag to compare

@poggufanz poggufanz released this 18 Aug 23:41

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 --since window that accepts a git ref or a duration (90m, 24h, 7d), defaulting to 24 hours since the last brief or first run. --ai requires 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; --ai stays 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.md and 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.md documents the record envelope discriminated by kind, including reserved rationale and guard kinds for writers that don't exist yet.

Not in this release

  • The reserved rationale kind has no writer yet — decided during design, tracked for a later release.
  • No recall-hit or guard-trigger counter in rocky stats yet: 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's RELEASE_TAG/RELEASE_COMMIT still 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

Choose a tag to compare

@poggufanz poggufanz released this 18 Aug 05:51

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 recall lost 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 both queryRecall and searchKnowledge.
  • rocky hook install/uninstall could reach the real PowerShell profile while USERPROFILE/HOME pointed at a sandbox. Probed hosts are now admitted only when $PROFILE resolves under the active home directory; a host outside it is dropped with a one-line disclosure. ROCKY_HOOK_ALLOW_PROFILE_OUTSIDE_HOME=1 is the explicit-consent escape hatch for Folder-Redirection setups; the ROCKY_TEST_POWERSHELL_HOSTS seam 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" finds npm 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

Choose a tag to compare

@poggufanz poggufanz released this 18 Aug 04:28

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 install could install the Windows-only PowerShell hook on Linux and macOS. detectPwshHost() in src/commands/hook.ts probed for a pwsh binary with no platform gate, unlike its detectWindowsPowerShellHost() sibling. PowerShell 7 (pwsh) is a real, cross-platform binary — it ships preinstalled on GitHub's hosted ubuntu-latest and macos-latest runners and is common on developer machines that use PowerShell as a cross-platform shell — so on any of those hosts, rocky hook install would genuinely try to write the Windows-only $PROFILE hook. 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 on process.platform === "win32" first, matching detectWindowsPowerShellHost().
  • A memory-settling wait in the release test suite could pass one record short. readMemoryRecordsSettled declared 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's RELEASE_TAG/RELEASE_COMMIT still 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.