Skip to content

chore: remove redundant pytest.mark.timeout(30) markers#740

Merged
Aureliolo merged 3 commits intomainfrom
chore/v047-cleanup
Mar 22, 2026
Merged

chore: remove redundant pytest.mark.timeout(30) markers#740
Aureliolo merged 3 commits intomainfrom
chore/v047-cleanup

Conversation

@Aureliolo
Copy link
Copy Markdown
Owner

Summary

  • Remove all 314 redundant pytest.mark.timeout(30) markers across test files -- the global timeout = 30 in pyproject.toml already covers every test
  • Preserve the 2 intentional timeout(60) overrides (Docker sandbox + real LLM integration)
  • Add no-redundant-timeout pre-commit hook (scripts/check_no_redundant_timeout.py) to prevent re-introduction
  • Update CLAUDE.md: document the new hook, clarify timeout is global-only

Test plan

  • grep -r "pytest.mark.timeout(30)" tests/ returns 0 matches
  • grep -r "pytest.mark.timeout(60)" tests/ returns exactly 2 matches (kept)
  • uv run ruff check src/ tests/ -- all checks passed
  • uv run mypy src/ tests/ -- no issues in 1185 files
  • uv run python -m pytest tests/ -m unit -n auto -- 10170 passed
  • uv run pre-commit run no-redundant-timeout --all-files -- passed
  • Hook correctly rejects new pytest.mark.timeout(30) additions (tested manually)

Review coverage

Pre-reviewed by 3 agents (docs-consistency, infra-reviewer, issue-resolution-verifier). 3 findings addressed:

  1. CLAUDE.md pre-commit hooks list updated with no-em-dashes + no-redundant-timeout
  2. CLAUDE.md Testing section clarified that timeout is global-only
  3. Hook regex hardened with \s* to catch whitespace variants

Closes #685

Aureliolo and others added 2 commits March 22, 2026 16:59
pyproject.toml sets timeout = 30 globally for all tests. Remove the
545 redundant per-file pytest.mark.timeout(30) markers that duplicate
this default. Keep the 2 intentional timeout(60) overrides for Docker
sandbox and real LLM integration tests.

Add a pre-commit hook (no-redundant-timeout) to prevent re-introduction.

Closes #685

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Pre-reviewed by 3 agents, 3 findings addressed:
- Add no-em-dashes and no-redundant-timeout to pre-commit hooks list
- Clarify timeout is global-only in Testing section
- Use \s* in hook regex to catch whitespace variants

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 22, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 22, 2026

Walkthrough

This pull request removes 299+ redundant pytest.mark.timeout(30) declarations from test files across the repository. Since pyproject.toml globally configures a 30-second timeout for all tests, these module-level and class-level markers have no effect. The PR introduces a new pre-commit hook (no-redundant-timeout) via a Python script that scans test files and prevents re-introduction of these redundant markers. Intentional timeout overrides such as timeout(60) in e2e and docker tests are preserved. Documentation in CLAUDE.md is updated to clarify the global timeout configuration, and em dashes are replaced with double hyphens in .gitattributes and LICENSE files.

Suggested labels

autorelease: tagged

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'chore: remove redundant pytest.mark.timeout(30) markers' is clear, concise, and accurately describes the primary change in this PR.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, explaining the removal of redundant markers, preservation of intentional overrides, and addition of a pre-commit hook.
Linked Issues check ✅ Passed The pull request fully implements all coding requirements from issue #685: removes 314 redundant timeout(30) markers, preserves timeout(60) overrides, adds the no-redundant-timeout pre-commit hook, and updates documentation.
Out of Scope Changes check ✅ Passed All changes are in-scope: test file modifications align with removing redundant timeouts, script additions implement the required pre-commit hook, documentation updates reflect the changes, and em-dash replacements prepare for the complementary no-em-dashes hook.
Docstring Coverage ✅ Passed Docstring coverage is 50.00% which is sufficient. The required threshold is 40.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@Aureliolo Aureliolo temporarily deployed to cloudflare-preview March 22, 2026 16:04 — with GitHub Actions Inactive
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request streamlines the test suite by eliminating unnecessary explicit timeout markers, relying instead on the globally configured pytest timeout. It also introduces a new pre-commit hook to enforce this standard moving forward, ensuring code quality and consistency. The changes improve the clarity and maintainability of the test codebase and its documentation.

Highlights

  • Redundant Pytest Timeout Markers Removed: Removed 314 instances of pytest.mark.timeout(30) across test files, as the global timeout = 30 in pyproject.toml already applies to all tests. Only two intentional timeout(60) overrides were preserved.
  • New Pre-commit Hook Added: Introduced a new pre-commit hook (scripts/check_no_redundant_timeout.py) to prevent the re-introduction of redundant pytest.mark.timeout(30) markers.
  • Documentation Updated: Updated CLAUDE.md to reflect the global nature of the pytest timeout and to document the newly added no-redundant-timeout pre-commit hook.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.pre-commit-config.yaml:
- Line 5: Remove "no-redundant-timeout" from the ci skip list in
.pre-commit-config.yaml so pre-commit.ci will run that check; specifically edit
the skip array (the key containing commitizen, gitleaks, hadolint-docker, etc.)
and delete the "no-redundant-timeout" entry while leaving the other entries
unchanged.

In `@scripts/check_no_redundant_timeout.py`:
- Around line 19-27: The loop that opens user-supplied paths (using sys.argv[1:]
and Path(path).open in the for loop) should validate each path before reading to
mitigate CodeQL warnings; update the for-loop to skip any absolute paths or
paths that escape the repo (e.g., if Path(path).is_absolute() or ".." in
Path(path).parts) or alternatively resolve the path and ensure it is inside the
repository root (using Path.resolve() and catching ValueError from
Path.resolve().relative_to(repo_root)); keep the existing UnicodeDecodeError and
OSError handling but perform this lightweight check before attempting to open
the file.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: d6732be5-be51-406f-a75c-17f6fb7d02c9

📥 Commits

Reviewing files that changed from the base of the PR and between 712a785 and 0ddb6ce.

