v0.7.84 — Usability & discoverability sweep
Usability & discoverability sweep — make what RustyHand can do visible at a glance, smooth out first contact, and stop a partial-update data-loss bug. 11 commits since v0.7.83. 1,728 tests, zero clippy warnings.
New dashboard surfaces
- Capabilities page — one searchable view of what this can do: the 72 built-in tools grouped by category, the agent templates, and the installed skills (with source badges). Backed by
GET /api/tools//api/templates//api/skills. - Security page — the live runtime guardrail posture, not static feature flags: exec mode (
fullflagged amber = any shell command), taint checking, auto-approve, the require-approval list, and per-channel gating (⚠ open to anyoneflagged). Trust-by-default (v0.7.75+) is permissive — the page shows that honestly instead of implying a lockdown. - CLI:
rustyhand tools [--json]andrustyhand agent templates [--json]make the same capability catalog discoverable from the terminal.
First-contact UX
doctor --repairnow writes a validanthropic/claude-sonnet-4-6config (was a deadgroqconfig); Docker default model corrected toclaude-sonnet-4-6.- Missing-API-key errors link the exact provider console; permission-denied tool errors tell you to grant the tool via
PATCH /api/agents/{id}/config. - Dashboard first-run: provider-aware "get a key" link (follows the selected provider), Chat empty-state CTA, and an honest demo-mode banner.
- Channel Connect dialog now surfaces the per-channel setup guidance (quick-setup line, numbered steps, and a "Get a token →" link to BotFather / the Discord developer portal / api.slack.com) instead of bare input boxes.
Channels
- Channel send failures map to human-readable causes — Telegram/Discord HTTP 401/403/404/429/5xx and Slack
ok:falseerror codes — so an operator sees why a send failed.
Honesty (no stubs pretending to work)
- WASM skills are now rejected at load time (with an actionable message) instead of registering tools that always fail when called.
describe_videofails fast with one honest message (no false "set a Gemini key" hint).media_describehonors its optionalpromptargument (was silently discarded); the tool description no longer claims "NOT YET IMPLEMENTED".
Fixes
PUT /api/agents/{id}/updateno longer silently clobbers omitted fields. The live-apply handler deserialized the body into a typed manifest whose container-level#[serde(default)]filled every omitted field with a non-empty default, defeating the value guards — so a partial PUT that set onlynamereset description/temperature/max_tokens/system_prompt/model/provider. Now it uses true PATCH semantics (apply only keys actually present in the submitted TOML). Regression test added.
All checks green: cargo build, cargo test --workspace (1,728), cargo clippy --all-targets -- -D warnings, cargo fmt --check.