✔ typed durable note calls retain CSRF, business, no-store and response epoch boundaries (11.912292ms) ✔ typed note flag does not disable ordinary idempotency on arbitrary routes (1.742083ms) ✔ old business response is discarded when the active membership changes (1.626584ms) ✔ private calls carry business context but session discovery can detect another-tab switch (0.484708ms) ✔ failed write retains retry id, while an account switch clears it (0.5445ms) ✔ portal requests are independent of staff context changes (0.321458ms) ✔ private image response is discarded across an account switch (2.901834ms) ✔ private image lease is revoked on context change and release is idempotent (1.174458ms) ✔ staff switch does not revoke a customer portal image (0.360792ms) ✔ upload retry identity includes bytes, not just endpoint (8.972791ms) ✔ opening another preview does not announce an account switch; login does (1.731084ms) ✔ private PDF arriving after a customer session switch is discarded before download (0.23575ms) ✔ private PDF uses business context and only downloads confirmed PDF responses (39.100125ms) ✔ customer CSV cannot download after an owner business switch (0.161208ms) ✔ customer CSV enforces type and downloads the safe filename with credentials and business scope (0.26925ms) ✔ Week and day navigation cross months, years and UK clocks without shifting dates (17.749667ms) ✔ Midnight endings are exclusive while all-day end dates are inclusive (0.203583ms) ✔ Repeated UK hour shows distinguishable summer and winter clock labels (67.227625ms) ✔ matching contacts never select identity; inactive records cannot be transfer choices (4.76825ms) ✔ confirmation uses the exact preview rather than later selection and preserves false acknowledgement (0.20475ms) ✔ export filter is encoded and completion rows contain only explicitly selected exact evidence (0.501917ms) ✔ correction freezes the reviewed body and validates the durable exact outcome (0.821834ms) ✔ retention stores only authenticated ciphertext, no key/text/job/account/URL (29.402083ms) ✔ reopening is locked; same authorized key unlocks after reconnect (3.384833ms) ✔ another exact scope cannot list, claim or decrypt actor ciphertext (1.043333ms) ✔ reload retries same operation after before failure (7.207917ms) ✔ reload retries same operation after after failure (3.401667ms) ✔ concurrent enqueue does not disappear when an older item is acknowledged (1.408333ms) ✔ two tabs cannot concurrently claim one retained note (3.530083ms) ✔ late response after sign-out or switching cannot unlock or acknowledge (3.969292ms) ✔ late unlock result is ignored after access changes (0.363916ms) ✔ expired lease cannot retain, read or send and no reconnect submits work (1.370459ms) ✔ invalid reply preserves note and operation (1.363042ms) ✔ stale reply preserves note and operation (0.656542ms) ✔ denied reply preserves note and operation (0.487583ms) ✔ quota failure never reports retained or sends without a durable sending marker (0.750375ms) ✔ lost correction reply retains both versions and recovers same identity (4.717875ms) ✔ confirmed earlier revision retains proposed correction without duplicate (24.182542ms) ✔ update is blocked while retaining or sending, durable idle notes permit update (2.720334ms) ✔ storage loss is not presented as a successful confirmation (1.756917ms) ✔ key failure preserves ciphertext instead of silently resetting the store (7.964833ms) ✔ late local retention reply keeps one durable identity when editor retries (2.06425ms) ✔ failed local acknowledgement after server commit is safely resolved after reload (3.92225ms) ✔ unavailable IndexedDB denies retention before requesting a key (0.246542ms) ✔ fractional lines round half up in integer pence before subtotal and VAT (2.295834ms) ✔ percentage deposit rounds half up and leaves the exact remaining pence (1.284916ms) ✔ invalid deposit percentages and sub-penny deposits are rejected (0.251583ms) ✔ stage editing cannot silently drop or add a penny (0.264417ms) ✔ opening a saved job and inspecting read-only history leaves editable facts clean (3.143625ms) ✔ job status changes and exact reversion are detected (0.21875ms) ✔ job notes changes and exact reversion are detected (0.3675ms) ✔ job scheduled_date changes and exact reversion are detected (0.151834ms) ✔ private job metadata priority stays protected (0.08425ms) ✔ private job metadata next_action stays protected (0.171625ms) ✔ private job metadata next_action_date stays protected (0.134833ms) ✔ private job metadata last_contact_date stays protected (0.124792ms) ✔ private job metadata completed_date stays protected (0.130167ms) ✔ private job metadata postcode_group stays protected (3.985167ms) ✔ private job metadata archived stays protected (0.281542ms) ✔ private job metadata followup_excluded stays protected (0.186167ms) ✔ valid equivalent tag case, spacing and order are clean; duplicate or invalid tags stay dirty (0.257416ms) ✔ a confirmed save advances only the saved snapshot, including after reopening (0.262209ms) ✔ failed and stale save attempts do not advance a draft baseline (0.799125ms) ✔ successful in-flight save accepts only the submitted values and preserves later text (0.705625ms) ✔ quote values cover each line, VAT, both dates and customer notes (0.486083ms) ✔ opening or cancelling a time editor is clean; blank override differs from an explicit zero rate (0.372541ms) ✔ transfer selection, reason and confirmation matter; object property order does not (0.695708ms) ✔ file selections and photo sharing fields remain distinct from viewing a photo (0.187ms) ✔ clean leave executes immediately without a pending confirmation (5.942167ms) ✔ Keep editing and Escape cancellation execute nothing and preserve the selected draft (0.336084ms) ✔ dirty leave has one owner and repeated requests retain the first intended destination (2.024542ms) ✔ clean repeated clicks and async discard cannot execute twice or start a background action (0.453458ms) ✔ a failed logout exposes its error without changing private draft values (0.981042ms) ✔ an identity reset cancels pending leave and ignores completion from its old context (1.108291ms) ✔ selection rejects unsafe names, empty and oversized files but accepts supported size boundaries (1.309875ms) ✔ real HEIC content is selected without a native browser decoder or a misleading preview (16.689916ms) ✔ HEIF header checks do not accept a renamed non-image or an AVIF brand (0.440959ms) ✔ photo rejection 413 preserves selected bytes and permits a corrected retry (0.999292ms) ✔ photo rejection 415 preserves selected bytes and permits a corrected retry (0.205333ms) ✔ photo rejection 422 preserves selected bytes and permits a corrected retry (0.177375ms) ✔ selection checks image signatures instead of trusting extensions or declared MIME (0.090208ms) ✔ visitor sends without cookies; a successful result exposes no receipt or private references (0.254541ms) ✔ concurrent clicks coalesce into one logical request (0.127333ms) ✔ lost response retains exact payload/key; edits are blocked until the unchanged retry succeeds (0.891042ms) ✔ a stalled request times out and retries the identical logical enquiry (11.728459ms) ✔ ambiguous HTTP 408 retains the logical operation (0.64825ms) ✔ ambiguous HTTP 500 retains the logical operation (0.302375ms) ✔ ambiguous HTTP 503 retains the logical operation (0.197459ms) ✔ malformed success is uncertain and never produces a successful-looking enquiry (0.393625ms) ✔ validation error allows correction without discarding the selected files or date (0.303875ms) ✔ a deliberately separate matching-contact enquiry has a new operation identity (0.22125ms) ✔ public permission defaults to no projection and no rating (1.079208ms) ✔ approved statement retains exact customer text (0.173ms) ✔ approval requires explicit boolean and nonempty exact fields (0.321542ms) ✔ projection bounds are enforced (0.132292ms) ✔ unconfirmed response does not produce a payload (0.168542ms) ✔ response keeps private answers separate from optional publication (0.166792ms) ✔ all four ratings and recommendation require a deliberate valid choice (0.28075ms) ✔ publication uses the exact current approved preview hash and version (0.275917ms) ✔ the repeated autumn hour requires the selected actual offset (24.969917ms) ✔ spring clock gap and seasonally incorrect offsets are rejected (1.560458ms) ✔ London date and intervals remain the same on a computer in another timezone (0.612417ms) ✔ incomplete, reversed and zero-duration correction inputs are rejected before saving (0.442542ms) ✔ customer price starts blank and no private source details become a document line (0.10525ms) ✔ timer display permits long captures but never negative elapsed time (0.09125ms) ✔ quoted commas, multiline text, escaped quotes, CRLF and blank lines (2.906834ms) ✔ auto mapping and preview require explicit valid prices; no NaN/default repairs (1.208541ms) ✔ column mapping, row limits, reviewed price overrides and invalid costs (0.431916ms) ✔ reopened saved rows and reordered object fields are clean (1.292834ms) ✔ equivalent valid price and quantity spellings do not create unsaved changes (1.128417ms) ✔ every catalogue edit is protected and reverting to saved values is clean (0.50875ms) ✔ blank optional prices, zero and invalid numeric input remain distinct (0.350916ms) ✔ job selection, purchasing dates, notes and applied previous-price values are protected (0.301ms) ✔ supplier reference edits, additions and removals are protected (0.319083ms) ✔ catalogue selection and CSV mapping or programmatic overrides are protected (0.323959ms) ✔ a persisted changed price becomes a clean reopened baseline (0.13175ms) ✔ merge correction selection uses exact IDs and current versions without inferred matches (1.4185ms) ✔ attempt freezes the reviewed selection, explanation and scope independently of edits (0.185584ms) ✔ only the complete exact outcome is accepted for reactivation only (1.48ms) ✔ only the complete exact outcome is accepted for selected jobs (0.305125ms) ✔ comparison pairs render before then after without changing stored order (6.152875ms) ✔ reorder preserves identity and bounds (0.9605ms) ✔ public drafts and selected photos start with fresh public text (4.850625ms) ✔ response binds to displayed version and saved snapshot with deliberate confirmation (1.741125ms) ✔ expired quote cannot produce a response payload (0.910042ms) ✔ superseded quote cannot produce a response payload (0.15725ms) ✔ draft quote cannot produce a response payload (0.142583ms) ✔ already accepted quote cannot produce a response payload (0.097666ms) ✔ declined quote cannot produce a response payload (0.086209ms) ✔ missing snapshot review is rejected (0.240209ms) ✔ PDF links remain private and scoped to exact document or stage (0.206208ms) ✔ a preview never requests private draft content without valid matching owner access (14.374458ms) ✔ draft preview loads once under exact owner access; valid checks do not replace its saved content (6.160042ms) ✔ owner context changes clear a loaded preview while customer context changes do not (4.075666ms) ✔ preview invalidates changed owner context slug (13.811291ms) ✔ preview invalidates changed owner context role (2.225791ms) ✔ preview invalidates changed owner context membership_id (1.295166ms) ✔ preview invalidates changed owner context csrf (0.956292ms) ✔ unavailable preview validation clears access and does not reload draft content (0.780625ms) ✔ logout during an initial draft load prevents its late response from exposing content (0.722375ms) ✔ preview deadline fails closed, coalesces checks and ignores late success (1.463792ms) ✔ closing a preview cancels listeners and ignores a pending load without reporting lost access (3.064792ms) ✔ private gallery preview loads under owner access once and valid checks retain its saved content (2.413583ms) ✔ gallery preview clears all held draft content on owner logout or account broadcast (1.873291ms) ✔ gallery preview clears changed owner business_id (1.037167ms) ✔ gallery preview clears changed owner slug (0.826833ms) ✔ gallery preview clears changed owner role (0.706ms) ✔ gallery preview clears changed owner membership_id (0.610333ms) ✔ gallery preview clears changed owner csrf (0.566875ms) ✔ gallery preview rejects staff access and an unavailable exact-business project (0.861916ms) ✔ gallery preview cannot reappear from a late private response after access ends (2.037458ms) ✔ gallery preview fails closed when validation is unavailable and leaves no active polling (1.71775ms) ✔ gallery preview deadline ignores late load and closing cancels pending access (2.960333ms) ✔ feedback validation is request-only and valid checks never replace draft inputs (3.710584ms) ✔ contact, transfer and feedback changes revalidate without broadcasting codes or private answers (1.551125ms) ✔ feedback validation failure 401 clears only the request view (0.725625ms) ✔ feedback validation failure 404 clears only the request view (0.578ms) ✔ feedback validation failure 503 clears only the request view (1.077125ms) ✔ feedback checks coalesce, time out closed and cannot revive a view with a late result (1.292375ms) ✔ stopped feedback checks ignore a late rejection and release all timers and listeners (2.220459ms) ✔ portal 401 clears private context and image leases, rejects old work and preserves staff access (2.229ms) ✔ public credential errors and another customer document 404 do not end a valid portal context (1.97675ms) ✔ focus, visibility and visible periodic checks preserve a valid context without resetting forms (1.137083ms) ✔ owner revoke, reissue, contact update and legacy rotation revalidate without blindly signing out (1.033417ms) ✔ another-tab access notice checks the active account and clears it only when validation fails (0.713542ms) ✔ customer identity changes clear old content even if the browser cookie now authenticates successfully (0.8265ms) ✔ business identity changes clear old content even if the browser cookie now authenticates successfully (0.631041ms) ✔ unreachable validation fails closed and overlapping focus checks coalesce (0.647167ms) ✔ validation deadline clears content and a late successful response cannot restore it (0.55825ms) ✔ stopping a watcher removes its deadline and ignores a late successful identity result (0.553416ms) ✔ apiImage clears current portal content on 401 but an old response cannot clear a newer session (0.477417ms) ✔ downloadPrivate clears current portal content on 401 but an old response cannot clear a newer session (0.442916ms) ✔ install verifies every exact asset, never caches HTML navigation, and never forces activation (29.023958ms) ✔ corrupt, missing, redirected and wrong-type shell responses fail installation without touching previous caches (11.298125ms) ✔ all mutations, APIs, private images/documents, queries, ranges and foreign requests bypass cache (3.664875ms) ✔ fresh navigations are network-only; offline and 503 return neutral fallback without recording URL or credentials (3.726125ms) ✔ old hashed bundles coexist; unknown assets are never learned or read from unrelated caches (9.517375ms) ✔ cleanup retains old/unresponsive tabs and removes only our obsolete namespace when all current (1504.289125ms) ✔ updates require every tab to prepare; dirty/uncertain/unresponsive/changed tab sets postpone (1507.13ms) ✔ only a deliberate request from a window with all safe responses can activate (2.797916ms) ✔ switching between week and month rules keeps valid explicit choices (3.342875ms) ✔ all-day conversion clears incompatible clock inputs (0.578833ms) ✔ single visit proposal retains original identity and requires fresh acknowledgement (0.171416ms) ✔ booking edits send booleans and exclude server and history fields (0.101958ms) ✔ suggested window is inclusive and bounded through DST (0.102584ms) ✔ month views include leap days and cross-year navigation (0.156334ms) ✔ range rejects reversed or over-62-day windows (0.094541ms) ✔ weekly windows and DST remain London calendar dates (0.054417ms) ✔ excluded placeholder can propose a reviewed single-date override without assuming a booking (0.09125ms) ✔ new request, edited filter, context change and unmount reject late success and failure (1.648792ms) ✔ drills use exact customer/resource IDs and one metric, never matching names or allocating money (0.2595ms) ✔ supporting row pages disclose full totals and do not lose the final partial page (0.937167ms) ✔ exports bind applied filters and exact snapshot, not draft input; time displays exact minutes (0.282041ms) ✔ service enquiry uses only the exact published business service and keeps its canonical title (0.995416ms) ✔ reordering is bounded, preserves identities and leaves the saved array untouched (0.617708ms) ✔ new page starts unpublished with independent editable content (3.9685ms) ✔ page and service routes resolve exactly and links retain the business prefix (0.10875ms) ✔ light and dark branding retain a contrasting button text colour (0.095417ms) ✔ draft, timer and in-flight blocks compose and are released independently (0.68325ms) ✔ new requests wait for the bounded update hold without starting or losing work (0.190125ms) ✔ unresolved ordinary saves block updates, reuse their operation ID, and known outcomes clear the block (4.237042ms) ✔ the form safety net detects edited mounted fields, accepts reversal and ignores removed forms (0.974459ms) ✔ registration does not reload on controller change; clean tab holds/release and old protocol is ignored (0.884917ms) ✔ dirty local page refuses update before contacting the worker and leaves current UI intact (0.186875ms) ✔ ready reviews exclude closed, snoozed and ineligible history (0.4055ms) ✔ snooze expiry uses the server effective state (0.080666ms) ✔ only preparation writes a draft and only snooze writes its date (0.501375ms) ✔ review confirmation is not inferred from a filled draft (0.074042ms) ✔ tag input retains duplicates for server validation (0.39775ms) ✔ all established workspace labels remain reachable alongside new sections (0.072958ms) ℹ tests 210 ℹ suites 0 ℹ pass 210 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 3413.924042