Skip to content

v1.1.0: The Reviewer actually runs now, and a stale daemon stops silently eating your commits

Latest

Choose a tag to compare

@Indexasp74 Indexasp74 released this 02 Jul 17:21

v1.1.0: The Reviewer actually runs now, and a stale daemon stops silently eating your commits

Since v1.0.0 the pipeline kept extracting notes just fine — but two separate bugs meant the QA layer behind it wasn't trustworthy, and one long-running background process could silently discard real work with zero error output. Both are root-caused and fixed here, along with a batch of self-healing-loop deadlocks and billing correctness fixes.

The Reviewer QA agent had never actually run

  • run-reviewer.sh used set -euo pipefail, and its own vault-stats check (grep -rl "status: inbox" Inbox/ | wc -l) exits 1 when there's nothing unprocessed — which is the normal, healthy state. That silently killed the whole script before any QA happened, every time the vault was caught up.
  • A second bug was hiding behind the first: markdown backticks in the agent's own prompt string were interpreted as shell command substitution, so even a fixed run would have crashed trying to "execute" source_agent as a command.
  • Together, review-log.md had no real entries in about six months, despite extraction running the whole time.
  • The Reviewer is now also wired into the direct-extraction path (Telegram text notes, Advisor-triggered extraction, retry-failed) — previously it only ran from the voice pipeline and the backlog drainer, so anything extracted outside those two paths skipped QA entirely.
  • /review in Telegram was also broken: review-item filenames longer than Telegram's 64-byte callback-data limit crashed the entire keyboard, not just the long one. Fixed with a short hashed id per item.

A stale background daemon was discarding voice-memo commits with no error at all

  • Long-running processes (the voice watcher, the Telegram bot) fix their environment at startup and never re-read .env — unlike cron-triggered agents, which get a fresh environment every run.
  • If a daemon had been running since before VAULT_GIT_DIR (two-repo mode) was configured, it kept committing against the engine repo's own .git, where the vault-content folders are gitignored by design. Every commit call saw "nothing to stage" and returned success — extraction "worked," the note was marked processed, and the actual content never landed anywhere durable.
  • A new startup guard checks the real invariant directly (whether the vault-content folder is gitignored by whichever repo git resolves to) and aborts loud, with a Telegram alert, instead of losing work silently. If you have long-running daemons up when you change .env, restart them — this guard will now tell you if you forgot.

Self-healing loop deadlocks

  • Retrospective and Implementer could deadlock each other in two-repo mode: Implementer intentionally leaves certain engine self-heals uncommitted for human review, and Retro refused to run on any dirty worktree. Root cause was actually one level deeper — Retro's "anything changed since last run" check only counted commits in the engine repo, so in two-repo mode it saw zero activity most nights and silently skipped, even with a full backlog of real vault changes.
  • Extraction retries could deadlock on a single auto-regenerated file: Meta/MANIFEST.md is rewritten every run and never committed, but wasn't on the clean-worktree guard's whitelist, so it could trip every retry in a loop.
  • Fixed two silent crashes that were quietly killing Retrospective's and Task-Enricher's heartbeats.

Billing correctness

  • invoke-agent.sh's "subscription" strategy could still get billed as metered API, because the CLI picked up an inherited ANTHROPIC_API_KEY from .env even when you intended to run on your Pro/Max login. Now unset before that path runs (opt out with PREFER_API_BILLING=1).
  • Telegram's fast triage mode depended on prepaid API credits for streaming; once those ran out, every message hard-failed instead of falling back. Triage now runs on the same subscription-backed CLI path as everything else by default.

Also in this release

  • drip-extract.sh: a budget-paced backlog drainer that spreads unprocessed notes across a nightly low-usage window instead of bursting into the session limit, with a self-correcting backstop if it trips one anyway.
  • The Extractor now gets a pre-built Canon index injected directly into its prompt for duplicate-checking, instead of exploring the vault with find/grep on every note.
  • Vault persona and language-detection rules are now generic/configurable rather than hardcoded to a single person or language — easier to adapt after the "make it yours" personalize step.