✔ old business response is discarded when the active membership changes (4.194583ms) ✔ private calls carry business context but session discovery can detect another-tab switch (0.3225ms) ✔ failed write retains retry id, while an account switch clears it (3.585417ms) ✔ portal requests are independent of staff context changes (1.426417ms) ✔ private image response is discarded across an account switch (1.342583ms) ✔ private image lease is revoked on context change and release is idempotent (1.196417ms) ✔ staff switch does not revoke a customer portal image (0.525875ms) ✔ upload retry identity includes bytes, not just endpoint (6.825625ms) ✔ opening another preview does not announce an account switch; login does (1.480625ms) ✔ private PDF arriving after a customer session switch is discarded before download (0.707833ms) ✔ private PDF uses business context and only downloads confirmed PDF responses (22.540792ms) ✔ customer CSV cannot download after an owner business switch (0.142459ms) ✔ customer CSV enforces type and downloads the safe filename with credentials and business scope (0.249792ms) ✔ Week and day navigation cross months, years and UK clocks without shifting dates (6.433709ms) ✔ Midnight endings are exclusive while all-day end dates are inclusive (0.134833ms) ✔ Repeated UK hour shows distinguishable summer and winter clock labels (39.705209ms) ✔ matching contacts never select identity; inactive records cannot be transfer choices (2.376916ms) ✔ confirmation uses the exact preview rather than later selection and preserves false acknowledgement (0.086417ms) ✔ export filter is encoded and completion rows contain only explicitly selected exact evidence (0.554292ms) ✔ fractional lines round half up in integer pence before subtotal and VAT (1.021084ms) ✔ percentage deposit rounds half up and leaves the exact remaining pence (1.821459ms) ✔ invalid deposit percentages and sub-penny deposits are rejected (2.03825ms) ✔ stage editing cannot silently drop or add a penny (0.350292ms) ✔ opening a saved job and inspecting read-only history leaves editable facts clean (1.600334ms) ✔ job status changes and exact reversion are detected (0.217291ms) ✔ job notes changes and exact reversion are detected (0.137125ms) ✔ job scheduled_date changes and exact reversion are detected (0.20075ms) ✔ private job metadata priority stays protected (0.171291ms) ✔ private job metadata next_action stays protected (0.115708ms) ✔ private job metadata next_action_date stays protected (0.061917ms) ✔ private job metadata last_contact_date stays protected (0.051459ms) ✔ private job metadata completed_date stays protected (0.27525ms) ✔ private job metadata postcode_group stays protected (0.203667ms) ✔ private job metadata archived stays protected (0.59425ms) ✔ private job metadata followup_excluded stays protected (0.280334ms) ✔ valid equivalent tag case, spacing and order are clean; duplicate or invalid tags stay dirty (0.145125ms) ✔ a confirmed save advances only the saved snapshot, including after reopening (0.076542ms) ✔ failed and stale save attempts do not advance a draft baseline (0.731208ms) ✔ successful in-flight save accepts only the submitted values and preserves later text (0.568792ms) ✔ quote values cover each line, VAT, both dates and customer notes (0.56025ms) ✔ opening or cancelling a time editor is clean; blank override differs from an explicit zero rate (0.284667ms) ✔ transfer selection, reason and confirmation matter; object property order does not (0.723125ms) ✔ file selections and photo sharing fields remain distinct from viewing a photo (0.094375ms) ✔ clean leave executes immediately without a pending confirmation (4.162792ms) ✔ Keep editing and Escape cancellation execute nothing and preserve the selected draft (0.10675ms) ✔ dirty leave has one owner and repeated requests retain the first intended destination (0.306625ms) ✔ clean repeated clicks and async discard cannot execute twice or start a background action (0.702583ms) ✔ a failed logout exposes its error without changing private draft values (0.237292ms) ✔ an identity reset cancels pending leave and ignores completion from its old context (0.358833ms) ✔ selection rejects unsafe names, empty and oversized files but accepts supported size boundaries (1.590541ms) ✔ real HEIC content is selected without a native browser decoder or a misleading preview (8.839417ms) ✔ HEIF header checks do not accept a renamed non-image or an AVIF brand (0.517333ms) ✔ photo rejection 413 preserves selected bytes and permits a corrected retry (0.65175ms) ✔ photo rejection 415 preserves selected bytes and permits a corrected retry (1.000333ms) ✔ photo rejection 422 preserves selected bytes and permits a corrected retry (0.478458ms) ✔ selection checks image signatures instead of trusting extensions or declared MIME (0.198042ms) ✔ visitor sends without cookies; a successful result exposes no receipt or private references (0.707208ms) ✔ concurrent clicks coalesce into one logical request (0.2955ms) ✔ lost response retains exact payload/key; edits are blocked until the unchanged retry succeeds (0.451667ms) ✔ a stalled request times out and retries the identical logical enquiry (12.189334ms) ✔ ambiguous HTTP 408 retains the logical operation (0.333292ms) ✔ ambiguous HTTP 500 retains the logical operation (0.305625ms) ✔ ambiguous HTTP 503 retains the logical operation (0.18575ms) ✔ malformed success is uncertain and never produces a successful-looking enquiry (0.371083ms) ✔ validation error allows correction without discarding the selected files or date (0.246625ms) ✔ a deliberately separate matching-contact enquiry has a new operation identity (0.197375ms) ✔ public permission defaults to no projection and no rating (1.423125ms) ✔ approved statement retains exact customer text (0.19ms) ✔ approval requires explicit boolean and nonempty exact fields (0.298208ms) ✔ projection bounds are enforced (0.163ms) ✔ unconfirmed response does not produce a payload (0.2125ms) ✔ response keeps private answers separate from optional publication (0.197958ms) ✔ all four ratings and recommendation require a deliberate valid choice (0.2655ms) ✔ publication uses the exact current approved preview hash and version (0.183875ms) ✔ the repeated autumn hour requires the selected actual offset (10.593917ms) ✔ spring clock gap and seasonally incorrect offsets are rejected (1.669625ms) ✔ London date and intervals remain the same on a computer in another timezone (7.175125ms) ✔ incomplete, reversed and zero-duration correction inputs are rejected before saving (1.266041ms) ✔ customer price starts blank and no private source details become a document line (1.297459ms) ✔ timer display permits long captures but never negative elapsed time (0.121166ms) ✔ quoted commas, multiline text, escaped quotes, CRLF and blank lines (1.193ms) ✔ auto mapping and preview require explicit valid prices; no NaN/default repairs (0.645833ms) ✔ column mapping, row limits, reviewed price overrides and invalid costs (1.249666ms) ✔ reopened saved rows and reordered object fields are clean (1.037583ms) ✔ equivalent valid price and quantity spellings do not create unsaved changes (4.376291ms) ✔ every catalogue edit is protected and reverting to saved values is clean (5.573167ms) ✔ blank optional prices, zero and invalid numeric input remain distinct (0.292833ms) ✔ job selection, purchasing dates, notes and applied previous-price values are protected (0.415834ms) ✔ supplier reference edits, additions and removals are protected (0.454167ms) ✔ catalogue selection and CSV mapping or programmatic overrides are protected (0.294542ms) ✔ a persisted changed price becomes a clean reopened baseline (0.136834ms) ✔ comparison pairs render before then after without changing stored order (0.64725ms) ✔ reorder preserves identity and bounds (0.088833ms) ✔ public drafts and selected photos start with fresh public text (3.126167ms) ✔ response binds to displayed version and saved snapshot with deliberate confirmation (0.793291ms) ✔ expired quote cannot produce a response payload (0.070459ms) ✔ superseded quote cannot produce a response payload (0.44075ms) ✔ draft quote cannot produce a response payload (0.043625ms) ✔ already accepted quote cannot produce a response payload (0.045667ms) ✔ declined quote cannot produce a response payload (0.035959ms) ✔ missing snapshot review is rejected (0.07925ms) ✔ PDF links remain private and scoped to exact document or stage (0.081916ms) ✔ a preview never requests private draft content without valid matching owner access (4.912333ms) ✔ draft preview loads once under exact owner access; valid checks do not replace its saved content (2.992834ms) ✔ owner context changes clear a loaded preview while customer context changes do not (1.952875ms) ✔ preview invalidates changed owner context slug (2.864708ms) ✔ preview invalidates changed owner context role (3.144166ms) ✔ preview invalidates changed owner context membership_id (1.792625ms) ✔ preview invalidates changed owner context csrf (1.55ms) ✔ unavailable preview validation clears access and does not reload draft content (1.570917ms) ✔ logout during an initial draft load prevents its late response from exposing content (0.829792ms) ✔ preview deadline fails closed, coalesces checks and ignores late success (1.169375ms) ✔ closing a preview cancels listeners and ignores a pending load without reporting lost access (1.148459ms) ✔ private gallery preview loads under owner access once and valid checks retain its saved content (2.42575ms) ✔ gallery preview clears all held draft content on owner logout or account broadcast (2.338875ms) ✔ gallery preview clears changed owner business_id (1.743875ms) ✔ gallery preview clears changed owner slug (2.819208ms) ✔ gallery preview clears changed owner role (0.612875ms) ✔ gallery preview clears changed owner membership_id (0.536916ms) ✔ gallery preview clears changed owner csrf (0.766208ms) ✔ gallery preview rejects staff access and an unavailable exact-business project (2.625125ms) ✔ gallery preview cannot reappear from a late private response after access ends (1.34125ms) ✔ gallery preview fails closed when validation is unavailable and leaves no active polling (1.509083ms) ✔ gallery preview deadline ignores late load and closing cancels pending access (0.7315ms) ✔ feedback validation is request-only and valid checks never replace draft inputs (2.376708ms) ✔ contact, transfer and feedback changes revalidate without broadcasting codes or private answers (1.131667ms) ✔ feedback validation failure 401 clears only the request view (0.54ms) ✔ feedback validation failure 404 clears only the request view (0.581ms) ✔ feedback validation failure 503 clears only the request view (0.633ms) ✔ feedback checks coalesce, time out closed and cannot revive a view with a late result (0.619625ms) ✔ stopped feedback checks ignore a late rejection and release all timers and listeners (0.67975ms) ✔ portal 401 clears private context and image leases, rejects old work and preserves staff access (1.176291ms) ✔ public credential errors and another customer document 404 do not end a valid portal context (0.599792ms) ✔ focus, visibility and visible periodic checks preserve a valid context without resetting forms (0.850792ms) ✔ owner revoke, reissue, contact update and legacy rotation revalidate without blindly signing out (1.384625ms) ✔ another-tab access notice checks the active account and clears it only when validation fails (0.733ms) ✔ customer identity changes clear old content even if the browser cookie now authenticates successfully (0.543334ms) ✔ business identity changes clear old content even if the browser cookie now authenticates successfully (0.45325ms) ✔ unreachable validation fails closed and overlapping focus checks coalesce (0.502542ms) ✔ validation deadline clears content and a late successful response cannot restore it (0.636ms) ✔ stopping a watcher removes its deadline and ignores a late successful identity result (0.579667ms) ✔ apiImage clears current portal content on 401 but an old response cannot clear a newer session (0.4175ms) ✔ downloadPrivate clears current portal content on 401 but an old response cannot clear a newer session (0.509833ms) ✔ switching between week and month rules keeps valid explicit choices (2.771375ms) ✔ all-day conversion clears incompatible clock inputs (0.089958ms) ✔ single visit proposal retains original identity and requires fresh acknowledgement (0.067667ms) ✔ booking edits send booleans and exclude server and history fields (0.081875ms) ✔ suggested window is inclusive and bounded through DST (0.073083ms) ✔ month views include leap days and cross-year navigation (0.169791ms) ✔ range rejects reversed or over-62-day windows (0.099666ms) ✔ weekly windows and DST remain London calendar dates (0.055ms) ✔ excluded placeholder can propose a reviewed single-date override without assuming a booking (0.090208ms) ✔ new request, edited filter, context change and unmount reject late success and failure (0.728209ms) ✔ drills use exact customer/resource IDs and one metric, never matching names or allocating money (0.112166ms) ✔ supporting row pages disclose full totals and do not lose the final partial page (0.152459ms) ✔ exports bind applied filters and exact snapshot, not draft input; time displays exact minutes (0.939ms) ✔ service enquiry uses only the exact published business service and keeps its canonical title (0.489958ms) ✔ reordering is bounded, preserves identities and leaves the saved array untouched (0.368584ms) ✔ new page starts unpublished with independent editable content (1.931917ms) ✔ page and service routes resolve exactly and links retain the business prefix (0.09475ms) ✔ light and dark branding retain a contrasting button text colour (0.087ms) ✔ ready reviews exclude closed, snoozed and ineligible history (0.47425ms) ✔ snooze expiry uses the server effective state (0.083375ms) ✔ only preparation writes a draft and only snooze writes its date (0.089583ms) ✔ review confirmation is not inferred from a filled draft (0.44125ms) ✔ tag input retains duplicates for server validation (0.343083ms) ✔ all established workspace labels remain reachable alongside new sections (0.06325ms) ℹ tests 167 ℹ suites 0 ℹ pass 167 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 235.816959