chore(M001/S01): auto-commit after plan-slice
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
---
|
||||
estimated_steps: 4
|
||||
estimated_files: 4
|
||||
skills_used:
|
||||
- react-best-practices
|
||||
- test
|
||||
---
|
||||
|
||||
# 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
|
||||
|
||||
1. Update `job-tracker-ui/src/types.ts` to reflect the new backend candidate contract and enriched correspondence metadata from T01 and T02.
|
||||
2. Pass job context from `job-tracker-ui/src/components/JobDetailsDialog.tsx` into `job-tracker-ui/src/components/Correspondence.tsx` so the Gmail tab can request job-aware suggestions without duplicating the job fetch.
|
||||
3. Refactor `job-tracker-ui/src/components/Correspondence.tsx` to 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.
|
||||
4. Add `job-tracker-ui/src/correspondence-gmail-import.test.tsx` covering 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.tsx` and 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.
|
||||
Reference in New Issue
Block a user