three-client
POST /api/tri/login 200
POST /api/tri/write/member-create 403
POST /api/tri/login 200
GET /api/tri/read/me 200
POST /api/tri/logout 200
GET /api/tri/read/me 401
GET /api/tri/read/members 401
GET /api/tri/public-policy 200
POST /api/tri/login 200
POST /api/tri/write/member-create 200
GET /api/tri/read/members 200
GET /desktop 200
GET /tri_service.py 404
test_foreign_origin_rejected (test_tri_http.GatewayTests.test_foreign_origin_rejected) ... ok
test_http_only_session_cookie_and_logout (test_tri_http.GatewayTests.test_http_only_session_cookie_and_logout) ... ok
test_no_anonymous_business_data (test_tri_http.GatewayTests.test_no_anonymous_business_data) ... ok
test_public_policy_draft_does_not_leak_config (test_tri_http.GatewayTests.test_public_policy_draft_does_not_leak_config) ... ok
test_real_gateway_write_and_read (test_tri_http.GatewayTests.test_real_gateway_write_and_read) ... ok
test_static_browser_shell_and_no_source_exposure (test_tri_http.GatewayTests.test_static_browser_shell_and_no_source_exposure) ... ok
test_aftersale_hold_and_release (test_tri_service.ThreeClientTests.test_aftersale_hold_and_release) ... ok
test_booking_cannot_be_linked_twice (test_tri_service.ThreeClientTests.test_booking_cannot_be_linked_twice) ... ok
test_card_is_lookup_only_and_revocation_blocks_lookup (test_tri_service.ThreeClientTests.test_card_is_lookup_only_and_revocation_blocks_lookup) ... ok
test_concurrent_different_orders_last_balance (test_tri_service.ThreeClientTests.test_concurrent_different_orders_last_balance) ... ok
test_concurrent_same_order_payment (test_tri_service.ThreeClientTests.test_concurrent_same_order_payment) ... ok
test_confirmed_tiers_and_no_progress_for_recharge (test_tri_service.ThreeClientTests.test_confirmed_tiers_and_no_progress_for_recharge) ... ok
test_customer_binds_wechat_once_verified (test_tri_service.ThreeClientTests.test_customer_binds_wechat_once_verified) ... ok
test_customer_cannot_confirm_external_cash (test_tri_service.ThreeClientTests.test_customer_cannot_confirm_external_cash) ... ok
test_customer_order_ownership (test_tri_service.ThreeClientTests.test_customer_order_ownership) ... ok
test_delivery_two_legs_one_fee (test_tri_service.ThreeClientTests.test_delivery_two_legs_one_fee) ... ok
test_discount_and_completion (test_tri_service.ThreeClientTests.test_discount_and_completion) ... ok
test_experience_excludes_whole_referral (test_tri_service.ThreeClientTests.test_experience_excludes_whole_referral) ... ok
test_idempotent_recharge_and_conflicting_payload (test_tri_service.ThreeClientTests.test_idempotent_recharge_and_conflicting_payload) ... ok
test_invalid_photo_file_rejected (test_tri_service.ThreeClientTests.test_invalid_photo_file_rejected) ... ok
test_invite_one_time_and_session_disabled (test_tri_service.ThreeClientTests.test_invite_one_time_and_session_disabled) ... ok
test_legacy_rewards_skip_new_order (test_tri_service.ThreeClientTests.test_legacy_rewards_skip_new_order) ... ok
test_low_first_order_not_replaced_by_second (test_tri_service.ThreeClientTests.test_low_first_order_not_replaced_by_second) ... ok
test_no_default_owner_and_password_authentication (test_tri_service.ThreeClientTests.test_no_default_owner_and_password_authentication) ... ok
test_no_unverified_credit (test_tri_service.ThreeClientTests.test_no_unverified_credit) ... ok
test_original_bucket_refund_not_external_cash (test_tri_service.ThreeClientTests.test_original_bucket_refund_not_external_cash) ... ok
test_packaging_atomic_stock (test_tri_service.ThreeClientTests.test_packaging_atomic_stock) ... ok
test_paid_reward_refund_goes_manual_review (test_tri_service.ThreeClientTests.test_paid_reward_refund_goes_manual_review) ... ok
test_partial_recharge_refund_recalculates_tier (test_tri_service.ThreeClientTests.test_partial_recharge_refund_recalculates_tier) ... ok
test_photo_must_belong_to_authorized_order (test_tri_service.ThreeClientTests.test_photo_must_belong_to_authorized_order) ... ok
test_precompletion_partial_refund_pauses_delivery (test_tri_service.ThreeClientTests.test_precompletion_partial_refund_pauses_delivery) ... ok
test_published_quote_snapshot_survives_policy_change (test_tri_service.ThreeClientTests.test_published_quote_snapshot_survives_policy_change) ... ok
test_quote_confirmation_required (test_tri_service.ThreeClientTests.test_quote_confirmation_required) ... ok
test_referral_first_completion_and_cap (test_tri_service.ThreeClientTests.test_referral_first_completion_and_cap) ... ok
test_referral_observation_blocks_early_approval (test_tri_service.ThreeClientTests.test_referral_observation_blocks_early_approval) ... ok
test_referral_refund_below_threshold (test_tri_service.ThreeClientTests.test_referral_refund_below_threshold) ... ok
test_refund_overpayment_rolled_back (test_tri_service.ThreeClientTests.test_refund_overpayment_rolled_back) ... ok
test_refund_unspent_voucher_and_progress (test_tri_service.ThreeClientTests.test_refund_unspent_voucher_and_progress) ... ok
test_split_integer_conservation (test_tri_service.ThreeClientTests.test_split_integer_conservation) ... ok
test_two_orders_cannot_reserve_same_voucher (test_tri_service.ThreeClientTests.test_two_orders_cannot_reserve_same_voucher) ... ok
test_unpublished_policy_blocks_recharge (test_tri_service.ThreeClientTests.test_unpublished_policy_blocks_recharge) ... ok
test_voucher_earned_once_and_rewash_no_new_progress (test_tri_service.ThreeClientTests.test_voucher_earned_once_and_rewash_no_new_progress) ... ok
test_voucher_reserved_only_on_confirm_and_cancel_unlocks (test_tri_service.ThreeClientTests.test_voucher_reserved_only_on_confirm_and_cancel_unlocks) ... ok
test_washer_cannot_read_money_or_deliver (test_tri_service.ThreeClientTests.test_washer_cannot_read_money_or_deliver) ... ok
test_washer_projection_omits_paid_and_prices (test_tri_service.ThreeClientTests.test_washer_projection_omits_paid_and_prices) ... ok

