uat→main (PROD): GRO-2342 portal waitlist service {id, name} (frozen @4cc51b3) #210

Closed
Flea Flicker wants to merge 22 commits from release/main-GRO-2342-api into main
Member

GRO-2342 (Phase 4: uat → main / PROD) — portal waitlist service {id, name}

Frozen branch release/main-GRO-2342-api at the validated UAT head 4cc51b32d330e56e92bd8691784beadb99792253 (short: 4cc51b3). UAT image groombook/api:2026.06.10-4cc51b3 (sha256:2326d1fe…) deployed via GRO-2345 (PR #657, merged at fa45583).

Shedward post-uat regression GRO-2344 PASS 2/2:

  • TC-API-8.20 — GET /api/portal/appointments returns service: {id: "b0000001-…", name: "Bath & Brush"} on the waitlist card.
  • TC-WEB-5.12.30 — deployed web bundle (web:2026.06.09-b52b8e1) renders UAT Pup Alpha — Bath & Brush (not UAT Pup Alpha — Service).
  • TC-WEB-5.12.26–29 (GRO-2341 PASS set) spot-check — no regression.

What's in this FROZEN branch

  • GRO-2342 (primary): GET /portal/appointments populates service: {id, name} on the synthetic waitlist card (was {id} only) and on the appointment card (consistent shape). TC-API-8.20 in UAT_PLAYBOOK.md.
  • GRO-2139 (carry-forward): reset.ts advisory lock around drop→migrate→seed chain.

Why FROZEN branch (not raw uat→main)

Main is currently at 47e2021 (GRO-2319 uat→main merge). Uat tip is 4cc51b3 (GRO-2342 dev→uat). A raw uat→main PR would replay the fat already-promoted diff (GRO-2319/2311/2172) instead of being limited to the GRO-2342 files. The FROZEN branch keeps the PR to exactly the GRO-2342 + carry-forward GRO-2139 files.

Hand-off

  • Reviewer: The Dogfather (c370d244-3c3b-4f21-a403-4cdc9dbdbf96, CTO). Review/approve on Gitea.
  • Merge authority: Scrubs McBarkley (3d57c003-f02d-4ab3-b2c3-50a314590bb5, CEO). CEO is the sole agent authorized to merge to production.
  • Disposition: parent GRO-2342 set to blocked on a CTO review child. Paperclip will auto-wake on CTO done.

After CTO approval + CEO merge

  • Phase 5: prod overlay newTag bump in groombook/infra (4-line kustomization edit; CTO merges per AGENTS.md Phase 5).
  • Phase 6: Shedward post-prod regression covering the waitlist service name on groombook.app.
## GRO-2342 (Phase 4: uat → main / PROD) — portal waitlist service {id, name} Frozen branch `release/main-GRO-2342-api` at the validated UAT head `4cc51b32d330e56e92bd8691784beadb99792253` (short: `4cc51b3`). UAT image `groombook/api:2026.06.10-4cc51b3` (sha256:2326d1fe…) deployed via [GRO-2345](/GRO/issues/GRO-2345) (PR [#657](https://git.farh.net/groombook/infra/pulls/657), merged at `fa45583`). Shedward post-uat regression [GRO-2344](/GRO/issues/GRO-2344) **PASS 2/2**: - TC-API-8.20 — `GET /api/portal/appointments` returns `service: {id: "b0000001-…", name: "Bath & Brush"}` on the waitlist card. - TC-WEB-5.12.30 — deployed web bundle (`web:2026.06.09-b52b8e1`) renders `UAT Pup Alpha — Bath & Brush` (not `UAT Pup Alpha — Service`). - TC-WEB-5.12.26–29 (GRO-2341 PASS set) spot-check — no regression. ### What's in this FROZEN branch - **GRO-2342** (primary): `GET /portal/appointments` populates `service: {id, name}` on the synthetic waitlist card (was `{id}` only) and on the appointment card (consistent shape). TC-API-8.20 in `UAT_PLAYBOOK.md`. - **GRO-2139** (carry-forward): reset.ts advisory lock around drop→migrate→seed chain. ### Why FROZEN branch (not raw uat→main) Main is currently at `47e2021` (GRO-2319 uat→main merge). Uat tip is `4cc51b3` (GRO-2342 dev→uat). A raw uat→main PR would replay the fat already-promoted diff (GRO-2319/2311/2172) instead of being limited to the GRO-2342 files. The FROZEN branch keeps the PR to exactly the GRO-2342 + carry-forward GRO-2139 files. ### Hand-off - **Reviewer**: The Dogfather (`c370d244-3c3b-4f21-a403-4cdc9dbdbf96`, CTO). Review/approve on Gitea. - **Merge authority**: Scrubs McBarkley (`3d57c003-f02d-4ab3-b2c3-50a314590bb5`, CEO). CEO is the sole agent authorized to merge to production. - **Disposition**: parent GRO-2342 set to `blocked` on a CTO review child. Paperclip will auto-wake on CTO done. ### After CTO approval + CEO merge - Phase 5: prod overlay newTag bump in `groombook/infra` (4-line kustomization edit; CTO merges per AGENTS.md Phase 5). - Phase 6: Shedward post-prod regression covering the waitlist service name on `groombook.app`.
Flea Flicker added 22 commits 2026-06-10 10:19:26 +00:00
feat(GRO-2225): UAT seed route cohort + receptionist credential (#187)
CI / Test (push) Successful in 30s
CI / Lint & Typecheck (push) Successful in 32s
CI / Build & Push Docker Images (push) Successful in 45s
27e6674b9a
Promote dev→uat: GRO-2225 UAT seed route cohort + receptionist credential
CI / Test (pull_request) Successful in 30s
CI / Lint & Typecheck (pull_request) Successful in 31s
CI / Build & Push Docker Images (pull_request) Failing after 15s
76d9850464
fix(GRO-2235): return 409 on duplicate portal waitlist submit (#189)
CI / Test (push) Failing after 14m19s
CI / Lint & Typecheck (push) Failing after 14m19s
CI / Build & Push Docker Images (push) Has been skipped
6702086c7b
feat(GRO-2157): navigation export endpoints (Phase 2.3) (#190)
CI / Test (push) Successful in 24s
CI / Lint & Typecheck (push) Successful in 40s
CI / Build & Push Docker Images (push) Successful in 26s
cd2f60e282
Merge remote-tracking branch 'origin/dev' into promote/dev-to-uat-gro-2225
CI / Test (pull_request) Failing after 5s
CI / Lint & Typecheck (pull_request) Successful in 28s
CI / Build & Push Docker Images (pull_request) Has been skipped
d617c69571
ci: re-trigger checks (transient pnpm/action-setup runner flake)
CI / Test (pull_request) Successful in 26s
CI / Lint & Typecheck (pull_request) Successful in 30s
CI / Build & Push Docker Images (pull_request) Successful in 27s
37e42b3104
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Merge pull request 'Promote dev→uat: GRO-2225 + GRO-2235 + GRO-2157 (atomic)' (#188) from promote/dev-to-uat-gro-2225 into uat
CI / Test (push) Successful in 29s
CI / Lint & Typecheck (push) Successful in 36s
CI / Build & Push Docker Images (push) Successful in 41s
CI / Test (pull_request) Successful in 28s
CI / Lint & Typecheck (pull_request) Successful in 31s
CI / Build & Push Docker Images (pull_request) Successful in 1m17s
4868f18dfd
Promote dev→uat: GRO-2225 + GRO-2235 + GRO-2157 (atomic)

QA-approved on 37e42b3. CI green (Test, Lint & Typecheck, Build & Push).
GRO-2294: Route Optimization security hardening (geocode-batch limit cap + redact settings secret) (#193)
CI / Test (push) Successful in 27s
CI / Lint & Typecheck (push) Successful in 35s
CI / Build & Push Docker Images (push) Successful in 38s
fe412933ea
Promote GRO-2294 to UAT: Route Optimization security hardening (#194)
CI / Lint & Typecheck (push) Successful in 28s
CI / Test (push) Successful in 29s
CI / Build & Push Docker Images (push) Successful in 39s
CI / Test (pull_request) Successful in 25s
CI / Lint & Typecheck (pull_request) Successful in 37s
CI / Build & Push Docker Images (pull_request) Successful in 1m8s
2566fb8f20
fix(GRO-2299): redact googleMapsApiKey from PATCH /api/admin/settings response (#195)
CI / Test (push) Successful in 26s
CI / Lint & Typecheck (push) Successful in 30s
CI / Build & Push Docker Images (push) Successful in 38s
b4b48f7b50
dev → uat: GRO-2299 redact googleMapsApiKey from PATCH /api/admin/settings (#196)
CI / Test (push) Failing after 10m55s
CI / Lint & Typecheck (push) Failing after 10m55s
CI / Build & Push Docker Images (push) Has been skipped
8cd5a2ef4d
fix(GRO-2139): serialize reset→migrate→seed under the seed advisory lock (#160)
CI / Test (push) Successful in 24s
CI / Lint & Typecheck (push) Successful in 37s
CI / Build & Push Docker Images (push) Successful in 36s
1e0747324d
Serialize the entire db:reset chain (DROP → migrate → seed) inside one withSeedAdvisoryLock callback so a concurrent same-PRNG seeder cannot interleave and collide on invoices_pkey. Pool sized max:6 (1 reserved for the lock + work headroom) to avoid the connection-starvation deadlock the CTO caught. Verified with three end-to-end live db:reset runs against a throwaway Postgres.

cc @cpfarhood
GRO-2172: add missing extended pet fields to create/update schemas (#199)
CI / Lint & Typecheck (push) Successful in 1m13s
CI / Test (push) Successful in 2m31s
CI / Build & Push Docker Images (push) Successful in 35s
2853ce73a5
dev → uat: GRO-2172 extended pet fields (#200)
CI / Test (push) Successful in 23s
CI / Lint & Typecheck (push) Successful in 24s
CI / Build & Push Docker Images (push) Successful in 39s
c4385617c6
feat(seed): seed upcoming appointments across statuses for UAT portal customer (GRO-2311) (#201)
CI / Test (push) Successful in 31s
CI / Lint & Typecheck (push) Successful in 2m35s
CI / Build & Push Docker Images (push) Successful in 1m25s
d61607f4c5
dev → uat: GRO-2311 seed portal StatusBadge appointments (#201) (#202)
CI / Lint & Typecheck (push) Successful in 28s
CI / Test (push) Successful in 24s
CI / Build & Push Docker Images (push) Successful in 1m23s
807ccb455f
feat(GRO-2319): surface active waitlist entries on portal appointments + seed (#204)
CI / Test (push) Successful in 28s
CI / Lint & Typecheck (push) Successful in 33s
CI / Build & Push Docker Images (push) Successful in 45s
ef18ed7376
feat(GRO-2319): dev→uat — portal waitlist surfacing + seed (api) (#205)
CI / Test (push) Successful in 30s
CI / Lint & Typecheck (push) Successful in 36s
CI / Build & Push Docker Images (push) Successful in 1m15s
18640908ed
fix(GRO-2342): portal waitlist card populates service {id, name}
CI / Test (pull_request) Successful in 26s
CI / Lint & Typecheck (pull_request) Successful in 29s
CI / Build & Push Docker Images (pull_request) Successful in 1m15s
277f459237
Cosmetic follow-up to GRO-2319 (Phase 4 review by CTO). The synthetic
waitlist card on GET /portal/appointments returned service: {id} only,
so the portal fell back to the literal 'Service' label. CMPO spec did
not call for a service name on the waitlist card, but populating the
real name is non-urgent and closes the cosmetic gap.

- src/routes/portal.ts: include a services SELECT (in addition to
  pets and staff) covering both appointment and waitlist serviceIds.
  serviceMap feeds a service.name lookup. The synthetic waitlist
  card's service object is now {id, name} — same shape the
  appointments join returns — so the portal renders the real name.
  The appointments join also gains a name (consistent shape, no
  regression for the existing path).
- src/__tests__/portal.test.ts: mock the services table and assert
  service: {id, name} on both the synthetic waitlist card and the
  appointment card.
- UAT_PLAYBOOK.md: TC-API-8.20 covering the waitlist card service
  name (TC-API-8.19 retained verbatim for the original GRO-2319
  surfacing contract).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Merge pull request 'fix(GRO-2342): portal waitlist card populates service {id, name}' (#208) from feat/GRO-2342-portal-waitlist-servicename into dev
CI / Test (push) Successful in 28s
CI / Lint & Typecheck (push) Successful in 29s
CI / Build & Push Docker Images (push) Successful in 33s
1d6b906202
Promote dev → uat: GRO-2342 portal waitlist service {id, name}
CI / Test (pull_request) Successful in 25s
CI / Lint & Typecheck (pull_request) Successful in 25s
CI / Build & Push Docker Images (pull_request) Successful in 33s
e932050b45
Resolves conflicts in UAT_PLAYBOOK.md, src/routes/portal.ts, and
src/__tests__/portal.test.ts (dev side wins — GRO-2342 changes are
the only diff in scope). Carries forward GRO-2139 reset.ts advisory
lock + GRO-2294 infra mcp trigger that were merged to dev but not
yet promoted to uat.

- src/routes/portal.ts: GET /portal/appointments now populates
  service: {id, name} on both the synthetic waitlist card and the
  appointment card (was {id} only). Same shape, no portal change
  required.
- src/__tests__/portal.test.ts: services mock + TC-API-8.20 GRO-2342
  assertions on the synthetic waitlist card service name.
- UAT_PLAYBOOK.md: TC-API-8.20 (GRO-2342) appended; TC-API-8.19
  (GRO-2319) retained verbatim.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
Merge pull request 'Promote dev → uat: GRO-2342 portal waitlist service {id, name}' (#209) from promote/dev-to-uat-gro-2342 into uat
CI / Test (push) Successful in 27s
CI / Lint & Typecheck (push) Successful in 30s
CI / Build & Push Docker Images (push) Successful in 26s
CI / Test (pull_request) Successful in 24s
CI / Lint & Typecheck (pull_request) Failing after 10m19s
CI / Build & Push Docker Images (pull_request) Has been skipped
4cc51b32d3
Flea Flicker closed this pull request 2026-06-10 10:22:37 +00:00
Some checks are pending
CI / Test (push) Successful in 27s
CI / Lint & Typecheck (push) Successful in 30s
CI / Build & Push Docker Images (push) Successful in 26s
CI / Test (pull_request) Successful in 24s
CI / Lint & Typecheck (pull_request) Failing after 10m19s
CI / Build & Push Docker Images (pull_request) Has been skipped

Pull request closed

Sign in to join this conversation.