📒 Files selected for processing (300)
  • .pre-commit-config.yaml
  • CLAUDE.md
  • scripts/check_no_redundant_timeout.py
  • tests/e2e/test_single_agent_e2e.py
  • tests/integration/communication/test_delegation_integration.py
  • tests/integration/communication/test_meeting_integration.py
  • tests/integration/engine/test_agent_engine_integration.py
  • tests/integration/engine/test_coordination_wiring.py
  • tests/integration/engine/test_crash_recovery.py
  • tests/integration/engine/test_error_taxonomy_integration.py
  • tests/integration/engine/test_graceful_shutdown.py
  • tests/integration/engine/test_multi_agent_delegation.py
  • tests/integration/engine/test_workspace_integration.py
  • tests/integration/memory/test_mem0_backend.py
  • tests/integration/memory/test_retriever_integration.py
  • tests/integration/observability/test_sink_routing_integration.py
  • tests/integration/persistence/test_sqlite_integration.py
  • tests/integration/providers/test_error_scenarios.py
  • tests/integration/providers/test_ollama_pipeline.py
  • tests/integration/providers/test_openrouter_pipeline.py
  • tests/integration/providers/test_provider_pipeline.py
  • tests/integration/providers/test_retry_integration.py
  • tests/integration/providers/test_tool_calling_pipeline.py
  • tests/integration/tools/test_docker_sandbox_integration.py
  • tests/integration/tools/test_mcp_integration.py
  • tests/integration/tools/test_sandbox_integration.py
  • tests/unit/api/conftest.py
  • tests/unit/api/controllers/test_approvals_helpers.py
  • tests/unit/api/controllers/test_backup.py
  • tests/unit/api/controllers/test_coordination.py
  • tests/unit/api/controllers/test_providers.py
  • tests/unit/api/test_auto_wire_meetings.py
  • tests/unit/api/test_server.py
  • tests/unit/backup/conftest.py
  • tests/unit/backup/test_config.py
  • tests/unit/backup/test_errors.py
  • tests/unit/backup/test_handlers/test_config_handler.py
  • tests/unit/backup/test_handlers/test_memory_handler.py
  • tests/unit/backup/test_handlers/test_persistence_handler.py
  • tests/unit/backup/test_models.py
  • tests/unit/backup/test_retention.py
  • tests/unit/backup/test_scheduler.py
  • tests/unit/backup/test_service.py
  • tests/unit/budget/conftest.py
  • tests/unit/budget/test_billing.py
  • tests/unit/budget/test_call_category.py
  • tests/unit/budget/test_category_analytics.py
  • tests/unit/budget/test_config.py
  • tests/unit/budget/test_coordination_config.py
  • tests/unit/budget/test_coordination_metrics.py
  • tests/unit/budget/test_cost_record.py
  • tests/unit/budget/test_cost_tiers.py
  • tests/unit/budget/test_degradation.py
  • tests/unit/budget/test_enforcer.py
  • tests/unit/budget/test_enforcer_degradation.py
  • tests/unit/budget/test_enforcer_quota.py
  • tests/unit/budget/test_enums.py
  • tests/unit/budget/test_errors.py
  • tests/unit/budget/test_hierarchy.py
  • tests/unit/budget/test_quota.py
  • tests/unit/budget/test_quota_tracker.py
  • tests/unit/budget/test_spending_summary.py
  • tests/unit/budget/test_tracker.py
  • tests/unit/communication/conflict_resolution/test_authority_strategy.py
  • tests/unit/communication/conflict_resolution/test_config.py
  • tests/unit/communication/conflict_resolution/test_debate_strategy.py
  • tests/unit/communication/conflict_resolution/test_helpers.py
  • tests/unit/communication/conflict_resolution/test_human_strategy.py
  • tests/unit/communication/conflict_resolution/test_hybrid_strategy.py
  • tests/unit/communication/conflict_resolution/test_models.py
  • tests/unit/communication/conflict_resolution/test_service.py
  • tests/unit/communication/delegation/test_authority.py
  • tests/unit/communication/delegation/test_hierarchy.py
  • tests/unit/communication/delegation/test_models.py
  • tests/unit/communication/delegation/test_service.py
  • tests/unit/communication/loop_prevention/test_ancestry.py
  • tests/unit/communication/loop_prevention/test_circuit_breaker.py
  • tests/unit/communication/loop_prevention/test_dedup.py
  • tests/unit/communication/loop_prevention/test_depth.py
  • tests/unit/communication/loop_prevention/test_guard.py
  • tests/unit/communication/loop_prevention/test_rate_limit.py
  • tests/unit/communication/meeting/test_config.py
  • tests/unit/communication/meeting/test_enums.py
  • tests/unit/communication/meeting/test_errors.py
  • tests/unit/communication/meeting/test_models.py
  • tests/unit/communication/meeting/test_orchestrator.py
  • tests/unit/communication/meeting/test_parsing.py
  • tests/unit/communication/meeting/test_participant.py
  • tests/unit/communication/meeting/test_position_papers.py
  • tests/unit/communication/meeting/test_prompts.py
  • tests/unit/communication/meeting/test_protocol.py
  • tests/unit/communication/meeting/test_round_robin.py
  • tests/unit/communication/meeting/test_structured_phases.py
  • tests/unit/communication/meeting/test_token_tracker.py
  • tests/unit/communication/test_bus_memory.py
  • tests/unit/communication/test_channel.py
  • tests/unit/communication/test_config.py
  • tests/unit/communication/test_dispatcher.py
  • tests/unit/communication/test_enums.py
  • tests/unit/communication/test_errors.py
  • tests/unit/communication/test_handler.py
  • tests/unit/communication/test_message.py
  • tests/unit/communication/test_messenger.py
  • tests/unit/communication/test_subscription.py
  • tests/unit/config/conftest.py
  • tests/unit/config/test_bootstrap_logging.py
  • tests/unit/config/test_utils_properties.py
  • tests/unit/core/test_agent.py
  • tests/unit/core/test_artifact.py
  • tests/unit/core/test_company.py
  • tests/unit/core/test_enums.py
  • tests/unit/core/test_personality.py
  • tests/unit/core/test_project.py
  • tests/unit/core/test_role.py
  • tests/unit/core/test_role_catalog.py
  • tests/unit/core/test_task.py
  • tests/unit/core/test_task_transitions.py
  • tests/unit/core/test_types.py
  • tests/unit/core/test_validation.py
  • tests/unit/engine/checkpoint/test_callback_factory.py
  • tests/unit/engine/checkpoint/test_models.py
  • tests/unit/engine/checkpoint/test_resume.py
  • tests/unit/engine/checkpoint/test_strategy.py
  • tests/unit/engine/compaction/test_summarizer.py
  • tests/unit/engine/stagnation/test_properties.py
  • tests/unit/engine/task_engine_helpers.py
  • tests/unit/engine/test_agent_engine.py
  • tests/unit/engine/test_agent_engine_auto_loop.py
  • tests/unit/engine/test_agent_engine_budget.py
  • tests/unit/engine/test_agent_engine_degradation.py
  • tests/unit/engine/test_agent_engine_errors.py
  • tests/unit/engine/test_agent_engine_lifecycle.py
  • tests/unit/engine/test_agent_state.py
  • tests/unit/engine/test_approval_gate.py
  • tests/unit/engine/test_approval_gate_models.py
  • tests/unit/engine/test_coordination_factory.py
  • tests/unit/engine/test_coordination_section_config.py
  • tests/unit/engine/test_hybrid_loop.py
  • tests/unit/engine/test_loop_helpers_approval.py
  • tests/unit/engine/test_loop_selector.py
  • tests/unit/engine/test_plan_helpers.py
  • tests/unit/engine/test_plan_parsing.py
  • tests/unit/engine/test_policy_validation.py
  • tests/unit/engine/test_prompt.py
  • tests/unit/engine/test_prompt_template.py
  • tests/unit/engine/test_recovery.py
  • tests/unit/engine/test_recovery_checkpoint_fields.py
  • tests/unit/engine/test_review_gate.py
  • tests/unit/engine/test_sanitization.py
  • tests/unit/engine/test_security_factory.py
  • tests/unit/engine/test_shutdown.py
  • tests/unit/engine/test_task_execution.py
  • tests/unit/engine/test_task_sync.py
  • tests/unit/hr/performance/test_models.py
  • tests/unit/hr/performance/test_tracker.py
  • tests/unit/hr/promotion/test_config.py
  • tests/unit/hr/promotion/test_models.py
  • tests/unit/hr/promotion/test_seniority_approval_strategy.py
  • tests/unit/hr/promotion/test_seniority_model_mapping.py
  • tests/unit/hr/promotion/test_threshold_evaluator.py
  • tests/unit/memory/backends/mem0/test_adapter.py
  • tests/unit/memory/backends/mem0/test_adapter_crud.py
  • tests/unit/memory/backends/mem0/test_adapter_shared.py
  • tests/unit/memory/backends/mem0/test_config.py
  • tests/unit/memory/backends/mem0/test_mappers.py
  • tests/unit/memory/consolidation/test_abstractive.py
  • tests/unit/memory/consolidation/test_archival.py
  • tests/unit/memory/consolidation/test_config.py
  • tests/unit/memory/consolidation/test_density.py
  • tests/unit/memory/consolidation/test_dual_mode_strategy.py
  • tests/unit/memory/consolidation/test_extractive.py
  • tests/unit/memory/consolidation/test_models.py
  • tests/unit/memory/consolidation/test_retention.py
  • tests/unit/memory/consolidation/test_service.py
  • tests/unit/memory/consolidation/test_strategy.py
  • tests/unit/memory/org/test_access_control.py
  • tests/unit/memory/org/test_config.py
  • tests/unit/memory/org/test_errors.py
  • tests/unit/memory/org/test_factory.py
  • tests/unit/memory/org/test_hybrid_backend.py
  • tests/unit/memory/org/test_models.py
  • tests/unit/memory/org/test_prompt_integration.py
  • tests/unit/memory/org/test_protocol.py
  • tests/unit/memory/org/test_store.py
  • tests/unit/memory/test_capabilities.py
  • tests/unit/memory/test_config.py
  • tests/unit/memory/test_errors.py
  • tests/unit/memory/test_factory.py
  • tests/unit/memory/test_filter.py
  • tests/unit/memory/test_formatter.py
  • tests/unit/memory/test_init.py
  • tests/unit/memory/test_injection.py
  • tests/unit/memory/test_models.py
  • tests/unit/memory/test_protocol.py
  • tests/unit/memory/test_ranking.py
  • tests/unit/memory/test_retrieval_config.py
  • tests/unit/memory/test_retriever.py
  • tests/unit/memory/test_shared.py
  • tests/unit/memory/test_store_guard.py
  • tests/unit/observability/test_config.py
  • tests/unit/observability/test_correlation.py
  • tests/unit/observability/test_correlation_async.py
  • tests/unit/observability/test_enums.py
  • tests/unit/observability/test_events.py
  • tests/unit/observability/test_logger.py
  • tests/unit/observability/test_processors.py
  • tests/unit/observability/test_setup.py
  • tests/unit/observability/test_sink_routing.py
  • tests/unit/observability/test_sinks.py
  • tests/unit/persistence/conftest.py
  • tests/unit/persistence/sqlite/test_agent_state_repo.py
  • tests/unit/persistence/sqlite/test_checkpoint_repo.py
  • tests/unit/persistence/sqlite/test_heartbeat_repo.py
  • tests/unit/providers/management/test_service.py
  • tests/unit/providers/management/test_service_allowlist.py
  • tests/unit/providers/management/test_service_discovery.py
  • tests/unit/providers/resilience/test_config.py
  • tests/unit/providers/resilience/test_errors.py
  • tests/unit/providers/resilience/test_rate_limiter.py
  • tests/unit/providers/resilience/test_retry.py
  • tests/unit/providers/routing/test_errors.py
  • tests/unit/providers/routing/test_models.py
  • tests/unit/providers/routing/test_resolver.py
  • tests/unit/providers/routing/test_router.py
  • tests/unit/providers/routing/test_strategies.py
  • tests/unit/providers/test_base_provider.py
  • tests/unit/providers/test_capabilities.py
  • tests/unit/providers/test_discovery.py
  • tests/unit/providers/test_discovery_policy.py
  • tests/unit/providers/test_enums.py
  • tests/unit/providers/test_errors.py
  • tests/unit/providers/test_family.py
  • tests/unit/providers/test_models.py
  • tests/unit/providers/test_protocol.py
  • tests/unit/providers/test_url_utils.py
  • tests/unit/security/rules/test_credential_detector.py
  • tests/unit/security/rules/test_custom_policy_rule.py
  • tests/unit/security/rules/test_data_leak_detector.py
  • tests/unit/security/rules/test_destructive_op_detector.py
  • tests/unit/security/rules/test_engine.py
  • tests/unit/security/rules/test_path_traversal_detector.py
  • tests/unit/security/rules/test_policy_validator.py
  • tests/unit/security/rules/test_risk_classifier.py
  • tests/unit/security/rules/test_utils.py
  • tests/unit/security/test_action_type_mapping.py
  • tests/unit/security/test_action_types.py
  • tests/unit/security/test_audit.py
  • tests/unit/security/test_config.py
  • tests/unit/security/test_llm_evaluator.py
  • tests/unit/security/test_llm_fallback_integration.py
  • tests/unit/security/test_models.py
  • tests/unit/security/test_output_scan_policy.py
  • tests/unit/security/test_output_scan_policy_factory.py
  • tests/unit/security/test_output_scanner.py
  • tests/unit/security/test_service.py
  • tests/unit/security/timeout/test_park_service.py
  • tests/unit/security/timeout/test_parked_context.py
  • tests/unit/security/timeout/test_scheduler.py
  • tests/unit/security/timeout/test_timeout_checker.py
  • tests/unit/security/trust/test_config.py
  • tests/unit/security/trust/test_disabled_strategy.py
  • tests/unit/security/trust/test_enums.py
  • tests/unit/security/trust/test_milestone_strategy.py
  • tests/unit/security/trust/test_models.py
  • tests/unit/security/trust/test_per_category_strategy.py
  • tests/unit/security/trust/test_service.py
  • tests/unit/security/trust/test_weighted_strategy.py
  • tests/unit/settings/test_backup_subscriber.py
  • tests/unit/settings/test_models.py
  • tests/unit/templates/test_errors.py
  • tests/unit/templates/test_inheritance.py
  • tests/unit/templates/test_loader.py
  • tests/unit/templates/test_renderer.py
  • tests/unit/templates/test_schema.py
  • tests/unit/tools/file_system/test_base_fs_tool.py
  • tests/unit/tools/file_system/test_delete_file.py
  • tests/unit/tools/file_system/test_edit_file.py
  • tests/unit/tools/file_system/test_list_directory.py
  • tests/unit/tools/file_system/test_path_validator.py
  • tests/unit/tools/file_system/test_read_file.py
  • tests/unit/tools/file_system/test_write_file.py
  • tests/unit/tools/git/test_git_clone.py
  • tests/unit/tools/git/test_git_sandbox_integration.py
  • tests/unit/tools/git/test_git_tools.py
  • tests/unit/tools/git/test_git_url_validator.py
  • tests/unit/tools/git/test_git_url_validator_toctou.py
  • tests/unit/tools/mcp/test_bridge_tool.py
  • tests/unit/tools/mcp/test_cache.py
  • tests/unit/tools/mcp/test_client.py
  • tests/unit/tools/mcp/test_config.py
  • tests/unit/tools/mcp/test_errors.py
  • tests/unit/tools/mcp/test_factory.py
  • tests/unit/tools/mcp/test_result_mapper.py
  • tests/unit/tools/sandbox/test_allowed_hosts.py
  • tests/unit/tools/sandbox/test_config.py
  • tests/unit/tools/sandbox/test_docker_config.py
  • tests/unit/tools/sandbox/test_docker_sandbox.py
  • tests/unit/tools/sandbox/test_errors.py
  • tests/unit/tools/sandbox/test_protocol.py
  • tests/unit/tools/sandbox/test_result.py
