chore(M001/S01): auto-commit after complete-slice

This commit is contained in:
2026-03-24 12:27:04 +01:00
parent 9f03d123d0
commit 13d4e29336
22 changed files with 970 additions and 118 deletions
@@ -6,34 +6,59 @@ files:
- job-tracker-ui/src/components/Correspondence.tsx
- job-tracker-ui/src/types.ts
- job-tracker-ui/src/correspondence-gmail-import.test.tsx
observability_surfaces:
- job-tracker-ui/src/components/Correspondence.tsx Gmail tab linked-thread state
- /gmail/job-candidates requests with queryOverride
- /gmail/refresh-linked-threads workspace refresh requests
- job-tracker-ui/src/correspondence-gmail-import.test.tsx
verification:
- npm ci (job-tracker-ui)
- CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx
---
Wired the job-aware Gmail matching contract into the actual job workspace UI.
Wired the job-aware Gmail matching contract into the actual job workspace UI and completed the live linked-thread refresh loop.
## What changed
What changed:
- `job-tracker-ui/src/types.ts`
- added frontend contracts for job-aware Gmail matches, match reasons, import results, and enriched correspondence metadata
- added frontend contracts for job-aware Gmail matches, linked-thread refresh results, import results, and enriched correspondence metadata
- `job-tracker-ui/src/components/JobDetailsDialog.tsx`
- now passes the loaded `job` into `Correspondence` so the Gmail tab can stay job-aware without another job fetch
- passes the loaded `job` into `Correspondence` so the Gmail tab can stay job-aware without another job fetch
- `job-tracker-ui/src/components/Correspondence.tsx`
- replaced client-side Gmail ranking as the primary workflow
- Gmail tab now calls `/gmail/job-candidates`
- shows confidence, score, match reasons, and already-linked state
- preserves manual query override via the same job-aware endpoint
- refreshes correspondence plus Gmail candidate state after single-message and thread imports
- automatically calls `/gmail/refresh-linked-threads` when the job already has linked Gmail thread ids
- refreshes correspondence plus Gmail candidate state after single-message, thread, and linked-thread refresh actions
- renders persisted Gmail metadata (`ExternalThreadId`, `ExternalFrom`, `ExternalTo`) in the correspondence view
- shows linked-thread freshness/import summary inside the Gmail area
- `job-tracker-ui/src/correspondence-gmail-import.test.tsx`
- verifies ranked Gmail suggestions render with visible reasons/confidence
- verifies single-message import refreshes the same jobs correspondence view
- verifies automatic linked-thread refresh shows a later Gmail reply without manual re-import
- verifies manual search override is sent as `queryOverride`
Verification:
## Verification
- frontend dependencies were installed with `npm ci` in `job-tracker-ui`
- focused React test passed:
- `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx`
Notes:
- The Gmail tab now treats the backend as the source of truth for ranking while keeping the manual search field as a fallback override.
## Verification Evidence
| # | Command | Exit Code | Verdict | Duration |
|---|---------|-----------|---------|----------|
| 1 | `npm ci` (job-tracker-ui) | 0 | ✅ pass | not recorded |
| 2 | `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx` | 0 | ✅ pass | ~2.8s |
## Diagnostics
- Open a job with imported Gmail correspondence and inspect the Gmail tab chips: linked-thread count, last refresh summary, and Gmail connection `lastSyncedAt` show whether the workspace considers the thread live.
- Watch network traffic for `GET /gmail/job-candidates` and `POST /gmail/refresh-linked-threads` to confirm the workspace distinguishes ranked suggestions from already-linked thread refresh.
- Inspect rendered correspondence chips (`Thread ...`, `From ...`, `To ...`) to verify imported Gmail metadata survived the round trip from persistence to UI.
- Read `job-tracker-ui/src/correspondence-gmail-import.test.tsx` for the durable automated proof of manual query override plus no-manual-reimport continuity.
## Notes
The Gmail tab now treats the backend as the source of truth for ranking while keeping the manual search field as a fallback override, and it refreshes known linked threads once per loaded job/thread-set automatically to avoid re-import loops.