Skip to content

Drop the Python sidecar from the payload - #13

Merged
lancekrogers merged 1 commit into
mainfrom
drop-sidecar
Aug 21, 2026
Merged

Drop the Python sidecar from the payload#13
lancekrogers merged 1 commit into
mainfrom
drop-sidecar

Conversation

@veronica-agent

Copy link
Copy Markdown
Owner

Why

The mouth has been the native qwen3-tts-worker (C++/GGML/Metal) since the native-tts PRs. Nothing calls the Python path any more, but the shipped payload still carried it: sidecar/say.py, pyproject.toml and uv.lock were embedded into the binary and extracted to ~/.cans/shipped, ship.Complete() refused a payload without them, and the Homebrew cask still declared uv as a dependency.

This removes all of it. Campaign workitem WI-8b1c5d.

What changed

  • Deleted sidecar/say.py, pyproject.toml, uv.lock from the checkout and from internal/ship/fs/ (−2,000 lines, mostly the lock file).
  • ship.Complete() now requires exactly voices/veronica/ref.wav + character.toml.
  • Removed dead code in internal/ship: Sync, LookUV, ImportMLX, VenvReady, Venv, HFHome, Env, Sidecar (sync.go is gone). No callers outside tests.
  • Tests
    • checkoutRoot() used sidecar/say.py as its checkout sentinel; without the fix TestEmbedMatchesCheckout would have started skipping instead of running. Sentinel is now go.mod + character.toml.
    • New TestEmbedIsExactlyPayload walks the embed FS and fails if it holds anything beyond the three payload files — the sidecar can't quietly come back.
    • New TestCompleteNeedsEveryPiece pins the Complete() contract.
    • TestPrepareSkipsSyncWhenSayBinSetTestPrepareSkipsEnsureWhenSayBinSet, asserting what Prepare actually skips now.
  • just dist stamp copies only the payload. Cask drops formula: uv. goreleaser check passes.
  • just vhs demo baked the tape line with uv run … say.py. It now uses qwen3-tts-cli, the one-shot tool that ships next to the worker in ~/.cans/native/bin (-m models -t text -r ref.wav -o out.wav), and feeds the CLI's Total: N ms into the tape's ttfa field.
  • Wording: no more MLX / sidecar in comments, error strings, or tape scripts. demo-say no longer shells out to python3 for a fractional sleep.

Verification

  • go build ./... && go vet ./... && gofmt -l . clean; just test unit green, 8 packages.
  • go test -run 'TestEmbed|TestComplete' -v ./internal/ship — all four run and pass (none skip).
  • grep -rn 'uv run|mlx|say\.py|pyproject' over the tree: empty.
  • Fresh CANS_HOME with the binary copied outside the checkout: cans doctor all ok, shipped/ holds only .stamp, character.toml, voices/veronica/{ref.wav,meta.json} — zero .py / pyproject / uv.lock.
  • cans say "Put the cans on." speaks through the native worker (exit 0).
  • just dist snapshot builds; archive is LICENSE, README.md, cans; strings on the binary finds no mlx_audio, sidecar/say.py, pyproject.toml, or UV_PROJECT_ENVIRONMENT.
  • just vhs demo runs end to end without uv: 1.58 s line at 24 kHz mono, gif + mp4 regenerated and the booth frame shows the line with its ttfa.

Not in this PR

  • docs/booth.gif / docs/booth.mp4 were regenerated as part of verification but reverted — the committed media is unchanged. Re-cutting the README demo with the native mouth is a separate call.
  • Older installs may still have ~/.cans/venv and ~/.cans/hf from the Python era; nothing cleans those up yet (just uninstall --all wipes the whole home).
  • -o, stdin, --stream, the mouth lock — that's the next slice (WI-a2e393), now unblocked.

…payload

The mouth has been the native qwen3-tts-worker since the native-tts PRs,
but the embed still carried sidecar/say.py, pyproject.toml and uv.lock,
Complete() still demanded them, and the cask still depended on uv.

- delete sidecar/, pyproject.toml, uv.lock from the checkout and internal/ship/fs
- Complete() needs voices/veronica/ref.wav + character.toml, nothing else
- remove Sync, LookUV, ImportMLX, VenvReady, Venv, HFHome, Env, Sidecar (no callers)
- ship_test: checkout sentinel is character.toml so TestEmbedMatchesCheckout
  keeps running; TestEmbedIsExactlyPayload pins the embed to the three files
- just dist stamp copies only the payload; cask drops the uv formula
- just vhs demo bakes the tape line with qwen3-tts-cli from ~/.cans/native/bin
- wording: no more MLX / sidecar in comments, errors, tape scripts
@lancekrogers
lancekrogers merged commit 1e8cea2 into main Aug 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants