--- title: T02 summary status: done files: - job-tracker-ui/src/components/JobDetailsDialog.tsx - job-tracker-ui/src/types.ts - job-tracker-ui/src/job-details-followup-drafts.test.tsx verification: - 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 observability_surfaces: - job-tracker-ui/src/components/JobDetailsDialog.tsx (Follow-up tab) - job-tracker-ui/src/job-details-followup-drafts.test.tsx - GET /api/jobapplications/{id}/followup-draft - POST /api/jobapplications/{id}/send-followup --- Refined the Follow-up tab so it exposes the thread and saved-package grounding behind the draft instead of behaving like a generic email form. ## What changed - `job-tracker-ui/src/types.ts` - added a typed `FollowUpDraft` contract aligned to the richer backend response - `job-tracker-ui/src/components/JobDetailsDialog.tsx` - switched the follow-up state to the shared typed DTO - added a follow-up context panel showing thread subject, last sender, context summary, and context signals - clarified the manual-send boundary directly in the recipient/body helper text - kept the draft editable before send while making the send-and-log behavior explicit - `job-tracker-ui/src/job-details-followup-drafts.test.tsx` - added focused frontend proof that the Follow-up tab shows thread grounding, keeps sending manual, and posts the edited draft through the send/log endpoint ## Diagnostics - Open the Follow-up tab in `job-tracker-ui/src/components/JobDetailsDialog.tsx` and confirm the context panel renders `threadSubject`, `contextSummary`, and `contextSignals` from the backend instead of showing only a blank compose form. - Edit the generated body before pressing **Send and log email**; the UI should preserve the edited body and only call `POST /api/jobapplications/{id}/send-followup` after the explicit button click. - Re-run `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/job-details-followup-drafts.test.tsx` after changes to follow-up state wiring, helper text, or send/log payloads. - Re-run `CI=true npm --prefix job-tracker-ui run build` after UI changes to catch contract drift or production-only compilation regressions. ## Verification Evidence | Check | Command | Exit code | Verdict | Duration | |---|---|---:|---|---| | Focused follow-up workspace test | `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/job-details-followup-drafts.test.tsx` | 0 | PASS | 00:00:02 | | Production frontend build | `CI=true npm --prefix job-tracker-ui run build` | 0 | PASS | 00:00:24 | ## Runtime note - Earlier local browser UAT was blocked by an unrelated port-3000 nginx bundle and a CRA dev-server crash under Node 25. The production build and focused follow-up UI test both passed during closeout, so the durable verification path for this task is the filtered React test plus the build output rather than the old dev-server attempt.