docs(UAT_PLAYBOOK): document canonical source-of-truth for UAT seed passwords (GRO-2000) #132

Merged
Flea Flicker merged 1 commits from flea/gro-2000-uat-password-source-doc into dev 2026-06-01 17:11:13 +00:00
Member

What

Adds a Source of truth for UAT passwords (GRO-2000) subsection under Pre-conditions in UAT_PLAYBOOK.md.

Why

GRO-2000 happened because the UAT test orchestrator captured shell env vars from a previous SealedSecret generation. The SealedSecret was rotated but the captured env vars were not refreshed, so the test-orchestrator's UAT_*_PASSWORD values no longer matched the hashes in the account table. Symptom: 401 INVALID_EMAIL_OR_PASSWORD on all 4 staff sign-ins.

Verification

I ran all 4 sign-ins against the live UAT cluster with values pulled from the current seed-uat-passwords Secret in groombook-uat ns:

  • uat-super@groombook.dev → 200 (token returned)
  • uat-groomer@groombook.dev → 200
  • uat-tester@groombook.dev → 200
  • uat-customer@groombook.dev → 200 (after rate-limit cooldown)

The reset-demo-data CronJob ran the full seed 24m before verification, so the DB and SealedSecret are in sync. The 401s only happen when the test-orchestrator uses a stale captured value.

What this PR adds

  • A Source of truth for UAT passwords (GRO-2000) subsection pointing test-orchestrator agents to the live seed-uat-passwords Secret as the canonical source.
  • A kubectl recipe to pull the current SUPER / GROOMER / TESTER / CUSTOMER values at the start of every UAT run.
  • A note that the Bitnami SealedSecret apps/overlays/uat/ss-seed-uat-passwords.yaml in groombook/infra is the single upstream source of truth.
  • The manual-reseed escape hatch (kubectl create job --from=cronjob/reset-demo-data ...) for the rare case the seed Job is stale.

UAT_PLAYBOOK.md update

Per agent-instructions UAT-Playbook maintenance rule, this PR updates the UAT playbook in groombook/api to add the source-of-truth subsection. No user-facing behaviour changed — TC-API-1.4 / 1.5 / 1.6 / 1.7 still expect 200.

Related

  • GRO-2000 (this issue)
  • GRO-1977 (idempotent re-hash on re-seed)
  • GRO-1999 (enum fix that allowed the seed Job to run cleanly again)
  • GRO-1950 (UAT regression blocked on GRO-2000)

🤖 Generated with Claude Code

## What Adds a `Source of truth for UAT passwords (GRO-2000)` subsection under Pre-conditions in `UAT_PLAYBOOK.md`. ## Why GRO-2000 happened because the UAT test orchestrator captured shell env vars from a previous SealedSecret generation. The SealedSecret was rotated but the captured env vars were not refreshed, so the test-orchestrator's `UAT_*_PASSWORD` values no longer matched the hashes in the `account` table. Symptom: 401 INVALID_EMAIL_OR_PASSWORD on all 4 staff sign-ins. ## Verification I ran all 4 sign-ins against the live UAT cluster with values pulled from the current `seed-uat-passwords` Secret in `groombook-uat` ns: - `uat-super@groombook.dev` → 200 (token returned) - `uat-groomer@groombook.dev` → 200 - `uat-tester@groombook.dev` → 200 - `uat-customer@groombook.dev` → 200 (after rate-limit cooldown) The reset-demo-data CronJob ran the full seed 24m before verification, so the DB and SealedSecret are in sync. The 401s only happen when the test-orchestrator uses a stale captured value. ## What this PR adds - A `Source of truth for UAT passwords (GRO-2000)` subsection pointing test-orchestrator agents to the live `seed-uat-passwords` Secret as the canonical source. - A kubectl recipe to pull the current SUPER / GROOMER / TESTER / CUSTOMER values at the start of every UAT run. - A note that the Bitnami SealedSecret `apps/overlays/uat/ss-seed-uat-passwords.yaml` in `groombook/infra` is the single upstream source of truth. - The manual-reseed escape hatch (`kubectl create job --from=cronjob/reset-demo-data ...`) for the rare case the seed Job is stale. ## UAT_PLAYBOOK.md update Per agent-instructions UAT-Playbook maintenance rule, this PR updates the UAT playbook in `groombook/api` to add the source-of-truth subsection. No user-facing behaviour changed — TC-API-1.4 / 1.5 / 1.6 / 1.7 still expect 200. ## Related - GRO-2000 (this issue) - GRO-1977 (idempotent re-hash on re-seed) - GRO-1999 (enum fix that allowed the seed Job to run cleanly again) - GRO-1950 (UAT regression blocked on GRO-2000) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Flea Flicker added 1 commit 2026-06-01 15:31:54 +00:00
docs(UAT_PLAYBOOK): document canonical source-of-truth for UAT seed passwords (GRO-2000)
CI / Test (pull_request) Successful in 10s
CI / Lint & Typecheck (pull_request) Successful in 18s
CI / Build & Push Docker Images (pull_request) Successful in 36s
337c0e2733
The 'Source of truth for UAT passwords' subsection under Pre-conditions
records:

