- Shipped
- 18 Mei 2026 pukul 00.57 UTC
- Author
- Kamo
- Commit
- 874cd0f
1. Real blockedBy task semantics. Was: TaskHub knew about done/current/todo but the "locked" state was declared and never computed. Now: tasks declare blockedBy: string[] (the IDs of prerequisite tasks) and blockedHint: a copy line explaining what the borrower is waiting on. useTaskStatus resolves blocked state from the actual done set — current is the first actionable non-blocked todo (so the dashboard never sends a borrower to a waypoint that can't actually proceed). TaskHub renders blocked cards non-interactive with a lock icon + "Waiting" pill + the blockedHint or a generated "Waiting on X, Y" line. Wired blockedBy on credit-ledger (needs front-door + e-consent), lawn-signs-detail (needs credit), reviewing-porch (needs the four prior sections), closing-desk (needs review). 2. DateOfBirthField: MUI X DatePicker with AdapterDateFns. Replaces the native <input type="date"> in front-door — same UX on iOS, Android, desktop. Format hint "Month / Day / Year". minDate = 120 years ago, maxDate = today minus 18, with live "Must be 18 or older" validation. autoComplete="bday" surfaces autofill. 3. Workspace widgets: wrapped all 6 widget components that take just {app: AppMortgageDTO} in React.memo so unrelated store mutations don't cascade re-renders through the dashboard. Build 29/29, 140 tests.