3.4 KiB
3.4 KiB
estimated_steps, estimated_files, skills_used
| estimated_steps | estimated_files | skills_used | ||
|---|---|---|---|---|
| 4 | 4 |
|
T03: Wire ranked Gmail suggestions into the job workspace UI
Slice: S01 — Smarter Gmail import and matching Milestone: M001
Description
Deliver the user-facing part of the slice in the actual job workspace. The Correspondence tab should stop acting like a generic Gmail search box and instead open with job-aware ranked suggestions from the backend, explain why each candidate is relevant, let the user override with manual search when needed, and refresh the job-linked correspondence view after import.
Steps
- Update
job-tracker-ui/src/types.tsto reflect the new backend candidate contract and enriched correspondence metadata from T01 and T02. - Pass job context from
job-tracker-ui/src/components/JobDetailsDialog.tsxintojob-tracker-ui/src/components/Correspondence.tsxso the Gmail tab can request job-aware suggestions without duplicating the job fetch. - Refactor
job-tracker-ui/src/components/Correspondence.tsxto consume the backend-ranked suggestions, show thread/message match reasons and import state, keep manual Gmail query override/search available, and refresh the rendered correspondence list after successful imports. - Add
job-tracker-ui/src/correspondence-gmail-import.test.tsxcovering ranked suggestion rendering, reason/confidence display, thread vs single-message import actions, and refresh after import.
Must-Haves
- The Gmail tab opens on job-aware ranked suggestions instead of using
scoreMessage(...)as the primary intelligence. - The UI still supports manual Gmail searching as a fallback override, but it no longer depends on freeform query heuristics for the core experience.
- The React test proves the user can see ranked suggestions and that importing updates the same job’s correspondence surface.
Verification
CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx- Manually inspect the dialog to confirm ranked reasons/import state are visible and the correspondence list refreshes after import.
Observability Impact
- Signals added/changed: visible match reasons/confidence/import state in the Gmail tab and clearer import success/duplicate feedback toasts.
- How a future agent inspects this: read
job-tracker-ui/src/correspondence-gmail-import.test.tsxand open the Correspondence dialog in the running app. - Failure state exposed: the UI should distinguish no matches, already-imported candidates, loading states, and import failures instead of collapsing them into a generic empty list.
Inputs
job-tracker-ui/src/components/JobDetailsDialog.tsx— host dialog that already owns the job record.job-tracker-ui/src/components/Correspondence.tsx— current Gmail import UI with client-side ranking.job-tracker-ui/src/types.ts— frontend API contracts.JobTrackerApi/Controllers/GmailController.cs— T01/T02 backend Gmail candidate and import contract.
Expected Output
job-tracker-ui/src/components/JobDetailsDialog.tsx— passes job context into the correspondence tab.job-tracker-ui/src/components/Correspondence.tsx— renders job-aware Gmail suggestions and refreshed import behavior.job-tracker-ui/src/types.ts— matches the updated backend contract.job-tracker-ui/src/correspondence-gmail-import.test.tsx— proves the UI flow end to end at component level.