Repository navigation
Releases
Releases · rittenpoems-beep/varve
v0.2.0
[0.2.0] - 2026-09-25
主题:L2 从"就地改写的文档"改为"只增不减的完整快照序列"。
Changed
- L2 is now an append-only snapshot stream (2026-09-25). The global state card is no longer a document that
gets rewritten in place: every update appends a complete, self-contained snapshot, and the hook injects only
the newest one. Context cost is therefore constant no matter how long the history grows, and older
snapshots are never modified, so any past state can be reconstructed. A task that ends is marked once in the
snapshot where it ended, instead of being collected into a rolling "recently completed" list.
This fixes two real failure modes of the previous model: a growing card was truncated head-first, dropping
the newest content (measured 2026-09-25 on a real card: 4107 characters against the 3500 guard), and items
rolled off the "recently completed" list were lost permanently.
Added
scripts/migrate-status-snapshots.py— converts a legacy five-section state card into the first snapshot
(idempotent, auto-backup, supports--dry-run).render_status()falls back to the legacy whole-section rendering when no snapshot marker is present, so
existing cards keep working without migration.
Fixed
- Truncation dropped the newest state first. The injection guard cut the card from the front
(seg[:3500]), so once a card exceeded the budget the most recent entries disappeared first — measured on a
real card on 2026-09-25: 4107 chars against a 3500 budget, with the newest line cut mid-sentence. Only the last
snapshot is rendered now, so card growth can no longer cost the newest information. - Rolled-off completions were lost forever. "Recently completed (≤5)" was a rolling list: a 6th item pushed
the 1st out of existence. Completion history now lives in the snapshot where the task ended and is never
deleted — the list can no longer overflow because there is no list. - Card drift was invisible. A delivered task could sit under "in progress" indefinitely (observed: the audit
script shipped 2026-09-24 was still listed as active the next day), and a stale banner could coexist with
current work. Snapshots are timestamped and append-only, so a stale line is readable as "last stated N days
ago" instead of silently passing as current.
v0.1.1
[0.1.1] - 2026-09-24
Added
- Claude Code adapter (second framework):
install-claude.ps1writes~/.claude/settings.json
(user scope by default,-Scope projectfor a single repo) and merges instead of overwriting.
The same hook scripts serve both frameworks —hook-user-prompt.py --json-outputemits
hookSpecificOutput.additionalContext, which Claude Code appends after the user message
(tail-append, so the cache-safety rule holds). probe-claude-transcript.py: samples Claude Code transcript structure (no message content),
so the index adapter can be written against real data instead of guesswork.- README (both languages): explicit compatibility scope — Codex and Claude Code only, with the
reasoning for why other framework categories are not applicable.
Fixed
build-search-index.pyno longer performs a full rebuild when sync triggers are active — previously
every session start rebuilt the entire FTS index even though the triggers already kept it current
(--forcestill rebuilds explicitly).audit.pyindex check rewritten: it now verifies trigger presence and reconciles FTS row counts
against content row counts, instead of comparingindex_built_at/content_updated_at
(which reported a false "stale index" under the trigger era).init_hintmarker moved out ofpending/— the 7-day pending cleanup recycled it, so the
one-time install prompt reappeared roughly every 8 days. Pending cleanup now also skips dotfiles.contract_hintdocumented correctly: the contract is injected on first prompt whether or not
a state card exists (implementation was right, the comment was stale).install.ps1gained-Scope user|project(defaultuser, writing~/.codex/hooks.json), matching
what the docs described; previously it only wrote project-level hooks.recall.py --deepde-duplicates cross-source overlapping traces (resume sessions produced duplicate
trace rows that diluted BM25; this mirrors the existingturnsde-duplication).- Size reporting unified to MB = 10^6 bytes across
audit.pyandbuild-search-index.py.
v0.1.0
[0.1.0] - 2026-09-24
First public release.
Added
- Three-tier memory (environment / state / history) with append-only injection at the request tail
- Single SQLite database (
turns+traces) with an FTS5 external-content index - Global state card shared across workspaces (no per-project scoping)
- Stable sequential ids + SQLite sync triggers — the FTS index follows content immediately, no rebuild window
- Retrieval CLI (
recall.py): records → conversation history → trace layer (--deep) - Audit tool (
audit.py): consistency / duplicates / index freshness / retrieval self-test / size - Environment scanner (
env-scan.py): records only what the harness does not inject - Codex session hooks: state marking (SessionStart), tail injection (UserPromptSubmit), silent index refresh
- Installer, 13-point doctor, staging-based concurrent writes, templates
- Chinese and English README; regression ledger (FIXES.md)