v1.1.0: The Reviewer actually runs now, and a stale daemon stops silently eating your commits
Latestv1.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.shusedset -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_agentas a command. - Together,
review-log.mdhad 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.
/reviewin 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.mdis 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 inheritedANTHROPIC_API_KEYfrom.enveven when you intended to run on your Pro/Max login. Now unset before that path runs (opt out withPREFER_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/grepon 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.