chore: auto-commit after execute-task

GSD-Unit: M001/S06/T01
This commit is contained in:
2026-03-27 08:54:34 +01:00
parent 7a44ebbd77
commit bdc47dde7f
31 changed files with 2017 additions and 966 deletions
+5 -55
View File
@@ -1,62 +1,12 @@
# S04: Daily control loop surfaces
**Goal:** Make the job table, reminders view, and dashboard behave like one daily control loop so the user can scan what needs attention and jump directly into the right job workspace state.
**Demo:** Starting from the job table or reminders/dashboard, the user can identify the highest-priority jobs, jump straight into the relevant job workspace tab (for example Tailored CV or Follow-up), and use those surfaces as a coherent daily review flow.
S04 directly owns active requirements **R005**, **R006**, **R007**, **R009**, and **R010**. The main risk is that the app already has all three surfaces but they still behave as adjacent pages instead of a loop: dashboard mostly reports metrics, reminders opens a separate modal, and the table only partially exposes what action is actually due. This slice should make the same underlying reminder/readiness signals actionable from the daily-entry surfaces without inventing a second workflow or weakening the individual-first job workspace model.
## Must-Haves
- The job table makes it easier to see which jobs need follow-up or package work and jump directly into the right workspace state.
- Dashboard and reminders surfaces expose the highest-priority jobs as actionable entries, not just passive summaries.
- The daily loop remains individual-first and routes the user into the existing job workspace rather than creating a separate control system.
## Proof Level
- This slice proves: integration
- Real runtime required: yes
- Human/UAT required: yes
## Verification
- `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx`
- `CI=true npm --prefix job-tracker-ui run build`
- Manual UAT: from the table, reminders page, and dashboard, identify a job needing attention, jump into the correct job workspace tab, and confirm the flow feels like one coherent daily review loop.
- Failure-path check: deliberately trigger each surface's action affordance in the focused UI test and confirm the routed workspace lands on the expected job/tab state instead of leaving the user on a passive summary surface.
## Observability / Diagnostics
- Runtime signals: reminders counts, dashboard attention cards, and table urgency chips should all route into the same workspace state instead of diverging.
- Inspection surfaces: `job-tracker-ui/src/components/JobTable.tsx`, `job-tracker-ui/src/components/DashboardView.tsx`, `job-tracker-ui/src/components/RemindersView.tsx`, and the routed job workspace opened through `/jobs?open=...&tab=...`.
- Failure visibility: the focused UI test should make broken routing or missing actionable surfaces obvious; browser UAT should confirm that the routed job workspace lands on the expected tab.
- Redaction constraints: no new logging of private job notes or correspondence content.
## Integration Closure
- Upstream surfaces consumed: `GET /api/jobapplications`, `GET /api/jobapplications/reminders`, `GET /api/jobapplications/analytics-overview`, and the existing job workspace in `job-tracker-ui/src/components/JobDetailsDialog.tsx`.
- New wiring introduced in this slice: action-oriented routing from daily overview surfaces into the existing job workspace state.
- What remains before the milestone is truly usable end-to-end: S05 still needs full live-loop revalidation across import, package drafting, follow-up drafting, and daily review.
**Demo:** After this: The job table works as the primary overview and the follow-up/dashboard surfaces clearly show what needs attention next for an individual user.
## Tasks
- [x] **T01: Turn reminders and dashboard into actionable entry surfaces** `est:4h`
- Why: S04 fails if dashboard/reminders only summarize state without helping the user move into the next job-level action.
- Files: `job-tracker-ui/src/components/DashboardView.tsx`, `job-tracker-ui/src/components/RemindersView.tsx`, `job-tracker-ui/src/App.tsx`
- Do: add actionable attention cards/lists to the dashboard, route reminders actions into the existing job workspace state instead of a separate modal loop, and preserve the individual-first control flow through `/jobs`.
- [x] **T01: Turn reminders and dashboard into actionable entry surfaces**
- Files: job-tracker-ui/src/components/DashboardView.tsx, job-tracker-ui/src/components/RemindersView.tsx, job-tracker-ui/src/App.tsx
- Verify: `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx`
- Done when: the dashboard and reminders surfaces clearly show what needs attention and can open the correct job workspace state directly.
- [x] **T02: Make the job table expose the right next action and prove the daily loop** `est:4h`
- Why: The table is the first surface the user sees each day, so it has to make urgency legible and connect cleanly into the same routed job workspace flow.
- Files: `job-tracker-ui/src/components/JobTable.tsx`, `job-tracker-ui/src/daily-control-loop.test.tsx`
- Do: tighten job-table urgency/action affordances for follow-up and package work, reuse the routed workspace-open mechanism, and add focused UI coverage proving the table/reminders/dashboard loop lands in the right job workspace state.
- [x] **T02: Make the job table expose the right next action and prove the daily loop**
- Files: job-tracker-ui/src/components/JobTable.tsx, job-tracker-ui/src/daily-control-loop.test.tsx
- Verify: `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx`
- Done when: the table surfaces the right next action clearly and the focused UI test proves the daily loop routing across overview surfaces.
## Files Likely Touched
- `job-tracker-ui/src/components/DashboardView.tsx`
- `job-tracker-ui/src/components/RemindersView.tsx`
- `job-tracker-ui/src/components/JobTable.tsx`
- `job-tracker-ui/src/App.tsx`
- `job-tracker-ui/src/daily-control-loop.test.tsx`
p.test.tsx`