--- title: T01 summary status: done files: - JobTrackerApi/Controllers/JobApplicationsController.cs - JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs verification: - $HOME/.dotnet/dotnet build JobTrackerApi/JobTrackerApi.csproj - $HOME/.dotnet/dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsFollowUpDraftTests observability_surfaces: - GET /api/jobapplications/{id}/followup-draft - POST /api/jobapplications/{id}/send-followup - GET /api/correspondence/{jobId} - JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs --- Strengthened follow-up draft generation so it now consumes imported thread context and saved application package material instead of relying mostly on job summary text. ## What changed - `JobTrackerApi/Controllers/JobApplicationsController.cs` - expanded `FollowUpDraftDto` to expose `contextSummary`, `contextSignals`, `threadSubject`, and last-correspondence metadata for the workspace - added helpers to parse the saved application-answer draft from notes, derive reply-style subjects from the latest thread, and assemble follow-up context signals from recruiter/package/thread state - enriched `GetFollowUpDraft(...)` so the AI prompt now includes imported correspondence context, recruiter details, saved tailored CV / cover letter / recruiter message / application-answer material, and thread-stage cues - improved the fallback body so it still reflects saved/thread context when AI output is unavailable - `JobTrackerApi.Tests/JobApplicationsFollowUpDraftTests.cs` - added focused backend proof that follow-up draft generation reflects imported thread and saved package state ## Diagnostics - Call `GET /api/jobapplications/{id}/followup-draft` and inspect `contextSummary`, `contextSignals`, `threadSubject`, `lastCorrespondenceFrom`, and `lastCorrespondenceAt` to confirm the draft is grounded in saved package material plus imported correspondence. - Call `POST /api/jobapplications/{id}/send-followup` only after editing the returned draft; this is the authoritative manual-send/log boundary surface for the slice. - Use `GET /api/correspondence/{jobId}` after a manual send/log to confirm the outbound follow-up appears back in the job timeline rather than remaining transient UI-only state. - Re-run `dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsFollowUpDraftTests` when follow-up prompt assembly, DTO shape, or fallback behavior changes. ## Verification Evidence | Check | Command | Exit code | Verdict | Duration | |---|---|---:|---|---| | Backend build | `$HOME/.dotnet/dotnet build JobTrackerApi/JobTrackerApi.csproj` | 0 | PASS | 00:00:03 | | Focused backend follow-up test | `$HOME/.dotnet/dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsFollowUpDraftTests` | 0 | PASS | 00:00:01 | ## Important caveat - The original task had to fall back to an isolated harness because `JobTrackerApi.Tests.csproj` was missing required framework/package references. During slice closeout, the test project was repaired so the plan-level filtered command now runs directly in this worktree again.