thth 4.3.0__tar.gz → 4.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thth-4.3.0 → thth-4.3.1}/PKG-INFO +2 -1
- {thth-4.3.0 → thth-4.3.1}/README.md +1 -0
- thth-4.3.1/tests/test_v431_stopped_timer.py +81 -0
- thth-4.3.1/thth/VERSION +1 -0
- {thth-4.3.0 → thth-4.3.1}/thth/core.py +25 -2
- thth-4.3.0/thth/VERSION +0 -1
- {thth-4.3.0 → thth-4.3.1}/.gitignore +0 -0
- {thth-4.3.0 → thth-4.3.1}/LICENSE +0 -0
- {thth-4.3.0 → thth-4.3.1}/accounts.example/bluesky.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/accounts.example/hatenablog.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/accounts.example/mastodon.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/accounts.example/principal-hatena.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/accounts.example/threads.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/accounts.example/x.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/bin/thth +0 -0
- {thth-4.3.0 → thth-4.3.1}/bin/thth-remote +0 -0
- {thth-4.3.0 → thth-4.3.1}/bin/thth-run +0 -0
- {thth-4.3.0 → thth-4.3.1}/mcp/server.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/pyproject.toml +0 -0
- {thth-4.3.0 → thth-4.3.1}/skills/thth/SKILL.md +0 -0
- {thth-4.3.0 → thth-4.3.1}/skills/thth-admin/SKILL.md +0 -0
- {thth-4.3.0 → thth-4.3.1}/systemd/thth@.service +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/__init__.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/conftest.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/coordination_snapshot.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/GraphemeBreakTest-17.0.0.txt +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/build_injection_eval.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/callback/worker_responses.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/injection_eval.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/limits_stage3/README.txt +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/limits_stage3/ledgers/vm-kopicha-hatenablog.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/limits_stage3/ledgers/vm-kopicha-x.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/limits_stage3/ledgers/vm-music-threads.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/limits_stage3/principals/vm-kopicha.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/twitter_text_v3_weighted.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/fixtures/umami-bile.md +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s1_flow_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s1_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s2_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s2_http.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s3_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s4_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s5_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/hatena_s6_helpers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/__init__.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_oauth_server.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_push_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_redirect_server.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_search_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_threads_reader.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_threads_status.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_threads_writes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/fake_x.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/hold_lock.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/hold_repo_lock.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/helpers/worker_probe.mjs +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_27_acceptance_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_account_name_check.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_account_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_accounts_dir.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_adapter_boundary.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_admin_http_mcp.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_admin_log.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_admin_notifications.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_admin_repairs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_admin_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_after_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_analytics_comparison.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_analytics_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_api_diagnostic.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_api_error_body.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_app_env_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_approval.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_approve_cmd.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_ask.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_assess.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_atlas_fifth_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_atlas_fourth_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_atlas_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_atlas_second_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_atlas_third_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit1_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit2_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit_b_counterexamples.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit_b_m1_semantics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit_b_n1_depth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit_b_r1_closure.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit_v201.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_audit_v23_details.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_auth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_auth_identity_required.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_b17_remote_reads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_behind_remote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_bluesky_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_bluesky_secret_scrub.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_board_needs_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_board_running.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_branch_replies.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_bundle.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_bundle_not_type_mismatch.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_charcount.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_cli_entrypoint.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_cli_help.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_cli_vm_path.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_collect.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_collect_engagements.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_collect_runs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_collect_sent.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_comparability.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_control_chars_refused.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_conversation_paging.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_count_for.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_docs_links.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_doctor.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_doctor_all_permissions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_doctor_next_step.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_duplicate_front_matter_keys.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_editorial_audit.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_editorial_n3_n4.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_engagements.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_external_acceptance.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_fake_api.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_form_spec.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_form_spec_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_forms.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_fresh_install.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_front_matter_injection.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_healthcheck_notifications.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_hypotheses.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_hypothesis_boundaries.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_hypothesis_units.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_impact_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_inbox_granted_scopes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_incident_notifications.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_independent_thread_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_independent_topic_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_independent_topic_review_r2.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_inflight.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_inflight_tag_body_hash.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_jst.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_limits_policy.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_limits_stage2.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_limits_stage3.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_limits_stage4.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_lint.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_list_projections.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_llm_trial.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_llm_trial_engage.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_lock.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_m2_independent.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_maintain.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_mastodon_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_mastodon_visibility.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_max_per_run.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_mcp.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_mcp_robustness.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_measured.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_media_accounts.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_media_next_steps.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_media_roundtrip.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_media_traits.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_mismatch_diagnostics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_n5_reply_null_element.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_n6_replies_incomplete_ledger.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_n7_doctor_error_body.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_no_limits.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_observation_provenance.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_operations_handoff.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_packaging.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_preview.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_production_mode.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_pull_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_pulse.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_queue.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_quiet_hours.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_r2_r4_r5.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_read_cli_bare_runtimeerror.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_reason_adoption.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_redact.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_redirect_token_leak.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_refresh.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_refresh_destination.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_rejudge_new.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_rejudge_r2_r3.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_replies.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_replies_refresh.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_repo_lock.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_repo_sync.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_report_checkout_import.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_report_http.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_report_isolation.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_report_service.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_retract_already_gone.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_reverse_audit.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_case_id_cluster_m2.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_case_id_cluster_r2.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_evidence_account.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_form_spec_and_case_id.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_provenance.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_review_records.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_revoke.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_roundtrip.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_run_missing_env.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_run_record_failclosed.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_runs_collected.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_runs_read_rows.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_schedule_multiple.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_schedule_view.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_scopes_source_requested.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_search_engage_targets.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_search_media_routes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_secret_value_redact.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_secrets_grep.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_security_small_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_select.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_selfupdate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_send.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_send_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_send_control_chars.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_send_guard_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_send_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_send_visibility.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_sent_integrity.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_server_json.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_site.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_skill_doc.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_study_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_systemd.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_thread_publish.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_thread_read.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_threadrun.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_threads_read_permissions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_threadshape.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_thth_root.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_token_exists.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_token_scopes_record.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_token_set.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic_advice.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic_models.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic_review_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic_shelf_observers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topic_store.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topics_record_concurrent.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_topics_tool.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_trial_frictions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v1015_path_semantics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v1015_take_what_we_can.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_admin_transaction.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_approve_account.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_json_contract.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_length.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_lock_wait.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_mastodon_scopes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_mentions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_post_urls.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_repo_paths.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_reposts.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_study_add.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_tool_version.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_unanswered.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_unanswered_scope.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_where_arguments.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_where_filters.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v210_who_arguments.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v211_auth_integration.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v211_authflow.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v211_bluesky_stdin.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v211_doctor_binding.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v211_mastodon_auth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v211_x_auth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_ask_coordination.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_budget.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_budget_auth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_budget_mcp.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_deletion.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_leave.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_leave_gate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_leave_providers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_leave_token_safety.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_mastodon_guide.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_mcp_compat.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_missing_token.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_read_coordination.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_relay.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_server_writes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_token_parent.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v212_write_storage.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2131_send_dry_run.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2131_threads_publish_wait.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2132_send_inflight_hint.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2132_threads_create_timeout.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2132_threads_create_unknown.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_acceptance_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_adts_asf.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_attachment_kinds.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_external.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_metadata.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_metadata_uri.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_metadata_video.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_record.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_record_video.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_video.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bluesky_webm_named.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_bmff_typed_metadata.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_budget_lock.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_capabilities.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_carryover_timeout.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_graphemes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_auth_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_bmff_audio.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_flac.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_gif.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_link.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_mp3.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_ogg_opus.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_ogg_vorbis.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_poll.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_primary_size_boundary.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_quote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_thumbnail.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_wav.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_webm_audio.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_mastodon_webm_video.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_cleanup.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_formats.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_foundation.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_prepared.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_relay.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_relay_refusals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_media_upload.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_review_followups.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_stage810_audit.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_static_diagnostics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_stop_observation.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_systemd_worker.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_ghost.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_gif.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_link.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_media_spoiler.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_poll.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_quote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_quote_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_replies.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_text.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_text_spoiler.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_threads_video.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_transport_review.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_video_typed_metadata.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_vorbis_comment_boundary.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v213_webm_schema_boundary.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2141_draft_lint_reason.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v2141_managed_repo_umask.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v214_release_signing.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v214_x_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v214_x_auth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v214_x_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v214_x_posts_budget.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v21b_approved_writes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v28_tags.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3100_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3100_invite_admin_approval.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3100_invite_create.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3100_invite_credential.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3100_invite_limits.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3100_invite_worker.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v310_morning.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v310_search_timeout.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v310_watch_words.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3111_observe_counts_only.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3111_observe_no_world.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_leave_same_user.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_mastodon_retract.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_morning_overdue.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_morning_own_exclusion.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_morning_unanswered_window.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_notifications_guidance.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v311_replies_owned.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3120_activity.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3120_admin_write_reasons.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3120_guard.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3120_worker_version.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v312_leave_shared_token.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v312_own_handles_stopped.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v312_report_admin.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v312_report_channel.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v312_report_inbox.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v312_report_mcp_user.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3140_api_relay.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3140_invite_key.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3140_remote_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3140_server_reads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3142_browser_login.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3143_activity_push.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3143_cli_umask_leave.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3143_inflight_remote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3143_managed_repo_recover.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v315_reactions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v317_run_lock_wait.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3180_json_names.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3180_map_timer.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3180_where_filters.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3180_where_keep.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3192_publish_hold.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v31_analysis.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v31_collection.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3200_x_weighted_length.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v320_reply_to_file_display.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v320_reply_to_file_lint.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v320_reply_to_file_resolve.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v320_report_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3220_account_scheduled.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3220_bluesky_reply_control.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3220_bluesky_retract.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3220_invite_mastodon.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3220_mentions_inbox.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v3250_burst_reply_queue.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_fingerprint_version.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_held.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_held_names.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_last_refusals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_notification_route.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_observe.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_report_friction.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_report_words.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v330_reports_effect.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v331_inflight_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v331_listing_resolve.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v331_outbox_retention.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v331_publish_status.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v331_self_resolve.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_fields.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_mcp.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_morning.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_observe.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_open.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_open_confirm.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_reply.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v340_plaza_store.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_nodes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_observe.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_plaza.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_retention.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_self.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_show.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v350_map_world.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v351_leave_timers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v351_plaza_open_holes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v351_who_owned.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_goal_analytics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_goal_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_goal_observe_map.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_goal_plaza.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_goal_record.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_goal_send.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v360_report_timeline.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_account_self_healing.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_approve_pending.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_click_attribution.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_collection_stale_basis.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_follow_comparison.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_local_path.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_weekly_goals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_where_aggregate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_where_also.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v370_where_zero.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_digest.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_from.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_mcp.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_moments.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_owner.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_received.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v380_plaza_triggers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v381_plaza_visibility_default.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v382_confirm_file.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v382_first_stage_not_refusal.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v382_reader_lock_and_push_pending.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v382_sync_without_fetch_head.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v390_docs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v390_per_post_clicks.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v390_where_rate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v390_where_suggest.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v391_plaza_text_numbers.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_jikki_1017.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_jikki_1017_bookmark.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_approve.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_deliveries.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_events.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_fingerprints.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_guard.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_locks.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_principals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_publish.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s1_remote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_audit.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_audit_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_commit.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_convert.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_held.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_oauth1.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_principal_auth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s2_syntax_readback.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s3_adapter.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s3_convert.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s3_flow.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s4_announce.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s4_audit_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s4_bookmark.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s4_ledger.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s5_audit_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s5_conflict.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s5_detect.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s5_guard_remote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s5_jikki.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s6_audit_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s6_bundle.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v400_s6_collect.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v401_board_hatena_token.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v401_bookmark_burst.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v40_contract_json.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v410_audit_night.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v410_bookmark_batch.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v411_batch_cleanup.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v420_bookmark_edit.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v420_bookmark_tag_bytes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v421_audit_fixes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v422_bookmark_rejections.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v422_sparse_checkout.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_v430_reply_batch.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_value_domains_shown.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_version.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_where_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_where_threads_tag_author.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_who_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_writeback_rebase.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_writeback_validate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_community.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_list.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_metrics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_owned_metrics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_search_thread.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_token_autorefresh.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/tests/test_x_trends_counts.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/__init__.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/__main__.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/_grapheme_data.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/account_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/account_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/account_settings.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/accounts.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/activity.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/__init__.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/_x_text_data.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/auth_mastodon.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/auth_threads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/auth_x.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/base.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/bluesky.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/bluesky_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/bluesky_video.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/fotolife.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/hatena_common.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/hatenablog.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/hatenabookmark.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/hatenastar.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/mastodon.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/mastodon_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/threads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/threads_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/x.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/x_media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/adapters/x_text.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/admin_diagnose.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/admin_log.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/admin_notifications.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/admin_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/advise.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/after_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_clicks.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_comparison.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_goals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_shapes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_threads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/analytics_weekly.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/announce.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/api_diagnostic.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/api_requests.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/appconfig.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/appenv.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/approval.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/approve_pending.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/article_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/article_reactions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/ask.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/ask_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/assess.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/audioformats.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/authclients.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/authflow.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/authpassword.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/bluesky_metadata.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/bookmark_batch.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/bookmark_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/budget_x.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/budget_x_posts.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/bundle.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/burst_queue.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/click_attribution.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/collect.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/collection_context.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/collection_status.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/community_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/conflict_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/deletion.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/deliveries.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/deliveries_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/doctor.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/ebmlaudio.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/ebmlvideo.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/engagements.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/events_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/fingerprint_golden.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/flacformats.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/forms.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/fotolife_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/goals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/graphemes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/guard.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/handoff_cursor.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_bookmark.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_conflict.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_convert.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_entry.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_fotolife.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_publish.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/hatena_reactions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/healthcheck.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/httpsafe.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/incident.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/inflight.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/inflight_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/inflight_resolve.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/invites.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/jst.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/leave.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/leave_gate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/limits_config.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/limits_policy.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/limits_view.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/lint.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/list_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/lock.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/maintain.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/managed_repo.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/map_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/map_store.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/map_view.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/map_world.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/measured.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_capabilities.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_cleanup.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_delivery.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_observations.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_relay.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/bluesky.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/fotolife.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/hatenablog.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/hatenabookmark.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/mastodon.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/misskey.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/threads.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits/x.json +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_traits.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/media_uploads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/mediaformats.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/morning.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/mpeg_audio.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/notification_route.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/oauth.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/oauth1.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/oggformats.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/operations_handoff.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza_from.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza_moments.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza_observe.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza_reads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/plaza_redact.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/postid.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/principal_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/principals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/private_store.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/publish_hold.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/pulse.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/queuefile.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/reaction_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/reactions.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/read_coordination.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/read_window.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/redact.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/refusals.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/relay.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/remote.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/replies.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report_details.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report_http.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report_inbox.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report_isolation.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report_service.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/report_timeline.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/retract_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/runs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/scopes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/secrets_fs.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/select.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/selfupdate.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/sent.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/server_files.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/server_reads.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/server_writes.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/stop_observation.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/study_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/study_report.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/summary_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/systemd_gen.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/tags.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/thread_read.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/threadrun.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/threads_read_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/threadshape.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/threadthrow.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/timer_cleanup.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/tool_version.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/topic_advice.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/topic_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/topic_models.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/topic_store.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/topics.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/trends_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/unanswered.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/vorbisformats.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/watch_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/where_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/where_keep.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/where_suggest.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/who_cli.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/worker.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/worker_version.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/writeback.py +0 -0
- {thth-4.3.0 → thth-4.3.1}/thth/x_metrics.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thth
|
|
3
|
-
Version: 4.3.
|
|
3
|
+
Version: 4.3.1
|
|
4
4
|
Summary: 承認済みの投稿だけを投げる門(Threads・Bluesky・Mastodon)。人が承認し、記録は利用者の git に残る。
|
|
5
5
|
Project-URL: Homepage, https://thth.me
|
|
6
6
|
Project-URL: Source, https://github.com/aokings/thth
|
|
@@ -44,6 +44,7 @@ English: [README.en.md](README.en.md) · サイト: https://thth.me · 文書の
|
|
|
44
44
|
- **調べる**: `thth topics <アカウント> --search <語>` で、その語の件数・投稿者の数・最新の投稿を見ます。`thth where` は「次にどこで話すか」を、自分がすでに絡んだ相手を重ねて探します。X の行には投稿者のフォロワー数(「フォロワー 1.2 万」)と投稿数も付きます(`--json` は `author_followers`・`author_posts`。保存しません)。
|
|
45
45
|
- **出す**: `thth send` で今すぐ、`thth schedule` で予約、`--reply-to` で返信です。
|
|
46
46
|
- **ブックマークの連投は記事と別に数える**(4.0.1): はてなブックマークは主体の別の窓(既定 10 分に 10 件)で数え、超えても主体を止めずにその 1 件だけ断ります。1 日 30 件・同じホストへ 1 日 3 件(自分の記事は 1 日 1 件のまま)。記事の連投で止める作りは変わりません([リリースノート 4.0.1](docs/リリースノート_4.0.1_2026-10-17.md))。
|
|
47
|
+
- **止めた口座では timer は何も出さない**(4.3.1): 安全装置か持ち主が止めた口座では、予約の投稿・返信を queue に残し、`thth account resume` で戻せば次の timer で出ます([リリースノート 4.3.1](docs/リリースノート_4.3.1_2026-10-20.md))。
|
|
47
48
|
- **返信はまとめて出す**(4.3.0): 時刻の過ぎた返信は承認したその場で、timer では 1 回でまとめて出します(返信の窓は返信だけで 10 分に 10 件・投稿の窓に数えない・投稿の間隔を掛けない)。使い方は「`publish_at` を今か過去にしてまとめて承認する」だけです([リリースノート 4.3.0](docs/リリースノート_4.3.0_2026-10-19.md))。
|
|
48
49
|
- **1 件の断りでまとめを止めない**(4.2.2): はてなに 1 件だけ断られた札は token を確かめてその札だけ外し、まとめを進めます。断られそうな札(半角の「%」・タグとコメントの長いもの)は 1 段目と lint で予告します(断りません)。止まったまとめは 60 分ごとにしか打たず、`thth bookmark batch-resume` で今すぐ見直せます。sparse-checkout の定義の外には記録を書かず、直し方を言います([リリースノート 4.2.2](docs/リリースノート_4.2.2_2026-10-18.md))。
|
|
49
50
|
- **ブックマークの直しとタグの長さの柵**(4.2.0): `thth bookmark edit` で THTH が付けたブックマークのコメントとタグを 2 段の承認で直す。31 バイトを超えるタグは予告して断る。上限の設定は台帳の `limits` と別名で書け、断りに根拠と通し方が付きます([リリースノート 4.2.0](docs/リリースノート_4.2.0_2026-10-18.md))。
|
|
@@ -20,6 +20,7 @@ English: [README.en.md](README.en.md) · サイト: https://thth.me · 文書の
|
|
|
20
20
|
- **調べる**: `thth topics <アカウント> --search <語>` で、その語の件数・投稿者の数・最新の投稿を見ます。`thth where` は「次にどこで話すか」を、自分がすでに絡んだ相手を重ねて探します。X の行には投稿者のフォロワー数(「フォロワー 1.2 万」)と投稿数も付きます(`--json` は `author_followers`・`author_posts`。保存しません)。
|
|
21
21
|
- **出す**: `thth send` で今すぐ、`thth schedule` で予約、`--reply-to` で返信です。
|
|
22
22
|
- **ブックマークの連投は記事と別に数える**(4.0.1): はてなブックマークは主体の別の窓(既定 10 分に 10 件)で数え、超えても主体を止めずにその 1 件だけ断ります。1 日 30 件・同じホストへ 1 日 3 件(自分の記事は 1 日 1 件のまま)。記事の連投で止める作りは変わりません([リリースノート 4.0.1](docs/リリースノート_4.0.1_2026-10-17.md))。
|
|
23
|
+
- **止めた口座では timer は何も出さない**(4.3.1): 安全装置か持ち主が止めた口座では、予約の投稿・返信を queue に残し、`thth account resume` で戻せば次の timer で出ます([リリースノート 4.3.1](docs/リリースノート_4.3.1_2026-10-20.md))。
|
|
23
24
|
- **返信はまとめて出す**(4.3.0): 時刻の過ぎた返信は承認したその場で、timer では 1 回でまとめて出します(返信の窓は返信だけで 10 分に 10 件・投稿の窓に数えない・投稿の間隔を掛けない)。使い方は「`publish_at` を今か過去にしてまとめて承認する」だけです([リリースノート 4.3.0](docs/リリースノート_4.3.0_2026-10-19.md))。
|
|
24
25
|
- **1 件の断りでまとめを止めない**(4.2.2): はてなに 1 件だけ断られた札は token を確かめてその札だけ外し、まとめを進めます。断られそうな札(半角の「%」・タグとコメントの長いもの)は 1 段目と lint で予告します(断りません)。止まったまとめは 60 分ごとにしか打たず、`thth bookmark batch-resume` で今すぐ見直せます。sparse-checkout の定義の外には記録を書かず、直し方を言います([リリースノート 4.2.2](docs/リリースノート_4.2.2_2026-10-18.md))。
|
|
25
26
|
- **ブックマークの直しとタグの長さの柵**(4.2.0): `thth bookmark edit` で THTH が付けたブックマークのコメントとタグを 2 段の承認で直す。31 バイトを超えるタグは予告して断る。上限の設定は台帳の `limits` と別名で書け、断りに根拠と通し方が付きます([リリースノート 4.2.0](docs/リリースノート_4.2.0_2026-10-18.md))。
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""4.3.1: 止めた口座では timer は何も出さない(masaru 10/20「止めた口座では timer も返信を出さないように直して」・
|
|
2
|
+
予約の投稿も止めることに「それでよいです」)。
|
|
3
|
+
|
|
4
|
+
4.3.0 までは承認の場の送り(`send_due_replies`)と thth.me・CLI の道だけが止めの印(`guard.stopped`)を見て、
|
|
5
|
+
timer の道(`throw_once`)は止めた口座でも予約の投稿と返信を出していた。
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from tests.test_v430_reply_batch import NOW, _Media, _place, _status, _tick
|
|
12
|
+
from thth import guard
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@pytest.fixture
|
|
16
|
+
def account(isolated_account_factory):
|
|
17
|
+
return isolated_account_factory(production=True, min_interval_hours=0)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_止めた口座ではtimerは返信も予約の投稿も出さない(account):
|
|
21
|
+
replies = [_place(account, f"r{i}.md", reply_to=f"1799{i}", minutes_ago=30 - i) for i in range(3)]
|
|
22
|
+
post = _place(account, "p.md", minutes_ago=40)
|
|
23
|
+
guard.stop(account["name"], "owner", now=NOW)
|
|
24
|
+
media = _Media()
|
|
25
|
+
result, lines = _tick(account, media)
|
|
26
|
+
assert result.exit_code == 0 and result.action == "stopped"
|
|
27
|
+
assert media.calls == []
|
|
28
|
+
assert _status(post) == "approved" and all(_status(p) == "approved" for p in replies) # queue に残る
|
|
29
|
+
assert "止まっているので出しません" in result.message
|
|
30
|
+
assert f"thth account resume {account['name']}" in result.message
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_戻したら次のtimerで出す(account):
|
|
34
|
+
reply = _place(account, "r.md", reply_to="17990", minutes_ago=5)
|
|
35
|
+
post = _place(account, "p.md", minutes_ago=40)
|
|
36
|
+
guard.stop(account["name"], "owner", now=NOW)
|
|
37
|
+
media = _Media()
|
|
38
|
+
_tick(account, media)
|
|
39
|
+
assert media.calls == []
|
|
40
|
+
guard.resume(account["name"], by="masaru")
|
|
41
|
+
_tick(account, media, minutes=1)
|
|
42
|
+
assert sorted(c[1] or "" for c in media.calls) == ["", "17990"]
|
|
43
|
+
assert _status(reply) == "posted" and _status(post) == "posted"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_止めた口座ではdry_runも出さないと言う(account):
|
|
47
|
+
_place(account, "p.md", minutes_ago=40)
|
|
48
|
+
guard.stop(account["name"], "burst", now=NOW)
|
|
49
|
+
from thth import core
|
|
50
|
+
result = core.throw_once(account["name"], production_flag=False, adapter_factory=lambda *_: _Media(), now=NOW)
|
|
51
|
+
assert result.action == "stopped" and result.mode == "rehearsal"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_止めの印を置けない置き場では印を読まず出す(account, monkeypatch):
|
|
55
|
+
"""運営者の CLI と同じ(`guard.check(cli=True)`): 印を置けない置き場には印が無い。"""
|
|
56
|
+
reply = _place(account, "r.md", reply_to="17990", minutes_ago=5)
|
|
57
|
+
monkeypatch.setattr(guard, "stop_place_usable", lambda account: False)
|
|
58
|
+
monkeypatch.setattr(guard, "stopped", lambda account: pytest.fail("印を読んだ"))
|
|
59
|
+
media = _Media()
|
|
60
|
+
_tick(account, media)
|
|
61
|
+
assert [c[1] for c in media.calls] == ["17990"] and _status(reply) == "posted"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_印が読めないときは止まっている側(account, monkeypatch):
|
|
65
|
+
from thth import server_files
|
|
66
|
+
_place(account, "r.md", reply_to="17990", minutes_ago=5)
|
|
67
|
+
|
|
68
|
+
def unreadable(account):
|
|
69
|
+
raise server_files.UnsafeFile("unsafe_server_directory")
|
|
70
|
+
monkeypatch.setattr(guard, "stopped", unreadable)
|
|
71
|
+
media = _Media()
|
|
72
|
+
result, _ = _tick(account, media)
|
|
73
|
+
assert result.action == "stopped" and media.calls == []
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_止めた口座ではスレッド連投にも入らない(account, monkeypatch):
|
|
77
|
+
from thth import threadthrow
|
|
78
|
+
monkeypatch.setattr(threadthrow, "run_for_account", lambda *a, **k: pytest.fail("スレッド連投に入った"))
|
|
79
|
+
guard.stop(account["name"], "owner", now=NOW)
|
|
80
|
+
result, _ = _tick(account, _Media())
|
|
81
|
+
assert result.action == "stopped"
|
thth-4.3.1/thth/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.3.1
|
|
@@ -299,6 +299,17 @@ def throw_once(account_name: str, *, production_flag: bool = False,
|
|
|
299
299
|
file=hold_row.get("file"),
|
|
300
300
|
error=hold_row.get("reason") or publish_hold_mod.UNREADABLE)
|
|
301
301
|
|
|
302
|
+
# **止めた口座では timer は何も出さない**(4.3.1・masaru 10/20): 安全装置か持ち主が止めた口座(止めの印
|
|
303
|
+
# `guard.stopped`)では、予約の投稿・返信・スレッド連投のどれも出さない(原稿は queue に残り、指紋も変えない)。
|
|
304
|
+
# 4.3.0 までは承認の場の送りと thth.me・CLI の道だけが印を見て、timer は止めた口座でも出していた。
|
|
305
|
+
# 採取(読むだけ)は止めない。runs には書かない(止まっている間、毎回同じ行が積もるだけ)。
|
|
306
|
+
if _account_stopped(account_name):
|
|
307
|
+
msg = (f"{account_name} は止まっているので出しません(予約の投稿・返信は queue に残ります。"
|
|
308
|
+
f"戻すのは thth account resume {account_name} --by <名前>)")
|
|
309
|
+
log(msg)
|
|
310
|
+
mode = "production" if (bool(account_cfg.get("production")) and production_flag) else "rehearsal"
|
|
311
|
+
return ThrowResult(exit_code=0, mode=mode, action="stopped", message=msg)
|
|
312
|
+
|
|
302
313
|
# **スレッド連投を先に見る**(独立検収 2026-09-11・P1-1)。
|
|
303
314
|
# v2 は**段ごとにロックを取り直す**ので、ここで account+repo ロックを
|
|
304
315
|
# 握ったまま入ることはできない。**握る前に**分岐する。
|
|
@@ -414,7 +425,7 @@ def send_due_replies(account_name: str, paths, *, adapter_factory=None, log=None
|
|
|
414
425
|
elif publish_hold_mod.held(account_name) is not None:
|
|
415
426
|
out["skipped"] = "publish_held"
|
|
416
427
|
elif guard_mod.stopped(account_name) is not None:
|
|
417
|
-
# 安全装置か持ち主が止めた口座(監査 中-3)。timer
|
|
428
|
+
# 安全装置か持ち主が止めた口座(監査 中-3)。timer の道も 4.3.1 から送らない(`throw_once`)。
|
|
418
429
|
out["skipped"] = "guard_stopped"
|
|
419
430
|
elif not accounts_mod.token_exists(account_cfg):
|
|
420
431
|
out["skipped"] = "missing_token"
|
|
@@ -638,6 +649,18 @@ class _ReplyWindow:
|
|
|
638
649
|
return assess.window_slot(self.times, self.count, self.minutes, self.now)
|
|
639
650
|
|
|
640
651
|
|
|
652
|
+
def _account_stopped(account_name) -> bool:
|
|
653
|
+
"""timer が何も出さない口座か(止めの印 `guard.stopped`・4.3.1)。印を置けない置き場では印は無いので読まない
|
|
654
|
+
(運営者の CLI と同じ・`guard.check(cli=True)`)。印が読めないときは止まっている側に倒す。"""
|
|
655
|
+
from . import guard as guard_mod, server_files
|
|
656
|
+
if not guard_mod.stop_place_usable(account_name):
|
|
657
|
+
return False
|
|
658
|
+
try:
|
|
659
|
+
return guard_mod.stopped(account_name) is not None
|
|
660
|
+
except server_files.UnsafeFile:
|
|
661
|
+
return True
|
|
662
|
+
|
|
663
|
+
|
|
641
664
|
def _reply_window_for(account_name, account_cfg, now):
|
|
642
665
|
"""返信の窓。はてなの口座・表が作れないときは None(返信も `max_per_run` に数える 4.2 までの形)。"""
|
|
643
666
|
if account_cfg.get("media") == "hatenablog":
|
|
@@ -2029,7 +2052,7 @@ def _send_locked(account_name, account_cfg, state_dir, run_id, *, text, topic, r
|
|
|
2029
2052
|
# **運営者の CLI(VM で打つ `thth send`)にも安全装置を掛ける**(10/15 masaru「推しで」)。
|
|
2030
2053
|
# それまでは thth.me を通る道(`server_writes` の `before_execute`)にだけ掛かり、
|
|
2031
2054
|
# music-research-threads が 5 分で 7 件出た。thth.me の道は `before_execute` の中で
|
|
2032
|
-
# 見るので二重にしない。timer の予約(`throw_once
|
|
2055
|
+
# 見るので二重にしない。timer の予約(`throw_once`)は数の柵の対象外のまま(止めの印は 4.3.1 から入口で見る)。
|
|
2033
2056
|
if before_execute is None:
|
|
2034
2057
|
from . import burst_queue as burst_queue_mod, guard as guard_mod
|
|
2035
2058
|
try:
|
thth-4.3.0/thth/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
4.3.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|