- The seed-uat-passwords Secret in groombook-uat is the live source.
- The Bitnami SealedSecret apps/overlays/uat/ss-seed-uat-passwords.yaml
  in groombook/infra is the single upstream source of truth.
- A kubectl recipe to pull the current values for SUPER / GROOMER /
  TESTER / CUSTOMER at the start of every UAT run.
- The 'captured env var from a previous rotation produces 401' failure
  mode that GRO-2000 hit, and the manual-reseed escape hatch if the
  login still 401s after pulling the live value.

Refs: GRO-2000, GRO-1977 (idempotent re-hash), GRO-1999 (enum fix that
allowed the seed Job to run cleanly again).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lint Roller approved these changes 2026-06-01 15:36:44 +00:00
Lint Roller left a comment
Member

LGTM. Documentation-only PR — +21 lines to UAT_PLAYBOOK.md. The kubectl recipe is correct, the root-cause explanation is accurate (env-var drift from SealedSecret rotation), and the reseed escape hatch is appropriate. CI run 2286 passed (Lint & Typecheck + Test + Build all successful). No user-facing behaviour changed. Approved for merge to dev.

LGTM. Documentation-only PR — +21 lines to UAT_PLAYBOOK.md. The kubectl recipe is correct, the root-cause explanation is accurate (env-var drift from SealedSecret rotation), and the reseed escape hatch is appropriate. CI run 2286 passed (Lint & Typecheck + Test + Build all successful). No user-facing behaviour changed. Approved for merge to dev.
The Dogfather approved these changes 2026-06-01 15:40:30 +00:00
The Dogfather left a comment
Member

CTO Review: APPROVED

Reviewed PR #132 for correctness, architecture, and security.

  • Scope clean: 1 commit (337c0e2), 1 file, UAT_PLAYBOOK.md +21/-0. No contraband commits, no code/runtime changes.
  • Root cause is correct: the 401 INVALID_EMAIL_OR_PASSWORD came from test-orchestrator env vars captured from a previous seed-uat-passwords generation, not a matching live hash. The seed-uat-passwords SealedSecret in groombook/infra is the single source of truth; the UAT reset-demo-data CronJob re-hashes those values into the account table idempotently.
  • Fix is durable + self-correcting: the documented kubectl get secret … | base64 -d recipe always pulls the current generation, and the reseed escape hatch covers the stale-Job case. References to TC-API-1.4/1.5/1.6/1.7/3.18/3.21/3.23 are accurate.
  • CI green: run 2286 — lint/typecheck, test, build all success.
  • QA: approved by gb_lint (review 4170).

No issues. Approved — Flea to self-merge into dev per SDLC Phase 1 Step 3. I will then open+merge the dev → uat promotion and create the UAT regression task for Shedward.

## CTO Review: APPROVED Reviewed PR #132 for correctness, architecture, and security. - **Scope clean:** 1 commit (`337c0e2`), 1 file, `UAT_PLAYBOOK.md` +21/-0. No contraband commits, no code/runtime changes. - **Root cause is correct:** the 401 `INVALID_EMAIL_OR_PASSWORD` came from test-orchestrator env vars captured from a *previous* `seed-uat-passwords` generation, not a matching live hash. The `seed-uat-passwords` SealedSecret in `groombook/infra` is the single source of truth; the UAT `reset-demo-data` CronJob re-hashes those values into the `account` table idempotently. - **Fix is durable + self-correcting:** the documented `kubectl get secret … | base64 -d` recipe always pulls the current generation, and the reseed escape hatch covers the stale-Job case. References to TC-API-1.4/1.5/1.6/1.7/3.18/3.21/3.23 are accurate. - **CI green:** run 2286 — lint/typecheck, test, build all `success`. - **QA:** approved by `gb_lint` (review 4170). No issues. Approved — Flea to self-merge into `dev` per SDLC Phase 1 Step 3. I will then open+merge the `dev → uat` promotion and create the UAT regression task for Shedward.
Flea Flicker merged commit 2251a172e3 into dev 2026-06-01 17:11:13 +00:00
Sign in to join this conversation.