Started investigation. Analyzing the sitter booking request detail data flow, writing an implementation plan, then I will add regression coverage before touching the rendering logic.
Standalone QA Hub
Issue #47
/at/petsitter/bookings/132704 · 2026-03-10 12:01:45
Screenshot
Stored at legacy-import/issues/163/1772614604910-6e95e8f6-93e0-490f-8683-7ef1e0dd0d05.png
Metadata
Selector candidates
[
{
"matches": 7,
"score": 76,
"selector": "div.bg-card.text-card-foreground.flex",
"strategy": "class"
},
{
"matches": 6,
"score": 60,
"selector": "div:nth-of-type(4)",
"strategy": "nth-of-type"
},
{
"matches": 4,
"score": 58,
"selector": "div \u003e div \u003e div \u003e div \u003e div \u003e div:nth-of-type(4)",
"strategy": "ancestor-path"
}
]
Target fingerprint
{
"ancestorPath": [
"div",
"div",
"div",
"div",
"div",
"div"
],
"ariaLabel": null,
"className": "bg-card text-card-foreground flex flex-col border py-6 gap-6 overflow-hidden rounded-2xl border-border/80 shadow-[0_8px_",
"href": null,
"id": null,
"name": null,
"role": null,
"tagName": "div",
"textSample": "Pet Information Caramel Dog Labrador Charli Dog Age: 3"
}
Secondary signal
{
"hasFiberInstance": true,
"reactComponentStack": [
"div",
"i",
"Content",
"d",
"V",
"H",
"x",
"c",
"f",
"T",
"E",
"j"
],
"reactOwnerStack": [],
"source": "react-fiber"
}
Layout evidence
bbox:
{
"bottom": 785,
"height": 294,
"left": 49,
"right": 937,
"top": 491,
"width": 888,
"x": 49,
"y": 491
}
viewport:
{
"height": 1112,
"width": 986
}
scroll:
{
"x": 0,
"y": 710
}
screenshotMarks:
[]
DOM excerpt
<div data-slot="card" class="bg-card text-card-foreground flex flex-col border py-6 gap-6 overflow-hidden rounded-2xl border-border/80 shadow-[0_8px_22px_rgba(15,23,42,0.05)]" data-sentry-component="Card" data-sentry-source-file="card.tsx"><div data-slot="card-header" class="@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6 pb-3" data-sentry-component="CardHeader" data-sentry-source-file="card.tsx"><div data-slot="card-title" class="font-semibold text-base" data-sentry-component="CardTitle" data-sentry-source-file="card.tsx">Pet Information</div></div><div data-slot="card-content" class="px-6 pt-0 space-y-3" data-sentry-component="CardContent" data-sentry-source-file="card.tsx"><div class="space-y-2.5"><div class="rounded-xl border border-border/80 bg-muted/25 px-3 py-3"><div class="space-y-1.5 text-sm"><div class="flex flex-wrap items-center gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-paw-print h-4 w-4 shrink-0 text-muted-foreground" aria-hidden="true"><circle cx="11" cy="4" r="2"></circle><circle cx="18" cy="8" r="2"></circle><circle cx="20" cy="16" r="2"></circle><path d="M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z"></path></svg><span class="font-medium text-foreground break-words">Caramel</span><span data-slot="badge" class="inline-flex items-center justify-center rounded-full border font-semibold w-fit whitespace-nowrap [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-all duration-300 overflow-hidden text-foreground border-gray-200 [a&]:hover:bg-gradient-to-r [a&]:hover:from-accent [a&]:hover:to-accent/80 [a&]:hover:text-accent-foreground [a&]:hover:scale-105 px-3 py-1 text-xs [&>svg]:size-3 gap-1 shadow-sm shrink-0" data-sentry-element="Comp" data-sentry-component="Badge" data-sentry-source-file="badge.tsx">Dog</span></div><div class="pl-6 text-muted-foreground leading-snug break-words">Labrador</div></div></div><div class="rounded-xl border border-border/80 bg-muted/25 px-3 py-3"><div class="space-y-1.5 text-sm"><div class="flex flex-wrap items-center gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-paw-print h-4 w-4 shrink-0 text-muted-foreground" aria-hidden="true"><circle cx="11" cy="4" r="2"></circle><circle cx="18" cy="8" r="2"></circle><circle cx="20" cy="16" r="2"></circle><path d="M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z"></path></svg><span class="font-medium text-foreground break-words">Charli</span><span data-slot="badge" class="inline-flex items-center justify-center rounded-full border font-semibold w-fit whitespace-nowrap [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-all duration-300 overflow-hidden text-foreground border-gray-200 [a&]:hover:bg-gradient-to-r [a&]:hover:from-accent [a&]:hover:to-accent/80 [a&]:hover:text-accent-foreground [a&]:hover:scale-105 px-3 py-1 text-xs [&>svg]:size-3 gap-1 shadow-sm shrink-0" data-sentry-element="Comp" data-sentry-component="Badge" data-sentry-source-file="badge.tsx">Dog</span></div><div class="pl-6 text-muted-foreground leading-snug break-words">Age: 3</div></div></div></div></div></div>
Thread
Implemented and verified locally. Root cause: - The sitter booking detail skipped /api/bookings/:id/pet-profiles whenever petSnapshots already existed. - Even when full pet profiles were fetched, the UI dropped neutered and compatibility fields during normalization. What changed: - Always fetch full pet profiles when petIds exist. - Merge fetched profile data into existing booking pet snapshots by petId. - Render richer pet metadata in the overview Pet Information card and in the Pet Care tab, including neutered and compatibility flags when available. Regression tests added first, then implementation: - tests/unit/booking/petsitter-booking-detail-pet-profile-regression.test.tsx Targeted checks run: - pnpm exec vitest run tests/unit/booking/petsitter-booking-detail-pet-profile-regression.test.tsx - pnpm exec vitest run tests/unit/request-flow/details-drawer-pet-snapshots-guard.test.tsx - pnpm exec vitest run tests/unit/booking/use-booking-detail-copy-schedule.test.tsx Visual verification: - Seeded local scenario: reservation-pending-missing-pet-snapshots - Verified overview card now shows neutered + good-with-* metadata - Verified Pet Care tab now shows the same fields per pet - /api/bookings/156/pet-profiles returned 200 during the verification run Artifacts saved locally: - /tmp/qa-163-artifacts/qa-163-overview.png - /tmp/qa-163-artifacts/qa-163-pet-care.png
Overview verification screenshot from the sitter booking request detail after the fix.
qa-163-overview.png
Pet Care tab verification screenshot showing the enriched pet metadata after the fix.
qa-163-pet-care.png
Follow-up verification after adding gender rendering. DevTools MCP re-check results: - Desktop overview: Gender is visible inline in the Pet Information card for each pet. - Desktop Pet Care tab: Gender is visible as a dedicated field for each pet. - Mobile layout: Gender is visible inside the Pet Information accordion for each pet. - Network evidence: /api/bookings/161/pet-profiles returned 200 during the verification run. - Console evidence: no relevant runtime errors surfaced during this check.
Desktop overview verification screenshot showing gender inline in the Pet Information card.
qa-163-desktop-overview-gender.png
Desktop Pet Care tab verification screenshot showing gender as a dedicated field.
qa-163-desktop-pet-care-gender.png
Mobile verification screenshot showing gender inside the Pet Information accordion.
qa-163-mobile-overview-gender.png