Skip to content

Wynelson94/longhand

v0.12.0 Feature

This release adds 2 notable features for engineering teams evaluating rollout.

Published 15d MCP Data & Storage
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

ai-memory anthropic chromadb claude-code forensic local-first
+6 more
lossless mcp mcp-server python recall sqlite

Summary

AI summary

Added an opt‑in SQLite vacuum command to reclaim disk space.

Changes in this release

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 / -V prints 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) and doctor gains 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=1 disables 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. doctor now shows SQLite +
    vector store sizes. (#51)
  • Reconcile sees more. New partially_indexed bucket for sessions whose
    ingest crashed mid-pipeline (repaired by --fix), and skipped_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
    .git over 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 explicit unattributed bucket
    instead of minting junk projects. longhand reattribute is now dry-run
    by default
    — review the move list, then --fix to 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 leaked Ask: scaffold is gone from problem descriptions
    (migration 8 cleans existing rows). The find_episodes MCP tool now
    defaults to min_confidence: 0.5 (pass 0 for everything); low-confidence
    episodes are filtered by default, never deleted. Historical labels change
    only when you run longhand analyze --all. (#50)
  • analyze --all now 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 detached backfill-episodes worker 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
    longhand on 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, and cli/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

Track Wynelson94/longhand

Get notified when new releases ship.

Sign up free

About Wynelson94/longhand

Persistent local memory for Claude Code. Indexes every session JSONL verbatim into SQLite + ChromaDB for semantic recall (~126ms)

All releases →

Related context

Earlier breaking changes

  • v0.13.0 Deprecates several CLI commands; they will be removed at v1.0.

Beta — feedback welcome: [email protected]