Complete S07 daily-loop UAT closure

This commit is contained in:
2026-03-27 10:03:31 +01:00
parent e03f2e90a3
commit 44ff64896a
8 changed files with 204 additions and 7 deletions
@@ -0,0 +1,68 @@
# S07: Daily-loop UAT artifact closure — UAT
**Milestone:** M001
**Written:** 2026-03-27T08:59:47.615Z
# S07 UAT — Daily-loop UAT artifact closure
## Preconditions
- Local API is running at `http://localhost:5202` and UI is running at `http://localhost:3000`.
- The S06 acceptance fixture can be seeded via `bash scripts/s06-acceptance-run.sh`.
- Seeded job identity exists after rerun: `S06 Acceptance Labs` / `S06 Acceptance Backend Engineer`.
- Browser session can reach the authenticated localhost UI used by the S06 acceptance flow.
## Test Case 1 — `/jobs` anchors the seeded daily-loop job
1. Run `bash scripts/s06-preflight.sh`.
- Expected: script reaches `/api/auth/config`; auth-limited partial pass is acceptable, but API reachability must succeed.
2. Run `bash scripts/s06-acceptance-run.sh`.
- Expected: `docs/s06-acceptance-run.md` is refreshed and reports overall runner result `pass`.
3. Open `/jobs` in the authenticated UI session.
- Expected: the table contains `S06 Acceptance Labs • S06 Acceptance Backend Engineer`.
4. Inspect the seeded row state.
- Expected: the row shows `Follow up`, `CV ready`, and `Waiting` badges.
5. Open the rows workspace entry.
- Expected: the real job workspace opens for the same seeded job, not a disconnected placeholder.
## Test Case 2 — Workspace preserves the same job identity and real seeded content
1. From the seeded workspace, inspect the tailored CV area.
- Expected: saved tailored CV content is present and begins with `Saved acceptance tailored CV highlighting ASP.NET Core delivery, workflow trust signals...`.
2. Switch to the correspondence view.
- Expected: the seeded recruiter-thread message `Backend Engineer follow-up` is visible for the same job.
3. Record Gmail continuity status honestly.
- Expected: if a linked-thread continuity banner/refresh signal is visible, capture it explicitly; if not, record Gmail continuity as not proven in this run rather than marking it passed.
## Test Case 3 — `/reminders` and `/dashboard` reflect the same seeded state
1. Navigate to `/reminders`.
- Expected: the seeded job appears under `Needs Follow-up`.
2. Inspect reminder state.
- Expected: `Follow up`, `Waiting 14d`, and `Follow-up: 10/03/2026` are all visible for the seeded job.
3. Navigate to `/dashboard`.
- Expected: dashboard counters show `Active applications = 2`, `Applied (30 days) = 2`, and `Responses logged = 1`.
4. Inspect company activity.
- Expected: `Top companies by activity` includes `S06 Acceptance Labs`.
5. Reload `/dashboard` after clearing diagnostics.
- Expected: no browser console errors and no failed network requests are observed in the clean dashboard pass.
## Test Case 4 — Follow-up drafting stays on the manual side of the boundary
1. Open the seeded job workspace follow-up draft area.
- Expected: separate `Copy Draft` and `Send And Log Email` controls are visible.
2. Verify draft retrieval without sending.
- Expected: the live draft content is present in the workspace; if the tab does not emit a fresh captured request, confirm `GET /api/jobapplications/3/followup-draft` succeeds from the authenticated browser context.
3. Observe browser/network activity during passive draft review.
- Expected: no `POST /api/jobapplications/3/send-followup` request occurs unless the explicit send action is clicked.
4. Record the outcome.
- Expected: UAT notes state that the system prepared the draft but did not auto-send email.
## Test Case 5 — Deterministic regression guardrail for closure
1. Run `CI=true npm --prefix job-tracker-ui test -- --runInBand --watch=false src/daily-control-loop.test.tsx src/workflow-trust-signals.test.tsx`.
- Expected: both suites pass (`2 passed, 2 total`) and all six tests pass.
2. Confirm `docs/s07-uat.md` contains a `UI regression results` section.
- Expected: the doc records the command, pass result, and the rule that closure must not be claimed if this regression pair fails on rerun.
## Edge Cases / Failure Handling
- If `scripts/s06-preflight.sh` cannot reach `http://localhost:5202/api`, stop and recover the local API before claiming closure.
- If `scripts/s06-acceptance-run.sh` fails to seed/update the fixture or reports a non-pass result, do not claim S07 closure; capture the runner logs and fix the blocker first.
- If the focused UI regression command fails with `react-scripts: not found`, run `npm --prefix job-tracker-ui install` and retry before treating the slice as regressed.
- If the seeded job is visible but Gmail-linked continuity is not, record that as a limitation; do not silently convert seeded correspondence visibility into a Gmail-sync pass.
- If any passive browser observation shows a `send-followup` POST without the explicit send action, treat it as a blocker against R008 and fail the UAT closure.