----------------------------------------------------------------------
Ran 45 tests in 28.044s

OK


platform-and-features
POST /api/tri/write/member-create 200
GET /api/tri/read/members 401
POST /api/tri/write/policy-publish 200
POST /api/tri/write/member-create 200
POST /api/tri/write/recharge 200
POST /api/tri/write/order-create 200
POST /api/tri/write/quote 200
POST /api/tri/write/quote-confirm 200
POST /api/tri/write/order-pay 200
POST /api/tri/write/recharge 403
POST /api/tri/write/order-refund 200
POST /api/tri/write/refund-resolve 200
POST /api/tri/write/item-status 200
POST /api/tri/write/item-status 200
POST /api/tri/write/item-status 200
GET /api/tri/export 401
GET /api/tri/backup 200
GET /api/tri/export 200
POST /api/tri/write/member-create 200
POST /api/tri/guest-booking 200
POST /api/tri/guest-booking 200
GET /api/tri/read/leads 200
GET /api/tri/read/leads 401
POST /api/tri/write/member-create 403
GET /api/tri/read/members 200
POST /api/tri/guest-booking 403
POST /api/platform/login 200
POST /api/platform/login 403
GET /api/tri/read/me 401
GET /api/platform/stores 401
GET /api/tri/storefront 200
POST /api/tri/login 200
GET /api/tri/read/me 200
GET /api/tri/read/me 401
GET /api/tri/read/me 404
GET /api/tri/read/me 400
GET /api/tri/read/me 400
GET /api/tri/read/me 400
test_bearer_cannot_cross_store (test_platform.PlatformTests.test_bearer_cannot_cross_store) ... ok
test_expired_store_can_refund_and_finish_paid_order (test_platform.PlatformTests.test_expired_store_can_refund_and_finish_paid_order) ... ok
test_export_and_backup_require_store_owner (test_platform.PlatformTests.test_export_and_backup_require_store_owner) ... ok
test_guest_does_not_link_or_expose_member (test_platform.PlatformTests.test_guest_does_not_link_or_expose_member) ... ok
test_parallel_store_databases (test_platform.PlatformTests.test_parallel_store_databases) ... ok
test_pause_blocks_new_allows_existing_reads (test_platform.PlatformTests.test_pause_blocks_new_allows_existing_reads) ... ok
test_platform_cookie_separate_and_tasks_initialized (test_platform.PlatformTests.test_platform_cookie_separate_and_tasks_initialized) ... ok
test_platform_foreign_origin_rejected (test_platform.PlatformTests.test_platform_foreign_origin_rejected) ... ok
test_platform_token_is_not_store_authorization (test_platform.PlatformTests.test_platform_token_is_not_store_authorization) ... ok
test_platform_version_conflict (test_platform.PlatformTests.test_platform_version_conflict) ... ok
test_public_storefront_hides_costs (test_platform.PlatformTests.test_public_storefront_hides_costs) ... ok
test_store_cookie_is_namespaced (test_platform.PlatformTests.test_store_cookie_is_namespaced) ... ok
test_store_create_idempotent_and_no_password_leak (test_platform.PlatformTests.test_store_create_idempotent_and_no_password_leak) ... ok
test_unknown_or_path_store_never_created (test_platform.PlatformTests.test_unknown_or_path_store_never_created) ... ok
test_cannot_cancel_item_still_paid (test_features.FeatureTests.test_cannot_cancel_item_still_paid) ... ok
test_csv_formula_escape (test_features.FeatureTests.test_csv_formula_escape) ... ok
test_customer_filter_before_pagination (test_features.FeatureTests.test_customer_filter_before_pagination) ... ok
test_dashboard_unknown_cost_and_recharge_not_revenue (test_features.FeatureTests.test_dashboard_unknown_cost_and_recharge_not_revenue) ... ok
test_full_refund_one_item_cancel_other_deliver (test_features.FeatureTests.test_full_refund_one_item_cancel_other_deliver) ... ok
test_guest_conversion_needs_identity_and_policy (test_features.FeatureTests.test_guest_conversion_needs_identity_and_policy) ... ok
test_independent_custom_policy_and_snapshot (test_features.FeatureTests.test_independent_custom_policy_and_snapshot) ... ok
test_invalid_tier_sort_discount_rejected (test_features.FeatureTests.test_invalid_tier_sort_discount_rejected) ... ok
test_member_search_and_pagination (test_features.FeatureTests.test_member_search_and_pagination) ... ok
test_partial_refund_confirm_and_resume_no_double_charge (test_features.FeatureTests.test_partial_refund_confirm_and_resume_no_double_charge) ... ok
test_password_change_revokes_all_sessions (test_features.FeatureTests.test_password_change_revokes_all_sessions) ... ok
test_profile_cost_and_dashboard_permissions (test_features.FeatureTests.test_profile_cost_and_dashboard_permissions) ... ok

