## Summary

Implements issue #328 — pluggable job persistence for `JobManager` so tracked async jobs survive a server restart.

- New `JobStorage` trait (`put` / `get` / `list` / `update_status` / `delete_older_than`) with two implementations:
  - **`InMemoryStorage`** — default, zero-dep, same semantics as before.
  - **`SqliteStorage`** — gated behind Cargo feature `job-persist-sqlite` (uses `rusqlite` with `bundled`). Write-through, `parking_lot::Mutex` around the connection.
- `JobManager::with_storage(...)` + `recover_from_storage()`; every mutation (`create_with_parent`, `start`, `complete`, `fail`, `cancel`, `update_progress`, `gc_stale`) persists through the backend.
- New terminal `JobStatus::Interrupted` — applied on startup to rows previously left as `Pending` / `Running`, with `error = "server restart"` and a `$/dcc.jobUpdated` emission.
- `McpHttpConfig::job_storage_path: Option<PathBuf>` + builder helper; `PyMcpHttpConfig.job_storage_path` mirror (+ `_core.pyi`). When the path is set but the Cargo feature is absent, `McpHttpServer::start()` fails fast with a descriptive error.
- New built-in MCP tool **`jobs.cleanup`** (SEP-986 validated) — prunes terminal jobs older than `older_than_hours` (default 24); destructive + idempotent annotations; returns `{removed, older_than_hours}` structured content.
- Docs: new `docs/guide/job-persistence.md`, additions to `docs/api/http.md`, and one-liners in `AGENTS.md` / `CLAUDE.md`.

## Test plan

- [x] `vx just preflight` (cargo check + clippy + fmt + rust tests)
- [x] `vx cargo test -p dcc-mcp-http --features job-persist-sqlite` — SQLite CRUD + restart-recovery integration test
- [x] `vx just dev` + `vx python -m pytest tests/` — 8214 passed / 58 skipped
- [x] New `tests/test_job_persistence.py` — server restart across SQLite file rewrites pending rows to `interrupted`; `jobs.cleanup` returns expected counts for both backends
- [x] Updated tool-count assertions in `tests/test_on_demand_loading.py`, `tests/test_tools_list_pagination.py`, `tests/test_auditlog_ratelimit_logging_mcp_versioned_deep.py`, `crates/dcc-mcp-http/src/tests.rs`

Closes #328
