92 lines
5.0 KiB
Markdown
92 lines
5.0 KiB
Markdown
# S02: Stronger AI application package drafting — UAT
|
|
|
|
**Milestone:** M001
|
|
**Written:** 2026-03-24
|
|
|
|
## UAT Type
|
|
|
|
- UAT mode: mixed
|
|
- Why this mode is sufficient: this slice needs both artifact proof (generation/save contracts and persisted reload behavior) and human judgment that the drafts actually feel specific enough to start from.
|
|
|
|
## Preconditions
|
|
|
|
- The app frontend and API are running against this worktree.
|
|
- The tester can sign in as a user with a parsed profile CV already available.
|
|
- At least one job exists with:
|
|
- company + recruiter information
|
|
- imported Gmail correspondence from S01 linked to the job
|
|
- optional but preferred AI-selected attachments for extra context
|
|
- The local AI summarizer/service used by `generate-application-package` is configured and reachable.
|
|
- The tester knows which job has the strongest imported recruiter/thread context so draft specificity is easy to judge.
|
|
|
|
## Smoke Test
|
|
|
|
Open a job with imported correspondence, switch to the Tailored CV tab, click **Generate package**, and confirm all four editable artifacts populate without errors: tailored CV, cover letter, recruiter message, and application answer.
|
|
|
|
## Test Cases
|
|
|
|
### 1. Generate a package that reflects imported job and correspondence context
|
|
|
|
1. Open a job that already has imported Gmail correspondence in the job workspace.
|
|
2. In the Tailored CV tab, confirm at least one attachment is selected for AI context if relevant.
|
|
3. Click **Generate package**.
|
|
4. Wait for generation to finish.
|
|
5. Review the tailored CV, cover letter, recruiter message, and application answer together.
|
|
6. **Expected:** the generated package mentions concrete job/company/recruiter details and reflects correspondence-specific context or tone rather than reading like a generic template.
|
|
|
|
### 2. Save edited package material as durable job workspace output
|
|
|
|
1. Starting from a generated package, edit all or some of these fields: tailored CV, cover letter, recruiter message, application answer.
|
|
2. Confirm the status chips change to show **Unsaved edits** for the edited artifacts.
|
|
3. Click **Save** for the package workspace.
|
|
4. Wait for the save to complete.
|
|
5. **Expected:** save succeeds without duplication, the edited values remain visible, and the status chips move to **Saved to job**.
|
|
|
|
### 3. Reopen the job and verify the last saved package reloads
|
|
|
|
1. Close the job details dialog after saving.
|
|
2. Reopen the same job.
|
|
3. Return to the Tailored CV tab.
|
|
4. **Expected:** the saved tailored CV, cover letter, recruiter message, and application answer reload as the current workspace state; nothing falls back to blank or a previous generated-only draft.
|
|
|
|
### 4. Regenerate after saving and use reset-to-saved safely
|
|
|
|
1. With a saved package already present, click **Generate package** again.
|
|
2. Confirm the editors are replaced with the new generated working copy.
|
|
3. Make one more manual edit so the status changes to **Unsaved edits**.
|
|
4. Click **Reset to saved**.
|
|
5. **Expected:** the unsaved regeneration/edit is discarded and the workspace returns exactly to the last saved job-tied material.
|
|
|
|
## Edge Cases
|
|
|
|
### Saved application answer does not duplicate on repeated saves
|
|
|
|
1. Save a package with a distinct application-answer draft.
|
|
2. Edit only the application answer and save again.
|
|
3. Close and reopen the job.
|
|
4. **Expected:** only the latest application-answer draft is present; earlier answers are replaced, not appended repeatedly into the notes-backed storage.
|
|
|
|
### Empty saved package still distinguishes generated-only state
|
|
|
|
1. Open a job with no previously saved package material.
|
|
2. Generate the package but do not click Save.
|
|
3. **Expected:** generated text appears, but the relevant status chips show **Generated only** rather than **Saved to job**.
|
|
|
|
## Failure Signals
|
|
|
|
- Generate package returns an error or leaves one or more of the four artifacts empty despite available context.
|
|
- Drafts ignore obvious recruiter/company/correspondence details and read like generic boilerplate.
|
|
- Saving succeeds visually but reopening the job loses edits or restores stale values.
|
|
- The application answer repeats previous saved copies instead of replacing the prior draft.
|
|
- Status chips do not match reality, for example showing **Saved to job** before any save or failing to show **Unsaved edits** after changes.
|
|
|
|
## Not Proven By This UAT
|
|
|
|
- This UAT does not prove Gmail import or linked-thread refresh; that belongs to S01.
|
|
- This UAT does not prove reply/follow-up draft generation from saved package context; that belongs to S03.
|
|
- This UAT does not prove final end-to-end milestone quality across dashboard/table/job-loop navigation; later slices and final milestone UAT must cover that.
|
|
|
|
## Notes for Tester
|
|
|
|
Use the job with the richest imported recruiter/thread context first; this slice is about whether that context materially improves draft usefulness. If draft quality feels only marginally better, note which missing signals (recruiter identity, thread details, attachment evidence, profile CV structure) seem absent so S03/S05 can inspect the package-context assembly path.
|