opencrabs 0.5.14

The autonomous, self-improving AI agent. Single Rust binary. Every channel. Recommended: the 40MB prebuilt binary for macOS, Linux and Windows: https://github.com/opencrabs/opencrabs/releases
<!--
Title shape is `type(scope): subject`, the same rule the issue tracker uses and
that .github/workflows/title-lint.yml enforces (CONTRIBUTING.md, Issue Titles).
A bare area prefix (`TUI:`, `voice:`) fails the check. Delete these comments
before submitting.
-->

## What was wrong

<!--
The reason the change exists. Explain why the current behaviour is incorrect,
not what the diff contains. The diff already shows what changed.
-->

## Fixes

<!-- One atomic issue per line. A PR that fixes several issues is fine; a PR that
     bundles unrelated work is not. -->

Fixes #

## Why this way

<!--
The approach, and the alternatives you rejected. If the change touches a core
surface (agent loop, provider layer, channels, memory, config, migrations), say
so here and explain the risk.
-->

## How it was verified

<!-- Real receipts, not intentions. Paste the commands and their outcome. -->

- [ ] `cargo fmt --all -- --check`
- [ ] `cargo clippy --locked --lib --bins --tests --examples --all-features -- -D warnings`
- [ ] `cargo test --locked --profile ci --all-features`

## Tests

<!-- Name the test file under src/tests/ and what it pins. A bug fix without a
     regression test is closed. Say explicitly if a test cannot be written and why. -->

## Checklist

- [ ] The commit is atomic and signed, and the message explains why the old
      behaviour was wrong.
- [ ] No `Co-Authored-By` trailer, no "generated by" footer, no agent
      attribution of any kind.
- [ ] No `[skip ci]` in any commit.
- [ ] Any test that reaches a config or keys writer runs under a home override,
      so it cannot write the live `~/.opencrabs/`.
- [ ] If this is agent-written: I ran it locally, I understand every line, and I
      can explain it in review without a transcript.