Files
jobtrackingapp/.gsd/milestones/M001/slices/S03/S03-PLAN.md
T

61 lines
6.3 KiB
Markdown

# S03: Reply and follow-up drafting from real thread context
**Goal:** Make follow-up drafting use imported correspondence and saved application material well enough that the job workspace can produce specific, trustworthy follow-up and reply drafts without crossing the manual-send boundary.
**Demo:** From a job with imported Gmail correspondence and saved package material, the user opens the Follow-up tab, generates a draft that clearly reflects the thread stage plus saved job context, edits it, and manually sends/logs it while keeping outbound control.
S03 directly owns active requirements **R004**, **R007**, and **R008**. The main risk is that the existing follow-up draft endpoint still behaves like a generic template generator: it knows basic job facts, but it does not deliberately consume imported thread details or the saved package material that now exists after S02. This slice should strengthen that backend context first, then make the workspace expose the richer draft state clearly without adding autonomous sending behavior or a second competing draft surface.
## Must-Haves
- Follow-up draft generation in `JobTrackerApi/Controllers/JobApplicationsController.cs` uses imported correspondence, recruiter details, and saved application package material deliberately enough that the draft responds to the real thread stage instead of generic reminders.
- The job workspace in `job-tracker-ui/src/components/JobDetailsDialog.tsx` presents follow-up drafting as job-tied working context, including visible thread/package grounding and editable draft state before manual send.
- The slice preserves the explicit manual-send boundary: the app may draft and log what was sent, but it must not auto-send or silently dispatch anything.
## Proof Level
- This slice proves: integration
- Real runtime required: yes
- Human/UAT required: yes
## Verification
- `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`
- Manual UAT: open a job with imported correspondence and saved package material, generate a follow-up draft, confirm it references the real job/thread/package context, edit the draft, send/log it manually, and verify the job timeline reflects the sent message without any autonomous outbound behavior.
## Observability / Diagnostics
- Runtime signals: follow-up draft responses should expose why the draft was generated now, what thread/package context informed it, and sent follow-ups should continue to create correspondence timeline entries.
- Inspection surfaces: `GET /api/jobapplications/{id}/followup-draft`, `POST /api/jobapplications/{id}/send-followup`, `GET /api/correspondence/{jobId}`, and the Follow-up tab in `job-tracker-ui/src/components/JobDetailsDialog.tsx`.
- Failure visibility: focused backend tests should make missing-context and weak-context behavior obvious, while the workspace should distinguish generation failure, editable draft state, and sent/logged state.
- Redaction constraints: imported message bodies and recruiter details stay inside application data flows; no new diagnostic logging should expose raw correspondence or secrets.
## Integration Closure
- Upstream surfaces consumed: imported correspondence in `Models/Correspondence.cs` and `JobTrackerApi/Controllers/CorrespondenceController.cs`, saved package material in `JobTrackerApi/Controllers/JobApplicationsController.cs`, and the current follow-up workspace in `job-tracker-ui/src/components/JobDetailsDialog.tsx`.
- New wiring introduced in this slice: correspondence-aware follow-up context assembly plus a clearer job-workspace follow-up loop grounded in saved package material and thread state.
- What remains before the milestone is truly usable end-to-end: S04 still needs to improve the daily control surfaces, and S05 still needs full live-loop revalidation across import, drafting, follow-up, and tracking.
## Tasks
- [x] **T01: Strengthen follow-up draft context assembly and backend reply/follow-up tests** `est:4h`
- Why: The slice succeeds or fails on draft quality and trust, so the generator must consume imported thread context plus saved package material before the workspace polish matters.
- Files: `JobTrackerApi/Controllers/JobApplicationsController.cs`, `JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs`
- Do: Audit `GetFollowUpDraft` and related helpers, add deliberate use of imported correspondence metadata/content, recruiter details, saved tailored CV / cover letter / recruiter message material, and explicit thread-stage cues; keep the manual-send boundary intact; and add focused backend tests proving the returned draft reflects real thread and package context instead of generic follow-up text.
- Verify: `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsFollowUpDraftTests`
- Done when: follow-up draft generation clearly uses job/thread/package context and focused backend tests prove the response is materially more specific.
- [x] **T02: Make the follow-up workspace show thread-grounded draft state without autonomous sending** `est:4h`
- Why: Even a stronger backend draft will still feel fragile if the Follow-up tab hides what context informed it or behaves like a blind mail form.
- Files: `job-tracker-ui/src/components/JobDetailsDialog.tsx`, `job-tracker-ui/src/types.ts`, `job-tracker-ui/src/job-details-followup-drafts.test.tsx`
- Do: Refine the Follow-up tab so the user can see why a draft was generated now, what saved/job/thread context informed it, edit the draft before sending, and observe the manual-send boundary clearly; expand focused frontend coverage for generate/edit/send/log behavior.
- Verify: `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/job-details-followup-drafts.test.tsx`
- Done when: the Follow-up tab presents a grounded editable draft loop tied to the job and the focused frontend test proves generation, editability, and manual send/log behavior.
## Files Likely Touched
- `JobTrackerApi/Controllers/JobApplicationsController.cs`
- `JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs`
- `job-tracker-ui/src/components/JobDetailsDialog.tsx`
- `job-tracker-ui/src/types.ts`
- `job-tracker-ui/src/job-details-followup-drafts.test.tsx`