----------------------------------------------------------------------
Ran 26 tests in 35.126s

OK


test_campaign_coupons
test_campaign_null_name_fractional_quantity_and_retry (test_campaign_coupons.Coupons.test_campaign_null_name_fractional_quantity_and_retry) ... ok
test_concurrent_apply_once (test_campaign_coupons.Coupons.test_concurrent_apply_once) ... ok
test_discount_exact_no_fake_cash_and_idempotent (test_campaign_coupons.Coupons.test_discount_exact_no_fake_cash_and_idempotent) ... ok
test_wrong_customer_paid_and_paused (test_campaign_coupons.Coupons.test_wrong_customer_paid_and_paused) ... ok

----------------------------------------------------------------------
Ran 4 tests in 0.539s

OK


test_finance_shift
test_correction_after_close_rejected (test_finance_shift.FinanceTests.test_correction_after_close_rejected) ... ok
test_correction_audit_repeat_and_stale (test_finance_shift.FinanceTests.test_correction_audit_repeat_and_stale) ... ok
test_repeat_lock_and_next (test_finance_shift.FinanceTests.test_repeat_lock_and_next) ... ok
test_stale_and_difference (test_finance_shift.FinanceTests.test_stale_and_difference) ... ok
test_unknown_and_totals (test_finance_shift.FinanceTests.test_unknown_and_totals) ... ok

----------------------------------------------------------------------
Ran 5 tests in 0.358s

OK


test_member_returns
test_delivered_and_confirmation (test_member_returns.Tests.test_delivered_and_confirmation) ... ok
test_legacy_reversal_deduplicates (test_member_returns.Tests.test_legacy_reversal_deduplicates) ... ok
test_partial_limit (test_member_returns.Tests.test_partial_limit) ... ok
test_partial_then_legacy_remaining (test_member_returns.Tests.test_partial_then_legacy_remaining) ... ok
test_same_wallet_and_idempotency (test_member_returns.Tests.test_same_wallet_and_idempotency) ... ok