💤 Files with no reviewable changes (239)
  • tests/integration/communication/test_meeting_integration.py
  • tests/integration/observability/test_sink_routing_integration.py
  • tests/unit/api/controllers/test_providers.py
  • tests/unit/api/test_auto_wire_meetings.py
  • tests/unit/budget/conftest.py
  • tests/unit/budget/test_call_category.py
  • tests/unit/budget/test_coordination_metrics.py
  • tests/unit/budget/test_degradation.py
  • tests/unit/budget/test_enforcer_quota.py
  • tests/unit/budget/test_enums.py
  • tests/unit/budget/test_errors.py
  • tests/unit/budget/test_hierarchy.py
  • tests/unit/budget/test_spending_summary.py
  • tests/unit/budget/test_tracker.py
  • tests/unit/communication/conflict_resolution/test_debate_strategy.py
  • tests/unit/communication/conflict_resolution/test_helpers.py
  • tests/unit/communication/conflict_resolution/test_human_strategy.py
  • tests/unit/communication/conflict_resolution/test_hybrid_strategy.py
  • tests/unit/communication/conflict_resolution/test_models.py
  • tests/unit/communication/delegation/test_authority.py
  • tests/unit/communication/delegation/test_hierarchy.py
  • tests/unit/communication/delegation/test_service.py
  • tests/unit/communication/loop_prevention/test_dedup.py
  • tests/unit/communication/loop_prevention/test_guard.py
  • tests/unit/communication/loop_prevention/test_rate_limit.py
  • tests/unit/communication/meeting/test_config.py
  • tests/unit/communication/meeting/test_enums.py
  • tests/unit/communication/meeting/test_errors.py
  • tests/unit/communication/meeting/test_orchestrator.py
  • tests/unit/communication/meeting/test_participant.py
  • tests/unit/communication/meeting/test_position_papers.py
  • tests/unit/communication/meeting/test_prompts.py
  • tests/unit/communication/meeting/test_protocol.py
  • tests/unit/communication/meeting/test_round_robin.py
  • tests/unit/communication/meeting/test_structured_phases.py
  • tests/unit/communication/meeting/test_token_tracker.py
  • tests/unit/communication/test_channel.py
  • tests/unit/communication/test_dispatcher.py
  • tests/unit/communication/test_enums.py
  • tests/unit/communication/test_errors.py
  • tests/unit/communication/test_handler.py
  • tests/unit/communication/test_message.py
  • tests/unit/communication/test_messenger.py
  • tests/unit/config/conftest.py
  • tests/unit/config/test_bootstrap_logging.py
  • tests/unit/config/test_utils_properties.py
  • tests/unit/core/test_artifact.py
  • tests/unit/core/test_agent.py
  • tests/unit/core/test_company.py
  • tests/unit/core/test_enums.py
  • tests/unit/core/test_personality.py
  • tests/unit/core/test_project.py
  • tests/unit/core/test_role.py
  • tests/unit/core/test_task.py
  • tests/unit/core/test_task_transitions.py
  • tests/unit/core/test_types.py
  • tests/unit/engine/checkpoint/test_callback_factory.py
  • tests/unit/engine/checkpoint/test_models.py
  • tests/unit/engine/checkpoint/test_resume.py
  • tests/unit/engine/checkpoint/test_strategy.py
  • tests/unit/engine/compaction/test_summarizer.py
  • tests/unit/engine/stagnation/test_properties.py
  • tests/unit/engine/task_engine_helpers.py
  • tests/unit/engine/test_agent_engine.py
  • tests/unit/engine/test_agent_engine_budget.py
  • tests/unit/engine/test_agent_engine_degradation.py
  • tests/unit/engine/test_agent_engine_errors.py
  • tests/unit/engine/test_agent_engine_lifecycle.py
  • tests/unit/engine/test_agent_state.py
  • tests/unit/engine/test_coordination_section_config.py
  • tests/unit/engine/test_loop_selector.py
  • tests/unit/engine/test_plan_helpers.py
  • tests/unit/engine/test_plan_parsing.py
  • tests/unit/engine/test_prompt.py
  • tests/unit/engine/test_prompt_template.py
  • tests/unit/engine/test_recovery.py
  • tests/unit/engine/test_recovery_checkpoint_fields.py
  • tests/unit/engine/test_review_gate.py
  • tests/unit/engine/test_sanitization.py
  • tests/unit/engine/test_shutdown.py
  • tests/unit/engine/test_task_execution.py
  • tests/unit/engine/test_task_sync.py
  • tests/unit/hr/performance/test_models.py
  • tests/unit/hr/performance/test_tracker.py
  • tests/unit/memory/backends/mem0/test_adapter.py
  • tests/unit/memory/backends/mem0/test_adapter_crud.py
  • tests/unit/memory/backends/mem0/test_adapter_shared.py
  • tests/unit/memory/backends/mem0/test_config.py
  • tests/unit/memory/backends/mem0/test_mappers.py
  • tests/unit/memory/consolidation/test_abstractive.py
  • tests/unit/memory/consolidation/test_config.py
  • tests/unit/memory/consolidation/test_density.py
  • tests/unit/memory/consolidation/test_dual_mode_strategy.py
  • tests/unit/memory/consolidation/test_extractive.py
  • tests/unit/memory/consolidation/test_archival.py
  • tests/unit/memory/consolidation/test_models.py
  • tests/unit/memory/consolidation/test_retention.py
  • tests/unit/memory/consolidation/test_service.py
  • tests/unit/memory/consolidation/test_strategy.py
  • tests/unit/memory/org/test_access_control.py
  • tests/unit/memory/org/test_errors.py
  • tests/unit/memory/org/test_factory.py
  • tests/unit/memory/org/test_config.py
  • tests/unit/memory/org/test_hybrid_backend.py
  • tests/unit/memory/org/test_models.py
  • tests/unit/memory/org/test_prompt_integration.py
  • tests/unit/memory/org/test_protocol.py
  • tests/unit/memory/test_capabilities.py
  • tests/unit/memory/test_config.py
  • tests/unit/memory/org/test_store.py
  • tests/unit/memory/test_errors.py
  • tests/unit/memory/test_factory.py
  • tests/unit/memory/test_filter.py
  • tests/unit/memory/test_formatter.py
  • tests/unit/memory/test_init.py
  • tests/unit/memory/test_injection.py
  • tests/unit/memory/test_protocol.py
  • tests/unit/memory/test_models.py
  • tests/unit/memory/test_ranking.py
  • tests/unit/memory/test_retrieval_config.py
  • tests/unit/memory/test_retriever.py
  • tests/unit/memory/test_shared.py
  • tests/unit/memory/test_store_guard.py
  • tests/unit/observability/test_config.py
  • tests/unit/observability/test_correlation.py
  • tests/unit/observability/test_correlation_async.py
  • tests/unit/observability/test_enums.py
  • tests/unit/observability/test_logger.py
  • tests/unit/observability/test_processors.py
  • tests/unit/observability/test_setup.py
  • tests/unit/observability/test_sink_routing.py
  • tests/unit/observability/test_sinks.py
  • tests/unit/persistence/conftest.py
  • tests/unit/persistence/sqlite/test_agent_state_repo.py
  • tests/unit/persistence/sqlite/test_checkpoint_repo.py
  • tests/unit/persistence/sqlite/test_heartbeat_repo.py
  • tests/unit/providers/resilience/test_config.py
  • tests/integration/communication/test_delegation_integration.py
  • tests/integration/engine/test_graceful_shutdown.py
  • tests/integration/memory/test_mem0_backend.py
  • tests/integration/memory/test_retriever_integration.py
  • tests/integration/providers/test_retry_integration.py
  • tests/integration/tools/test_docker_sandbox_integration.py
  • tests/unit/api/conftest.py
  • tests/unit/api/controllers/test_backup.py
  • tests/unit/api/controllers/test_coordination.py
  • tests/unit/backup/conftest.py
  • tests/unit/backup/test_config.py
  • tests/unit/backup/test_handlers/test_config_handler.py
  • tests/unit/backup/test_handlers/test_persistence_handler.py
  • tests/unit/backup/test_models.py
  • tests/unit/backup/test_retention.py
  • tests/unit/backup/test_scheduler.py
  • tests/unit/backup/test_service.py
  • tests/unit/budget/test_billing.py
  • tests/unit/budget/test_category_analytics.py
  • tests/unit/budget/test_config.py
  • tests/unit/budget/test_coordination_config.py
  • tests/unit/budget/test_cost_record.py
  • tests/unit/budget/test_cost_tiers.py
  • tests/unit/budget/test_enforcer.py
  • tests/unit/budget/test_enforcer_degradation.py
  • tests/unit/budget/test_quota_tracker.py
  • tests/unit/communication/conflict_resolution/test_authority_strategy.py
  • tests/unit/communication/conflict_resolution/test_config.py
  • tests/unit/communication/conflict_resolution/test_service.py
  • tests/unit/communication/delegation/test_models.py
  • tests/unit/communication/loop_prevention/test_circuit_breaker.py
  • tests/unit/communication/loop_prevention/test_ancestry.py
  • tests/unit/communication/loop_prevention/test_depth.py
  • tests/unit/communication/meeting/test_models.py
  • tests/unit/communication/meeting/test_parsing.py
  • tests/unit/communication/test_bus_memory.py
  • tests/unit/communication/test_config.py
  • tests/unit/engine/test_agent_engine_auto_loop.py
  • tests/unit/engine/test_hybrid_loop.py
  • tests/unit/providers/test_enums.py
  • tests/unit/providers/resilience/test_errors.py
  • tests/unit/providers/management/test_service.py
  • tests/unit/providers/test_capabilities.py
  • tests/unit/providers/test_base_provider.py
  • tests/unit/providers/test_protocol.py
  • tests/unit/security/rules/test_credential_detector.py
  • tests/unit/security/rules/test_policy_validator.py
  • tests/unit/providers/test_errors.py
  • tests/unit/security/rules/test_destructive_op_detector.py
  • tests/unit/providers/test_family.py
  • tests/unit/security/rules/test_data_leak_detector.py
  • tests/unit/security/rules/test_engine.py
  • tests/unit/security/rules/test_utils.py
  • tests/unit/security/rules/test_path_traversal_detector.py
  • tests/unit/security/rules/test_risk_classifier.py
  • tests/unit/security/test_config.py
  • tests/unit/security/test_action_type_mapping.py
  • tests/unit/security/test_action_types.py
  • tests/unit/providers/resilience/test_retry.py
  • tests/unit/security/test_audit.py
  • tests/unit/security/test_output_scan_policy_factory.py
  • tests/unit/security/test_llm_fallback_integration.py
  • tests/unit/security/timeout/test_park_service.py
  • tests/unit/security/test_output_scan_policy.py
  • tests/unit/security/test_models.py
  • tests/unit/security/test_output_scanner.py
  • tests/unit/security/timeout/test_timeout_checker.py
  • tests/unit/security/timeout/test_scheduler.py
  • tests/unit/security/trust/test_disabled_strategy.py
  • tests/unit/security/test_llm_evaluator.py
  • tests/unit/security/test_service.py
  • tests/unit/security/trust/test_enums.py
  • tests/unit/security/timeout/test_parked_context.py
  • tests/unit/security/trust/test_config.py
  • tests/unit/providers/test_models.py
  • tests/unit/security/trust/test_models.py
  • tests/unit/backup/test_handlers/test_memory_handler.py
  • tests/unit/budget/test_quota.py
  • tests/unit/core/test_role_catalog.py
  • tests/unit/engine/test_coordination_factory.py
  • tests/unit/templates/test_inheritance.py
  • tests/unit/tools/file_system/test_read_file.py
  • tests/unit/security/trust/test_weighted_strategy.py
  • tests/unit/security/trust/test_service.py
  • tests/unit/templates/test_errors.py
  • tests/unit/tools/file_system/test_delete_file.py
  • tests/unit/tools/git/test_git_clone.py
  • tests/unit/templates/test_schema.py
  • tests/unit/templates/test_loader.py
  • tests/unit/tools/file_system/test_edit_file.py
  • tests/unit/templates/test_renderer.py
  • tests/unit/security/trust/test_milestone_strategy.py
  • tests/unit/tools/git/test_git_url_validator.py
  • tests/unit/backup/test_errors.py
  • tests/unit/tools/file_system/test_list_directory.py
  • tests/unit/settings/test_backup_subscriber.py
  • tests/unit/tools/git/test_git_tools.py
  • tests/unit/tools/file_system/test_base_fs_tool.py
  • tests/unit/security/trust/test_per_category_strategy.py
  • tests/unit/tools/file_system/test_path_validator.py
  • tests/unit/tools/file_system/test_write_file.py
  • tests/unit/tools/git/test_git_url_validator_toctou.py

