Release Notes
The follow-ups from reviewing v0.7.0's warm-up thread, plus the schema contract
the MCP tools never declared. Minor rather than patch because
harken::mcp::ServerInfo gained a public field, which breaks literal
construction — the rule for picking that digit is now written down in
CLAUDE.md instead of re-derived per release.
transcribe_statusno longer misreports a warm-up in flight. It derived
everything from a pure stat, so during the startup download it said the model
"is NOT cached: the first transcription call will download it" — both halves
wrong in the one window an agent is most likely to ask. The download is
already running, and a call does not start a second one, it waits on it. The
tool stays stat-only (that is what lets it answer "will a call stall?" without
ever risking a download); it now reads the warm-up state alongside the stat
and reportsidle,downloading,readyorfailed.- A failed warm-up is finally visible to a client. It used to exist only as
a stderr line, so an agent asking for status right after got a plain "not
cached" with no hint the download had already failed once.transcribe_status
now surfaces the recorded error. - All three MCP tools declare an
outputSchemadescribing the
structuredContentthey already returned, plusreadOnlyHint: trueand
openWorldHint: false. A client now has a machine-readable contract for the
structured payload and can tell these tools mutate nothing without reading
prose. A key-set drift guard ships with them — a declared schema with nothing
checking it is worse than no schema. - Fixed: a panic in the warm-up thread wedged every tool call for the life
of the process. The warm state was settled only on the happy path, so an
unwind left it pending forever and the gate blocked on it — the client saw
initializeandtools/listanswer normally, then atools/callthat never
returned and never errored. A drop guard now settles the state on unwind too,
so a panic behaves like a failed download: the call is let through and the
engine retries inline. - Fixed: the server outlived EOF until its warm-up download finished. A
client that spawns and kills MCP servers (probing a config, restarting after
an edit) left one live process per attempt, each streaming up to 466 MB with
nothing to stop it. The thread is now detached at EOF, bounding shutdown. An
abandoned download can never corrupt the cache — only a Content-Length- and
SHA-256-verified file is renamed into place — but it does leave its.partial
file behind, which is inert. - 158 → 166 tests.
Breaking
harken::mcp::ServerInfohas a new public field,warm: Option<Warmth>.
Construct it with..ServerInfo::default(), or passSome(warmth)to have
transcribe_statusreport the warm-up. CLI and MCP surfaces are unaffected —
no flag, tool or argument changed shape.
Install harken 0.8.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/montezuma-p/harken/releases/download/v0.8.0/harken-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/montezuma-p/harken/releases/download/v0.8.0/harken-installer.ps1 | iex"Download harken 0.8.0
| File | Platform | Checksum |
|---|---|---|
| harken-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| harken-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| harken-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| harken-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| harken-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |