Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NHyYupFdBiR4VfoUM7NjSM
4.0 KiB
4.0 KiB
Shared brief — web dashboard implementation agents
You are implementing one step of docs/plans/2026-09-03-web-dashboard.md in the
daily-epub Rust crate. Read that plan in full before writing code — every
decision in it is settled (§0), and §2 records verified facts about the crates and
the host. Also read docs/plans/2026-08-15-implementation-notes.md (conventions:
runtime sqlx queries with manual row mapping, jiff for time with RFC3339 UTC
strings in SQLite, thiserror/anyhow errors, askama templates, no network in
tests, rustfmt defaults, no unwrap() outside tests, tracing spans).
Ground rules
- Work on the current branch (
web-dashboard) in place. Do not commit; the orchestrator reviews and commits. Do not create branches or stash. - Do not edit earlier migrations (
0001–0003). Step 1 createsmigrations/0004_web.sql; later steps may append a new migration file only if the plan says so. - Templates for the web live in
src/web/templates/(.html, HTML-escaped by default);askama.tomllists both template dirs. EPUB templates insrc/epub/templates/are untouched. - Every
|safein a template must be one of the sanitized inputs listed in plan §16; user text is never|safe. - The existing routes (
/r/…,/opds…,/files/…,/healthz,/issues.json) and their tests keep working unchanged. - Tests: unit tests inline per module; router tests with
tower::ServiceExt::oneshotagainstserver::router(...)over a temp DB (tempfile), never the network, never systemd. Add the tests the plan's §17 lists for your step. - Keep
cargo fmt,cargo clippy --all-targets -- -D warningsandcargo testgreen. Finish with those three commands and report their output. - Sandbox note: inside your sandbox
bind()on 127.0.0.1 is forbidden, so exactly these pre-existing tests fail there and must be ignored:curate::llm::tests::anthropic_*(4),extract::tests::relative_urls_resolve_against_the_url_we_landed_on,server::tests::*(5 that bind a listener), and any test intests/m7_server.rs. Do not "fix" them. Any new router test must useoneshotand not bind. The orchestrator runs the full suite outside the sandbox. - Don't gold-plate: implement what the plan says for your step and nothing from
later steps beyond stubs the plan explicitly asks for. Where the plan's
sketch and the real crate API disagree, follow the real API (read the crate
source in
~/.cargo/registryor~/.cargo/git) and note the deviation. - When you finish, write a short handoff at
docs/plans/briefs/web-dashboard/handoff-step<N>.md: what landed, deviations from the plan and why, anything left for the next step, test counts.
Parallel steps (added after step 2)
From step 3 on, steps may run in parallel in separate git worktrees, so file ownership matters:
src/web/dashboard/mod.rsalready declares one submodule per page group (runs,articles,ratings,profile,settings,jobs,stats,users), each exposingroutes() -> Router<AppState>that the dashboard router merges under the admin layer. Put your routes in your submodule'sroutes(); do not touchweb::routerinsrc/web/mod.rsfor dashboard routes. Only step 3 edits theoverviewhandler indashboard/mod.rs.- You own: your
src/web/dashboard/<group>.rsfiles, your templates undersrc/web/templates/dashboard/, partials you introduce, your tests. - Shared files you may touch additively only (no reformatting, reordering
or renaming of existing code):
src/web/mod.rs(helpers),src/db.rs(new query helpers appended insideimpl Db),src/main.rs,src/lib.rs,Cargo.toml,src/web/static/app.cssandapp.js(append a block at the end under a/* step N: … */comment),src/web/templates/layout.html. Keep such edits small so merges stay trivial. - If your worktree is on its own branch, finish by committing one commit
on that branch (message
Web dashboard step N: …); the orchestrator merges. If you are onweb-dashboarditself, do not commit.