{
 "source": {
  "repository": "phishdestroy/TgWitness",
  "commit": "c06a2ba5ae98a0ec2f43b537c24e0a10fd32bd85",
  "subject": "Improve jurisdiction guidance and report recovery (#306)"
 },
 "started_at": "2026-11-14T07:28:28+00:00",
 "finished_at": "2026-11-14T07:42:39+00:00",
 "duration_seconds": 850.9,
 "pytest_exit": 1,
 "environment": {
  "os": "Linux-6.8.0-147-generic-x86_64-with-glibc2.39",
  "python": "3.12.3"
 },
 "totals": {
  "passed": 1909,
  "failed": 152,
  "skipped": 35,
  "tests": 2096,
  "files": 134,
  "unexpected_failures": 0
 },
 "files": [
  {
   "file": "addons/capture/tests/test_beacon.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.084
  },
  {
   "file": "addons/capture/tests/test_gateway.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.015
  },
  {
   "file": "addons/capture/tests/test_official.py",
   "passed": 19,
   "failed": 0,
   "skipped": 3,
   "seconds": 1.42
  },
  {
   "file": "addons/capture/tests/test_official_proof.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.115
  },
  {
   "file": "addons/capture/tests/test_trusted.py",
   "passed": 42,
   "failed": 0,
   "skipped": 1,
   "seconds": 10.982
  },
  {
   "file": "addons/capture/tests/test_trusted_anchors.py",
   "passed": 4,
   "failed": 1,
   "skipped": 0,
   "seconds": 0.265
  },
  {
   "file": "tools/test_access_label_privacy.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.039
  },
  {
   "file": "tools/test_account_attachment_integrity.py",
   "passed": 16,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.387
  },
  {
   "file": "tools/test_action_protocol.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.921
  },
  {
   "file": "tools/test_analyzer_graphs.py",
   "passed": 3,
   "failed": 1,
   "skipped": 0,
   "seconds": 1.162
  },
  {
   "file": "tools/test_analyzer_linking.py",
   "passed": 2,
   "failed": 1,
   "skipped": 0,
   "seconds": 1.087
  },
  {
   "file": "tools/test_anchor_backoff.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.236
  },
  {
   "file": "tools/test_anchor_temp_files.py",
   "passed": 1,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.2
  },
  {
   "file": "tools/test_api_authorization_matrix.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.045
  },
  {
   "file": "tools/test_api_refactor.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.485
  },
  {
   "file": "tools/test_archive_token_comparison.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.213
  },
  {
   "file": "tools/test_archive_views.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 9.558
  },
  {
   "file": "tools/test_assurance_boundaries.py",
   "passed": 37,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.229
  },
  {
   "file": "tools/test_assurance_chain.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.975
  },
  {
   "file": "tools/test_assurance_ladder.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.588
  },
  {
   "file": "tools/test_audit_logic_repairs.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 15.818
  },
  {
   "file": "tools/test_audit_platform_fixes.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.885
  },
  {
   "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.573
  },
  {
   "file": "tools/test_capture_open.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.728
  },
  {
   "file": "tools/test_case_package.py",
   "passed": 2,
   "failed": 2,
   "skipped": 0,
   "seconds": 1.872
  },
  {
   "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.205
  },
  {
   "file": "tools/test_chat_export_integrity.py",
   "passed": 15,
   "failed": 1,
   "skipped": 0,
   "seconds": 9.995
  },
  {
   "file": "tools/test_chat_state.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.14
  },
  {
   "file": "tools/test_chat_timeline.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.339
  },
  {
   "file": "tools/test_checkpoint_drand_route.py",
   "passed": 2,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.77
  },
  {
   "file": "tools/test_cli.py",
   "passed": 10,
   "failed": 1,
   "skipped": 0,
   "seconds": 12.636
  },
  {
   "file": "tools/test_client_checks.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.287
  },
  {
   "file": "tools/test_client_initialization.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.776
  },
  {
   "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.005
  },
  {
   "file": "tools/test_cloud_refactor.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.023
  },
  {
   "file": "tools/test_conversation.py",
   "passed": 29,
   "failed": 0,
   "skipped": 0,
   "seconds": 9.781
  },
  {
   "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.018
  },
  {
   "file": "tools/test_deletion_evidence_reports.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.11
  },
  {
   "file": "tools/test_deletion_semantics.py",
   "passed": 0,
   "failed": 8,
   "skipped": 0,
   "seconds": 4.067
  },
  {
   "file": "tools/test_device_attribution.py",
   "passed": 27,
   "failed": 1,
   "skipped": 0,
   "seconds": 4.41
  },
  {
   "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": 7.96
  },
  {
   "file": "tools/test_distributed_export.py",
   "passed": 48,
   "failed": 0,
   "skipped": 0,
   "seconds": 74.886
  },
  {
   "file": "tools/test_distributed_pages.py",
   "passed": 27,
   "failed": 0,
   "skipped": 0,
   "seconds": 38.132
  },
  {
   "file": "tools/test_distributed_takeout.py",
   "passed": 13,
   "failed": 0,
   "skipped": 0,
   "seconds": 16.768
  },
  {
   "file": "tools/test_documentation.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.366
  },
  {
   "file": "tools/test_documentation_scope.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.711
  },
  {
   "file": "tools/test_download_ticket_quotas.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.198
  },
  {
   "file": "tools/test_dstack_archive_limits.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.036
  },
  {
   "file": "tools/test_ephemeral_media.py",
   "passed": 77,
   "failed": 0,
   "skipped": 0,
   "seconds": 9.66
  },
  {
   "file": "tools/test_evidence_checks.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.041
  },
  {
   "file": "tools/test_export_archive_name.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.07
  },
  {
   "file": "tools/test_export_budget.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.214
  },
  {
   "file": "tools/test_export_plan.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.895
  },
  {
   "file": "tools/test_exported_authorization.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.325
  },
  {
   "file": "tools/test_extensions.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.459
  },
  {
   "file": "tools/test_file_hash_export.py",
   "passed": 23,
   "failed": 0,
   "skipped": 0,
   "seconds": 17.189
  },
  {
   "file": "tools/test_fulltext.py",
   "passed": 25,
   "failed": 0,
   "skipped": 0,
   "seconds": 19.746
  },
  {
   "file": "tools/test_gap_analysis.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.844
  },
  {
   "file": "tools/test_history_backfill.py",
   "passed": 29,
   "failed": 0,
   "skipped": 0,
   "seconds": 29.502
  },
  {
   "file": "tools/test_independent_report_pdf.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.925
  },
  {
   "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.524
  },
  {
   "file": "tools/test_installer_checks/InstallerChecksTests.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.047
  },
  {
   "file": "tools/test_journal_write_failures.py",
   "passed": 6,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.503
  },
  {
   "file": "tools/test_jurisdiction_guidance.py",
   "passed": 63,
   "failed": 74,
   "skipped": 0,
   "seconds": 13.848
  },
  {
   "file": "tools/test_lookup_backoff.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.707
  },
  {
   "file": "tools/test_media_job_states.py",
   "passed": 22,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.892
  },
  {
   "file": "tools/test_messages_first_live_media.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.986
  },
  {
   "file": "tools/test_metrics.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.067
  },
  {
   "file": "tools/test_mtproto_forensics.py",
   "passed": 100,
   "failed": 1,
   "skipped": 0,
   "seconds": 0.344
  },
  {
   "file": "tools/test_narrative.py",
   "passed": 20,
   "failed": 42,
   "skipped": 0,
   "seconds": 41.741
  },
  {
   "file": "tools/test_narrative_config.py",
   "passed": 33,
   "failed": 3,
   "skipped": 0,
   "seconds": 9.82
  },
  {
   "file": "tools/test_opsec.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.627
  },
  {
   "file": "tools/test_parallel_exports.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 11.006
  },
  {
   "file": "tools/test_password_export.py",
   "passed": 34,
   "failed": 0,
   "skipped": 0,
   "seconds": 22.559
  },
  {
   "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": 10.967
  },
  {
   "file": "tools/test_persona.py",
   "passed": 31,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.673
  },
  {
   "file": "tools/test_presence_watch.py",
   "passed": 14,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.54
  },
  {
   "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.398
  },
  {
   "file": "tools/test_qr_codes.py",
   "passed": 2,
   "failed": 0,
   "skipped": 4,
   "seconds": 0.6
  },
  {
   "file": "tools/test_release_branch_fixes.py",
   "passed": 22,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.073
  },
  {
   "file": "tools/test_release_data_fixes.py",
   "passed": 35,
   "failed": 0,
   "skipped": 0,
   "seconds": 43.654
  },
  {
   "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.102
  },
  {
   "file": "tools/test_replica_derivation.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.396
  },
  {
   "file": "tools/test_replica_recipient.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.725
  },
  {
   "file": "tools/test_report_brief_timestamps.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.031
  },
  {
   "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.688
  },
  {
   "file": "tools/test_request_limit_slowloris.py",
   "passed": 20,
   "failed": 0,
   "skipped": 0,
   "seconds": 3.529
  },
  {
   "file": "tools/test_request_security.py",
   "passed": 42,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.185
  },
  {
   "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.67
  },
  {
   "file": "tools/test_scale_demo.py",
   "passed": 32,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.031
  },
  {
   "file": "tools/test_sealed_account.py",
   "passed": 26,
   "failed": 0,
   "skipped": 0,
   "seconds": 28.552
  },
  {
   "file": "tools/test_secret_chat_custody.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.469
  },
  {
   "file": "tools/test_secret_chat_safety.py",
   "passed": 9,
   "failed": 1,
   "skipped": 0,
   "seconds": 3.127
  },
  {
   "file": "tools/test_selected_export.py",
   "passed": 12,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.578
  },
  {
   "file": "tools/test_session_import.py",
   "passed": 21,
   "failed": 2,
   "skipped": 0,
   "seconds": 96.006
  },
  {
   "file": "tools/test_site_context.py",
   "passed": 3,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.102
  },
  {
   "file": "tools/test_site_metadata.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.442
  },
  {
   "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.184
  },
  {
   "file": "tools/test_store_transactions.py",
   "passed": 10,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.775
  },
  {
   "file": "tools/test_subject.py",
   "passed": 7,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.41
  },
  {
   "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": 5.384
  },
  {
   "file": "tools/test_translation.py",
   "passed": 15,
   "failed": 0,
   "skipped": 0,
   "seconds": 6.631
  },
  {
   "file": "tools/test_tsa_cert_reference.py",
   "passed": 19,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.225
  },
  {
   "file": "tools/test_undercover.py",
   "passed": 9,
   "failed": 0,
   "skipped": 0,
   "seconds": 0.357
  },
  {
   "file": "tools/test_verification_launcher.py",
   "passed": 16,
   "failed": 0,
   "skipped": 2,
   "seconds": 12.181
  },
  {
   "file": "tools/test_verifier_account_compatibility.py",
   "passed": 35,
   "failed": 0,
   "skipped": 0,
   "seconds": 7.498
  },
  {
   "file": "tools/test_verifier_comparison.py",
   "passed": 22,
   "failed": 1,
   "skipped": 0,
   "seconds": 35.458
  },
  {
   "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.572
  },
  {
   "file": "tools/test_verifier_output_safety.py",
   "passed": 8,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.249
  },
  {
   "file": "tools/test_verifier_sources.py",
   "passed": 15,
   "failed": 9,
   "skipped": 0,
   "seconds": 4.629
  },
  {
   "file": "tools/test_video_documentation.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 1.568
  },
  {
   "file": "tools/test_watchlists.py",
   "passed": 16,
   "failed": 1,
   "skipped": 0,
   "seconds": 4.019
  },
  {
   "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": 10.851
  },
  {
   "file": "tools/test_witness_daily.py",
   "passed": 11,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.777
  },
  {
   "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": 4.884
  },
  {
   "file": "tools/test_witness_keys.py",
   "passed": 4,
   "failed": 0,
   "skipped": 0,
   "seconds": 2.449
  },
  {
   "file": "tools/test_witness_relogin.py",
   "passed": 5,
   "failed": 0,
   "skipped": 0,
   "seconds": 4.745
  },
  {
   "file": "tools/test_witness_resilience.py",
   "passed": 16,
   "failed": 0,
   "skipped": 0,
   "seconds": 5.087
  }
 ],
 "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.363,
   "message": "assert False\n +  where False = any(<generator object test_edges_cite_journal_records_across_chosen_chats.<locals>.<genexpr> at 0x70b6f88d5e50>)",
   "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.521,
   "message": "assert False\n +  where False = any(<generator object test_rotated_account_ranks_first_with_explanation_and_citations.<locals>.<genexpr> at 0x70b708b5a810>)",
   "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": 1.112,
   "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.759,
   "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 0x70b6e6b820f0>, 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.913,
   "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.499,
   "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.54,
   "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.439,
   "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.416,
   "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.449,
   "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.725,
   "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.507,
   "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.492,
   "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.53,
   "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_catalog_routes_keep_sources_local_summary_and_research_status[civil-AT]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-BD]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.002,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-BE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.002,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-BG]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-CA]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, Choose a procedure_scope for CA: civil-ontario, civil-federal [type=value_error, input_value={'jurisdiction': 'CA', 'p...il', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-HR]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-CY]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-CZ]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-DK]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-EE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-ET]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No civil examination route is available for ET [type=value_error, input_value={'jurisdiction': 'ET', 'p...il', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-FI]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-GE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-GR]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No civil examination route is available for GR [type=value_error, input_value={'jurisdiction': 'GR', 'p...il', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-HK]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-HU]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-IE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-IL]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-JP]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-LV]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-LT]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-LU]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-MT]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-MD]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-NL]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No civil examination route is available for NL [type=value_error, input_value={'jurisdiction': 'NL', 'p...il', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-NO]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-PL]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-RO]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-SK]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-SI]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-KR]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-SE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-CH]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-TW]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-TH]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No civil examination route is available for TH [type=value_error, input_value={'jurisdiction': 'TH', 'p...il', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[civil-UZ]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-AT]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-BD]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-BE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-BG]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-HR]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No criminal examination route is available for HR [type=value_error, input_value={'jurisdiction': 'HR', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-CY]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No criminal examination route is available for CY [type=value_error, input_value={'jurisdiction': 'CY', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-CZ]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-DK]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-EE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-ET]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-FI]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-GE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-GR]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No criminal examination route is available for GR [type=value_error, input_value={'jurisdiction': 'GR', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-HK]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-HU]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-ID]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, Choose a procedure_scope for ID: criminal-kuhap-2025, criminal-kuhap-1981-transitional [type=value_error, input_value={'jurisdiction': 'ID', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-IE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-IL]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-JP]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-LV]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-LT]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-LU]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No criminal examination route is available for LU [type=value_error, input_value={'jurisdiction': 'LU', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-MT]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-MD]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-NL]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-NO]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-PL]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-RO]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-SK]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-SI]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No criminal examination route is available for SI [type=value_error, input_value={'jurisdiction': 'SI', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-KR]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-SE]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-CH]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-TW]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-TH]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "pydantic_core._pydantic_core.ValidationError: 1 validation error for Options\n  Value error, No criminal examination route is available for TH [type=value_error, input_value={'jurisdiction': 'TH', 'p...al', 'local_note': True}, input_type=dict]\n    For further information visit https://errors.pydantic.dev/2.14/v/value_error",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "id": "tools/test_jurisdiction_guidance.py::test_catalog_routes_keep_sources_local_summary_and_research_status[criminal-UZ]",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 0.001,
   "message": "TypeError: 'NoneType' object is not subscriptable",
   "expected": "Expects the caveat \"does not mean a measure was used or verified\", removed from jurisdiction guidance after v0.9.3."
  },
  {
   "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.001,
   "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_jurisdiction_guidance.py::test_api_permissions_workspace_isolation_and_export_inheritance",
   "file": "tools/test_jurisdiction_guidance.py",
   "status": "failed",
   "seconds": 1.826,
   "message": "AssertionError: assert (200 == 200 and 60 == 25)\n +  where 200 = <Response [200 OK]>.status_code\n +  and   60 = len([{'code': 'AU', 'name': 'Australia', 'scope': 'Commonwealth model; states and territories vary', 'language': 'en', .......}, {'code': 'BG', 'name': 'Bulgaria', 'language': 'en', 'scope': 'Bulgaria. Expert examination guidance. ', ...}, ...])",
   "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.001,
   "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.774,
   "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": 0.84,
   "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.824,
   "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": 1.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[it]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.804,
   "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.802,
   "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.792,
   "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": 0.801,
   "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.829,
   "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": 1.725,
   "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.865,
   "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.881,
   "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.852,
   "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": 0.879,
   "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.783,
   "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": 1.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[da]",
   "file": "tools/test_narrative.py",
   "status": "failed",
   "seconds": 0.824,
   "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.805,
   "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": 0.783,
   "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.769,
   "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.764,
   "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": 1.706,
   "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.799,
   "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.825,
   "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": 0.828,
   "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.787,
   "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.797,
   "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": 1.979,
   "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": 1.041,
   "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": 1.128,
   "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.062,
   "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": 1.12,
   "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": 1.993,
   "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.769,
   "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.806,
   "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.837,
   "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": 0.953,
   "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.843,
   "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": 1.667,
   "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.449,
   "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/c06a2ba5ae98a0ec2f43b537c24e0a10fd32bd85/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.424,
   "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.4,
   "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.39,
   "message": "assert 1 == 2\n +  where 1 = <built-in method count of str object at 0x300f8cc0>('<svg ')\n +    where <built-in method count of str object at 0x300f8cc0> = '<!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.248,
   "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": 33.983,
   "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": 35.81,
   "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.136,
   "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.254,
   "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.258,
   "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.245,
   "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.25,
   "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.248,
   "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.619,
   "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.483,
   "message": "assert False\n +  where False = all(<generator object test_terms_patterns_wallets_usernames_and_domains_are_matched.<locals>.<genexpr> at 0x70b6ef5daf80>)",
   "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.16,
   "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\"."
  }
 ]
}
