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`
@@ -1,30 +1,22 @@
---
title: T01 summary
status: done
files:
- job-tracker-ui/src/components/DashboardView.tsx
- job-tracker-ui/src/components/RemindersView.tsx
- job-tracker-ui/src/jobWorkspaceRoute.ts
- job-tracker-ui/src/daily-control-loop.test.tsx
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
id: T01
parent: S04
milestone: M001
provides: []
requires: []
affects: []
key_files: []
key_decisions: []
patterns_established: []
drill_down_paths: []
observability_surfaces: []
duration: ""
verification_result: ""
completed_at: 2026-03-27T07:30:18.615Z
blocker_discovered: false
---
Turned dashboard and reminders into actionable entry surfaces instead of dead-end summaries.
# T01: Turn reminders and dashboard into actionable entry surfaces
What changed:
- `job-tracker-ui/src/jobWorkspaceRoute.ts`
- added a single helper for routed job-workspace entry with `open`, `tab`, and optional `followMode`
- `job-tracker-ui/src/components/DashboardView.tsx`
- added a `Needs Follow-up` action section driven by reminder jobs
- wired dashboard actions into the shared routed job-workspace flow
- `job-tracker-ui/src/components/RemindersView.tsx`
- replaced the separate reminder modal loop with routed entry into `/jobs`
- reminders now open the relevant workspace state directly instead of creating another local workflow
- `job-tracker-ui/src/daily-control-loop.test.tsx`
- added focused proof that dashboard and reminders route into the right workspace flow
Verification:
- Focused daily-loop test passed
- Frontend build passed
## What Happened
No summary recorded.
@@ -2,88 +2,21 @@
id: T02
parent: S04
milestone: M001
provides:
- Makes job-table urgency signals actionable and keeps table, reminders, and dashboard on the same routed job-workspace loop.
key_files:
- job-tracker-ui/src/components/JobTable.tsx
- job-tracker-ui/src/daily-control-loop.test.tsx
- job-tracker-ui/src/i18n/translations.ts
- .gsd/milestones/M001/slices/S04/S04-PLAN.md
- .gsd/milestones/M001/slices/S04/tasks/T02-PLAN.md
key_decisions:
- Derived table chips and primary row actions from one shared action-signal model so table urgency and routed next-action behavior cannot drift.
patterns_established:
- Use the shared `/jobs?open=...&tab=...&followMode=...` workspace route from overview surfaces and prove each surface with focused UI/browser checks.
observability_surfaces:
- job-tracker-ui/src/components/JobTable.tsx
- job-tracker-ui/src/daily-control-loop.test.tsx
- Browser UAT on the built app served locally with mocked API routes at http://localhost:4173
- .gsd/milestones/M001/slices/S04/S04-PLAN.md verification/failure-path notes
duration: ~2h
verification_result: passed
completed_at: 2026-03-24T13:55:43+01:00
provides: []
requires: []
affects: []
key_files: []
key_decisions: []
patterns_established: []
drill_down_paths: []
observability_surfaces: []
duration: ""
verification_result: ""
completed_at: 2026-03-27T07:30:18.615Z
blocker_discovered: false
---
# T02: Make the job table expose the right next action and prove the daily loop
**Made the job table show actionable follow-up/package next steps and proved table, reminders, and dashboard all land in the same job workspace flow.**
## What Happened
I first fixed the flagged observability gaps in the slice and task plans so this unit explicitly described its failure-path coverage and inspection surfaces.
In `job-tracker-ui/src/components/JobTable.tsx`, I replaced the split decorative/action logic with a shared action-signal model. The table now derives both row chips and the primary “Next action” control from the same follow-up/package readiness signals, so the visible urgency affordance and the routed action cannot drift apart. Package work now reflects the same readiness inputs already used by the table filters: missing tailored CV, missing notes, or both.
I updated translations in `job-tracker-ui/src/i18n/translations.ts` so the new package-work affordances and details are user-facing copy instead of hardcoded strings.
In `job-tracker-ui/src/daily-control-loop.test.tsx`, I expanded the focused daily-loop proof so the table explicitly participates in the routed loop: the test now clicks a table urgency signal for follow-up work and the tables next-action button for package work, while the earlier reminders/dashboard proofs remain in place.
For runtime verification, I also exercised the built app in a browser. Because `dotnet` is unavailable in this environment, I served the compiled UI locally and mocked the frontends own API contract in-browser, then verified that table, reminders, and dashboard each opened the expected job workspace state.
## Verification
Verified the focused UI test passes, the frontend production build succeeds, and browser UAT confirms the routed daily loop across all three surfaces.
- Focused test: `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx`
- Build: `CI=true npm --prefix job-tracker-ui run build`
- Browser UAT on built app (`npx serve -s job-tracker-ui/build -l 4173`) with mocked API contract:
- `/jobs`: clicked table next action for Backend Developer and confirmed Follow-up context + saved cover-letter reuse signal
- `/reminders`: clicked Missing tailored CV → Open and confirmed Tailored CV workspace for Platform Engineer
- `/dashboard`: clicked Follow up card action and confirmed routed follow-up workspace
- Network errors were cleared after route mocking; the verified browser interactions completed without failed mocked requests
## Verification Evidence
| # | Command | Exit Code | Verdict | Duration |
|---|---------|-----------|---------|----------|
| 1 | `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx` | 0 | ✅ pass | 4.723s |
| 2 | `CI=true npm --prefix job-tracker-ui run build` | 0 | ✅ pass | 12.969s |
| 3 | Browser UAT on `http://localhost:4173` with mocked `http://localhost:5202/api/*` routes: table → follow-up workspace, reminders → tailored CV workspace, dashboard → follow-up workspace | 0 | ✅ pass | ~4m |
## Diagnostics
Inspect `job-tracker-ui/src/components/JobTable.tsx` to see the shared action-signal derivation that drives both urgency chips and primary next-action buttons.
Run `CI=true npm --prefix job-tracker-ui test -- --watch=false --runTestsByPath src/daily-control-loop.test.tsx` to catch drift between table, reminders, dashboard, and the routed workspace state.
For browser-level inspection, serve the built UI and verify these surfaces route into `/jobs` with the expected workspace content:
- table signal / next-action controls
- reminders Open actions
- dashboard Needs Follow-up actions
## Deviations
Used browser-level API route mocks for manual UAT because the local ASP.NET API could not be started in this environment (`dotnet` is not installed). The shipped UI code was still exercised in a real browser against its own HTTP contract.
## Known Issues
The focused Jest run still emits existing React Router v7 future-flag warnings from the test harness. They do not fail the tasks verification gate and were not introduced by this change.
## Files Created/Modified
- `job-tracker-ui/src/components/JobTable.tsx` — unified actionable urgency chips and primary next-action routing for follow-up and package work
- `job-tracker-ui/src/daily-control-loop.test.tsx` — extended the focused loop test to prove the table participates in the same routed workspace flow
- `job-tracker-ui/src/i18n/translations.ts` — added user-facing copy for package-work affordances and details
- `.gsd/milestones/M001/slices/S04/S04-PLAN.md` — added explicit slice-level failure-path verification guidance
- `.gsd/milestones/M001/slices/S04/tasks/T02-PLAN.md` — added the missing Observability Impact section
No summary recorded.