PR #170 opened: fix: JobCard crash when property_size is null (Sentry 3P/3R/3S/32)
Why
Four Sentry issues, one root cause:
| Sentry | Surface | Last seen |
|---|---|---|
| TIDY-LINKER-3P | Mobile Safari, /cleaner/jobs | today 16:35 |
| TIDY-LINKER-3R | Chrome Mobile, /cleaner/jobs | today 06:15 |
| TIDY-LINKER-3S | Chrome Mobile, /cleaner/jobs | today 08:02 |
| TIDY-LINKER-32 | Inertia SSR worker | today 08:02 |
The SSR exception gave it away — full traceback names JobCard and points at bootstrap/ssr/assets/jobs-Bh1y5WTL.js:212:238, which is job.property_size.replace(/_/g, ' ') in resources/js/components/jobs/job-card.tsx:216.
property_size has been nullable in the schema since the 2025_11_25_add_property_type_to_job_postings_table migration. 23 of 41 jobs in prod have null property_size — overwhelmingly direct bookings, which skip the wizard step that sets it. Job #55 (6AgxZben) — the no-show situation we built admin tooling for yesterday — is one of them, which is why the cleaner job board was crashing for everyone with that job visible.
Fix
JobCardrenders the property-size pill (icon + label) only whenproperty_sizeis set. Showing a generic Home icon next to nothing was the other option and felt worse.types/jobs.ts:property_sizewidened tostring | nullto match the schema.property_categorystays non-null — its column has aresidentialdefault.- Regression test in
tests/Feature/Cleaner/JobControllerTest.php: listings must include null-property_sizejobs (otherwise the guard would never get exercised in CI).
Out of scope
The remaining live Sentry issues are too noisy / single-user to chase in this PR:
- TIDY-LINKER-3Q — React
insertBeforeNotFoundError on/login(7 hits, 0 users): hydration race, no source maps yet, hard to localise. - TIDY-LINKER-3N —
Failed to construct 'FormData'on/(Samsung Internet, 1 hit): one event, unclear repro. - TIDY-LINKER-3C —
HttpNetworkErroronupdate-rates(2 hits, 2 users): looks like a user network drop, no server-side trace. - TIDY-LINKER-2S —
NotFoundError: The object can not be found here.(1 hit): not actionable.
The fixes in PR #167 (notification deserialization + ThrottlesResendApi retryUntil) have NOT recurred — last sightings of 3J/3H/3K/3M/3A all predate the merge.
Test plan
-
pest tests/Feature/Cleaner/JobControllerTest.php— 9 passing (including new null-property_size case) -
pint --dirtyclean - eslint clean on touched files
-
tsc --noEmitno new errors - Manual: deploy and confirm no further 3P/3R/3S/32 events in Sentry within 24h
- Manual: resolve the four Sentry issues post-deploy