chore(M001/S03): auto-commit after complete-slice

This commit is contained in:
2026-03-24 12:40:09 +01:00
parent 406a1c15c7
commit ac1832ea04
11 changed files with 258 additions and 48 deletions
@@ -0,0 +1,92 @@
# S03: Reply and follow-up drafting from real thread context — UAT
**Milestone:** M001
**Written:** 2026-03-24
## UAT Type
- UAT mode: mixed
- Why this mode is sufficient: S03 changes both backend draft assembly and the per-job Follow-up workspace, so the right acceptance script combines artifact-backed checks (focused backend/frontend tests and build) with a human review of draft specificity, editability, and the manual-send boundary.
## Preconditions
- The API and UI for this worktree are running from `/home/pi/development/JobTracker/.gsd/worktrees/M001`.
- A job exists with all of the following:
- imported Gmail correspondence tied to the job
- recruiter email populated on the company/job
- saved tailored CV, cover letter, recruiter message, and/or saved application-answer draft material
- The tester can open that job in the job workspace.
- No autonomous outbound-email automation is enabled anywhere in the environment.
## Smoke Test
Open one seeded job, switch to the **Follow-up** tab, and confirm the tab shows a generated draft plus a visible context panel that names the thread/package grounding rather than only a blank email form.
## Test Cases
### 1. Generate a thread-grounded follow-up draft
1. Open a job that already has imported correspondence and saved application package material.
2. Open the **Follow-up** tab.
3. Wait for the draft to load.
4. Review the context panel above/alongside the draft.
5. **Expected:**
- a draft subject and body are generated
- the UI shows why the draft was generated now (for example, waiting-update timing)
- the UI shows thread/package grounding such as thread subject, latest sender, context summary, or context signals
- the draft content feels tied to the actual thread stage and saved package context instead of reading like a generic template
### 2. Edit the draft before sending and verify manual-send behavior
1. In the **Follow-up** tab, edit the generated subject and/or body.
2. Confirm the recipient field is editable or clearly visible before any send action.
3. Verify the helper text/button copy makes the manual-send boundary explicit.
4. Click **Send and log email**.
5. **Expected:**
- nothing is sent before the explicit button click
- the edited draft text, not the original generated text, is what gets submitted
- the workflow behaves like a manual send/log action rather than background automation
- there is a clear success state or logged result after submission
### 3. Confirm the sent follow-up reappears in job history/correspondence
1. After sending/logging the follow-up, switch to the jobs correspondence/history surface.
2. Refresh the job workspace if needed.
3. Find the newly logged outbound follow-up entry.
4. **Expected:**
- the sent/logged follow-up appears back in the same job timeline/correspondence record
- the entry is attached to the correct job and thread context
- the app reflects history continuity instead of treating the send as an isolated compose event
## Edge Cases
### Missing package or thin thread context still preserves user control
1. Open a job that has weaker context than the happy path (for example, imported correspondence but little/no saved package material, or saved package material but only a thin thread).
2. Generate a follow-up draft.
3. **Expected:**
- the app still returns an editable draft or a clearly explained degraded draft state
- the UI reflects missing/limited grounding rather than pretending the draft is strongly informed
- the manual-send boundary remains unchanged: no autonomous send occurs, and the user still must explicitly send/log
## Failure Signals
- The Follow-up tab loads only a blank compose form with no visible context grounding.
- The generated draft ignores obvious thread details (subject, recruiter, recent message content) and reads like a generic reminder.
- Editing the draft does not persist into the send/log request.
- A follow-up appears to be sent or logged without an explicit user action.
- The sent follow-up does not return to the jobs correspondence/history surface.
- The tab crashes, build/test regressions appear, or the follow-up endpoint no longer returns the grounding fields expected by the UI.
## Not Proven By This UAT
- This UAT does not prove Gmail OAuth/import itself; that was covered by S01 and is only consumed here as prerequisite context.
- This UAT does not prove end-to-end milestone coherence across table/dashboard/control-loop surfaces; S04 and S05 still own that broader workflow validation.
## Notes for Tester
Use a job with real-looking imported thread content and saved package material; otherwise the quality signal will be too weak to judge whether S03 actually improved grounding. If the environment cannot support live send/log execution, fall back to the focused checks that already passed for this slice:
- `$HOME/.dotnet/dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsFollowUpDraftTests`
- `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/job-details-followup-drafts.test.tsx`
- `CI=true npm --prefix job-tracker-ui run build`