<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="148" time="46.040" timestamp="2026-10-31T09:20:25.898440+00:00" hostname="6a:9e:8c:72:41:3e"><testcase classname="tests.test_device_notes" name="test_lost_before_send_and_after_commit_reload_same_identity" time="0.402" /><testcase classname="tests.test_device_notes" name="test_concurrent_duplicate_and_distinct_notes" time="0.222" /><testcase classname="tests.test_device_notes" name="test_correction_fences_late_old_send_and_preserves_id" time="0.232" /><testcase classname="tests.test_device_notes" name="test_correction_after_lost_committed_reply_returns_original_receipt" time="0.186" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[scope]" time="0.273" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[device]" time="0.283" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[job]" time="0.257" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[business]" time="0.260" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[actor]" time="0.236" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[disabled]" time="0.263" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[expired]" time="0.237" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[archived]" time="0.244" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[transferred]" time="0.240" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[removed_assignment]" time="0.288" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[archived_resource]" time="0.254" /><testcase classname="tests.test_device_notes" name="test_current_authority_even_after_confirmation[deleted]" time="0.244" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra0]" time="0.206" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra1]" time="0.195" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra2]" time="0.254" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra3]" time="0.184" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra4]" time="0.189" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra5]" time="0.186" /><testcase classname="tests.test_device_notes" name="test_rejects_untyped_work_without_creating_a_log[extra6]" time="0.182" /><testcase classname="tests.test_device_notes" name="test_scope_separation_and_password_rotation" time="0.183" /><testcase classname="tests.test_device_notes" name="test_recovery_keeps_logs_history_and_receipts_but_cannot_unlock_old_device_notes" time="0.719" /><testcase classname="tests.test_device_notes" name="test_unauthenticated_and_missing_csrf_cannot_unlock" time="0.176" /><testcase classname="tests.test_fieldwork" name="test_active_jobs_exact_staff_scope_and_no_finances" time="0.282" /><testcase classname="tests.test_fieldwork" name="test_timer_pause_resume_rounding_team_costs_and_no_double_count" time="0.229" /><testcase classname="tests.test_fieldwork" name="test_timer_retry_concurrency_and_cross_job_resource_lock" time="0.234" /><testcase classname="tests.test_fieldwork" name="test_lost_heartbeat_and_restart_never_add_downtime" time="0.368" /><testcase classname="tests.test_fieldwork" name="test_server_clock_drift_interrupts_at_last_confirmed_time[-60]" time="0.180" /><testcase classname="tests.test_fieldwork" name="test_server_clock_drift_interrupts_at_last_confirmed_time[3600]" time="0.184" /><testcase classname="tests.test_fieldwork" name="test_dst_actual_elapsed_not_wall_clock_hours[2026-03-29T00:30:00+00:00-2026-03-29T01:30:00+00:00-60]" time="0.000" /><testcase classname="tests.test_fieldwork" name="test_dst_actual_elapsed_not_wall_clock_hours[2026-10-25T01:30:00+01:00-2026-10-25T01:30:00+00:00-60]" time="0.000" /><testcase classname="tests.test_fieldwork" name="test_london_midnight_splits_actual_milliseconds_and_dates" time="0.000" /><testcase classname="tests.test_fieldwork" name="test_revoked_assignment_blocks_cached_timer_and_log_writes" time="0.251" /><testcase classname="tests.test_fieldwork" name="test_staff_cannot_attribute_unassigned_person_or_owner_review" time="0.243" /><testcase classname="tests.test_fieldwork" name="test_review_correction_retains_rates_archives_prior_conversion_and_prevents_overlap" time="0.332" /><testcase classname="tests.test_fieldwork" name="test_field_logs_exact_photos_review_material_conversion_and_relink_guard" time="0.214" /><testcase classname="tests.test_fieldwork" name="test_source_draft_never_auto_shares_and_preserves_costs" time="0.258" /><testcase classname="tests.test_fieldwork" name="test_duplicate_source_claim_concurrency_and_rollback" time="0.236" /><testcase classname="tests.test_fieldwork" name="test_quote_revision_conversion_cancel_void_and_replacement_claims" time="1.050" /><testcase classname="tests.test_fieldwork" name="test_draft_source_changes_block_issue_until_explicit_refresh" time="0.221" /><testcase classname="tests.test_fieldwork" name="test_removed_source_is_released_and_manual_lines_remain_possible" time="0.368" /><testcase classname="tests.test_fieldwork" name="test_source_review_requires_explicit_strict_acknowledgement[False]" time="0.361" /><testcase classname="tests.test_fieldwork" name="test_source_review_requires_explicit_strict_acknowledgement[1]" time="0.173" /><testcase classname="tests.test_fieldwork" name="test_source_review_requires_explicit_strict_acknowledgement[true]" time="0.168" /><testcase classname="tests.test_fieldwork" name="test_cached_start_and_heartbeat_recheck_team_and_account[coworker_archive]" time="0.278" /><testcase classname="tests.test_fieldwork" name="test_cached_start_and_heartbeat_recheck_team_and_account[coworker_unassign]" time="0.283" /><testcase classname="tests.test_fieldwork" name="test_cached_start_and_heartbeat_recheck_team_and_account[staff_disable]" time="0.373" /><testcase classname="tests.test_fieldwork" name="test_owner_can_resolve_closed_job_after_staff_access_ends" time="0.262" /><testcase classname="tests.test_fieldwork" name="test_invalid_review_never_changes_raw_history[invalid0]" time="0.199" /><testcase classname="tests.test_fieldwork" name="test_invalid_review_never_changes_raw_history[invalid1]" time="0.204" /><testcase classname="tests.test_fieldwork" name="test_invalid_review_never_changes_raw_history[invalid2]" time="0.191" /><testcase classname="tests.test_fieldwork" name="test_invalid_review_never_changes_raw_history[invalid3]" time="0.191" /><testcase classname="tests.test_fieldwork" name="test_invalid_review_never_changes_raw_history[invalid4]" time="0.193" /><testcase classname="tests.test_fieldwork" name="test_invalid_review_never_changes_raw_history[invalid5]" time="0.295" /><testcase classname="tests.test_fieldwork" name="test_minute_capacity_failure_rolls_back_entire_two_person_conversion" time="0.209" /><testcase classname="tests.test_fieldwork" name="test_tiny_capture_requires_correction_or_discard_and_retains_raw_time" time="0.206" /><testcase classname="tests.test_fieldwork" name="test_partial_reservation_failure_keeps_existing_draft_and_claims" time="0.200" /><testcase classname="tests.test_fieldwork" name="test_sources_reject_other_job_business_and_generated_time" time="0.245" /><testcase classname="tests.test_fieldwork" name="test_changed_quote_source_cannot_be_shared_accepted_privately_or_converted" time="0.236" /><testcase classname="tests.test_fieldwork" name="test_paid_invoice_keeps_source_reserved_and_void_releases_unpaid_only" time="0.354" /><testcase classname="tests.test_fieldwork" name="test_field_history_cannot_use_retired_unreviewed_customer_relink" time="0.187" /><testcase classname="tests.test_fieldwork" name="test_closed_job_with_only_field_logs_stays_in_owner_review_queue" time="0.191" /><testcase classname="tests.test_field_recovery" name="test_four_business_field_loss_restore_and_interrupted_clocks" time="2.093" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[customer]" time="0.224" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[raw_interval]" time="0.339" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[locks]" time="0.238" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[rate]" time="0.226" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[time_link]" time="0.224" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[time_cost]" time="0.225" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[history]" time="0.233" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[membership]" time="0.321" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[source_line]" time="0.232" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[source_snapshot]" time="0.239" /><testcase classname="tests.test_field_recovery" name="test_field_backup_rejects_inconsistent_provenance[source_history]" time="0.230" /><testcase classname="tests.test_field_recovery" name="test_historical_manual_and_material_sources_remain_valid_after_correction" time="0.252" /><testcase classname="tests.test_field_recovery" name="test_pinned_format_five_restores_populated_records_with_empty_field_tables" time="0.385" /><testcase classname="tests.test_identity" name="test_third_business_empty_retry_restart_and_switch" time="0.436" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[api]" time="0.277" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[../other]" time="0.208" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[Caps]" time="0.190" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[double--dash]" time="0.222" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[short_thing]" time="0.181" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[-start]" time="0.296" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[end-]" time="0.201" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[ab]" time="0.177" /><testcase classname="tests.test_identity" name="test_business_slug_rejected[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]" time="0.200" /><testcase classname="tests.test_identity" name="test_provision_concurrency_same_and_distinct_slugs" time="0.319" /><testcase classname="tests.test_identity" name="test_failed_provision_rolls_back_then_retry_succeeds[staged]" time="0.301" /><testcase classname="tests.test_identity" name="test_failed_provision_rolls_back_then_retry_succeeds[renamed]" time="0.351" /><testcase classname="tests.test_identity" name="test_failed_provision_rolls_back_then_retry_succeeds[before_commit]" time="0.238" /><testcase classname="tests.test_identity" name="test_crash_marker_cleanup_only_matching_uncommitted_data" time="0.245" /><testcase classname="tests.test_identity" name="test_default_deny_complete_inventory_and_every_owner_endpoint" time="0.409" /><testcase classname="tests.test_identity" name="test_staff_assignments_projection_notes_and_revoked_resource" time="0.277" /><testcase classname="tests.test_identity" name="test_unlinked_staff_never_match_name_or_email" time="0.265" /><testcase classname="tests.test_identity" name="test_membership_disable_role_change_and_last_owner" time="0.306" /><testcase classname="tests.test_identity" name="test_two_owners_cannot_concurrently_remove_last_owner" time="0.342" /><testcase classname="tests.test_identity" name="test_invites_scope_expiry_reissue_reuse_and_existing_password" time="0.387" /><testcase classname="tests.test_identity" name="test_invitation_concurrent_consume_and_resource_ownership" time="0.271" /><testcase classname="tests.test_identity" name="test_reset_generic_hashed_capture_reuse_and_cross_business_revocation" time="0.696" /><testcase classname="tests.test_identity" name="test_expired_superseded_and_password_change_reset_codes" time="0.797" /><testcase classname="tests.test_identity" name="test_reset_capture_failure_and_rate_fail_closed" time="1.211" /><testcase classname="tests.test_identity" name="test_setup_resume_requires_real_local_progress" time="0.425" /><testcase classname="tests.test_identity" name="test_customer_cookie_and_cross_tenant_memberships_never_authorize_staff" time="0.260" /><testcase classname="tests.test_identity" name="test_four_business_recovery_preserves_inactive_links_never_auth_tokens" time="0.854" /><testcase classname="tests.test_identity" name="test_registry_credential_and_foreign_resource_corruption_rejected" time="0.308" /><testcase classname="tests.test_identity" name="test_missing_registered_storage_fails_closed" time="0.308" /><testcase classname="tests.test_identity" name="test_simultaneous_same_operation_provisions_once" time="0.232" /><testcase classname="tests.test_identity" name="test_reset_consumed_once_concurrently_and_disabled_member_stays_disabled" time="0.606" /><testcase classname="tests.test_identity" name="test_removing_owner_revokes_their_unaccepted_invites" time="0.261" /><testcase classname="tests.test_identity" name="test_explicit_resource_change_revokes_sessions_and_owner_only_audit" time="0.267" /><testcase classname="tests.test_identity" name="test_v06_existing_data_migrates_memberships_once_and_v3_restore" time="0.485" /><testcase classname="tests.test_identity" name="test_mock_capture_cli_prints_only_private_path" time="0.644" /><testcase classname="tests.test_identity" name="test_disabled_owner_membership_can_be_disabled_without_removing_active_owner" time="0.241" /><testcase classname="tests.test_identity" name="test_provision_identity_collision_does_not_delete_existing_business" time="0.203" /><testcase classname="tests.test_boundaries" name="test_fresh_businesses_empty_and_separate_files" time="0.205" /><testcase classname="tests.test_boundaries" name="test_auth_csrf_origin_host_and_security_headers" time="0.179" /><testcase classname="tests.test_boundaries" name="test_cross_business_reads_writes_and_body_tenant_spoof" time="0.263" /><testcase classname="tests.test_boundaries" name="test_public_capture_routes_exact_business_and_deduplicates_retries" time="0.205" /><testcase classname="tests.test_boundaries" name="test_two_customers_same_name_email_have_separate_portals" time="0.335" /><testcase classname="tests.test_boundaries" name="test_portal_drafts_hidden_acceptance_and_immediate_revocation" time="0.228" /><testcase classname="tests.test_boundaries" name="test_portal_replacing_code_revokes_old_session" time="0.185" /><testcase classname="tests.test_boundaries" name="test_money_rounding_invoice_snapshot_idempotency_and_overpayment" time="0.222" /><testcase classname="tests.test_boundaries" name="test_concurrent_payments_do_not_lose_or_double_count" time="0.221" /><testcase classname="tests.test_boundaries" name="test_optimistic_job_update_rejects_stale_version" time="0.189" /><testcase classname="tests.test_boundaries" name="test_site_draft_publish_restore_and_tenant_separation" time="0.349" /><testcase classname="tests.test_boundaries" name="test_image_validation_and_publication_access" time="0.354" /><testcase classname="tests.test_boundaries" name="test_password_change_and_logout_invalidate_sessions" time="0.267" /><testcase classname="tests.test_boundaries" name="test_rate_limit_and_no_sensitive_validation_echo" time="0.383" /><testcase classname="tests.test_boundaries" name="test_domain_simulator_no_default_and_unique_ownership" time="0.206" /><testcase classname="tests.test_boundaries" name="test_records_persist_across_app_restart" time="0.388" /><testcase classname="tests.test_boundaries" name="test_outbound_guard_blocks_socket_before_connection" time="0.017" /><testcase classname="tests.test_boundaries" name="test_static_server_does_not_serve_data_or_unknown_api" time="0.216" /><testcase classname="tests.test_recurrence_recovery" name="test_four_business_recurrence_loss_drill" time="2.081" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[customer]" time="0.256" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[state]" time="0.379" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[rule_snapshot]" time="0.256" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[original_rule]" time="0.257" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[block_link]" time="0.255" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[history_missing]" time="0.260" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[history_immutable]" time="0.265" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[run_operation]" time="0.271" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[run_result]" time="0.375" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[membership]" time="0.240" /><testcase classname="tests.test_recurrence_recovery" name="test_recurrence_tampering_rejected[booking_history]" time="0.283" /><testcase classname="tests.test_recurrence_recovery" name="test_populated_pinned_format_six_restores_with_empty_recurrence" time="0.520" /></testsuite></testsuites>