{
 "source": {
  "repository": "phishdestroy/TgWitness",
  "commit": "3a614fb780cd1d235fdf77e9b97d91828af1c219",
  "subject": "Detect secret chats the peer ended"
 },
 "started_at": "2026-11-14T08:12:19+00:00",
 "finished_at": "2026-11-14T08:29:35+00:00",
 "duration_seconds": 1035.3,
 "pytest_exit": 1,
 "environment": {
  "os": "Linux-6.8.0-147-generic-x86_64-with-glibc2.39",
  "python": "3.12.3"
 },
 "tests_synced_at": "2026-11-14T08:12:09+00:00",
 "totals": {
  "passed": 2178,
  "failed": 42,
  "skipped": 35,
  "tests": 2255,
  "files": 137,
  "unexpected_failures": 10
 },
 "files": [
  {
   "file": "addons/capture/tests/test_beacon.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.102
  },
  {
   "file": "addons/capture/tests/test_gateway.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.016
  },
  {
   "file": "addons/capture/tests/test_official.py",
   "passed": 19,
   "failed": 0,
   "skipped": 3,
   "seconds": 1.441
  },
  {
   "file": "addons/capture/tests/test_official_proof.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.734
  },
  {
   "file": "addons/capture/tests/test_trusted.py",
   "passed": 42,
   "failed": 0,
   "skipped": 1,
   "seconds": 12.388
  },
  {
   "file": "addons/capture/tests/test_trusted_anchors.py",
   "passed": 4,
   "failed": 1,
   "skipped": 0,
   "seconds": 0.293
  },
  {
   "file": "tools/test_access_label_privacy.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 8.775
  },
  {
   "file": "tools/test_account_attachment_integrity.py",
   "passed": 16,
   "failed": 0,
   "skipped": 0,
   "seconds": 8.289
  },
  {
   "file": "tools/test_action_protocol.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.629
  },
  {
   "file": "tools/test_analyzer_graphs.py",
   "passed": 3,
   "failed": 1,
   "skipped": 0,
   "seconds": 1.473
  },
  {
   "file": "tools/test_analyzer_linking.py",
   "passed": 2,
   "failed": 1,
   "skipped": 0,
   "seconds": 1.478
  },
  {
   "file": "tools/test_anchor_backoff.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.687
  },
  {
   "file": "tools/test_anchor_temp_files.py",
   "passed": 1,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.877
  },
  {
   "file": "tools/test_api_authorization_matrix.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.334
  },
  {
   "file": "tools/test_api_refactor.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.658
  },
  {
   "file": "tools/test_archive_token_comparison.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.174
  },
  {
   "file": "tools/test_archive_views.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.999
  },
  {
   "file": "tools/test_assurance_boundaries.py",
   "passed": 37,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.897
  },
  {
   "file": "tools/test_assurance_chain.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.741
  },
  {
   "file": "tools/test_assurance_ladder.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.484
  },
  {
   "file": "tools/test_audit_logic_repairs.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 15.809
  },
  {
   "file": "tools/test_audit_platform_fixes.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.585
  },
  {
   "file": "tools/test_auto_delete_classification.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.0
  },
  {
   "file": "tools/test_capture_liveness.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.108
  },
  {
   "file": "tools/test_capture_open.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.667
  },
  {
   "file": "tools/test_case_package.py",
   "passed": 2,
   "failed": 2,
   "skipped": 0,
   "seconds": 0.756
  },
  {
   "file": "tools/test_channel_graph.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.002
  },
  {
   "file": "tools/test_chat_comparison.py",
   "passed": 24,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.212
  },
  {
   "file": "tools/test_chat_export_integrity.py",
   "passed": 15,
   "failed": 1,
   "skipped": 0,
   "seconds": 5.93
  },
  {
   "file": "tools/test_chat_state.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.275
  },
  {
   "file": "tools/test_chat_timeline.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.122
  },
  {
   "file": "tools/test_checkpoint_drand_route.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.024
  },
  {
   "file": "tools/test_cli.py",
   "passed": 10,
   "failed": 1,
   "skipped": 0,
   "seconds": 7.808
  },
  {
   "file": "tools/test_client_checks.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.023
  },
  {
   "file": "tools/test_client_initialization.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.269
  },
  {
   "file": "tools/test_client_timezone.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.022
  },
  {
   "file": "tools/test_client_transport.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.004
  },
  {
   "file": "tools/test_cloud_refactor.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.019
  },
  {
   "file": "tools/test_conversation.py",
   "passed": 29,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.2
  },
  {
   "file": "tools/test_court.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.0
  },
  {
   "file": "tools/test_crypto_ids.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.008
  },
  {
   "file": "tools/test_deletion_evidence_reports.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.372
  },
  {
   "file": "tools/test_deletion_semantics.py",
   "passed": 0,
   "failed": 8,
   "skipped": 0,
   "seconds": 5.216
  },
  {
   "file": "tools/test_device_attribution.py",
   "passed": 27,
   "failed": 1,
   "skipped": 0,
   "seconds": 5.705
  },
  {
   "file": "tools/test_difference_gaps.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.005
  },
  {
   "file": "tools/test_disclosure_markers.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 9.892
  },
  {
   "file": "tools/test_distributed_export.py",
   "passed": 48,
   "failed": 0,
   "skipped": 0,
   "seconds": 50.755
  },
  {
   "file": "tools/test_distributed_pages.py",
   "passed": 27,
   "failed": 0,
   "skipped": 0,
   "seconds": 24.653
  },
  {
   "file": "tools/test_distributed_takeout.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 10.39
  },
  {
   "file": "tools/test_documentation.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.188
  },
  {
   "file": "tools/test_documentation_scope.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.625
  },
  {
   "file": "tools/test_download_ticket_quotas.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.395
  },
  {
   "file": "tools/test_dstack_archive_limits.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.019
  },
  {
   "file": "tools/test_ephemeral_media.py",
   "passed": 77,
   "failed": 0,
   "skipped": 0,
   "seconds": 11.929
  },
  {
   "file": "tools/test_evidence_checks.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.02
  },
  {
   "file": "tools/test_export_archive_name.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.551
  },
  {
   "file": "tools/test_export_budget.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.353
  },
  {
   "file": "tools/test_export_plan.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.165
  },
  {
   "file": "tools/test_exported_authorization.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.329
  },
  {
   "file": "tools/test_extensions.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.166
  },
  {
   "file": "tools/test_file_hash_export.py",
   "passed": 23,
   "failed": 0,
   "skipped": 0,
   "seconds": 13.818
  },
  {
   "file": "tools/test_fulltext.py",
   "passed": 25,
   "failed": 0,
   "skipped": 0,
   "seconds": 45.36
  },
  {
   "file": "tools/test_gap_analysis.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.981
  },
  {
   "file": "tools/test_geo_profiles.py",
   "passed": 121,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.249
  },
  {
   "file": "tools/test_history_backfill.py",
   "passed": 29,
   "failed": 0,
   "skipped": 0,
   "seconds": 52.485
  },
  {
   "file": "tools/test_independent_report_pdf.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 8.855
  },
  {
   "file": "tools/test_indicator_limits.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.02
  },
  {
   "file": "tools/test_insights.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.793
  },
  {
   "file": "tools/test_installer_checks/InstallerChecksTests.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.097
  },
  {
   "file": "tools/test_journal_write_failures.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.633
  },
  {
   "file": "tools/test_jurisdiction_guidance.py",
   "passed": 137,
   "failed": 0,
   "skipped": 0,
   "seconds": 22.127
  },
  {
   "file": "tools/test_lookup_backoff.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.434
  },
  {
   "file": "tools/test_media_job_states.py",
   "passed": 22,
   "failed": 0,
   "skipped": 0,
   "seconds": 8.877
  },
  {
   "file": "tools/test_messages_first_live_media.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.453
  },
  {
   "file": "tools/test_metrics.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.348
  },
  {
   "file": "tools/test_mtproto_forensics.py",
   "passed": 100,
   "failed": 1,
   "skipped": 0,
   "seconds": 1.012
  },
  {
   "file": "tools/test_narrative.py",
   "passed": 62,
   "failed": 0,
   "skipped": 0,
   "seconds": 62.619
  },
  {
   "file": "tools/test_narrative_config.py",
   "passed": 36,
   "failed": 0,
   "skipped": 0,
   "seconds": 19.917
  },
  {
   "file": "tools/test_opsec.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.215
  },
  {
   "file": "tools/test_parallel_exports.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 18.183
  },
  {
   "file": "tools/test_password_export.py",
   "passed": 34,
   "failed": 0,
   "skipped": 0,
   "seconds": 23.168
  },
  {
   "file": "tools/test_paused_updates.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.001
  },
  {
   "file": "tools/test_pending_login_revocation.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 15.57
  },
  {
   "file": "tools/test_persona.py",
   "passed": 31,
   "failed": 0,
   "skipped": 0,
   "seconds": 8.723
  },
  {
   "file": "tools/test_presence_watch.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.201
  },
  {
   "file": "tools/test_provider_metadata_umask.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.002
  },
  {
   "file": "tools/test_proxy_source_settings.py",
   "passed": 8,
   "failed": 10,
   "skipped": 0,
   "seconds": 0.186
  },
  {
   "file": "tools/test_publication_guard.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.397
  },
  {
   "file": "tools/test_qr_codes.py",
   "passed": 2,
   "failed": 0,
   "skipped": 4,
   "seconds": 1.18
  },
  {
   "file": "tools/test_release_branch_fixes.py",
   "passed": 22,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.265
  },
  {
   "file": "tools/test_release_data_fixes.py",
   "passed": 35,
   "failed": 0,
   "skipped": 0,
   "seconds": 70.297
  },
  {
   "file": "tools/test_removal_notice_order.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.002
  },
  {
   "file": "tools/test_render_boundary.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.107
  },
  {
   "file": "tools/test_replica_derivation.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.562
  },
  {
   "file": "tools/test_replica_recipient.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.509
  },
  {
   "file": "tools/test_report_brief_timestamps.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.028
  },
  {
   "file": "tools/test_report_repeats.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.439
  },
  {
   "file": "tools/test_report_settings.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.849
  },
  {
   "file": "tools/test_report_settings_recovery.py",
   "passed": 19,
   "failed": 0,
   "skipped": 0,
   "seconds": 11.064
  },
  {
   "file": "tools/test_request_limit_slowloris.py",
   "passed": 20,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.962
  },
  {
   "file": "tools/test_request_security.py",
   "passed": 42,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.174
  },
  {
   "file": "tools/test_resolve_target.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.0
  },
  {
   "file": "tools/test_rpc_diagnostics.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.004
  },
  {
   "file": "tools/test_scale_demo.py",
   "passed": 32,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.019
  },
  {
   "file": "tools/test_sealed_account.py",
   "passed": 26,
   "failed": 0,
   "skipped": 0,
   "seconds": 83.974
  },
  {
   "file": "tools/test_secret_chat_custody.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.197
  },
  {
   "file": "tools/test_secret_chat_safety.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.487
  },
  {
   "file": "tools/test_selected_export.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.076
  },
  {
   "file": "tools/test_session_import.py",
   "passed": 21,
   "failed": 2,
   "skipped": 0,
   "seconds": 102.199
  },
  {
   "file": "tools/test_site_context.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.099
  },
  {
   "file": "tools/test_site_metadata.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.433
  },
  {
   "file": "tools/test_site_seo/PageSearchMetadata.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.015
  },
  {
   "file": "tools/test_site_validation.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.165
  },
  {
   "file": "tools/test_store_transactions.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.885
  },
  {
   "file": "tools/test_subject.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.77
  },
  {
   "file": "tools/test_system_map_pool.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.007
  },
  {
   "file": "tools/test_telegram_view_review.py",
   "passed": 20,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.676
  },
  {
   "file": "tools/test_translation.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 8.247
  },
  {
   "file": "tools/test_tsa_cert_reference.py",
   "passed": 19,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.213
  },
  {
   "file": "tools/test_undercover.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.337
  },
  {
   "file": "tools/test_verification_launcher.py",
   "passed": 16,
   "failed": 0,
   "skipped": 2,
   "seconds": 12.166
  },
  {
   "file": "tools/test_verifier_account_compatibility.py",
   "passed": 35,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.192
  },
  {
   "file": "tools/test_verifier_comparison.py",
   "passed": 22,
   "failed": 1,
   "skipped": 0,
   "seconds": 35.838
  },
  {
   "file": "tools/test_verifier_dispatch.py",
   "passed": 20,
   "failed": 2,
   "skipped": 0,
   "seconds": 0.043
  },
  {
   "file": "tools/test_verifier_languages.py",
   "passed": 115,
   "failed": 0,
   "skipped": 25,
   "seconds": 11.704
  },
  {
   "file": "tools/test_verifier_output_safety.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.524
  },
  {
   "file": "tools/test_verifier_sources.py",
   "passed": 15,
   "failed": 9,
   "skipped": 0,
   "seconds": 4.499
  },
  {
   "file": "tools/test_video_documentation.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.895
  },
  {
   "file": "tools/test_watchlists.py",
   "passed": 16,
   "failed": 1,
   "skipped": 0,
   "seconds": 2.524
  },
  {
   "file": "tools/test_webapp.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.014
  },
  {
   "file": "tools/test_witness_continuity.py",
   "passed": 1,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.502
  },
  {
   "file": "tools/test_witness_daily.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.834
  },
  {
   "file": "tools/test_witness_export_window.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.0
  },
  {
   "file": "tools/test_witness_freshness.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.187
  },
  {
   "file": "tools/test_witness_keys.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.248
  },
  {
   "file": "tools/test_witness_relogin.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.103
  },
  {
   "file": "tools/test_witness_resilience.py",
   "passed": 16,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.685
  }
 ],
 "failures": [
  {
   "id": "tools/test_analyzer_graphs.py::test_edges_cite_journal_records_across_chosen_chats",
   "file": "tools/test_analyzer_graphs.py",
   "status": "failed",
   "seconds": 0.529,
   "message": "assert False\n +  where False = any(<generator object test_edges_cite_journal_records_across_chosen_chats.<locals>.<genexpr> at 0x7101b5b0b6b0>)",
   "expected": "Expects the contact-graph limit \"does not mean there was no contact\", removed after v0.9.3."
  },
  {
   "id": "tools/test_analyzer_linking.py::test_rotated_account_ranks_first_with_explanation_and_citations",
   "file": "tools/test_analyzer_linking.py",
   "status": "failed",
   "seconds": 0.721,
   "message": "assert False\n +  where False = any(<generator object test_rotated_account_ranks_first_with_explanation_and_citations.<locals>.<genexpr> at 0x7101b638d2f0>)",
   "expected": "Expects the account-linking limit \"not identification\", removed after v0.9.3."
  },
  {
   "id": "tools/test_case_package.py::test_package_contains_readable_report_files_and_explanations[tsr]",
   "file": "tools/test_case_package.py",
   "status": "failed",
   "seconds": 0.296,
   "message": "assert ('Timestamp receipts (not verified)' in '<!doctype html><html lang=\"en\"><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"default-src ...lank\"></span></p><p>Date: <span class=\"blank\"></span></p><p>Place: <span class=\"blank\"></span></p></div></body></html>')",
   "expected": "Expects the heading \"Timestamp receipts (not verified)\", renamed in the case package."
  },
  {
   "id": "tools/test_case_package.py::test_package_contains_readable_report_files_and_explanations[ots]",
   "file": "tools/test_case_package.py",
   "status": "failed",
   "seconds": 0.459,
   "message": "assert ('Timestamp receipts (not verified)' in '<!doctype html><html lang=\"en\"><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"default-src ...lank\"></span></p><p>Date: <span class=\"blank\"></span></p><p>Place: <span class=\"blank\"></span></p></div></body></html>')",
   "expected": "Expects the heading \"Timestamp receipts (not verified)\", renamed in the case package."
  },
  {
   "id": "tools/test_chat_export_integrity.py::test_sparse_message_numbers_are_counted_without_expansion",
   "file": "tools/test_chat_export_integrity.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "assert 2 == 1999999998\n +  where 2 = len((<tgwitness.message_numbers.MissingNumbers object at 0x7101a37e14c0>, 1))",
   "expected": "Missing-number counting now returns (numbers, count) instead of a sized collection; test not yet updated to the new API."
  },
  {
   "id": "tools/test_cli.py::test_local_commands",
   "file": "tools/test_cli.py",
   "status": "failed",
   "seconds": 0.764,
   "message": "AssertionError: assert [{'workspace'...n workspace'}] == [{'workspace'...ain account'}]\n  \n  At index 0 diff: {'workspace': 'default', 'name': 'Main workspace'} != {'workspace': 'default', 'name': 'Main account'}\n  Use -v to get more diff",
   "expected": "Expects the default workspace name \"Main account\"; it is now \"Main workspace\"."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[2-55123]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 0.381,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[2--1000000000555]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 0.421,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[9-55123]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 0.323,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[9--1000000000555]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 1.31,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[10-55123]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 1.035,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[10--1000000000555]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 0.958,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[15-55123]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 0.395,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_deletion_semantics.py::test_deletion_of_subset_keeps_actor_and_whole_history_unknown[15--1000000000555]",
   "file": "tools/test_deletion_semantics.py",
   "status": "failed",
   "seconds": 0.393,
   "message": "AssertionError: assert 'does not identify who deleted them' in 'Telegram reported several message IDs as deleted in one update.'",
   "expected": "Expects the batch-deletion caveat \"does not identify who deleted them, whether deletion applied to all participants…\", shortened in 3f5f0fbcb. Pending decision: restore the caveat or update the test."
  },
  {
   "id": "tools/test_device_attribution.py::test_the_dossier_counts_clients_sticker_sets_and_prepared_media",
   "file": "tools/test_device_attribution.py",
   "status": "failed",
   "seconds": 0.632,
   "message": "assert 'Metadata hypothesis about the client that encoded the file' in \"Client that encoded the file, read from the file's own metadata. A forwarded or re-uploaded file carries the encoder of whoever made it first.\"",
   "expected": "Expects the wording \"Metadata hypothesis about the client that encoded the file\"; the dossier now says \"Client that encoded the file, read from the file's own metadata\"."
  },
  {
   "id": "tools/test_mtproto_forensics.py::test_outbox_read_watermark_does_not_identify_a_person",
   "file": "tools/test_mtproto_forensics.py",
   "status": "failed",
   "seconds": 0.0,
   "message": "AssertionError: assert 'does not identify' in 'Observed outgoing read watermark.'",
   "expected": "Expects the caveat that a read watermark does not identify a person, shortened in 3f5f0fbcb."
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[{]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[[]]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[null]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[{\"countries\":\"invalid\"}]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[{\"github\":{\"enabled\":[]}}]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[{\"unknown\":true}]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_unreadable_settings_never_restore_enabled_defaults[\\xff]",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_permission_error_never_restores_enabled_defaults",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_proxy_source_settings.py::test_invalid_settings_prevent_refresh_before_network",
   "file": "tools/test_proxy_source_settings.py",
   "status": "failed",
   "seconds": 0.036,
   "message": "Failed: DID NOT RAISE ValueError",
   "expected": null
  },
  {
   "id": "tools/test_session_import.py::test_independent_login_browser[False]",
   "file": "tools/test_session_import.py",
   "status": "failed",
   "seconds": 34.298,
   "message": "playwright._impl._errors.TimeoutError: Locator.evaluate: Timeout 30000ms exceeded.\nCall log:\n  - waiting for locator(\".other-sign-in\")",
   "expected": "The sign-in form no longer has the \"other sign-in methods\" block (.other-sign-in, removed in 3f5f0fbcb); the browser test still follows the old flow."
  },
  {
   "id": "tools/test_session_import.py::test_independent_login_browser[True]",
   "file": "tools/test_session_import.py",
   "status": "failed",
   "seconds": 36.414,
   "message": "playwright._impl._errors.TimeoutError: Locator.evaluate: Timeout 30000ms exceeded.\nCall log:\n  - waiting for locator(\".other-sign-in\")",
   "expected": "The sign-in form no longer has the \"other sign-in methods\" block (.other-sign-in, removed in 3f5f0fbcb); the browser test still follows the old flow."
  },
  {
   "id": "tools/test_verifier_comparison.py::test_ots_structure_only_does_not_get_a_positive_indicator[unknown]",
   "file": "tools/test_verifier_comparison.py",
   "status": "failed",
   "seconds": 0.0,
   "message": "AssertionError: assert 'unknown' in 'synthetic'",
   "expected": "Expects an OTS-structure-only receipt to be labelled unknown; it is now labelled synthetic."
  },
  {
   "id": "tools/test_verifier_dispatch.py::test_direct_check_preserves_policy_and_archive_without_printing[tgwitness.verify]",
   "file": "tools/test_verifier_dispatch.py",
   "status": "failed",
   "seconds": 0.005,
   "message": "AssertionError: assert False\n[+2 more lines; full report in element text]",
   "expected": "Same frozen verifier decisions as test_verifier_sources."
  },
  {
   "id": "tools/test_verifier_dispatch.py::test_direct_check_preserves_policy_and_archive_without_printing[tgwitness.verifier.cli]",
   "file": "tools/test_verifier_dispatch.py",
   "status": "failed",
   "seconds": 0.018,
   "message": "AssertionError: assert False\n[+2 more lines; full report in element text]",
   "expected": "Same frozen verifier decisions as test_verifier_sources."
  },
  {
   "id": "tools/test_verifier_sources.py::test_review_modules_import_without_application_state",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.004,
   "message": "AssertionError: assert False\n[+2 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_frozen_verification_decisions_are_unchanged",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.134,
   "message": "assert False\n[+2 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_and_new_decisions_and_statuses_match[pinned---json]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.253,
   "message": "assert False\n[+3 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_and_new_decisions_and_statuses_match[pinned---plain]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.244,
   "message": "assert False\n[+5 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_and_new_decisions_and_statuses_match[unpinned---json]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.256,
   "message": "assert False\n[+3 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_and_new_decisions_and_statuses_match[unpinned---plain]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.246,
   "message": "assert False\n[+5 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_and_new_decisions_and_statuses_match[unmet_tier---json]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.252,
   "message": "assert False\n[+3 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_and_new_decisions_and_statuses_match[unmet_tier---plain]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.246,
   "message": "assert False\n[+5 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_verifier_sources.py::test_old_verifier_accepts_new_archive_with_identical_signed_events",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.501,
   "message": "assert False\n[+3 more lines; full report in element text]",
   "expected": "The verifier's readable answer was shortened (93976cde9): plain output starts with EVIDENCE instead of ASSURANCE, and frozen JSON decisions differ in note wording. Frozen fixtures need regeneration."
  },
  {
   "id": "tools/test_watchlists.py::test_terms_patterns_wallets_usernames_and_domains_are_matched",
   "file": "tools/test_watchlists.py",
   "status": "failed",
   "seconds": 0.396,
   "message": "assert False\n +  where False = all(<generator object test_terms_patterns_wallets_usernames_and_domains_are_matched.<locals>.<genexpr> at 0x7101b6be35a0>)",
   "expected": "Expects the watchlist-hit caveat \"nothing about who wrote it\", removed after v0.9.3."
  },
  {
   "id": "addons/capture/tests/test_trusted_anchors.py::test_cloudflare_queries_are_read_only_scoped_and_token_is_not_exported",
   "file": "addons/capture/tests/test_trusted_anchors.py",
   "status": "failed",
   "seconds": 0.195,
   "message": "AssertionError: assert 'no proof of continuous presence' in 'provider state sampled at the polled time'",
   "expected": "Expects \"no proof of continuous presence\"; the capture add-on now says \"provider state sampled at the polled time\"."
  }
 ]
}
