Fixed in local dev and verified against the booking-completion regression scenario. Root cause: - the completed client request-flow card already had rebook support in the banner action registry, but the visible completed-state inline card never received a book_again CTA in the inline copy catalog - the summary contract only surfaced extra summary actions for the petsitter booking-request decline case, so the completed client card never promoted the rebook action alongside review/details Implementation: - added book_again to the stay_completed_client inline CTA catalog for EN plus DE/FR/ES/IT/NL/CA overrides - extended the request-flow summary contract so completed/reviewed client states keep the rebook action visible on the inline card while preserving See details Regression tests run: - pnpm vitest run tests/unit/booking/request-flow-contract.test.ts tests/unit/request-flow/request-flow-state-card-model-render.test.tsx tests/unit/messaging/client-messages-route-reset-regression.test.ts - result: 3 files passed, 20 tests passed Visual verification: - seeded /api/test/booking-completion on local dev for market AT, locale de, completed-single-day scenario - confirmed the completed client card now renders Leave a review + Book again + See details - confirmed Book again opens the AT search flow with booking context prefilled Artifacts: - /tmp/qa-168-artifacts/qa-168-completed-card.png - /tmp/qa-168-artifacts/qa-168-book-again-search.png
Standalone QA Hub
Issue #51
/at/client/messages · 2026-03-10 13:11:32
Screenshot
Stored at legacy-import/issues/168/1772784201117-bedd54a8-7d5a-4c78-bb39-ca7cb5c202a3.png
Metadata
Selector candidates
[
{
"matches": 46,
"score": 76,
"selector": "div.bg-white.border.border-\\[\\#E3EDF7\\]",
"strategy": "class"
},
{
"matches": 230,
"score": 60,
"selector": "div:nth-of-type(1)",
"strategy": "nth-of-type"
},
{
"matches": 206,
"score": 58,
"selector": "div \u003e div \u003e div \u003e div \u003e div \u003e div:nth-of-type(1)",
"strategy": "ancestor-path"
}
]
Target fingerprint
{
"ancestorPath": [
"div",
"div",
"div",
"div",
"div",
"div"
],
"ariaLabel": null,
"className": "bg-white border border-[#E3EDF7] rounded-2xl p-5 w-full max-w-[500px] shadow-[0_1px_2px_rgba(0,0,0,0.04)]",
"href": null,
"id": null,
"name": null,
"role": null,
"tagName": "div",
"textSample": "Caramel's stay with estelle is complete ✅ Dog Walking • 1 mars – 1 mars Caramel's stay with estelle is now complete. Lea"
}
Secondary signal
{
"hasFiberInstance": true,
"reactComponentStack": [
"div",
"sa",
"eO",
"su",
"Content",
"o",
"D",
"_",
"x",
"c",
"f",
"T"
],
"reactOwnerStack": [],
"source": "react-fiber"
}
Layout evidence
bbox:
{
"bottom": 936,
"height": 260,
"left": 17,
"right": 517,
"top": 676,
"width": 500,
"x": 17,
"y": 676
}
viewport:
{
"height": 1120,
"width": 992
}
scroll:
{
"x": 0,
"y": 0
}
screenshotMarks:
[]
DOM excerpt
<div class="bg-white border border-[#E3EDF7] rounded-2xl p-5 w-full max-w-[500px] shadow-[0_1px_2px_rgba(0,0,0,0.04)]"><div class="flex items-start gap-4 mb-4"><div class="w-10 h-10 rounded-full flex items-center justify-center shrink-0 mt-1 bg-green-50 text-green-600"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 576 512" class="text-base" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"></path></svg></div><div class="flex-1"><h3 class="text-[#1F2937] text-lg font-semibold leading-tight mb-1">Caramel's stay with estelle is complete ✅</h3><p class="text-[#6B7280] text-sm mb-2">Dog Walking • 1 mars – 1 mars</p><p class="text-[#6B7280] text-sm leading-relaxed mb-3">Caramel's stay with estelle is now complete. Leave a review to share your experience.</p></div></div><div class="flex flex-col items-center gap-3 mt-2"><button data-slot="button" class="inline-flex items-center justify-center gap-2 whitespace-nowrap disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-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 has-[>svg]:px-4 w-full bg-[#7fbce6] text-white h-11 px-4 rounded-xl text-[15px] font-medium transition-colors shadow-sm hover:bg-[#6ca8d1]" type="button" data-sentry-element="Comp" data-sentry-component="Button" data-sentry-source-file="button.tsx">Leave a review</button><button type="button" class="text-[#6B7280] text-sm font-medium hover:text-[#7fbce6] hover:underline transition-colors pb-1" data-sentry-component="InlineLinkAction" data-sentry-source-file="RequestFlowStateCard.tsx">See details</button></div></div>
Thread
Visual verification screenshot: completed client card now shows Leave a review, Book again, and See details.
qa-168-completed-card.png
Visual verification screenshot: Book again opens the prefilled AT search flow.
qa-168-book-again-search.png
Updated visual verification: Book again opens the sitter profile route, not general search.
qa-168-book-again-opens-sitter-profile.png
Updated visual verification: Book again opens the sitter profile route, not general search.
qa-168-book-again-opens-sitter-profile.png
Product clarification: this issue should remain single-CTA. The previous change that exposed Book again on the completed card before review was reverted. Correct behavior is: completed stay -> Leave a review only; after review submitted -> Book again. Prior visual verification comments for the dual-CTA behavior are superseded.