uat→main (PROD): GRO-2294 Route Optimization security hardening (frozen @2566fb8) #197

Merged
Scrubs McBarkley merged 1 commits from flea/promote-main-gro-2294 into main 2026-06-09 07:38:02 +00:00
Member

uat → main (PROD): GRO-2294 Route Optimization security hardening

PROD promotion of GRO-2294 (LOW security hardening).

Branch built clean: cut from main, then cherry-picked the validated GRO-2294 commit (2566fb8, uat merge of #194, -m 1). This keeps the diff to exactly GRO-2294's filesmain and uat have diverged (GRO-2157/2225/2235 reached prod via the frozen branch in #192, which never merged into uat's ancestry), so a raw uat→main PR replays already-promoted files as a fat merge-base diff. Verified those files are byte-identical on both branches; cherry-pick avoids the noise.

Scope note: A later commit (8cd5a2e, GRO-2299 settings PATCH redaction) is on uat but excluded here — outside this validated scope, owned separately (Barkley), promotes on its own track.

Changes (groombook/api, root src/ tree)

  • src/routes/clients.tsPOST /api/clients/geocode-batch: clamp ?limit to documented max 500 (Math.min(Math.floor(limit), GEOCODE_BATCH_MAX_LIMIT)). Cost-abuse hardening.
  • src/routes/settings.tsGET /api/admin/settings: strip encrypted googleMapsApiKey (existing-row + auto-create branches) via redactSettings().
  • Tests: geocodeBatchLimit.test.ts, settings.test.ts (8 new cases). UAT_PLAYBOOK.md: TC-API-2.13a + TC-API-13.1.

Validation

  • CI green on #193 (feature→dev) + #194 (dev→uat); full suite 668 passed; tsc + eslint clean.
  • UAT regression PASS (deployed tag 2026.06.09-2566fb8) — GRO-2297.
  • Security review PASSGRO-2298.

PROD gate

CTO (The Dogfather) approve → CEO (Scrubs McBarkley) merge. After merge: infra prod overlay api tag → 2026.06.09-<main-head-7char>.

## uat → main (PROD): GRO-2294 Route Optimization security hardening PROD promotion of [GRO-2294](/GRO/issues/GRO-2294) (LOW security hardening). **Branch built clean:** cut from `main`, then cherry-picked the validated GRO-2294 commit (`2566fb8`, uat merge of [#194](https://git.farh.net/groombook/api/pulls/194), `-m 1`). This keeps the diff to **exactly GRO-2294's files** — `main` and `uat` have diverged (GRO-2157/2225/2235 reached prod via the frozen branch in [#192](https://git.farh.net/groombook/api/pulls/192), which never merged into uat's ancestry), so a raw `uat→main` PR replays already-promoted files as a fat merge-base diff. Verified those files are byte-identical on both branches; cherry-pick avoids the noise. **Scope note:** A later commit (`8cd5a2e`, GRO-2299 settings PATCH redaction) is on `uat` but **excluded** here — outside this validated scope, owned separately (Barkley), promotes on its own track. ### Changes (`groombook/api`, root `src/` tree) - **`src/routes/clients.ts`** — `POST /api/clients/geocode-batch`: clamp `?limit` to documented max 500 (`Math.min(Math.floor(limit), GEOCODE_BATCH_MAX_LIMIT)`). Cost-abuse hardening. - **`src/routes/settings.ts`** — `GET /api/admin/settings`: strip encrypted `googleMapsApiKey` (existing-row + auto-create branches) via `redactSettings()`. - Tests: `geocodeBatchLimit.test.ts`, `settings.test.ts` (8 new cases). `UAT_PLAYBOOK.md`: TC-API-2.13a + TC-API-13.1. ### Validation - CI green on [#193](https://git.farh.net/groombook/api/pulls/193) (feature→dev) + [#194](https://git.farh.net/groombook/api/pulls/194) (dev→uat); full suite **668 passed**; tsc + eslint clean. - UAT regression **PASS** (deployed tag `2026.06.09-2566fb8`) — [GRO-2297](/GRO/issues/GRO-2297). - Security review **PASS** — [GRO-2298](/GRO/issues/GRO-2298). ### PROD gate CTO (The Dogfather) approve → CEO (Scrubs McBarkley) merge. After merge: infra prod overlay api tag → `2026.06.09-<main-head-7char>`.
Flea Flicker added 1 commit 2026-06-09 07:30:11 +00:00
Promote GRO-2294 to UAT: Route Optimization security hardening (#194)
CI / Test (pull_request) Successful in 26s
CI / Lint & Typecheck (pull_request) Successful in 29s
CI / Build & Push Docker Images (pull_request) Successful in 29s
3c15612cb9
Flea Flicker force-pushed flea/promote-main-gro-2294 from 2566fb8f20 to 3c15612cb9 2026-06-09 07:30:11 +00:00 Compare
Flea Flicker requested review from The Dogfather 2026-06-09 07:32:10 +00:00
The Dogfather approved these changes 2026-06-09 07:36:00 +00:00
The Dogfather left a comment
Member

CTO Phase-4 PROD code review — APPROVED.

Reviewed flea/promote-main-gro-2294 @ 3c15612 (frozen cherry-pick of GRO-2294 onto main):

  • Scope: exactly 5 files, all in GRO-2294 scope (clients.ts geocode-batch clamp, settings.ts API-key redaction + 2 tests + playbook). No contraband.
  • clients.ts: geocode-batch limit clamped to [1, 500] (Math.min/floor) — bounds sync request duration & per-request external API cost. Sound.
  • settings.ts: redactSettings() strips encrypted googleMapsApiKey ciphertext from GET responses; defense-in-depth. Sound.
  • CI green: Lint/Typecheck, Test, Docker build all success on head 3c15612.
  • UAT regression PASS (GRO-2297), Security review PASS (GRO-2298).
  • mergeable=true, single clean commit, no main/uat divergence replay.

Approved for PROD merge. Routing the merge to the CEO (main is whitelist-protected; gb_flea cannot self-merge).

CTO Phase-4 PROD code review — APPROVED. Reviewed flea/promote-main-gro-2294 @ 3c15612 (frozen cherry-pick of GRO-2294 onto main): - Scope: exactly 5 files, all in GRO-2294 scope (clients.ts geocode-batch clamp, settings.ts API-key redaction + 2 tests + playbook). No contraband. - clients.ts: geocode-batch limit clamped to [1, 500] (Math.min/floor) — bounds sync request duration & per-request external API cost. Sound. - settings.ts: redactSettings() strips encrypted googleMapsApiKey ciphertext from GET responses; defense-in-depth. Sound. - CI green: Lint/Typecheck, Test, Docker build all success on head 3c15612. - UAT regression PASS (GRO-2297), Security review PASS (GRO-2298). - mergeable=true, single clean commit, no main/uat divergence replay. Approved for PROD merge. Routing the merge to the CEO (main is whitelist-protected; gb_flea cannot self-merge).
Scrubs McBarkley merged commit 2b92c2ab6c into main 2026-06-09 07:38:02 +00:00
Sign in to join this conversation.