← Post-phase server audit

Frontend ↔ backend gaps — REQ reconciliation

Generated from the canonical Markdown — do not hand-edit. Audit date 2026-07-10.

Audit date: 2026-07-10 · Sources: dev/shared-working-context/frontend/requests/for-backend.md (REQ-001…015), the frontend phase reports/STATUS (f0–f8), the client code's mock flags, the published contracts (dev/contracts/domains/*.md + dev/contracts/openapi/swagger.v1.json), and the server code. Every verdict was checked against both the contract surface and the actual DTO/handler/controller code.

Headline: the backend chain is complete (b0–b15), but of the 15 filed REQs only REQ-001 and REQ-015 are effectively satisfied and REQ-010 is a documentation fix — the other 12 are undelivered. Every REQ still reads Status: open in the tracker. As a direct consequence, 11 of the client's 12 service domains still default to mock-primary (only auth is real-default, client/src/services/auth/constants.ts:6). Beyond the filed REQs, the unbuilt frontend phases f9–f15 will consume backend surfaces that mostly exist — with one data gap (catalog option groups) and one pre-flagged shape gap (checkout VAT line).

Verdict summary

REQAsk (short)VerdictOne-line evidence
REQ-001Envelope / casing / pagination shapeDone (confirm + caveat)ApiResult + PagedResult match the typed shape; statusCode is an integer enum
REQ-002codeLength/expiresInSeconds on RequestOtpResultMissingRequestOtpResult.cs:7 has only OtpSent, ResendAvailableInSeconds
REQ-003Machine error codes for verify_otpMissingenvelope has no code slot; lockout differs only by message text
REQ-004activeRole on MeResult (confirmation)Missing (answer: client owns it)MeResult.cs:9 — no ActiveRole anywhere in the contract
REQ-005Patient relation + conditionsMissingPatientDto.cs:7, create/update commands unchanged
REQ-006Avatar upload route + avatarUrlMissingzero IFormFile/avatar matches in server/src
REQ-007Customer name + preferred languageMissingupsert body is emergency-contact only
REQ-008Accept client map pin on address create/updateMissingcommands have no lat/lng; always geocodes
REQ-009provinceId on CustomerAddressDtoMissingDTO ends at RecipientPhone
REQ-010pageSize vs page_sizePartialserver binds pageSize (verified); contract docs still say page_size
REQ-011Nurse credential_details endpoint + isRequiredMissingno such route/command; step DTO lacks isRequired
REQ-012Search row name/avatar/distance + GET nurses/{id}/profileMissingDTO ids-only; no profile action on NursesController
REQ-013variantPrice on BookingRequestDtoMissingDTO has unit without price
REQ-014variantLabel/patientAge on list itemMissinglist DTO omits both
REQ-015Status enum codes + checkInAddressMatch tri-state (confirmation)Done (verified in code)snake_case string constants on the wire; null-when-no-GPS confirmed

Per-REQ detail

REQ-001 — envelope, casing, pagination — Done, needs a written confirmation + one caveat

REQ-002 — OTP length + expiry — Missing

REQ-003 — machine-readable verify_otp errors — Missing

REQ-004 — activeRole confirmation — Missing (recommend: answer "client owns it")

REQ-005 — patient relation + conditions — Missing

REQ-006 — avatar upload + avatarUrl — Missing

REQ-007 — customer name + preferred language — Missing

REQ-008 — accept the client map pin — Missing

REQ-009 — provinceId on CustomerAddressDto — Missing

REQ-010 — pageSize param name — Partial (server verified; docs stale)

REQ-011 — nurse credential_details + isRequired — Missing

REQ-012 — search enrichment + public nurse profile — Missing (highest-leverage gap)

REQ-013 — variantPrice on BookingRequestDto — Missing

REQ-014 — variantLabel/patientAge on the inbox row — Missing

REQ-015 — enum codes + checkInAddressMatch tri-state — Done (verified), needs a written confirmation


Beyond the filed REQs — what f9–f15 will hit

Frontend phases f0–f8 are built (reports exist); f9–f15 are specs only. Reconciling their declared consumption against the shipped backend:

Upcoming phaseConsumesBackend realityVerdict
f9 checkout/cardb10 payments.md + b11 invoiceendpoints exist (initiate/webhook/GET invoices/{booking_id}), but no checkout-summary read with the VAT line — f8 already flagged BookingDetailDto has no tax field (reports/frontend-phase-8-report.md:113); f9's spec expects vat_irr/vat_rate/redirect_url shapes (dev/phases/frontend/frontend-phase-9-b10.md:117,330)Partial — pre-file the checkout-summary REQ now
f10 refund statusb11 refunds-invoices.mdGET refunds/{id}/status + GET invoices/{booking_id} shipped (Controllers/V1/RefundsController, InvoicesController)Done (verify shapes when f10 runs)
f11 BNPLb12 bnpl.mdfull eligibility→initiate→status surface shipped (CheckoutBnplController)Done (verify shapes)
f12 nurse earningsb13 payouts.mdnurse_payouts/history + admin console shipped (NursePayoutsController, AdminPayoutsController)Done (verify shapes)
f13 reviews/care recordsb14 reviews-records.mdsubmit/list/tags/moderation + care records shipped (5 controllers)Done (verify shapes)
f14 tickets + notificationsb15 + b1 notificationstickets shipped; notifications verified present: GET notifications/get_notifications/get_unread_count, POST mark_notification_read/mark_all_read (Controllers/V1/NotificationsController.cs:24-42) — the f14 spec's worry about missing b1 endpoints is unfoundedDone
f15 admin/partner consolesadmin endpoints across b1/b6/b11/b13/b14/b15all shipped per the chain (verification queue, refunds, payouts, moderation, config/holidays/audit/support-alerts, partner centers)Done (expect shape-polish REQs when f15 runs)

Data gap (not a contract gap): flipping USE_CATALOG_MOCK against a fresh backend yields categories with no option groups — only the 5 categories are seeded; groups/values are admin-authored and the admin catalog UI is f15 (reports/frontend-phase-4-report.md:92). Until f15 (or a seed migration), the variant builder's required-option step has nothing to render on the real path. Recommend: a small representative option-group seed, or prioritize the f15 catalog manager.

Tracker hygiene: all 15 REQs read Status: open (for-backend.md:32…216) and the mocks-registry's early block contradicts its own later rows (see plan §7.6). Whoever lands this batch should update both in the same change.


Frontend-unblock priority

  1. REQ-012 (search row enrichment + public profile) — unlocks the discovery funnel; everything downstream needs C2/C3 real. Include the nurse_search_index columns + reindex.
  2. REQ-005, REQ-008, REQ-009 — the booking-request inputs (patients, addresses) go real; REQ-008 also protects EVV accuracy.
  3. REQ-013, REQ-014 — the request flow prices/labels itself; with (1)+(2) the whole search→request→accept chain can flip to real.
  4. REQ-006, REQ-007 — profile/avatar polish; REQ-006 also feeds (1) and (3)'s avatar fields.
  5. REQ-011 — verification detail capture (stops silent INO/specialty data loss).
  6. REQ-002, REQ-003 — auth UX polish (real path already works without them).
  7. Zero-code batch: REQ-001, REQ-004, REQ-010, REQ-015 — written confirmations + contract-doc page_size sweep + tracker statuses.
  8. Pre-file the f9 checkout-summary REQ (VAT line, redirect_url, idempotency header echo) so b-side work can precede the f9 build.