From 1891b9c5237267eea5bdfc55959fc138ddc97035 Mon Sep 17 00:00:00 2001 From: Scrubs McBarkley <18+gb_scrubs@noreply.git.farh.net> Date: Sat, 30 May 2026 04:12:06 +0000 Subject: [PATCH 1/5] GRO-1949: add behavioral and skin medicalAlertPool types, deterministic seeding for TestCooper/TestRocky (#109) --- packages/db/src/seed.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/db/src/seed.ts b/packages/db/src/seed.ts index 375ffe1..985ecf0 100644 --- a/packages/db/src/seed.ts +++ b/packages/db/src/seed.ts @@ -270,6 +270,10 @@ const medicalAlertPool: MedicalAlert[] = [ { id: "", type: "other", description: "Seizure history — avoid flashing lights", severity: "high" }, { id: "", type: "other", description: "Luxating patella — short walks only", severity: "medium" }, { id: "", type: "other", description: "Ear infections — dry thoroughly after bath", severity: "low" }, + { id: "", type: "behavioral", description: "Anxiety — calm environment preferred", severity: "low" }, + { id: "", type: "behavioral", description: "Fear-based aggression — approach with caution", severity: "high" }, + { id: "", type: "skin", description: "Contact dermatitis — avoid harsh chemicals", severity: "medium" }, + { id: "", type: "skin", description: "Hot spots — monitor and report any worsening", severity: "high" }, ]; const preferredCutPool: string[] = [ @@ -962,6 +966,14 @@ async function seed() { temperamentScore: randInt(1, 5), temperamentFlags: pickN(temperamentFlagPool, randInt(1, 3)), medicalAlerts: (() => { + // Deterministic alerts for UAT AC pets + if (uc.petName === "TestCooper") { + return pickN(medicalAlertPool.filter((a) => a.type === "behavioral"), 1).map((a) => ({ ...a, id: uuid() })); + } + if (uc.petName === "TestRocky") { + return pickN(medicalAlertPool.filter((a) => a.type === "skin"), 1).map((a) => ({ ...a, id: uuid() })); + } + // Other UAT pets: random if (rand() < 0.3) { const count = rand() < 0.7 ? 1 : 2; return pickN(medicalAlertPool, count).map((a) => ({ ...a, id: uuid() })); @@ -1058,6 +1070,14 @@ async function seed() { temperamentScore: randInt(1, 5), temperamentFlags: pickN(temperamentFlagPool, randInt(1, 3)), medicalAlerts: (() => { + // Deterministic alerts for UAT AC pets + if (uc.petName === "TestCooper") { + return pickN(medicalAlertPool.filter((a) => a.type === "behavioral"), 1).map((a) => ({ ...a, id: uuid() })); + } + if (uc.petName === "TestRocky") { + return pickN(medicalAlertPool.filter((a) => a.type === "skin"), 1).map((a) => ({ ...a, id: uuid() })); + } + // Other UAT pets: random if (rand() < 0.3) { const count = rand() < 0.7 ? 1 : 2; return pickN(medicalAlertPool, count).map((a) => ({ ...a, id: uuid() })); @@ -1081,6 +1101,14 @@ async function seed() { temperamentScore: randInt(1, 5), temperamentFlags: pickN(temperamentFlagPool, randInt(1, 3)), medicalAlerts: (() => { + // Deterministic alerts for UAT AC pets + if (uc.petName === "TestCooper") { + return pickN(medicalAlertPool.filter((a) => a.type === "behavioral"), 1).map((a) => ({ ...a, id: uuid() })); + } + if (uc.petName === "TestRocky") { + return pickN(medicalAlertPool.filter((a) => a.type === "skin"), 1).map((a) => ({ ...a, id: uuid() })); + } + // Other UAT pets: random if (rand() < 0.3) { const count = rand() < 0.7 ? 1 : 2; return pickN(medicalAlertPool, count).map((a) => ({ ...a, id: uuid() })); From e00cdc13214f71e1a8a49f6dbaa44fba7ca1ecd2 Mon Sep 17 00:00:00 2001 From: Lint Roller <23+gb_lint@noreply.git.farh.net> Date: Sat, 30 May 2026 04:20:02 +0000 Subject: [PATCH 2/5] fix(db): add missing 'short' value to coat_type enum (GRO-1953) (#110) --- .../0035_add_short_to_coat_type_enum.sql | 14 ++++++++++++++ packages/db/migrations/meta/_journal.json | 7 +++++++ 2 files changed, 21 insertions(+) create mode 100644 packages/db/migrations/0035_add_short_to_coat_type_enum.sql diff --git a/packages/db/migrations/0035_add_short_to_coat_type_enum.sql b/packages/db/migrations/0035_add_short_to_coat_type_enum.sql new file mode 100644 index 0000000..26145a9 --- /dev/null +++ b/packages/db/migrations/0035_add_short_to_coat_type_enum.sql @@ -0,0 +1,14 @@ +-- Migration: 0035_add_short_to_coat_type_enum.sql +-- GRO-1953: Adds missing "short" value to the coat_type enum so that seed data +-- (which uses coatTypePool including "short") can be inserted without error. +-- +-- The seed file defines coatTypePool as: +-- ["short", "medium", "long", "double", "wire", "silky", "curly", "hairless"] +-- but migration 0031 created the enum without "short", causing: +-- PostgresError: invalid input value for enum coat_type: "short" + +BEGIN; + +ALTER TYPE "coat_type" ADD VALUE IF NOT EXISTS 'short'; + +COMMIT; \ No newline at end of file diff --git a/packages/db/migrations/meta/_journal.json b/packages/db/migrations/meta/_journal.json index db9e36c..58d27a7 100644 --- a/packages/db/migrations/meta/_journal.json +++ b/packages/db/migrations/meta/_journal.json @@ -246,6 +246,13 @@ "when": 1751140800000, "tag": "0034_extend_pet_profile_columns", "breakpoints": true + }, + { + "idx": 35, + "version": "7", + "when": 1751140800000, + "tag": "0035_add_short_to_coat_type_enum", + "breakpoints": true } ] } \ No newline at end of file From c588c94dcb4fa483872d76ce96230d526ef1058a Mon Sep 17 00:00:00 2001 From: Flea Flicker <22+gb_flea@noreply.git.farh.net> Date: Sat, 30 May 2026 04:42:33 +0000 Subject: [PATCH 3/5] GRO-1955: hotfix seed.ts broken uc reference in random pet batch (#112) --- packages/db/src/seed.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/packages/db/src/seed.ts b/packages/db/src/seed.ts index 985ecf0..0264c19 100644 --- a/packages/db/src/seed.ts +++ b/packages/db/src/seed.ts @@ -966,14 +966,6 @@ async function seed() { temperamentScore: randInt(1, 5), temperamentFlags: pickN(temperamentFlagPool, randInt(1, 3)), medicalAlerts: (() => { - // Deterministic alerts for UAT AC pets - if (uc.petName === "TestCooper") { - return pickN(medicalAlertPool.filter((a) => a.type === "behavioral"), 1).map((a) => ({ ...a, id: uuid() })); - } - if (uc.petName === "TestRocky") { - return pickN(medicalAlertPool.filter((a) => a.type === "skin"), 1).map((a) => ({ ...a, id: uuid() })); - } - // Other UAT pets: random if (rand() < 0.3) { const count = rand() < 0.7 ? 1 : 2; return pickN(medicalAlertPool, count).map((a) => ({ ...a, id: uuid() })); @@ -1101,14 +1093,6 @@ async function seed() { temperamentScore: randInt(1, 5), temperamentFlags: pickN(temperamentFlagPool, randInt(1, 3)), medicalAlerts: (() => { - // Deterministic alerts for UAT AC pets - if (uc.petName === "TestCooper") { - return pickN(medicalAlertPool.filter((a) => a.type === "behavioral"), 1).map((a) => ({ ...a, id: uuid() })); - } - if (uc.petName === "TestRocky") { - return pickN(medicalAlertPool.filter((a) => a.type === "skin"), 1).map((a) => ({ ...a, id: uuid() })); - } - // Other UAT pets: random if (rand() < 0.3) { const count = rand() < 0.7 ? 1 : 2; return pickN(medicalAlertPool, count).map((a) => ({ ...a, id: uuid() })); From e9aef5719f6280871c9d0f41ef2176595d9c511e Mon Sep 17 00:00:00 2001 From: Flea Flicker Date: Sat, 30 May 2026 04:49:59 +0000 Subject: [PATCH 4/5] GRO-1939: Add CI smoke test for blackholed migrate runtime Cherry-picked from fix/GRO-1909-migrate-corepack-offline (f007eca) --- .gitea/workflows/ci.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 0f05f7c..867246f 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -100,7 +100,7 @@ jobs: push: true tags: | git.farh.net/groombook/api:${{ steps.version.outputs.tag }} - ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/api:latest' || '' }} + ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombok/api:latest' || '' }} cache-from: type=registry,ref=git.farh.net/groombook/cache:api cache-to: type=registry,ref=git.farh.net/groombook/cache:api,mode=max @@ -118,6 +118,17 @@ jobs: cache-from: type=registry,ref=git.farh.net/groombook/cache:migrate cache-to: type=registry,ref=git.farh.net/groombook/cache:migrate,mode=max + - name: Smoke test migrate image (blackhole npmjs.org) + run: | + set -euo pipefail + IMAGE="git.farh.net/groombook/migrate:${{ steps.version.outputs.tag }}" + docker pull "$IMAGE" + docker run --rm \ + --add-host registry.npmjs.org:127.0.0.1 \ + --entrypoint="" \ + "$IMAGE" \ + pnpm --version + - name: Build and push Seed image uses: docker/build-push-action@v6 with: @@ -143,5 +154,5 @@ jobs: tags: | git.farh.net/groombook/reset:${{ steps.version.outputs.tag }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/reset:latest' || '' }} - cache-from: type=registry,ref=git.farh.net/groombook/cache:reset - cache-to: type=registry,ref=git.farh.net/groombook/cache:reset,mode=max + cache-from: type=registry,ref=git.farh.net/groombook/cache:reset + cache-to: type=registry,ref=git.farh.net/groombook/cache:reset,mode=max From 5ec9e9a8fdf0a05fed627147bd95d6ca5b73e2e0 Mon Sep 17 00:00:00 2001 From: Flea Flicker Date: Sat, 30 May 2026 05:14:51 +0000 Subject: [PATCH 5/5] fix(ci): correct typo groombok->groombook and fix Reset image cache-from indentation - Fix API image tag typo: groombok -> groombook (line 103) - Fix Reset image cache-from/cache-to indentation: moved from under tags: (12 spaces) to under with: (10 spaces) - This corrects the Reset image build failure in CI runs. --- .gitea/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 867246f..9103390 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -100,7 +100,7 @@ jobs: push: true tags: | git.farh.net/groombook/api:${{ steps.version.outputs.tag }} - ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombok/api:latest' || '' }} + ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/api:latest' || '' }} cache-from: type=registry,ref=git.farh.net/groombook/cache:api cache-to: type=registry,ref=git.farh.net/groombook/cache:api,mode=max @@ -154,5 +154,5 @@ jobs: tags: | git.farh.net/groombook/reset:${{ steps.version.outputs.tag }} ${{ github.ref == 'refs/heads/main' && 'git.farh.net/groombook/reset:latest' || '' }} - cache-from: type=registry,ref=git.farh.net/groombook/cache:reset - cache-to: type=registry,ref=git.farh.net/groombook/cache:reset,mode=max + cache-from: type=registry,ref=git.farh.net/groombook/cache:reset + cache-to: type=registry,ref=git.farh.net/groombook/cache:reset,mode=max