- JobTrackerApi/Controllers/JobApplicationsController.cs - JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs - job-tracker-ui/src/jobWorkflowSignals.ts - job-tracker-ui/src/components/JobTable.tsx - job-tracker-ui/src/components/DashboardView.tsx - job-tracker-ui/src/components/RemindersView.tsx - job-tracker-ui/src/workflow-trust-signals.test.tsx
6.6 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 | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| T01 | S05 | M001 |
|
|
|
|
|
2h 10m | passed | 2026-03-24T14:02:04+01:00 | false |
T01: Centralize workflow trust signals across overview and readiness surfaces
Unified workflow trust signals across the API, table, dashboard, and reminders.
What Happened
I verified the local controller and UI code first, found that the backend already had the beginnings of a WorkflowSignal contract, and confirmed the remaining drift was on the consumer side: JobTable, DashboardView, and RemindersView still fell back to followUpReason parsing or raw notes/tailoredCvText heuristics.
On the backend, I fixed the broken RulesEngine.Decision type references so the controller compiled again, kept the saved-application-answer block parsing as the package-readiness source of truth, and added focused tests proving two things: generic notes do not satisfy saved-answer readiness, and reminders/readiness now expose normalized workflow routing metadata for both package work and follow-up work.
On the frontend, I completed the shared type contract by adding WorkflowSignal to job-tracker-ui/src/types.ts, extended ReadinessResponse to surface that signal, and rewrote job-tracker-ui/src/jobWorkflowSignals.ts as the one shared helper for overview routing, labels, and reminder grouping.
I then updated the three overview surfaces to consume that helper directly. JobTable now drives urgency chips, primary actions, and the readiness filter from workflowSignal instead of raw notes or followUpReason. DashboardView now chooses reminder labels/routes from the same helper. RemindersView now groups jobs and opens workspace tabs from workflowSignal rather than parsing reason text.
To keep the existing integrated coverage useful, I also updated src/daily-control-loop.test.tsx to the new contract so the broader slice-level regression continues to validate the overview loop instead of enforcing the old heuristic behavior.
Verification
I ran the focused T01 backend and frontend checks from the task plan and both passed. I also ran the slice-level verification commands relevant at this stage: the broader focused UI regression bundle now passes, the production build passes, and the only remaining slice-level failure is the missing src/end-to-end-trust-loop.test.tsx, which belongs to T02 and is expected for this intermediate task.
Verification Evidence
| # | Command | Exit Code | Verdict | Duration |
|---|---|---|---|---|
| 1 | dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --filter JobApplicationsWorkflowSignalsTests |
0 | ✅ pass | 3.62s |
| 2 | CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/workflow-trust-signals.test.tsx |
0 | ✅ pass | 3.37s |
| 3 | CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/end-to-end-trust-loop.test.tsx |
1 | ❌ fail | 0.62s |
| 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 | 4.62s |
| 5 | CI=true npm --prefix job-tracker-ui run build |
0 | ✅ pass | 12.73s |
Diagnostics
Inspect GET /api/jobapplications/reminders and GET /api/jobapplications/{id}/readiness to confirm workflowSignal.actionKey, workspaceTab, followMode, and package/interview/follow-up booleans. On the UI side, inspect job-tracker-ui/src/jobWorkflowSignals.ts and run src/workflow-trust-signals.test.tsx to catch any routing/grouping drift. Failures now surface as deterministic targeted test failures instead of silent string-parsing mismatches.
Deviations
I also corrected a pre-existing controller compile issue (RulesEngine.Decision vs. FollowUpDecision) and updated the existing src/daily-control-loop.test.tsx regression so it validates the new shared workflow contract instead of the retired heuristic behavior.
Known Issues
src/end-to-end-trust-loop.test.tsxdoes not exist yet, so that slice-level verification command still fails until T02 adds the integrated trust-loop proof.- The React test runs emit React Router future-flag warnings, but they are warnings only and did not affect pass/fail outcomes.
Files Created/Modified
JobTrackerApi/Controllers/JobApplicationsController.cs— fixed the follow-up decision type usage while preserving and exposing the normalized workflow signal contract.JobTrackerApi.Tests/JobApplicationsWorkflowSignalsTests.cs— added focused backend proofs for package-gap vs. generic-notes handling and normalized reminder routing metadata.job-tracker-ui/src/types.ts— added the sharedWorkflowSignaltype and extended readiness responses to carry it.job-tracker-ui/src/jobWorkflowSignals.ts— centralized workflow routing, labels, and reminder grouping for overview surfaces.job-tracker-ui/src/components/JobTable.tsx— switched next-action chips/buttons and readiness filtering to the shared workflow signal.job-tracker-ui/src/components/DashboardView.tsx— switched reminder labels/routes to the shared workflow signal helper.job-tracker-ui/src/components/RemindersView.tsx— switched grouping and open-action routing to workflow signal metadata.job-tracker-ui/src/workflow-trust-signals.test.tsx— added focused frontend regression coverage proving overview surfaces stay aligned.job-tracker-ui/src/daily-control-loop.test.tsx— updated the broader loop regression to the shared workflow contract.