autofix_prs: true
autofix_commit_msg: "style: auto-fix pre-commit hooks"
skip: [commitizen, gitleaks, hadolint-docker, no-em-dashes, mypy, pytest-unit, golangci-lint, go-vet, go-test]
skip: [commitizen, gitleaks, hadolint-docker, no-em-dashes, no-redundant-timeout, mypy, pytest-unit, golangci-lint, go-vet, go-test]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Do not skip no-redundant-timeout in pre-commit.ci.

Adding no-redundant-timeout to ci.skip disables the new guard in pre-commit.ci, which undercuts the “prevent re-introduction” objective for PR automation paths.

Suggested fix
-ci:
-  autoupdate_schedule: never
-  autofix_prs: true
-  autofix_commit_msg: "style: auto-fix pre-commit hooks"
-  skip: [commitizen, gitleaks, hadolint-docker, no-em-dashes, no-redundant-timeout, mypy, pytest-unit, golangci-lint, go-vet, go-test]
+ci:
+  autoupdate_schedule: never
+  autofix_prs: true
+  autofix_commit_msg: "style: auto-fix pre-commit hooks"
+  skip: [commitizen, gitleaks, hadolint-docker, no-em-dashes, mypy, pytest-unit, golangci-lint, go-vet, go-test]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
skip: [commitizen, gitleaks, hadolint-docker, no-em-dashes, no-redundant-timeout, mypy, pytest-unit, golangci-lint, go-vet, go-test]
ci:
autoupdate_schedule: never
autofix_prs: true
autofix_commit_msg: "style: auto-fix pre-commit hooks"
skip: [commitizen, gitleaks, hadolint-docker, no-em-dashes, mypy, pytest-unit, golangci-lint, go-vet, go-test]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.pre-commit-config.yaml at line 5, Remove "no-redundant-timeout" from the ci
skip list in .pre-commit-config.yaml so pre-commit.ci will run that check;
specifically edit the skip array (the key containing commitizen, gitleaks,
hadolint-docker, etc.) and delete the "no-redundant-timeout" entry while leaving
the other entries unchanged.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request is a nice cleanup, removing a large number of redundant pytest.mark.timeout(30) markers and adding a pre-commit hook to prevent them from being re-introduced. The changes to the test files and documentation are all correct and align with the goal of using a global timeout configuration. However, the new pre-commit hook script contains a syntax error that will prevent it from running correctly. I've left a comment with a fix for this critical issue.

