# HR/Finance Phase 1 Sprint 1b — Plan kickoff (B9-B11 + F1-F6) > Plan: `.harness/plans/hr-finance-fiscalisation.md` §3b > Branch: `feature/hr-finance-phase-1b` (worktree `.worktrees/hr-finance-phase-1b/`) > Owner: backend-expert (pre-step, B9-B11) → frontend-expert (F1-F6) → code-reviewer (gate). ## What this commit does Two planning artefacts — no code yet. 1. **Spec the Sprint 1b scope** in `hr-finance-fiscalisation.md` §3b. Three backend touch-points (`PUT /finance/expenses/:id/approve|reject`, `GET /finance/expenses/summary`, verifier pin for `?status=` filters) and four frontend pages (LeaveApproval, StaffDirectory, PayrollRuns, Payslips) plus two modifications (Expenses approval actions, HRManagement alert cleanup). 2. **Relocate three untracked stub trackers** from the repo root into `.harness/plans/stubs-sprint-1b/` as `A.md`, `B.md`, `C.md`. These are the spec the parallel Track A/B/C stub sweep will follow after Sprint 1b lands. ## Files touched | File | Change | |---|---| | `.harness/plans/hr-finance-fiscalisation.md` | +74 (insert §3b between §3a and §6) | | `.harness/plans/stubs-sprint-1b/A.md` | renamed from `STUBS_TRACK_A_IDENTITY_ACCESS.md` | | `.harness/plans/stubs-sprint-1b/B.md` | renamed from `STUBS_TRACK_B_FEES_AND_COPY.md` | | `.harness/plans/stubs-sprint-1b/C.md` | renamed from `STUBS_TRACK_C_MODULE_PLACEHOLDERS.md` | | `.harness/changelogs/2026-07-04-phase1b-planning.md` | new (this file) | ## What lands next (commit-by-commit) | # | Commit | Owner | Notes | |---|---|---|---| | 1 | `feat(finance): B9 approve/reject state machine` | backend-expert | `PUT /api/finance/expenses/:id/approve\|reject` — records `approved_by` / `approved_at`, 409 on already-decided rows. | | 2 | `feat(finance): B10 /expenses/summary` | backend-expert | Powers the approval queue tile on the Finance dashboard. | | 3 | `docs: B11 verifier pin for ?status= filters` | backend-expert | One-line additions to the plan; no code unless a filter is missing. | | 4 | `feat(hr/finance): F1-F6 — LeaveApproval, StaffDirectory, PayrollRuns, Payslips, Expenses approve UI, HRManagement cleanup` | frontend-expert | 4 new pages + 2 modifications. Routes + nav wiring + SCREENS.md update. | | 5 | `feat(routes): remove /finance/payroll/runs placeholder mapping` | frontend-expert | `App.tsx:330` routes to `PayrollRuns`, not `HRManagement`. | | 6 | review | code-reviewer | Gate. | ## Acceptance (recap from §3b) - B9 happy path: approve `status='pending'` row → 200 with `status='approved'`, `approved_by`/`approved_at` populated. - B9 sad path: approve already-approved row → 409. - All 4 new pages render with real data; no `alert(`, no `window.prompt`, no ``. - `/finance/payroll/runs` no longer maps to `HRManagement`. - `npm run build` green. ## Out of scope (parked) - `approved → paid` transition (Sprint 1c). - Accountant/Librarian/Nurse dashboards (§9 Phase 2+). - Test framework + CI (`tester` rein's first sprint). - Phase 0 nits (still parked on `fix/stabilise-finance-nits`).