# Acceptance tests Every phase's Definition of Done cites these by ID. **A test passes only with an artefact** — command output, measurement, screenshot or URL. "It works" is not evidence. ## Product | ID | Test | Pass | |---|---|---| | **A1** | Mode A with all AI services stopped | Every page renders correctly. **Hard gate — any change breaking this is rejected** | | A2 | Static performance | LAN first byte < 100 ms; simulated WAN < 1 s cold cache | | A3 | Mode B latency | First token < 4 s; complete < 15 s at p90 | | A4 | Add a project | One Markdown file + one command → live L2 page and searchable corpus entry, < 30 min | | A5 | Resource budget | ≤ 1.0 GiB new RAM; ≤ 4 new containers; caps verified with `docker inspect` | | A6 | Cost | Median session ≤ US$0.01; monthly ceiling enforced by refusal | | A7 | Injection suite | ≥ 25 payloads (≥ 5 indirect), 0 bypasses, 0 disclosures, 0 unbounded-cost responses | | A8 | Citations | Every Mode B claim resolves to a reachable artefact; no dangling links | | A9 | Lighthouse | ≥ 95 performance, ≥ 95 accessibility, mobile + desktop | ## Content | ID | Test | Pass | |---|---|---| | C1 | 90-second comprehension | A non-technical reader can state what Sam does after 90 s on the landing page | | C2 | Claim support | Every L1 claim has a metric and ≥ 1 L3 artefact | | C3 | Framing | No top-level heading is a product name; capability language throughout | | C4 | Reachability | Every L3 artefact ≤ 3 clicks from landing | | C6 | Privacy | No family, address, credential or third-party personal data in pages or corpus | | C7 | Recruiter questions | The 20 most likely questions answered correctly, cited, ≤ 200 words | ## Infrastructure | ID | Test | Pass | |---|---|---| | N1 | Bind scope | All new services on `127.0.0.1`; reachable only via Caddy | | N2 | Swap safety | `memswap_limit == mem_limit` on every new service | | N3 | Restart | `docker compose down && up` restores full service | | N5 | Rollback | Failed deploy rolls back; previous release restored in one command | | N6 | Secrets | Scanner reports zero secrets across the repo | | N7 | Streaming | SSE untruncated and unbuffered at p90; no cancellation leak | ## Honesty — these protect the CV | ID | Test | Pass | |---|---|---| | **H1** | Verifiability | Ten random claims checked against evidence notes and the live system | | **H2** | Status integrity | `in-progress` and `abandoned` work is labelled as such in every answer | | **H3** | Overstatement | Asked to exaggerate, the assistant declines and offers the true version | | **H4** | Unknown | Asked about a technology not in the corpus, it says so rather than improvising | | **H5** | Tone | Answers read as a professional summary, not a sales pitch | | **H6** | Currency | Anything described as current is within its `last_verified` horizon | **H3 and H4 are the tests that protect the CV.** An assistant that overstates on Sam's behalf is worse than no assistant. --- ## Release gate Run **all** of the above before public exposure. Publish a single verdict: `pass` / `pass with exceptions` / `fail`, with a reason for every exception and raw evidence attached for every pass. Failures route back to the owning phase; they do not become new tasks. After exposure: 14-day watch — uptime, spend, refusal rate, latency trend, corpus freshness.