This release adds 2 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+6 more
Summary
AI summaryAdded an opt‑in SQLite vacuum command to reclaim disk space.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Low |
Adds update channel: `longhand --version` prints version; CLI checks PyPI daily; `doctor` gains Version row. Adds update channel: `longhand --version` prints version; CLI checks PyPI daily; `doctor` gains Version row. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Adds opt‑in `longhand db vacuum` to reclaim disk space with preflight and ingest lock held; `--prune-aux` deletes stored harness‑noise events. Adds opt‑in `longhand db vacuum` to reclaim disk space with preflight and ingest lock held; `--prune-aux` deletes stored harness‑noise events. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Adds `partially_indexed` and `skipped_oversize` buckets for sessions with mid‑pipeline crashes or oversized transcripts; no re‑analysis on upgrade. Adds `partially_indexed` and `skipped_oversize` buckets for sessions with mid‑pipeline crashes or oversized transcripts; no re‑analysis on upgrade. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Changes attribution logic: prefers highest `.git` marker, normalizes path casing, routes unattributed sessions to explicit bucket; `longhand reattribute` defaults to dry‑run. Changes attribution logic: prefers highest `.git` marker, normalizes path casing, routes unattributed sessions to explicit bucket; `longhand reattribute` defaults to dry‑run. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Changes episode extraction: requires explicit success flag or error‑free tool result; new errors start a new episode; `find_episodes` defaults to min_confidence 0.5. Changes episode extraction: requires explicit success flag or error‑free tool result; new errors start a new episode; `find_episodes` defaults to min_confidence 0.5. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
Changes `analyze --all` to rebuild missing transcripts from events table and delete old episodes/segments before re‑extracting, eliminating stale duplicates. Changes `analyze --all` to rebuild missing transcripts from events table and delete old episodes/segments before re‑extracting, eliminating stale duplicates. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Performance | Low |
Skips credit‑card redaction pattern unless a cheap digit‑run pre‑check fires, reducing CPU on numeric‑heavy transcripts while preserving masking behavior. Skips credit‑card redaction pattern unless a cheap digit‑run pre‑check fires, reducing CPU on numeric‑heavy transcripts while preserving masking behavior. Source: granite4.1:30b@2026-07-15-audit Confidence: low |
— |
| Bugfix | Medium |
Fixes harness UI‑state entries no longer stored as "unknown" events with full raw JSON, reducing event type size. Fixes harness UI‑state entries no longer stored as "unknown" events with full raw JSON, reducing event type size. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Fixes hook installer fallback to write functional `-m longhand.cli` commands when `longhand` is not on PATH. Fixes hook installer fallback to write functional `-m longhand.cli` commands when `longhand` is not on PATH. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Fixes MCP server to reuse a single store across tool calls and wrap handler failures in readable JSON errors instead of raw tracebacks. Fixes MCP server to reuse a single store across tool calls and wrap handler failures in readable JSON errors instead of raw tracebacks. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Fixes session‑id prefix lookup to search the entire corpus via SQL, resolving previously silent failures for older prefixes. Fixes session‑id prefix lookup to search the entire corpus via SQL, resolving previously silent failures for older prefixes. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Prevents segment IDs from colliding when rebuilt events carry duplicate sequence numbers, avoiding failed embedding batches. Prevents segment IDs from colliding when rebuilt events carry duplicate sequence numbers, avoiding failed embedding batches. Source: granite4.1:30b@2026-07-15-audit Confidence: low |
— |
Full changelog
Feature release: the update channel, cleaner attribution, sharper episodes,
and storage hygiene. One new migration pair (7 and 8) — both O(1) and applied
automatically on first open; existing data is never re-processed without your
say-so. Everything below was dogfooded on a real 331-session corpus before
release, which itself surfaced (and fixed) three long-standing bugs.
Added
- Update channel.
longhand --version/-Vprints the installed
version; the interactive CLI checks pypi.org for a newer release at most
once a day (cache-only hints, printed after your command's output, TTY
only) anddoctorgains a Version row. The check never runs from hooks or
the MCP server — enforced by a test — never blocks a command, and
LONGHAND_NO_UPDATE_CHECK=1disables it entirely. The README privacy
section discloses exactly what it does. (#46) longhand db vacuum(opt-in, never automatic) — reclaim disk space
with a free-space preflight and the ingest lock held;--prune-aux
first deletes stored harness-noise events.doctornow shows SQLite +
vector store sizes. (#51)- Reconcile sees more. New
partially_indexedbucket for sessions whose
ingest crashed mid-pipeline (repaired by--fix), andskipped_oversize
for transcripts past the parser's size cap. Pre-existing rows are treated
as complete — no re-analysis stampede on upgrade. (#48, #52)
Changed
- Attribution overhaul. The project-root walk now prefers the highest
.gitover nearer non-git markers (monorepo packages stop splitting into
per-package projects); paths are normalized to the filesystem's own casing
(case-dupe spellings mint one project); and sessions with no cwd or a
markerless cwd in reserved locations ($HOME root, temp/pytest dirs, plugin
caches, Claude Code internals) land in one explicitunattributedbucket
instead of minting junk projects.longhand reattributeis now dry-run
by default — review the move list, then--fixto apply and prune
emptied projects. (#49) - Episode extraction got honest. Verification requires an explicit
success flag or an error-free result from a command-executing tool —
Read/Grep output no longer marks episodes "resolved". A new error always
starts a new episode instead of being swallowed by the previous one.
Harness plumbing (<task-notification>and friends) is never a problem
anchor, and the leakedAsk:scaffold is gone from problem descriptions
(migration 8 cleans existing rows). Thefind_episodesMCP tool now
defaults tomin_confidence: 0.5(pass 0 for everything); low-confidence
episodes are filtered by default, never deleted. Historical labels change
only when you runlonghand analyze --all. (#50) analyze --allnow reaches your whole corpus and truly replaces.
Sessions whose transcripts rotated off disk are rebuilt from the events
table (previously ~75% of a mature corpus was unreachable), and
re-analysis deletes a session's old episodes/segments before extracting —
no more stale-boundary duplicates accumulating in SQLite and vector
search. (#53, #54)- The prompt hook never embeds inline. The first-recall-after-upgrade
episode backfill (up to the whole corpus, synchronously, inside the
UserPromptSubmit hook) is now a detachedbackfill-episodesworker that
claims the ingest lock. (#47)
Fixed
- Harness UI-state entries (
last-prompt,mode,permission-mode,
attachment,ai-title,agent-name) are no longer stored as "unknown"
events with full raw JSON — they were the 3rd-largest event type on a real
corpus. (#51) - The hook installer's no-PATH fallback wrote dead
-m longhand.cli
commands (the v0.11.2 background-spawn bug class); hooks installed without
longhandon PATH now actually run. (#52) - The MCP server reuses one store across tool calls (it re-ran migrations
and re-opened ChromaDB on every call) and wraps handler failures in a
readable JSON error instead of a raw traceback. (#52) - Session-id prefix lookup (
longhand timeline <prefix>etc.) now searches
the whole corpus in SQL — it previously scanned only the 1,000 most
recent sessions, so older prefixes silently failed to resolve. (#52) - Segment ids no longer collide when rebuilt events carry duplicate
sequence numbers — a collision failed the session's whole embedding
batch. (#54) - The credit-card redaction pattern is skipped unless a cheap digit-run
pre-check fires, cutting redaction CPU on numeric-heavy transcripts;
masking behavior is unchanged. (#52)
Internal
- First direct tests for
session_summary_embedding,segment_search,
vector_store, andcli/helpers; suite now 421 tests. Third-party
deprecation noise filtered in pytest config (6,426 → 95 warnings). (#52)
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Wynelson94/longhand
Persistent local memory for Claude Code. Indexes every session JSONL verbatim into SQLite + ChromaDB for semantic recall (~126ms)
Related context
Related tools
Earlier breaking changes
- v0.13.0 Deprecates several CLI commands; they will be removed at v1.0.
Beta — feedback welcome: [email protected]