Skip to content

Hound 10.2.0 - brick-proof self-update + doctor + rollback

Choose a tag to compare

@dondai1234 dondai1234 released this 18 Jul 08:54

The old hound -u could brick the install, and once bricked hound -u itself was dead so the tool could not self-heal. This release rebuilds the whole update lifecycle to make it flawless.

Root causes of the brick

  1. hound -u ran pip install --upgrade hound-mcp[all]. The [all] extra pulls onnxruntime (~100 MB), tokenizers, rapidocr, pdfplumber - slow and fragile. When it failed mid-install, pip had already deleted master_fetch but could not replace hound.exe (Windows locks a running .exe), so every hound command crashed with ModuleNotFoundError, including hound -u.
  2. The recovery messages told users to run a bare pip install --force-reinstall while a hound server held the launcher - the exact command that bricks it.

The fix (new updater.py module)

  • --no-deps, no extras. The self-update only touches hound-mcp itself. Dependencies already installed are left alone; a user's [all] extra is preserved. Fast, deterministic, cannot fail on a heavy dep.
  • Windows: a detached helper runs pip after the launcher exits. The running hound -u IS hound.exe, which Windows locks against overwrite. The helper is a standalone python -c (no master_fetch dependency) that waits for the parent launcher to exit, frees it via the rename trick (Windows permits renaming a running .exe, just not overwriting it), then runs pip with the launcher free. A running server keeps the old code in memory until restarted - no need to stop it. Never refuses, never bricks.
  • Self-heal. If pip's first pass leaves the version unchanged or broken, a --force-reinstall --no-deps pass runs (the launcher is free by then) and re-verifies.
  • Surviving repair. ~/.hound/repair.py (pure stdlib, outside site-packages) is written on every update. If hound is ever bricked, python ~/.hound/repair.py stops hound and force-reinstalls. It survives because it is not part of the hound-mcp package, so a failed pip uninstall never removes it.
  • Safe messages. Every failure prints the safe recovery (python ~/.hound/repair.py), never a bare destructive pip command.

New commands

  • hound doctor - proactive health check (launcher, imports, metadata consistency, stale .old, core deps, PyPI, repair script). Catches a half-broken install before it bricks.
  • hound --rollback - reinstall the version from before the last update.

Compatibility

No new tools, no MCP schema changes, no response-shape changes, no new runtime dependencies. The CLI gained --doctor and --rollback. 705 tests (+12 updater).

Full notes: https://github.com/dondai1234/master-fetch/blob/master/CHANGELOG.md