if _PATTERN.search(line):
print(f"{path}:{lineno}: {line.rstrip()}")
found = True
except UnicodeDecodeError, OSError:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

This except syntax is for Python 2. Since the script is intended for Python 3 (as indicated by the shebang #!/usr/bin/env python3), this will raise a SyntaxError. To catch multiple exceptions in Python 3, you should use a tuple.

Suggested change
except UnicodeDecodeError, OSError:
except (UnicodeDecodeError, OSError):

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 22, 2026

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
10333 1 10332 6
View the top 1 failed test(s) by shortest run time
tests.unit.memory.org.test_store.TestSQLiteOrgFactStoreOperations::test_get_sqlite_error_wraps
Stack Traces | 0.004s run time
.venv/lib/python3.14....../site-packages/aiosqlite/core.py:66: in _connection_worker_thread
    future.get_loop().call_soon_threadsafe(set_result, future, result)
../..................../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:872: in call_soon_threadsafe
    self._check_closed()
../..................../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:550: in _check_closed
    raise RuntimeError('Event loop is closed')
E   RuntimeError: Event loop is closed

During handling of the above exception, another exception occurred:
../..................../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/threading.py:1082: in _bootstrap_inner
    self._context.run(self.run)
../..................../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/threading.py:1024: in run
    self._target(*self._args, **self._kwargs)
.venv/lib/python3.14....../site-packages/aiosqlite/core.py:75: in _connection_worker_thread
    future.get_loop().call_soon_threadsafe(set_exception, future, e)
../..................../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:872: in call_soon_threadsafe
    self._check_closed()
../..................../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:550: in _check_closed
    raise RuntimeError('Event loop is closed')
E   RuntimeError: Event loop is closed

The above exception was the direct cause of the following exception:
.venv/lib/python3.14....../site-packages/_pytest/runner.py:353: in from_call
    result: TResult | None = func()
                             ^^^^^^
.venv/lib/python3.14....../site-packages/_pytest/runner.py:245: in <lambda>
    lambda: runtest_hook(item=item, **kwds),
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14.../site-packages/pluggy/_hooks.py:512: in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14.../site-packages/pluggy/_manager.py:120: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14.../site-packages/_pytest/logging.py:850: in pytest_runtest_call
    yield
.venv/lib/python3.14................../site-packages/pluggy/_callers.py:53: in run_old_style_hookwrapper
    return result.get_result()
           ^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14................../site-packages/pluggy/_callers.py:38: in run_old_style_hookwrapper
    res = yield
          ^^^^^
.venv/lib/python3.14.../site-packages/_pytest/capture.py:900: in pytest_runtest_call
    return (yield)
            ^^^^^
.venv/lib/python3.14................../site-packages/pluggy/_callers.py:53: in run_old_style_hookwrapper
    return result.get_result()
           ^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14................../site-packages/pluggy/_callers.py:38: in run_old_style_hookwrapper
    res = yield
          ^^^^^
.venv/lib/python3.14................../site-packages/pluggy/_callers.py:53: in run_old_style_hookwrapper
    return result.get_result()
           ^^^^^^^^^^^^^^^^^^^
.venv/lib/python3.14................../site-packages/pluggy/_callers.py:38: in run_old_style_hookwrapper
    res = yield
          ^^^^^
.venv/lib/python3.14.../site-packages/_pytest/skipping.py:268: in pytest_runtest_call
    return (yield)
            ^^^^^
.venv/lib/python3.14........./site-packages/_pytest/threadexception.py:147: in pytest_runtest_call
    collect_thread_exception(item.config)
.venv/lib/python3.14........./site-packages/_pytest/threadexception.py:70: in collect_thread_exception
    raise errors[0]
.venv/lib/python3.14........./site-packages/_pytest/threadexception.py:58: in collect_thread_exception
    warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg))
