Files
jobtrackingapp/.gsd/milestones/M001/slices/S01/tasks/T03-SUMMARY.md
T

3.8 KiB
Raw Blame History

title, status, files, observability_surfaces, verification
title status files observability_surfaces verification
T03 summary done
job-tracker-ui/src/components/JobDetailsDialog.tsx
job-tracker-ui/src/components/Correspondence.tsx
job-tracker-ui/src/types.ts
job-tracker-ui/src/correspondence-gmail-import.test.tsx
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
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 and completed the live linked-thread refresh loop.

What changed

  • job-tracker-ui/src/types.ts
    • 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
    • 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
    • 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

  • 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

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.