feat(S05/T01): Unified workflow trust signals across the API, table, da…

- 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
This commit is contained in:
2026-03-24 14:28:01 +01:00
parent d166f9854d
commit 9adbde3f5e
12 changed files with 974 additions and 314 deletions
+55 -3
View File
@@ -26,8 +26,21 @@ const pagedJobs = {
needsFollowUp: true,
followUpReason: 'Follow-up due soon',
shortSummary: 'Strong backend match',
tailoredCvText: null,
notes: null,
tailoredCvText: 'Saved CV',
notes: 'Notes\n\n<<<APPLICATION_ANSWER_DRAFT>>>\nSaved answer\n<<<END_APPLICATION_ANSWER_DRAFT>>>',
workflowSignal: {
actionKey: 'follow-up',
reason: 'Follow-up due soon',
workspaceTab: 'follow-up',
followMode: 'waiting-update',
needsAttention: true,
hasPackageGap: false,
needsInterviewPrep: false,
needsFollowUpAction: true,
hasTailoredCv: true,
hasSavedApplicationAnswerDraft: true,
hasInterviewPrepNotes: true,
},
},
{
id: 43,
@@ -42,6 +55,19 @@ const pagedJobs = {
shortSummary: 'Platform work',
tailoredCvText: null,
notes: null,
workflowSignal: {
actionKey: 'package-work',
reason: 'Tailored CV missing for this role.',
workspaceTab: 'tailored-cv',
followMode: null,
needsAttention: true,
hasPackageGap: true,
needsInterviewPrep: false,
needsFollowUpAction: false,
hasTailoredCv: false,
hasSavedApplicationAnswerDraft: false,
hasInterviewPrepNotes: false,
},
},
],
total: 2,
@@ -61,6 +87,19 @@ const reminderItems = [
followUpReason: 'Follow-up due soon',
tailoredCvText: 'Saved CV',
followUpAt: new Date().toISOString(),
workflowSignal: {
actionKey: 'follow-up',
reason: 'Follow-up due soon',
workspaceTab: 'follow-up',
followMode: 'waiting-update',
needsAttention: true,
hasPackageGap: false,
needsInterviewPrep: false,
needsFollowUpAction: true,
hasTailoredCv: true,
hasSavedApplicationAnswerDraft: true,
hasInterviewPrepNotes: true,
},
},
{
id: 43,
@@ -73,6 +112,19 @@ const reminderItems = [
followUpReason: 'Tailored CV missing',
tailoredCvText: null,
followUpAt: new Date().toISOString(),
workflowSignal: {
actionKey: 'package-work',
reason: 'Tailored CV missing for this role.',
workspaceTab: 'tailored-cv',
followMode: null,
needsAttention: true,
hasPackageGap: true,
needsInterviewPrep: false,
needsFollowUpAction: true,
hasTailoredCv: false,
hasSavedApplicationAnswerDraft: false,
hasInterviewPrepNotes: false,
},
},
];
@@ -152,7 +204,7 @@ test('reminders open action routes tailored-cv gaps into the tailored cv workspa
const platformJob = await screen.findByText(/platform engineer/i);
const platformCard = platformJob.closest('.MuiPaper-root') ?? platformJob.parentElement?.parentElement;
expect(platformCard).toBeTruthy();
fireEvent.click(within(platformCard as HTMLElement).getByRole('button', { name: /open/i }));
fireEvent.click(within(platformCard as HTMLElement).getByRole('button', { name: /build package/i }));
await waitFor(() => {
expect(screen.getByTestId('location-indicator')).toHaveTextContent('/jobs');