----------------------------------------------------------------------
Ran 5 tests in 0.310s

OK


test_quick_pickup
test_attachment_blocks_entire_batch (test_quick_pickup.Pickup.test_attachment_blocks_entire_batch) ... ok
test_bad_inputs_and_repeat_new_request (test_quick_pickup.Pickup.test_bad_inputs_and_repeat_new_request) ... ok
test_batch_and_retry (test_quick_pickup.Pickup.test_batch_and_retry) ... ok
test_concurrent_once (test_quick_pickup.Pickup.test_concurrent_once) ... ok
test_duplicate_item_tag_alias (test_quick_pickup.Pickup.test_duplicate_item_tag_alias) ... ok
test_partial_and_unready (test_quick_pickup.Pickup.test_partial_and_unready) ... ok
test_unpaid (test_quick_pickup.Pickup.test_unpaid) ... ok
test_wrong_customer_no_change (test_quick_pickup.Pickup.test_wrong_customer_no_change) ... ok
test_wrong_second_scan_atomic (test_quick_pickup.Pickup.test_wrong_second_scan_atomic) ... ok

----------------------------------------------------------------------
Ran 9 tests in 0.562s

OK


test_workflows
test_invalid_money (test_workflows.Workflows.test_invalid_money) ... 127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/orders HTTP/1.1" 400 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/orders HTTP/1.1" 400 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/orders HTTP/1.1" 400 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/orders HTTP/1.1" 400 -
ok
test_location_pickup (test_workflows.Workflows.test_location_pickup) ... 127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/orders HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 400 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 400 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 400 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 200 -
ok
test_money_lifecycle (test_workflows.Workflows.test_money_lifecycle) ... 127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/members HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-credit HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-credit HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/orders HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-pay HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-pay HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-wallet HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "GET /api/cash-ledger HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-payment-reverse HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-payment-reverse HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/member-wallet HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "POST /api/action HTTP/1.1" 200 -
127.0.0.1 - - [07/Oct/2026 02:20:33] "GET /api/cash-ledger HTTP/1.1" 200 -
ok

----------------------------------------------------------------------
Ran 3 tests in 0.898s

OK


hardening
test_chunked (test_hardening.InputTests.test_chunked) ... ok
test_duplicate_key (test_hardening.InputTests.test_duplicate_key) ... ok
test_duplicate_length (test_hardening.InputTests.test_duplicate_length) ... ok
test_foreign_origin (test_hardening.InputTests.test_foreign_origin) ... ok
test_incomplete (test_hardening.InputTests.test_incomplete) ... ok
test_length_limit (test_hardening.InputTests.test_length_limit) ... ok
test_nonfinite (test_hardening.InputTests.test_nonfinite) ... ok
test_null_root (test_hardening.InputTests.test_null_root) ... ok
test_optional_limit (test_hardening.InputTests.test_optional_limit) ... ok
test_optional_null (test_hardening.InputTests.test_optional_null) ... ok
test_optional_object (test_hardening.InputTests.test_optional_object) ... ok
test_same_origin (test_hardening.InputTests.test_same_origin) ... ok
test_utf8 (test_hardening.InputTests.test_utf8) ... ok
test_valid (test_hardening.InputTests.test_valid) ... ok
test_invalid_ports (test_hardening.StartupTests.test_invalid_ports) ... ok
test_local_allowed (test_hardening.StartupTests.test_local_allowed) ... ok
test_lock_contention_and_release (test_hardening.StartupTests.test_lock_contention_and_release) ... ok
test_port_is_exclusive (test_hardening.StartupTests.test_port_is_exclusive) ... ok
test_rate_cache_is_bounded (test_hardening.StartupTests.test_rate_cache_is_bounded) ... ok
test_remote_requires_secure_configuration (test_hardening.StartupTests.test_remote_requires_secure_configuration) ... ok

----------------------------------------------------------------------
Ran 20 tests in 0.030s

OK


performance
test_dashboard_cache_and_invalidation (test_performance.PerformanceTests.test_dashboard_cache_and_invalidation) ... ok
test_dashboard_cache_is_tenant_local (test_performance.PerformanceTests.test_dashboard_cache_is_tenant_local) ... ok
test_joined_jobs_paged_and_operator_filter (test_performance.PerformanceTests.test_joined_jobs_paged_and_operator_filter) ... ok
test_member_tiers_batched_and_search_options (test_performance.PerformanceTests.test_member_tiers_batched_and_search_options) ... ok
test_owned_records_filtered_before_paging (test_performance.PerformanceTests.test_owned_records_filtered_before_paging) ... ok

