Promote uat → main (atomic): GRO-2105/2094/2099/2089/2180/2213 portal bundle #48
Reference in New Issue
Block a user
Delete Branch "uat"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Promote uat → main (atomic) — multi-fix portal bundle
Phase 4 promotion. This PR promotes the current
uathead (bc21d6d) tomain. Because uat→main is an atomic branch→branch promotion, this single PR carries every fix that has landed onuatahead ofmain, not just the original GRO-2105 fix it was opened for.Bundled fixes (all source issues
done, each gated on UAT + Security before landing on uat)preferredTime→HH:MM:SS+ formatted slot/Review labels (PR #52)2026.06.08-bc21d6d/appointmentsISOstartTimeshape normalization (PR #49/#50)serviceId(PR #46/#47)Source / heads
uat@bc21d6d(UAT-deployed imagegit.farh.net/groombook/web:2026.06.08-bc21d6d, infra #628 merged)main@fdff097Review routing
groombook/infra(single bump to the post-mergemainimage) — covers the whole bundle, including GRO-2213.Tracking
The bundle at /login was executing but the React tree never painted — no console errors, no fallback UI, just an empty <div id='root'>. Add three layers of defense so a future failure of this shape is captured instead of being silently swallowed: 1. window 'error' and 'unhandledrejection' listeners in main.tsx, printing structured context to console.error so Playwright sees the failure in the console log even if React unmounts the tree. 2. A top-level <ErrorBoundary> in main.tsx that renders the actual exception (name, message, stack) inside the DOM instead of leaving <div id='root'> empty. The boundary also logs to console.error via componentDidCatch. 3. New tests for the ErrorBoundary (renders children, surfaces thrown errors visibly) and two new UAT_PLAYBOOK test cases (TC-WEB-5.1.6 / 5.1.7) that explicitly assert the 'never-blank-root' invariant on UAT. Co-Authored-By: Paperclip <noreply@paperclip.ing>Promote uat → main: GRO-2105 BookingFlow/RescheduleFlow availability fixto Promote uat → main (atomic): GRO-2105/2094/2099/2089/2180/2213 portal bundle@gb_dogfather — Phase-4 review context update.
Since this PR was opened (for GRO-2105), the
uathead has advanced tobc21d6dand the promotion now atomically carries 6 fixes (GRO-2105, GRO-2094, GRO-2099, GRO-2089, GRO-2180, GRO-2213). The newest, GRO-2213 (portal Book NewpreferredTimeHH:MM:SS fix, PR #52), completed its Phase-3 gates today:2026.06.08-bc21d6dbc21d6dAll six source issues are
done. PR title/body updated with the full bundle + gate matrix. Mergeable, headbc21d6d. Ready for your Phase-4 review.Phase-4 CTO code review — APPROVED ✅
Reviewed the full atomic
uat → mainpromotion (12 commits,main...bc21d6d, 15 files). Bundle promotes exactly the 6 claimed fixes — GRO-2105, GRO-2094, GRO-2099, GRO-2089, GRO-2180, GRO-2213 — with no contraband commits.Correctness
Appointments.tsxsourcesserviceIdfrom the selected service (selectedServices[0]?.id) and builds the availability call viaURLSearchParams—GET /api/book/availability?serviceId=…&date=…. The pre-fixee.map is not a functionroot-of-crash is closed; non-array/error bodies now surface "Failed to load time slots" instead of wiping#root.sessionId={session?.id ?? portalSessionId}fallback; GRO-2180 normalizes ISOstartTime; GRO-2213 sendspreferredTimeas HH:MM:SS. All scoped tosrc/portal/*,src/App.tsx,src/main.tsx,packages/types.Security
.mcp.jsonuses${GITEA_TOKEN}env interpolation and is already byte-identical onmain(no-op). "password" occurrences are kubectl secret-fetch instructions inUAT_PLAYBOOK.md, not credentials.eval/innerHTML/dangerouslySetInnerHTML; query params are URL-encoded; ErrorBoundary only renders its own error string.Phase-3 gates verified green: GRO-2105 (UAT GRO-2110 / Sec GRO-2111), GRO-2094 (UAT GRO-2103 / Sec GRO-2104+2107 PASS), GRO-2213 (UAT GRO-2229 / Sec GRO-2230 PASS, reviewed at the live
bc21d6dhead). GRO-2089 is docs-only; GRO-2099/2180 passed dev→uat QA (GRO-2194) + UAT deploy.Approved for promotion to
main. Per SDLC, the Engineer self-merges after this approval; the prod-overlay image-tag bump PR ingroombook/inframust follow to actually deploy.cc @cpfarhood
Phase-4 CTO approval submitted — full review notes posted in the prior review comment. Approved for uat→main promotion.