Follow-up from PR #153 review (flagged by @JesuFemi-O on approval).
load_token() now raises QuackTokenError on a malformed token instead of returning None. The call path tycoon start → _preflight_checks → quack.ensure_token() → load_token() has no handler (src/tycoon/commands/start.py:122), so a tampered .tycoon/secrets.yml surfaces as an unhandled traceback rather than a clean CLI error.
The message itself is actionable ("delete the 'quack' entry and rerun"), only the presentation is wrong.
Fix: catch QuackTokenError in _preflight_checks, route the message through error(), and raise typer.Exit(1).
Test note: this is a CLI-surface behavior (exit code + stderr presentation) — cover it at the subprocess test layer, not just in-process Typer tests.
Follow-up from PR #153 review (flagged by @JesuFemi-O on approval).
load_token()now raisesQuackTokenErroron a malformed token instead of returningNone. The call pathtycoon start→_preflight_checks→quack.ensure_token()→load_token()has no handler (src/tycoon/commands/start.py:122), so a tampered.tycoon/secrets.ymlsurfaces as an unhandled traceback rather than a clean CLI error.The message itself is actionable ("delete the 'quack' entry and rerun"), only the presentation is wrong.
Fix: catch
QuackTokenErrorin_preflight_checks, route the message througherror(), and raisetyper.Exit(1).Test note: this is a CLI-surface behavior (exit code + stderr presentation) — cover it at the subprocess test layer, not just in-process Typer tests.