- job-tracker-ui/src/end-to-end-trust-loop.test.tsx - job-tracker-ui/src/components/JobDetailsDialog.tsx - job-tracker-ui/src/components/Correspondence.tsx - .gsd/milestones/M001/slices/S05/S05-UAT.md
6.5 KiB
id, parent, milestone, provides, key_files, key_decisions, patterns_established, observability_surfaces, duration, verification_result, completed_at, blocker_discovered
| id | parent | milestone | provides | key_files | key_decisions | patterns_established | observability_surfaces | duration | verification_result | completed_at | blocker_discovered | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| T02 | S05 | M001 |
|
|
|
|
|
33m | passed | 2026-03-24T14:35:40+01:00 | false |
T02: Add integrated trust-loop proof and workspace polish
Added an end-to-end trust-loop regression, surfaced saved-package and Gmail continuity trust state in the workspace, and documented a live-safe UAT runbook.
What Happened
I verified the existing S01-S04 tests and workspace code first, then added a new focused React regression at job-tracker-ui/src/end-to-end-trust-loop.test.tsx that starts from the real /jobs overview action path and proves the composed loop in one place: open the workspace from the overview, confirm saved package material is already present, confirm linked Gmail thread refresh brings in new correspondence without re-importing the thread, and confirm the grounded follow-up draft remains available without calling send-followup.
To make that integrated path trustworthy in the actual UI, I limited code changes to the two planned components. In JobDetailsDialog.tsx, I tightened the package-reuse copy and added an explicit manual-send boundary panel in the follow-up workspace so draft generation/regeneration cannot be mistaken for sending. In Correspondence.tsx, I added a linked-thread continuity panel to the main workspace so Gmail connection state, linked-thread count, and last refresh outcome are visible without opening the import modal.
I also wrote .gsd/milestones/M001/slices/S05/S05-UAT.md as the live-safe runbook for the final human loop. It tells a human how to verify /jobs, /dashboard, and /reminders against real services while stopping before Send and log email unless outbound mail is explicitly pointed at a safe sink/stub.
Verification
I ran the full slice command suite: the backend workflow-signal tests, the focused workflow-signal React suite, the new integrated trust-loop regression, the existing Gmail/package/follow-up/daily-loop bundle, and the production build. All command-based verification passed.
I also attempted a real browser sanity pass by starting the local UI and navigating to http://localhost:3000/jobs. The browser reached the app shell, but the live verification could not proceed because an already-running process on port 5202 responded without the expected CORS headers, so the UI could not load API data. I did not treat that as a slice blocker because it is an environment/runtime collision outside the T02 code changes, and the live-safe UAT runbook is now ready for a correctly configured environment.
Verification Evidence
| # | Command | Exit Code | Verdict | Duration |
|---|---|---|---|---|
| 1 | dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsWorkflowSignalsTests |
0 | ✅ pass | 4.79s |
| 2 | CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/workflow-trust-signals.test.tsx |
0 | ✅ pass | 3.85s |
| 3 | CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/end-to-end-trust-loop.test.tsx |
0 | ✅ pass | 3.58s |
| 4 | CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/correspondence-gmail-import.test.tsx src/job-details-generated-drafts.test.tsx src/job-details-followup-drafts.test.tsx src/daily-control-loop.test.tsx |
0 | ✅ pass | 6.54s |
| 5 | CI=true npm --prefix job-tracker-ui run build |
0 | ✅ pass | 15.55s |
Diagnostics
Use job-tracker-ui/src/end-to-end-trust-loop.test.tsx as the single integrated proof for the slice. Inspect job-tracker-ui/src/components/JobDetailsDialog.tsx for the saved-package reuse and manual-send boundary copy, and inspect job-tracker-ui/src/components/Correspondence.tsx for linked-thread continuity state. For live verification, follow .gsd/milestones/M001/slices/S05/S05-UAT.md. If the real browser flow fails, inspect GET /api/jobapplications/{id}/followup-draft, GET /api/correspondence/{jobId}, and POST /api/gmail/refresh-linked-threads together with browser network/CORS diagnostics.
Deviations
I did not need to update job-tracker-ui/src/daily-control-loop.test.tsx because the shared entry semantics from T01 still held once the integrated regression was added.
Known Issues
- A live browser sanity attempt against
http://localhost:3000/jobswas blocked by a pre-existing process bound to port5202that did not return the expected CORS headers forhttp://localhost:3000, so the app shell loaded but API-backed job data did not. The code changes in this task were still verified through the full automated command suite. - React Router future-flag warnings still appear during test runs, but they are warnings only and did not affect pass/fail outcomes.
Files Created/Modified
job-tracker-ui/src/end-to-end-trust-loop.test.tsx— added the integrated overview → workspace → package reuse → Gmail continuity → follow-up/manual-send regression.job-tracker-ui/src/components/JobDetailsDialog.tsx— clarified saved-package reuse and added explicit manual-send boundary copy in the follow-up workspace.job-tracker-ui/src/components/Correspondence.tsx— surfaced linked-thread continuity and last-refresh status directly in the main correspondence workspace..gsd/milestones/M001/slices/S05/S05-UAT.md— documented the live-safe final human verification flow and send-safety guardrails..gsd/milestones/M001/slices/S05/S05-PLAN.md— marked T02 complete.