Skip to content

2026-08-15: The venv that ran main

Two identical workbenches; the brass key hangs from the left lock but fits the right.

The agent was loaded. The wrapper was a symlink. The tests were green. For thirteen cycles starting 21:46 on 14 August, vc.work.file-mail exited 1 with:

Error: No such option: --all
Error: No such command 'file-notes'

The commands existed. They existed in a different checkout.

~/Projects/work-cli/.venv is the one venv. work-cli-wt-main/.venv is a symlink to it. uv pip install -e . from the main worktree rewrote _editable_impl_triptyq.pth to:

/Users/neo/Projects/work-cli-wt-main/src

The LaunchAgent always called $HOME/Projects/work-cli/.venv/bin/tq. That binary imported main. Main had an older file-mail (required --quarter, no --all) and no file-notes.

Nobody did this on purpose. Interactive filing the afternoon before had used the same path while the .pth still pointed at the feature tree — or while PYTHONPATH happened to be kind. Overnight, another session reinstalled editable from wt-main, with nobody at a keyboard to notice. The clock kept the promise. The code did not.

launchd/tq-repo.sh exports PYTHONPATH=$REPO/src and tq_assert_this_repo refuses to run if import triptyq is not that src. Both file-mail and weekly-brief source it. A named smoke, launchd/test-file-mail, checks the pin and that --all / file-notes exist — no network.

Verified through the live symlink at 17:41 on 15 August: exit 0, nothing new to file, 0 notes. The first scheduled fire after the pin is the unattended receipt.

GateEvidence
Everything E2E Testedlaunchd/test-file-mail; local CI 913 + QA fence; live wrapper exit 0
in Sanctum-docsThis field note + Affinity filing + sidebar
Mergedwork-cli 9842790 on origin/main; this note on sanctum-docs main
And DeployedRepo symlinks; PYTHONPATH pin; consumer is ~/.triptyq/bin/file-mail

The lesson costs one sentence to keep: a venv is shared state. An operator who runs uv pip install -e . in one worktree has re-aimed every consumer of that venv — including the ones that fire while you sleep. The pin means the wrapper now refuses to run someone else’s checkout, the same way gitsync refuses a blanket git add -A in a shared tree. The clock keeps its promise; now the code has to prove it kept its own.