E   pytest.PytestUnhandledThreadExceptionWarning: Exception in thread Thread-399 (_connection_worker_thread)
E   Enable tracemalloc to get traceback where the object was allocated.
E   See https://docs.pytest..../stable/how-to/capture-warnings.html#resource-warnings for more info.

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Add path validation (repo-root check) and stderr warnings for skipped
files in both check_no_redundant_timeout.py and check_no_em_dashes.py.
Replace em-dashes with ASCII double-dashes in LICENSE and .gitattributes.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/check_no_redundant_timeout.py`:
- Around line 30-31: Replace the parenthesized multi-except syntax with PEP 758
style: change the clause using the exception types UnicodeDecodeError and
OSError (currently written as "except (UnicodeDecodeError, OSError) as exc:") to
the no-parentheses form "except UnicodeDecodeError, OSError as exc:" so the
except line that precedes the print(f\"WARNING: skipping {path}: {exc}\",
file=sys.stderr) uses the new syntax; keep the exc variable and the print call
unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 752e34f5-580a-48d3-9777-563c108188ba

📥 Commits

Reviewing files that changed from the base of the PR and between 0ddb6ce and 0f8f34a.

📒 Files selected for processing (4)
  • .gitattributes
  • LICENSE
  • scripts/check_no_em_dashes.py
  • scripts/check_no_redundant_timeout.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Test (Python 3.14)
  • GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.py: No from __future__ import annotations -- Python 3.14 has PEP 649 native lazy annotations
Use except A, B: (no parentheses) for exception syntax on Python 3.14 per PEP 758
Line length must be 88 characters, enforced by ruff
Python version 3.14+, supports PEP 649 native lazy annotations

Files:

  • scripts/check_no_em_dashes.py
  • scripts/check_no_redundant_timeout.py
scripts/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

Scripts in scripts/ have relaxed ruff rules: print and deferred imports allowed

Files:

  • scripts/check_no_em_dashes.py
  • scripts/check_no_redundant_timeout.py
🧠 Learnings (18)
📓 Common learnings
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-22T15:54:54.120Z
Learning: Applies to pyproject.toml : 30-second timeout per test enforced
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-16T07:02:24.531Z
Learning: Applies to tests/**/*.py : Test timeout: 30 seconds per test.
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-17T22:08:13.456Z
Learning: Applies to tests/**/*.py : Test markers: `pytest.mark.unit`, `pytest.mark.integration`, `pytest.mark.e2e`, `pytest.mark.slow`. Coverage: 80% minimum. Async: `asyncio_mode = 'auto'` — no manual `pytest.mark.asyncio` needed. Timeout: 30 seconds per test. Parallelism: `pytest-xdist` via `-n auto` — ALWAYS include `-n auto` when running pytest, never run tests sequentially.
📚 Learning: 2026-03-22T15:54:54.120Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-22T15:54:54.120Z
Learning: Pre-commit hooks enforce: trailing-whitespace, end-of-file-fixer, check-yaml, check-toml, check-json, check-merge-conflict, check-added-large-files, no-commit-to-branch (main), ruff check+format, gitleaks, hadolint (Dockerfile), golangci-lint + go vet (CLI)

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-15T18:17:43.675Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T18:17:43.675Z
Learning: Pre-commit hooks: trailing-whitespace, end-of-file-fixer, check-yaml, check-toml, check-json, check-merge-conflict, check-added-large-files, no-commit-to-branch (main), ruff check+format, gitleaks, hadolint (Dockerfile linting).

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-19T11:19:40.044Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T11:19:40.044Z
Learning: CLI workflow (`.github/workflows/cli.yml`) runs Go lint (golangci-lint + go vet) + test (race, coverage) + build (cross-compile matrix) + vulnerability check (govulncheck) + fuzz testing. Cross-compiles for linux/darwin/windows × amd64/arm64. GoReleaser release on v* tags with cosign keyless signing and SLSA L3 attestations.

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to .github/workflows/cli.yml : CLI workflow: Go lint (golangci-lint + go vet) + test (-race -coverprofile) + build (cross-compile: linux/darwin/windows × amd64/arm64) + govulncheck + fuzz testing (main-only, 30s/target, continue-on-error, matrix over 4 packages). cli-pass gate includes fuzz as informational. GoReleaser release on v* tags. Cosign keyless signing of checksums.txt. SLSA L3 provenance attestations. Sigstore bundle (.sigstore.json) attached. Post-release appends checksums/verification/provenance to draft release notes.

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-16T19:52:03.656Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-16T19:52:03.656Z
Learning: Applies to cli/**/*.go : Lint CLI Go code with golangci-lint and go vet; test with go test -race; check vulnerabilities with govulncheck

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-22T15:54:54.120Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-22T15:54:54.120Z
Learning: Applies to cli/**/*.go : golangci-lint and go vet required for CLI Go code

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-19T11:30:29.217Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T11:30:29.217Z
Learning: Applies to cli/**/*.go : Run Go lint via `golangci-lint run`, vet via `go vet`, tests via `go test ./...`, and fuzz via `go test -fuzz=FuzzTarget -fuzztime=30s`

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-19T11:19:40.044Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-19T11:19:40.044Z
Learning: Applies to cli/**/*.go : Lint Go code with `golangci-lint` and `go vet`. Run tests with `-race` flag to detect race conditions.

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-15T21:32:02.880Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T21:32:02.880Z
Learning: Applies to cli/**/*.go : Go CLI (Go 1.26+) uses Cobra for commands, charmbracelet/huh for interactive CLI, charmbracelet/lipgloss for styled output. Cross-platform builds (linux/darwin/windows × amd64/arm64). GoReleaser for releases with cosign keyless signing of checksums.txt. SLSA L3 provenance attestations via actions/attest-build-provenance.

Applied to files:

  • .gitattributes
📚 Learning: 2026-03-22T15:54:54.120Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-22T15:54:54.120Z
Learning: Applies to pyproject.toml : 30-second timeout per test enforced

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-16T07:02:24.531Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-16T07:02:24.531Z
Learning: Applies to tests/**/*.py : Test timeout: 30 seconds per test.

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-22T15:54:54.120Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-22T15:54:54.120Z
Learning: Applies to **/*.py : Use `except A, B:` (no parentheses) for exception syntax on Python 3.14 per PEP 758

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-14T16:18:57.267Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T16:18:57.267Z
Learning: Applies to **/*.py : Handle errors explicitly—never silently swallow exceptions.

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-14T16:18:57.267Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T16:18:57.267Z
Learning: Applies to **/*.py : Use PEP 758 except syntax with `except A, B:` (no parentheses) for multiple exceptions—ruff enforces this on Python 3.14.

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-14T15:43:05.601Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-14T15:43:05.601Z
Learning: Applies to **/*.py : Handle errors explicitly, never silently swallow exceptions

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-16T07:22:28.134Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-16T07:22:28.134Z
Learning: Applies to **/*.py : Handle errors explicitly; never silently swallow exceptions

Applied to files:

  • scripts/check_no_redundant_timeout.py
📚 Learning: 2026-03-16T07:22:28.134Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-16T07:22:28.134Z
Learning: Applies to **/*.py : Use `except A, B:` syntax (no parentheses) for exception handling — PEP 758 exception syntax enforced by ruff on Python 3.14

Applied to files:

  • scripts/check_no_redundant_timeout.py
🧬 Code graph analysis (1)
scripts/check_no_em_dashes.py (1)
scripts/check_no_redundant_timeout.py (1)
  • main (17-40)
🔇 Additional comments (6)
.gitattributes (1)

3-3: LGTM! Em dash replacement improves compatibility.

The replacement of em dashes (—) with ASCII double hyphens (--) in comments enhances plain-text compatibility and aligns with the pre-commit hook enforcement introduced in this PR. All functional Git attributes remain unchanged.

Also applies to: 8-8, 16-16, 19-19

scripts/check_no_redundant_timeout.py (2)

1-14: LGTM!

The module header, imports, and constants are well-structured. The regex correctly matches pytest.mark.timeout(30) with flexible whitespace, and _REPO_ROOT properly calculates the repository root for path validation.


43-44: LGTM!

Standard entry point pattern with proper exit code propagation.

scripts/check_no_em_dashes.py (2)

10-21: Repo-root boundary check and resolved-path scanning are a solid hardening change.

This safely constrains hook scanning to repository files and avoids accidental reads outside the repo.


26-27: Current code is correct per PEP 758; do not make this change.

Per PEP 758, parentheses are required when catching multiple exceptions with an as alias. The current syntax except (UnicodeDecodeError, OSError) as exc: is correct. The unparenthesized form except A, B as exc: is only valid without an as clause.

			> Likely an incorrect or invalid review comment.
LICENSE (1)

23-26: Good normalization to ASCII double-dashes in license text.

This aligns with the repository punctuation policy and preserves the clause semantics.

Comment on lines +30 to +31
except (UnicodeDecodeError, OSError) as exc:
print(f"WARNING: skipping {path}: {exc}", file=sys.stderr)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use PEP 758 exception syntax (no parentheses) for Python 3.14.

The exception clause uses the pre-3.14 parenthesized syntax. Per coding guidelines, Python 3.14 enforces PEP 758 syntax without parentheses.

🔧 Proposed fix
-        except (UnicodeDecodeError, OSError) as exc:
+        except UnicodeDecodeError, OSError as exc:

As per coding guidelines: "Use except A, B: (no parentheses) for exception syntax on Python 3.14 per PEP 758"

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
except (UnicodeDecodeError, OSError) as exc:
print(f"WARNING: skipping {path}: {exc}", file=sys.stderr)
except UnicodeDecodeError, OSError as exc:
print(f"WARNING: skipping {path}: {exc}", file=sys.stderr)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/check_no_redundant_timeout.py` around lines 30 - 31, Replace the
parenthesized multi-except syntax with PEP 758 style: change the clause using
the exception types UnicodeDecodeError and OSError (currently written as "except
(UnicodeDecodeError, OSError) as exc:") to the no-parentheses form "except
UnicodeDecodeError, OSError as exc:" so the except line that precedes the
print(f\"WARNING: skipping {path}: {exc}\", file=sys.stderr) uses the new
syntax; keep the exc variable and the print call unchanged.

@Aureliolo Aureliolo merged commit 9ec2163 into main Mar 22, 2026
24 of 25 checks passed
@Aureliolo Aureliolo deleted the chore/v047-cleanup branch March 22, 2026 16:42
@Aureliolo Aureliolo temporarily deployed to cloudflare-preview March 22, 2026 16:42 — with GitHub Actions Inactive
Aureliolo added a commit that referenced this pull request Mar 22, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.4.7](v0.4.6...v0.4.7)
(2026-03-22)


### Features

* add system user for CLI-to-backend authentication
([#710](#710))
([dc6bd3f](dc6bd3f))
* dev channel builds with incremental pre-releases between stable
releases ([#715](#715))
([0e8a714](0e8a714))
* replace hardcoded name pools with Faker multi-locale name generation
([#714](#714))
([5edc6ec](5edc6ec))


### Bug Fixes

* dev-release tag creation, dependabot coverage, go -C cli convention
([#730](#730))
([7634843](7634843))
* improve name generation step UX and fix sentinel expansion bug
([#739](#739))
([f03fd05](f03fd05))
* settings page UX polish -- toggle bug, source badges, form
improvements ([#712](#712))
([d16a0ac](d16a0ac))
* switch dev tags to semver and use same release pipeline as stable
([#729](#729))
([4df6b9b](4df6b9b)),
closes [#713](#713)
* unify CLI image discovery and standardize Go tooling
([#738](#738))
([712a785](712a785))
* use PAT in dev-release workflow to trigger downstream pipelines
([#716](#716))
([d767aa3](d767aa3))


### CI/CD

* bump astral-sh/setup-uv from 7.4.0 to 7.6.0 in
/.github/actions/setup-python-uv in the minor-and-patch group
([#731](#731))
([7887257](7887257))
* bump the minor-and-patch group with 3 updates
([#735](#735))
([7cd253a](7cd253a))
* bump wrangler from 4.75.0 to 4.76.0 in /.github in the minor-and-patch
group ([#732](#732))
([a6cafc7](a6cafc7))
* clean up all dev releases and tags on stable release
([#737](#737))
([8d90f5c](8d90f5c))


### Maintenance

* bump the minor-and-patch group across 2 directories with 2 updates
([#733](#733))
([2b60069](2b60069))
* bump the minor-and-patch group with 3 updates
([#734](#734))
([859bc25](859bc25))
* fix dependabot labels and add scope tags
([#736](#736))
([677eb15](677eb15))
* remove redundant pytest.mark.timeout(30) markers
([#740](#740))
([9ec2163](9ec2163))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: remove redundant pytest.mark.timeout(30) markers and add pre-commit hook

2 participants