882c59ee93
The SQLite runtime repair builds its replacement venv with `uv sync --extra all --locked` and, when that fails, reported only "replacement environment did not pass dependency and import smoke tests". The child's diagnosis went to inherited stdout, so it survived in console scrollback and nowhere else: the rejection line the logger records carried the bare exit code, the failure detail the repair returns is generic, and update receipts are built from explicit record_step calls — none of which covers this repair. On an install where the repair cannot succeed, `hermes update` therefore ended at "partially complete" with no reason — the reason being a one-line uv message the user never saw. Forward that sync's output live (unchanged contract: stderr merged into stdout and drained while the child runs, so pre-desktop-update hand-offs cannot deadlock uv on a full stderr pipe) and keep its tail: reject with the child's `error:`/`hint:` lines and announce them, so the console and the log say what to fix. Carrying the reason into RuntimeRepairResult.detail, and therefore into a receipt step, is deliberately out of scope here — separate change, separate PR. Test: the reported reason keeps uv's error + hint and drops the progress noise that precedes them (red before this change, where the reason was the bare exit code).