----------------------------------------------------------------------
Ran 5 tests in 3.655s

OK


workbench
test_counts_and_filter_before_page_limit (test_workbench.WorkbenchTests.test_counts_and_filter_before_page_limit) ... ok
test_customer_cannot_read_workbench (test_workbench.WorkbenchTests.test_customer_cannot_read_workbench) ... ok
test_invalid_filter_rejected_and_operator_scope (test_workbench.WorkbenchTests.test_invalid_filter_rejected_and_operator_scope) ... ok
test_pickup_counts_orders_once_and_excludes_cancelled (test_workbench.WorkbenchTests.test_pickup_counts_orders_once_and_excludes_cancelled) ... ok

----------------------------------------------------------------------
Ran 4 tests in 2.095s

OK


commercial
test_backup_restore_and_no_overwrite_or_tampering (test_commercial.CommercialTests.test_backup_restore_and_no_overwrite_or_tampering) ... ok
test_catalog_price_protected_and_override_reason_required (test_commercial.CommercialTests.test_catalog_price_protected_and_override_reason_required) ... ok
test_default_manager_cannot_export_refund_configure_or_escalate (test_commercial.CommercialTests.test_default_manager_cannot_export_refund_configure_or_escalate) ... ok
test_followup_optout_and_version_required (test_commercial.CommercialTests.test_followup_optout_and_version_required) ... ok
test_forwarded_client_ip_only_trusted_from_loopback (test_commercial.CommercialTests.test_forwarded_client_ip_only_trusted_from_loopback) ... ok
test_mature_cohort_excludes_new_customer_and_refunds (test_commercial.CommercialTests.test_mature_cohort_excludes_new_customer_and_refunds) ... ok
test_owner_grants_permissions_and_version_conflicts (test_commercial.CommercialTests.test_owner_grants_permissions_and_version_conflicts) ... ok
test_profit_counts_free_item_cost_delivery_and_unknown (test_commercial.CommercialTests.test_profit_counts_free_item_cost_delivery_and_unknown) ... ok
test_revoked_recharge_permission_also_blocks_idempotent_replay (test_commercial.CommercialTests.test_revoked_recharge_permission_also_blocks_idempotent_replay) ... ok

----------------------------------------------------------------------
Ran 9 tests in 5.838s

OK


client-helpers
PASS null differs from zero
PASS blank lines and money validation
PASS corrupt pending record blocks accidental retry
PASS pending storage excludes passwords and contact data
PASS unresolved request blocks changed submission
PASS retry reuses id despite field ordering
PASS definitive API validation identified
PASS incomplete response preserves uncertain outcome


mini-assets
7 mini-program page asset sets, JSON, tag balance and event bindings: OK


client-retry
PASS network retry reuses payment idempotency key
PASS unresolved operation blocks a different payment
PASS definitive validation error clears pending submission
PASS switching stores selects isolated token and request namespace


photo-client
PASS large photo resized below upload limit
PASS encoded JPEG and temporary URL cleaned
PASS retry reuses prepared image
PASS small photos are not enlarged
PASS oversized and unsupported originals rejected


mini-performance
PASS paged lists load 50 then next records
PASS late previous-store response discarded
PASS previous customer response discarded
PASS mini image dimensions and bytes bounded
PASS oversized compressed file never read or uploaded
PASS ignored resize detected before upload
PASS unsupported image resize handled explicitly


ui-native
PASS date and slot reach guest booking payload
PASS missing date blocks submission and releases busy flag
PASS appointment opens as a page from three-tab navigation


syntax:tri_web\photos.js


syntax:tri_web\client.js


syntax:tri_web\app.js


syntax:tri_web\platform.js


syntax:tri_miniprogram\app.js


syntax:tri_miniprogram\config.js


syntax:tri_miniprogram\pages\aftersale\aftersale.js


syntax:tri_miniprogram\pages\booking\booking.js


syntax:tri_miniprogram\pages\detail\detail.js


syntax:tri_miniprogram\pages\home\home.js


syntax:tri_miniprogram\pages\mine\mine.js


syntax:tri_miniprogram\pages\orders\orders.js


syntax:tri_miniprogram\pages\rewards\rewards.js


syntax:tri_miniprogram\utils\api.js


syntax:tri_miniprogram\utils\pager.js


syntax:tri_miniprogram\utils\photo.js
