daybook/issues/019-handover-to-llm-test-round-4-predeploy.md
peter a355285f3b Add round-4 (pre-deploy) handover for the LLM test project
Final regression sign-off before deployment. Since #018 the only changes
are cosmetic (table/body fonts), so no new API surface — this round is a
broad regression sweep: full CRUD across all kinds, auth boundaries,
confirmation that every closed issue (#003/#004/#006/#008/#010/#014/#015/
#016) stays fixed, and a sharing re-check. A clean pass is the deploy gate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-03 14:16:53 +01:00

77 lines
3.6 KiB
Markdown

# 019 — Handover to AGENT_DAYBOOK__LLM_TEST (round 4 — pre-deploy sign-off)
**Status:** For information — final regression pass before deployment.
This is the **last test round before the app is deployed**. Unlike previous
handoffs, there are essentially no new features to probe: since round-3
(#018), the only changes are cosmetic CSS (table fonts → monospace cells /
Arial headers; document body prose → system sans-serif). **No API or
behavioral surface changed.** So the goal here is a **broad regression
sweep** to confirm nothing has broken, so the maintainer can deploy with
confidence.
Everything is on `main` (pushed) and live on the local dev instance
(`http://127.0.0.1:8001`). Use the `test` / `testpwd` account and clean up
what you create.
## What to do: full regression sweep
Confirm the whole API still behaves. Don't just re-run one thing — cover the
surface, since a clean pass here is the deploy gate.
### Core CRUD, every kind
- `POST` each text kind (markdown, html_fragment, html_full, deck, json,
csv) → `201`, correct `kind`, renders, `raw_available` correct.
- `POST` each file kind (image, pdf, binary) and `.xlsx` (→ converts to csv).
- `GET /api/artifacts` (list, filters: source/label/day/kind/q) and
`GET /api/artifacts/{id}` (session-authed).
- `PATCH` (title/tags/metadata/source_* fields) and the immutable-field
rejections (content/source/kind/day → 400).
- `DELETE` → 204, files gone, second delete 404s.
- `/api/capabilities` returns the current kind/method/filter lists.
### Auth boundaries (important pre-deploy)
- No token / bad token on writes → 403.
- One user's token cannot read/patch/delete another user's artifact (404).
- List/detail reads require a session, not just a bearer token.
### Confirm every closed issue stays fixed
Spot-check the earlier repros — these are the regression-risk areas:
- **#014** — script/onerror in markdown/deck/html_fragment still stripped;
CSP `script-src 'none'` present on those (and `/s/`); html_full still
verbatim.
- **#015** — deeply nested JSON (content *and* request body) → 400, not 500.
- **#016** — ragged CSV rows don't drop cells.
- **#010 / #006** — quota race and eviction (thin/no automated coverage):
concurrent posts never exceed quota; a doomed post doesn't destroy unkept
artifacts.
- **#008** — non-string source_* → 400.
- **#003 / #004** — length limits and content-shape checks still enforced.
### Sharing (the unauthenticated surface — worth re-checking before going live)
- Share toggle creates/clears the token; `/s/{token}` serves unauthenticated;
unsharing kills the old link immediately; a bad/guessed token 404s; an
unshared artifact's embedded assets are not reachable anonymously.
## Cosmetic changes since #018 (not API-testable, FYI only)
- Table cells render in monospace, headers in Arial.
- Document body prose is system sans-serif (was serif in the report theme).
- Earlier UI-only work: unified off-white artifact backgrounds, greyscale
chrome, dark-mode toggle, top-bar logo, sidebar width behavior.
None of these change API responses; verify only if a render looks broken.
## Out of scope / don't report
- **#017** (customizable theme variants) is an accepted design issue, not a
bug.
- `html_full` being verbatim/unsanitized is by design.
- `pdf` using the browser's grey viewer chrome is expected.
## Outcome
- **Clean sweep → the maintainer deploys.** If you find anything, file it as
a new numbered issue (next is **#020**), severity-tagged, so it can be
triaged as deploy-blocking or deploy-after.
As always: `test`/`testpwd`, clean up, and check `artifacts/views.py` before
calling a surprise a bug.