# 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 `<Module Under Construction>`.
- `/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`).
