{
 "source": {
  "repository": "phishdestroy/TgWitness",
  "commit": "23c7cc65e776bca40b989ff73d9d2a438954604e",
  "subject": "Label service messages in reports and tidy the chat list and account counters (#302)"
 },
 "started_at": "2026-11-14T06:13:22+00:00",
 "finished_at": "2026-11-14T06:24:07+00:00",
 "duration_seconds": 644.9,
 "pytest_exit": 1,
 "environment": {
  "os": "Linux-6.8.0-147-generic-x86_64-with-glibc2.39",
  "python": "3.12.3"
 },
 "totals": {
  "passed": 1912,
  "failed": 79,
  "skipped": 35,
  "tests": 2026,
  "files": 134,
  "unexpected_failures": 0
 },
 "files": [
  {
   "file": "addons/capture/tests/test_beacon.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.067
  },
  {
   "file": "addons/capture/tests/test_gateway.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.004
  },
  {
   "file": "addons/capture/tests/test_official.py",
   "passed": 19,
   "failed": 0,
   "skipped": 3,
   "seconds": 1.238
  },
  {
   "file": "addons/capture/tests/test_official_proof.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.821
  },
  {
   "file": "addons/capture/tests/test_trusted.py",
   "passed": 42,
   "failed": 0,
   "skipped": 1,
   "seconds": 9.767
  },
  {
   "file": "addons/capture/tests/test_trusted_anchors.py",
   "passed": 4,
   "failed": 1,
   "skipped": 0,
   "seconds": 0.139
  },
  {
   "file": "tools/test_access_label_privacy.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.5
  },
  {
   "file": "tools/test_account_attachment_integrity.py",
   "passed": 16,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.491
  },
  {
   "file": "tools/test_action_protocol.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.564
  },
  {
   "file": "tools/test_analyzer_graphs.py",
   "passed": 3,
   "failed": 1,
   "skipped": 0,
   "seconds": 0.99
  },
  {
   "file": "tools/test_analyzer_linking.py",
   "passed": 2,
   "failed": 1,
   "skipped": 0,
   "seconds": 1.188
  },
  {
   "file": "tools/test_anchor_backoff.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.684
  },
  {
   "file": "tools/test_anchor_temp_files.py",
   "passed": 1,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.123
  },
  {
   "file": "tools/test_api_authorization_matrix.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.034
  },
  {
   "file": "tools/test_api_refactor.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.825
  },
  {
   "file": "tools/test_archive_token_comparison.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.22
  },
  {
   "file": "tools/test_archive_views.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 9.234
  },
  {
   "file": "tools/test_assurance_boundaries.py",
   "passed": 37,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.923
  },
  {
   "file": "tools/test_assurance_chain.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.968
  },
  {
   "file": "tools/test_assurance_ladder.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.489
  },
  {
   "file": "tools/test_audit_logic_repairs.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 15.564
  },
  {
   "file": "tools/test_audit_platform_fixes.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.84
  },
  {
   "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": 1.464
  },
  {
   "file": "tools/test_capture_open.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.546
  },
  {
   "file": "tools/test_case_package.py",
   "passed": 2,
   "failed": 2,
   "skipped": 0,
   "seconds": 0.583
  },
  {
   "file": "tools/test_channel_graph.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.01
  },
  {
   "file": "tools/test_chat_comparison.py",
   "passed": 24,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.202
  },
  {
   "file": "tools/test_chat_export_integrity.py",
   "passed": 15,
   "failed": 1,
   "skipped": 0,
   "seconds": 4.344
  },
  {
   "file": "tools/test_chat_state.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.641
  },
  {
   "file": "tools/test_chat_timeline.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.941
  },
  {
   "file": "tools/test_checkpoint_drand_route.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.442
  },
  {
   "file": "tools/test_cli.py",
   "passed": 10,
   "failed": 1,
   "skipped": 0,
   "seconds": 7.309
  },
  {
   "file": "tools/test_client_checks.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.626
  },
  {
   "file": "tools/test_client_initialization.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.267
  },
  {
   "file": "tools/test_client_timezone.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.02
  },
  {
   "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.02
  },
  {
   "file": "tools/test_conversation.py",
   "passed": 29,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.457
  },
  {
   "file": "tools/test_court.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.001
  },
  {
   "file": "tools/test_crypto_ids.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.013
  },
  {
   "file": "tools/test_deletion_evidence_reports.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.26
  },
  {
   "file": "tools/test_deletion_semantics.py",
   "passed": 0,
   "failed": 8,
   "skipped": 0,
   "seconds": 2.28
  },
  {
   "file": "tools/test_device_attribution.py",
   "passed": 27,
   "failed": 1,
   "skipped": 0,
   "seconds": 2.248
  },
  {
   "file": "tools/test_difference_gaps.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.002
  },
  {
   "file": "tools/test_disclosure_markers.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.035
  },
  {
   "file": "tools/test_distributed_export.py",
   "passed": 48,
   "failed": 0,
   "skipped": 0,
   "seconds": 43.288
  },
  {
   "file": "tools/test_distributed_pages.py",
   "passed": 27,
   "failed": 0,
   "skipped": 0,
   "seconds": 15.568
  },
  {
   "file": "tools/test_distributed_takeout.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.32
  },
  {
   "file": "tools/test_documentation.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.078
  },
  {
   "file": "tools/test_documentation_scope.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.382
  },
  {
   "file": "tools/test_download_ticket_quotas.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.986
  },
  {
   "file": "tools/test_dstack_archive_limits.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.021
  },
  {
   "file": "tools/test_ephemeral_media.py",
   "passed": 77,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.168
  },
  {
   "file": "tools/test_evidence_checks.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.99
  },
  {
   "file": "tools/test_export_archive_name.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.439
  },
  {
   "file": "tools/test_export_budget.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.316
  },
  {
   "file": "tools/test_export_plan.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.716
  },
  {
   "file": "tools/test_exported_authorization.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.235
  },
  {
   "file": "tools/test_extensions.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.635
  },
  {
   "file": "tools/test_file_hash_export.py",
   "passed": 23,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.049
  },
  {
   "file": "tools/test_fulltext.py",
   "passed": 25,
   "failed": 0,
   "skipped": 0,
   "seconds": 11.149
  },
  {
   "file": "tools/test_gap_analysis.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.012
  },
  {
   "file": "tools/test_history_backfill.py",
   "passed": 29,
   "failed": 0,
   "skipped": 0,
   "seconds": 19.545
  },
  {
   "file": "tools/test_independent_report_pdf.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.774
  },
  {
   "file": "tools/test_indicator_limits.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.019
  },
  {
   "file": "tools/test_insights.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.201
  },
  {
   "file": "tools/test_installer_checks/InstallerChecksTests.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.02
  },
  {
   "file": "tools/test_journal_write_failures.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.561
  },
  {
   "file": "tools/test_jurisdiction_guidance.py",
   "passed": 66,
   "failed": 1,
   "skipped": 0,
   "seconds": 12.346
  },
  {
   "file": "tools/test_lookup_backoff.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.474
  },
  {
   "file": "tools/test_media_job_states.py",
   "passed": 22,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.122
  },
  {
   "file": "tools/test_messages_first_live_media.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.751
  },
  {
   "file": "tools/test_metrics.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.978
  },
  {
   "file": "tools/test_mtproto_forensics.py",
   "passed": 100,
   "failed": 1,
   "skipped": 0,
   "seconds": 0.264
  },
  {
   "file": "tools/test_narrative.py",
   "passed": 20,
   "failed": 42,
   "skipped": 0,
   "seconds": 36.695
  },
  {
   "file": "tools/test_narrative_config.py",
   "passed": 33,
   "failed": 3,
   "skipped": 0,
   "seconds": 8.141
  },
  {
   "file": "tools/test_opsec.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.452
  },
  {
   "file": "tools/test_parallel_exports.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 9.795
  },
  {
   "file": "tools/test_password_export.py",
   "passed": 34,
   "failed": 0,
   "skipped": 0,
   "seconds": 21.155
  },
  {
   "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": 8.403
  },
  {
   "file": "tools/test_persona.py",
   "passed": 31,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.548
  },
  {
   "file": "tools/test_presence_watch.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.051
  },
  {
   "file": "tools/test_provider_metadata_umask.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.002
  },
  {
   "file": "tools/test_publication_guard.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.401
  },
  {
   "file": "tools/test_qr_codes.py",
   "passed": 2,
   "failed": 0,
   "skipped": 4,
   "seconds": 0.452
  },
  {
   "file": "tools/test_release_branch_fixes.py",
   "passed": 22,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.062
  },
  {
   "file": "tools/test_release_data_fixes.py",
   "passed": 35,
   "failed": 0,
   "skipped": 0,
   "seconds": 38.229
  },
  {
   "file": "tools/test_removal_notice_order.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.003
  },
  {
   "file": "tools/test_render_boundary.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.1
  },
  {
   "file": "tools/test_replica_derivation.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.574
  },
  {
   "file": "tools/test_replica_recipient.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.779
  },
  {
   "file": "tools/test_report_brief_timestamps.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.029
  },
  {
   "file": "tools/test_report_repeats.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.95
  },
  {
   "file": "tools/test_report_settings.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.778
  },
  {
   "file": "tools/test_request_limit_slowloris.py",
   "passed": 20,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.452
  },
  {
   "file": "tools/test_request_security.py",
   "passed": 42,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.17
  },
  {
   "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": 0.578
  },
  {
   "file": "tools/test_scale_demo.py",
   "passed": 32,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.061
  },
  {
   "file": "tools/test_sealed_account.py",
   "passed": 26,
   "failed": 0,
   "skipped": 0,
   "seconds": 27.505
  },
  {
   "file": "tools/test_secret_chat_custody.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.179
  },
  {
   "file": "tools/test_secret_chat_safety.py",
   "passed": 9,
   "failed": 1,
   "skipped": 0,
   "seconds": 2.674
  },
  {
   "file": "tools/test_selected_export.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.964
  },
  {
   "file": "tools/test_session_import.py",
   "passed": 21,
   "failed": 2,
   "skipped": 0,
   "seconds": 89.817
  },
  {
   "file": "tools/test_site_context.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.096
  },
  {
   "file": "tools/test_site_metadata.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.435
  },
  {
   "file": "tools/test_site_seo/PageSearchMetadata.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.016
  },
  {
   "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": 2.419
  },
  {
   "file": "tools/test_subject.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.527
  },
  {
   "file": "tools/test_system_map_pool.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.002
  },
  {
   "file": "tools/test_telegram_view_review.py",
   "passed": 20,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.598
  },
  {
   "file": "tools/test_translation.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.529
  },
  {
   "file": "tools/test_tsa_cert_reference.py",
   "passed": 19,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.141
  },
  {
   "file": "tools/test_undercover.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.191
  },
  {
   "file": "tools/test_verification_launcher.py",
   "passed": 16,
   "failed": 0,
   "skipped": 2,
   "seconds": 9.426
  },
  {
   "file": "tools/test_verifier_account_compatibility.py",
   "passed": 35,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.16
  },
  {
   "file": "tools/test_verifier_comparison.py",
   "passed": 22,
   "failed": 1,
   "skipped": 0,
   "seconds": 34.976
  },
  {
   "file": "tools/test_verifier_dispatch.py",
   "passed": 20,
   "failed": 2,
   "skipped": 0,
   "seconds": 0.044
  },
  {
   "file": "tools/test_verifier_languages.py",
   "passed": 115,
   "failed": 0,
   "skipped": 25,
   "seconds": 11.498
  },
  {
   "file": "tools/test_verifier_output_safety.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.083
  },
  {
   "file": "tools/test_verifier_sources.py",
   "passed": 15,
   "failed": 9,
   "skipped": 0,
   "seconds": 4.497
  },
  {
   "file": "tools/test_video_documentation.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.19
  },
  {
   "file": "tools/test_watchlists.py",
   "passed": 16,
   "failed": 1,
   "skipped": 0,
   "seconds": 2.802
  },
  {
   "file": "tools/test_webapp.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.036
  },
  {
   "file": "tools/test_witness_continuity.py",
   "passed": 1,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.332
  },
  {
   "file": "tools/test_witness_daily.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.63
  },
  {
   "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": 3.665
  },
  {
   "file": "tools/test_witness_keys.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.883
  },
  {
   "file": "tools/test_witness_relogin.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.804
  },
  {
   "file": "tools/test_witness_resilience.py",
   "passed": 16,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.531
  }
 ],
 "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.235,
   "message": "assert False\n +  where False = any(<generator object test_edges_cite_journal_records_across_chosen_chats.<locals>.<genexpr> at 0x7dd266e74380>)",
   "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.548,
   "message": "assert False\n +  where False = any(<generator object test_rotated_account_ranks_first_with_explanation_and_citations.<locals>.<genexpr> at 0x7dd2667a2dc0>)",
   "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.297,
   "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.283,
   "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.002,
   "message": "assert 2 == 1999999998\n +  where 2 = len((<tgwitness.message_numbers.MissingNumbers object at 0x7dd25cbcdb80>, 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.661,
   "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.234,
   "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.227,
   "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.292,
   "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": 0.281,
   "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": 0.307,
   "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.292,
   "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.327,
   "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.32,
   "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.214,
   "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_jurisdiction_guidance.py::test_choices_do_not_upgrade_facts_or_claim_safeguards_were_used",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.0,
   "message": "assert 'does not mean a measure was used or verified' in '<section class=\"card panel case-assessment\" id=\"jurisdiction-guidance\" lang=\"en\" dir=\"ltr\"><h2>Jurisdiction guidance<...ed by a separate party takes the host and hypervisor out of the operator&#x27;s control.</p></article></div></section>'\n[+2 more lines; full report in element text]",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "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_narrative.py::test_pdf_html_and_svg_outputs[en]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.707,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[de]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.583,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[fr]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.711,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[es]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.72,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[it]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.666,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[pt]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.661,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[nl]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.633,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[pl]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.563,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[cs]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.66,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[sk]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.659,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[uk]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.654,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ro]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.662,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[bg]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.694,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[hu]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.626,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[el]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.719,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[sv]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.715,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[da]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.716,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[fi]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.702,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[no]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.604,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[lt]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.724,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[lv]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.712,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[et]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.717,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[tr]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.674,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ja]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.694,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[zh]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.593,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[zh-Hant]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.708,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ko]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.827,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ar]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.925,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[he]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.849,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[fa]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.997,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[hi]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.914,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ur]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.994,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[bn]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.955,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[id]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.676,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ms]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.679,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[vi]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.69,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[th]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 1.726,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[uz]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.694,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_pdf_html_and_svg_outputs[ru]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.693,
   "message": "KeyError: 'translation_review'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_jurisdictions_change_only_the_terms_section",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.308,
   "message": "assert 3 == 1\n +  where 3 = len({'<!doctype html><html lang=\"de\" dir=\"ltr\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-wid...c8f7a0d69ff5a7e83a7095b9b2112ec</code></td></tr></table></section><footer>Beweisbericht</footer></main></body></html>'})\n[+1 more line; full report in element text]",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_catalog_policy_and_plural_edge_cases",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.002,
   "message": "FileNotFoundError: [Errno 2] No such file or directory: '/workspace/qa/src/23c7cc65e776bca40b989ff73d9d2a438954604e/tgwitness/narrative/review-policy.json'",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative.py::test_golden_model_is_language_independent",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "AssertionError: assert {'format': 't...e': None, ...} == {'format': 't...e': None, ...}\n  \n  Omitting 6 identical items, use -vv to show\n  Differing items:\n  {'limits': [{'template_key': 'limit.truth', 'params': {}}]} != {'limits': [{'template_key': 'limit.truth', 'params': {}}, {'template_key': 'limit.review', 'params': {}}]}\n  Right contains 1 more item:\n  {'translation_review': 'machine-assisted, not reviewed'}\n  Use -v to get more diff",
   "expected": "Test predates v0.9.3: the narrative no longer carries the \"machine-assisted, not reviewed\" translation note or the limit.review text (removed in 95b944dc9). Pending decision: restore the note or update the test."
  },
  {
   "id": "tools/test_narrative_config.py::test_optional_diagrams_cannot_hide_assurance_limits_or_references[selected0]",
   "file": "tools/test_narrative_config.py",
   "status": "failed",
   "seconds": 0.241,
   "message": "KeyError: 'limit.review'",
   "expected": "Same as test_narrative: expects the limit.review text removed in v0.9.3."
  },
  {
   "id": "tools/test_narrative_config.py::test_optional_diagrams_cannot_hide_assurance_limits_or_references[selected1]",
   "file": "tools/test_narrative_config.py",
   "status": "failed",
   "seconds": 0.313,
   "message": "KeyError: 'limit.review'",
   "expected": "Same as test_narrative: expects the limit.review text removed in v0.9.3."
  },
  {
   "id": "tools/test_narrative_config.py::test_optional_diagrams_cannot_hide_assurance_limits_or_references[selected2]",
   "file": "tools/test_narrative_config.py",
   "status": "failed",
   "seconds": 0.296,
   "message": "assert 1 == 2\n +  where 1 = <built-in method count of str object at 0x21a471f0>('<svg ')\n +    where <built-in method count of str object at 0x21a471f0> = '<!doctype html><html lang=\"en\" dir=\"ltr\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-widt...a0d69ff5a7e83a7095b9b2112ec</code></td></tr></table></section><footer>Evidence narrative</footer></main></body></html>'.count\n +  and   2 = len(['ladder', 'files'])",
   "expected": "Same as test_narrative: expects the limit.review text removed in v0.9.3."
  },
  {
   "id": "tools/test_secret_chat_safety.py::test_allowed_close_is_sent_and_journaled",
   "file": "tools/test_secret_chat_safety.py",
   "status": "failed",
   "seconds": 0.225,
   "message": "ValueError: Connect this account to Telegram first.",
   "expected": "Closing a secret chat now requires a connected account; the test's fake client is not marked connected."
  },
  {
   "id": "tools/test_session_import.py::test_independent_login_browser[False]",
   "file": "tools/test_session_import.py",
   "status": "failed",
   "seconds": 35.017,
   "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": 33.823,
   "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.019,
   "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.245,
   "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.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[unpinned---json]",
   "file": "tools/test_verifier_sources.py",
   "status": "failed",
   "seconds": 0.247,
   "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.253,
   "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.255,
   "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.243,
   "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.527,
   "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.359,
   "message": "assert False\n +  where False = all(<generator object test_terms_patterns_wallets_usernames_and_domains_are_matched.<locals>.<genexpr> at 0x7dd25f4365e0>)",
   "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.081,
   "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\"."
  }
 ]
}
