drydock-cli 2.9.55__tar.gz → 2.9.59__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.
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/PKG-INFO +1 -1
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/opus_escalator.py +11 -1
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agent_loop.py +121 -5
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/write_file.py +64 -16
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/gap_detector.py +203 -2
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/pyproject.toml +1 -1
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/uv.lock +1 -1
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/.gitignore +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/LICENSE +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/NOTICE +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/docs/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/__main__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/goal.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/logger.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/gemma4_math.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/gemma4_slim.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/slug.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/spec_check.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prolog_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/types.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/ingest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/checklist/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/config.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/whats_new.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/install_tests/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/install_tests/publish/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/install_tests/windows/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/scripts/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/scripts/_archived_eval_harness/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/scripts/llm/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/conftest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/conftest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/common.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/utils.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agents.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_api_error_recovery.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_approval_modal_stray_keys.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_classifier.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_gemma4_anti_loop_migration.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_goal.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_integration.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_math_docs_lazy_injection.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_mcp_stdio_command_normalization.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_message_id.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_middleware.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_prolog_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_read_file_notebook_slim.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_retrieve_project_detection.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_safe_parse_tool_args.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_search_replace_syntax_rollback.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_session_log_event.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_session_publish_on_resume.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_smoke.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_specialist_math_tools_hidden.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tool_call_loops_regression_suite.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tool_stop_injected_scope.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_validation_error_scrub.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_workloads.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_pre_rename_hook.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_missing_main_module.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_multifile_rename.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/web/README.md +0 -0
- {drydock_cli-2.9.55 → drydock_cli-2.9.59}/worked_examples/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.9.
|
|
3
|
+
Version: 2.9.59
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -39,7 +39,7 @@ the user, say so explicitly.
|
|
|
39
39
|
|
|
40
40
|
Detector: {code}
|
|
41
41
|
Admiral's canned fallback: "{fallback}"
|
|
42
|
-
|
|
42
|
+
{loop_constraint}
|
|
43
43
|
Recent conversation:
|
|
44
44
|
<conversation>
|
|
45
45
|
{context}
|
|
@@ -110,10 +110,20 @@ async def escalate(
|
|
|
110
110
|
messages: Sequence[LLMMessage],
|
|
111
111
|
) -> str | None:
|
|
112
112
|
"""Ask Opus for a directive. Returns directive text or None."""
|
|
113
|
+
loop_constraint = ""
|
|
114
|
+
if finding.code.startswith("loop:bash::"):
|
|
115
|
+
cmd_snippet = finding.code[len("loop:bash::"):][:120]
|
|
116
|
+
loop_constraint = (
|
|
117
|
+
f"\nCRITICAL CONSTRAINT: The repeated command is `bash` with "
|
|
118
|
+
f"args `{cmd_snippet}`. Your directive MUST NOT suggest running "
|
|
119
|
+
f"this same command again — the model already has its output. "
|
|
120
|
+
f"Direct the agent to read/edit source code instead.\n"
|
|
121
|
+
)
|
|
113
122
|
prompt = _OPUS_PROMPT.format(
|
|
114
123
|
rubric=_DIRECTIVES_RUBRIC,
|
|
115
124
|
code=finding.code,
|
|
116
125
|
fallback=finding.directive[:200],
|
|
126
|
+
loop_constraint=loop_constraint,
|
|
117
127
|
context=_render_turns(messages, n_turns=12),
|
|
118
128
|
)
|
|
119
129
|
out = await _try_anthropic_sdk(prompt)
|
|
@@ -1680,6 +1680,70 @@ class AgentLoop:
|
|
|
1680
1680
|
expected_paths = list(dict.fromkeys(pat.findall(task_text)))[:10]
|
|
1681
1681
|
missing_expected = [p for p in expected_paths if p not in written_paths]
|
|
1682
1682
|
has_expected_misses = bool(expected_paths and missing_expected)
|
|
1683
|
+
|
|
1684
|
+
# Fix E (2026-06-04): parse the task instruction for
|
|
1685
|
+
# explicit verify commands and check if the model has
|
|
1686
|
+
# ever run them. Targets the partial-pytest-credit
|
|
1687
|
+
# cluster — fix-code-vulnerability scored 5/6 pytest
|
|
1688
|
+
# but never ran the explicit `pytest -rA` the task
|
|
1689
|
+
# named. Same shape across 14 trials in v2.9.55 batch.
|
|
1690
|
+
expected_verifies: list[str] = []
|
|
1691
|
+
if len(self.messages) >= 2:
|
|
1692
|
+
task_text = (self.messages[1].content or "")
|
|
1693
|
+
import re as _re2
|
|
1694
|
+
# Patterns the model should run before exit:
|
|
1695
|
+
# - "you can run: `pytest -rA`"
|
|
1696
|
+
# - "verify by running `bash test.sh`"
|
|
1697
|
+
# - "to test, run `python test.py`"
|
|
1698
|
+
# - bare `pytest` mentions in instructions
|
|
1699
|
+
# Capture the command text (inside backticks first).
|
|
1700
|
+
cmd_patterns = [
|
|
1701
|
+
r"(?:you can run|verify by running|to test,?\s*run|"
|
|
1702
|
+
r"to verify,?\s*run|run the tests? with|tests? are run with|"
|
|
1703
|
+
r"verifier runs?|you may run|run\s+the\s+command|"
|
|
1704
|
+
r"to evaluate|evaluation command):\s*`([^`]+)`",
|
|
1705
|
+
r"verify by:?\s*`([^`]+)`",
|
|
1706
|
+
# bare backtick commands containing pytest/bash/make
|
|
1707
|
+
r"`(pytest\s[^`]*|bash\s+[^`]*\.sh[^`]*|make\s+test[^`]*|"
|
|
1708
|
+
r"npm\s+test[^`]*|cargo\s+test[^`]*|go\s+test[^`]*)`",
|
|
1709
|
+
]
|
|
1710
|
+
for p in cmd_patterns:
|
|
1711
|
+
for m in _re2.finditer(p, task_text, _re2.IGNORECASE):
|
|
1712
|
+
cmd = m.group(1).strip()
|
|
1713
|
+
if cmd and cmd not in expected_verifies:
|
|
1714
|
+
expected_verifies.append(cmd)
|
|
1715
|
+
if len(expected_verifies) >= 5:
|
|
1716
|
+
break
|
|
1717
|
+
if len(expected_verifies) >= 5:
|
|
1718
|
+
break
|
|
1719
|
+
# Did the model run any matching command via bash?
|
|
1720
|
+
ran_verify_cmds: list[str] = []
|
|
1721
|
+
if expected_verifies:
|
|
1722
|
+
bash_cmds: list[str] = []
|
|
1723
|
+
for msg in self.messages:
|
|
1724
|
+
for tc in (msg.tool_calls or []):
|
|
1725
|
+
fn_obj = tc.function
|
|
1726
|
+
if not fn_obj or fn_obj.name != "bash":
|
|
1727
|
+
continue
|
|
1728
|
+
try:
|
|
1729
|
+
import json as _json2
|
|
1730
|
+
a = _json2.loads(fn_obj.arguments or "{}")
|
|
1731
|
+
c = a.get("command") or ""
|
|
1732
|
+
if c:
|
|
1733
|
+
bash_cmds.append(c)
|
|
1734
|
+
except Exception:
|
|
1735
|
+
pass
|
|
1736
|
+
# Match: any token of the expected command appears in
|
|
1737
|
+
# any of the model's bash commands. Lenient match
|
|
1738
|
+
# (model might add extra flags or paths).
|
|
1739
|
+
for ev in expected_verifies:
|
|
1740
|
+
first_token = ev.split()[0] if ev.split() else ev
|
|
1741
|
+
if any(first_token in bc for bc in bash_cmds):
|
|
1742
|
+
ran_verify_cmds.append(ev)
|
|
1743
|
+
missing_verify_cmds = [
|
|
1744
|
+
ev for ev in expected_verifies if ev not in ran_verify_cmds
|
|
1745
|
+
]
|
|
1746
|
+
has_missing_verify = bool(missing_verify_cmds)
|
|
1683
1747
|
# Cap raised 5 → 10 nudges per session. Removed tool_turns
|
|
1684
1748
|
# gate entirely — the 2026-06-03 v2948 batch showed that
|
|
1685
1749
|
# most "engaged but failed" trials (bucket D, 26/50 fails)
|
|
@@ -1690,16 +1754,24 @@ class AgentLoop:
|
|
|
1690
1754
|
# The verifier never ran for any of them. Nudging late
|
|
1691
1755
|
# forces them to run the verifier and iterate.
|
|
1692
1756
|
#
|
|
1693
|
-
#
|
|
1694
|
-
# `
|
|
1695
|
-
#
|
|
1757
|
+
# Count `verify` tool calls for the nudge text. Note:
|
|
1758
|
+
# `last_verify_passed` is NOT used as a gate anymore.
|
|
1759
|
+
# 2026-06-04 v2.9.55 batch: the model's `verify` tool
|
|
1760
|
+
# checks MODEL-CHOSEN criteria, not the external tbench
|
|
1761
|
+
# verifier. Self-pass happens easily (chess-best-move had
|
|
1762
|
+
# 4 verify calls, last passed=True, model's answer was
|
|
1763
|
+
# wrong, external tbench verifier rejected). Using
|
|
1764
|
+
# last_verify_passed as a gate silenced the nudge across
|
|
1765
|
+
# 37/37 fails in that batch. The nudge cap (10) is
|
|
1766
|
+
# already a sufficient bound; let it fire so Fix A
|
|
1767
|
+
# (path-aware nudge) actually runs.
|
|
1696
1768
|
verify_count = 0
|
|
1697
1769
|
last_verify_passed = False
|
|
1698
1770
|
for msg in self.messages:
|
|
1699
1771
|
if msg.role == Role.tool and (msg.name == "verify"):
|
|
1700
1772
|
verify_count += 1
|
|
1701
1773
|
last_verify_passed = "passed: True" in (msg.content or "")
|
|
1702
|
-
if is_programmatic and nudges < 10
|
|
1774
|
+
if is_programmatic and nudges < 10:
|
|
1703
1775
|
self._premature_exit_nudges = nudges + 1
|
|
1704
1776
|
if zero_writes:
|
|
1705
1777
|
paths_hint = ""
|
|
@@ -1740,6 +1812,44 @@ class AgentLoop:
|
|
|
1740
1812
|
f"no file, and partial-credit verifiers reward "
|
|
1741
1813
|
f"format correctness even when content is off."
|
|
1742
1814
|
)
|
|
1815
|
+
elif has_missing_verify:
|
|
1816
|
+
# Fix E (2026-06-04): task explicitly names a
|
|
1817
|
+
# verify command (e.g. "you can run: `pytest -rA`")
|
|
1818
|
+
# and the model never executed it. 14 of 37 fails
|
|
1819
|
+
# in v2.9.55 had partial pytest credit (one named
|
|
1820
|
+
# 5/6, another 4/5) — they were ONE iteration away
|
|
1821
|
+
# from passing but never ran the verifier to see.
|
|
1822
|
+
note = (
|
|
1823
|
+
f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
|
|
1824
|
+
f"The task explicitly names this verify "
|
|
1825
|
+
f"command: `{missing_verify_cmds[0]}`"
|
|
1826
|
+
f"{' (+%d more)' % (len(missing_verify_cmds)-1) if len(missing_verify_cmds) > 1 else ''}"
|
|
1827
|
+
f". You have NOT run it. The external "
|
|
1828
|
+
f"verifier will use that exact command (or "
|
|
1829
|
+
f"equivalent) after you exit — run it NOW "
|
|
1830
|
+
f"yourself via `bash`, READ every failure "
|
|
1831
|
+
f"line, FIX what it reports, then rerun "
|
|
1832
|
+
f"until 0 failures. Your self-`verify` tool "
|
|
1833
|
+
f"checks YOUR criterion, not this command."
|
|
1834
|
+
)
|
|
1835
|
+
elif last_verify_passed:
|
|
1836
|
+
# 2026-06-04: model self-verified with its OWN
|
|
1837
|
+
# criterion. Real tbench/pytest verifier runs
|
|
1838
|
+
# later and is stricter. Warn explicitly.
|
|
1839
|
+
note = (
|
|
1840
|
+
f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
|
|
1841
|
+
f"Your `verify` call passed, but that checks "
|
|
1842
|
+
f"the criterion YOU wrote — not the external "
|
|
1843
|
+
f"pytest the harness will run after you exit. "
|
|
1844
|
+
f"Common gap: your verify checks 'file exists' "
|
|
1845
|
+
f"or 'output contains X', but the verifier "
|
|
1846
|
+
f"checks EXACT format / EXACT path / specific "
|
|
1847
|
+
f"line content. Re-read the task literally: "
|
|
1848
|
+
f"the path it names, the format it specifies, "
|
|
1849
|
+
f"the example outputs it shows. Run a stricter "
|
|
1850
|
+
f"check (cat the file, run pytest if installed, "
|
|
1851
|
+
f"diff against the example) BEFORE exiting."
|
|
1852
|
+
)
|
|
1743
1853
|
else:
|
|
1744
1854
|
note = (
|
|
1745
1855
|
f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
|
|
@@ -2550,7 +2660,13 @@ class AgentLoop:
|
|
|
2550
2660
|
# Read-only checks (ls, pwd, git status) get a higher threshold.
|
|
2551
2661
|
tool_name = tool_call.tool_name
|
|
2552
2662
|
is_readonly = tool_name in ("grep", "read_file", "glob", "ls")
|
|
2553
|
-
|
|
2663
|
+
# 2026-06-04: lowered read-only success threshold 6 → 3 after
|
|
2664
|
+
# operator TUI session showed read_file looping 7× on the same
|
|
2665
|
+
# file before circuit breaker fired. The tool already injects a
|
|
2666
|
+
# "2nd identical read" header; if the model hasn't pivoted by
|
|
2667
|
+
# the 3rd call, it never will. Cuts wasted-turn cost on stuck
|
|
2668
|
+
# models from ~6 to ~3 per loop.
|
|
2669
|
+
success_threshold = 3 if is_readonly else 4
|
|
2554
2670
|
|
|
2555
2671
|
if is_failed and count >= 2:
|
|
2556
2672
|
pass # will be blocked below
|
|
@@ -451,6 +451,27 @@ class WriteFile(
|
|
|
451
451
|
# triggers panic-retry loops (feedback_no_tool_errors_for_loop_detection).
|
|
452
452
|
if not args.path.strip():
|
|
453
453
|
cwd = Path.cwd()
|
|
454
|
+
# Track consecutive missing-path attempts so the advisory can
|
|
455
|
+
# escalate from gentle → concrete-suggestion → hard-block.
|
|
456
|
+
# 2026-06-04: operator reported 3+ identical missing-path
|
|
457
|
+
# attempts in TUI session — the soft advisory wasn't enough.
|
|
458
|
+
miss_state = self.state.__dict__.setdefault(
|
|
459
|
+
"_write_file_missing_path_streak", 0
|
|
460
|
+
)
|
|
461
|
+
miss_state += 1
|
|
462
|
+
self.state.__dict__["_write_file_missing_path_streak"] = miss_state
|
|
463
|
+
|
|
464
|
+
# Pull last-read paths from the read-file state for concrete
|
|
465
|
+
# suggestions on retry.
|
|
466
|
+
read_state = ctx.read_file_state if ctx else None
|
|
467
|
+
recent_reads: list[str] = []
|
|
468
|
+
if read_state:
|
|
469
|
+
try:
|
|
470
|
+
# read_file_state is keyed by path; pull a stable list
|
|
471
|
+
recent_reads = list(read_state.keys())[-3:]
|
|
472
|
+
except Exception:
|
|
473
|
+
pass
|
|
474
|
+
|
|
454
475
|
try:
|
|
455
476
|
pkg_dirs = [
|
|
456
477
|
d.name for d in sorted(cwd.iterdir())
|
|
@@ -459,29 +480,56 @@ class WriteFile(
|
|
|
459
480
|
hint = f"Package dirs in {cwd.name}/: {', '.join(pkg_dirs)}" if pkg_dirs else f"cwd: {cwd}"
|
|
460
481
|
except OSError:
|
|
461
482
|
hint = f"cwd: {cwd}"
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
# root-cause as the search_replace empty-call loop fixed
|
|
471
|
-
# via dedup-strip in commit dee310a.
|
|
472
|
-
yield WriteFileResult(
|
|
473
|
-
path="(missing)",
|
|
474
|
-
bytes_written=0,
|
|
475
|
-
file_existed=False,
|
|
476
|
-
content=(
|
|
483
|
+
|
|
484
|
+
if miss_state == 1:
|
|
485
|
+
# 2026-05-31: do NOT echo a sample call shape in the
|
|
486
|
+
# error content. Gemma 4 copies whatever it sees from
|
|
487
|
+
# prior tool results as the next call's args — a
|
|
488
|
+
# literal call-syntax template in the error message
|
|
489
|
+
# gets re-emitted as the next call. Keep terse.
|
|
490
|
+
msg = (
|
|
477
491
|
f"NO path supplied. Pick a concrete file path "
|
|
478
492
|
f"under the current project (e.g. one of the "
|
|
479
493
|
f"existing source files you just read), then "
|
|
480
494
|
f"re-emit the call with that path and the full "
|
|
481
495
|
f"file content. {hint}."
|
|
482
|
-
)
|
|
496
|
+
)
|
|
497
|
+
elif miss_state == 2 and recent_reads:
|
|
498
|
+
# Escalate: name the actual recently-read files so the
|
|
499
|
+
# model has a concrete target. Removes ambiguity that
|
|
500
|
+
# caused the model to retry with the same empty args.
|
|
501
|
+
msg = (
|
|
502
|
+
f"[REPEAT #{miss_state}] write_file STILL called with "
|
|
503
|
+
f"NO path. Stop guessing — pick ONE of these files "
|
|
504
|
+
f"you just read and pass its FULL absolute path as "
|
|
505
|
+
f"`path`: {', '.join(recent_reads[:3])}. If none "
|
|
506
|
+
f"of these is right, call read_file on the file "
|
|
507
|
+
f"you intend to edit FIRST, then write_file with "
|
|
508
|
+
f"that exact path."
|
|
509
|
+
)
|
|
510
|
+
else:
|
|
511
|
+
# 3rd+ miss with no recoverable suggestion. Block harder
|
|
512
|
+
# so the agent loop's "no progress" detector kicks in.
|
|
513
|
+
msg = (
|
|
514
|
+
f"[HARD-BLOCK] write_file called with NO path "
|
|
515
|
+
f"{miss_state} times in a row. STOP calling "
|
|
516
|
+
f"write_file. Do one of: (1) call read_file on the "
|
|
517
|
+
f"file you intend to edit so its path enters my "
|
|
518
|
+
f"context, (2) call bash with `ls` or `find` to "
|
|
519
|
+
f"locate the target file, (3) end your turn with a "
|
|
520
|
+
f"text summary if you're stuck. Continuing to call "
|
|
521
|
+
f"write_file without a path will produce this same "
|
|
522
|
+
f"block — it is not progress."
|
|
523
|
+
)
|
|
524
|
+
yield WriteFileResult(
|
|
525
|
+
path="(missing)",
|
|
526
|
+
bytes_written=0,
|
|
527
|
+
file_existed=False,
|
|
528
|
+
content=msg,
|
|
483
529
|
)
|
|
484
530
|
return
|
|
531
|
+
# Reset the missing-path streak on a successful path arg.
|
|
532
|
+
self.state.__dict__["_write_file_missing_path_streak"] = 0
|
|
485
533
|
file_path, file_existed, content_bytes = self._prepare_and_validate_path(args)
|
|
486
534
|
|
|
487
535
|
# Read-before-Write enforcement (Claude Code tool contract).
|
|
@@ -43,6 +43,8 @@ _STOPWORDS: frozenset[str] = frozenset({
|
|
|
43
43
|
# because they always lead a Title-Case phrase ("Consider the X").
|
|
44
44
|
"Consider", "Suppose", "Given", "Let", "Define", "Compute",
|
|
45
45
|
"Determine", "Evaluate", "Prove", "Recall", "Note", "Assume",
|
|
46
|
+
"Render", "Parse", "Scan", "Detect", "Match", "Merge",
|
|
47
|
+
"Insert", "Delete", "Select", "Update", "Create", "Drop",
|
|
46
48
|
})
|
|
47
49
|
|
|
48
50
|
# HLE / harness prompt-template tokens that the detector kept flagging
|
|
@@ -99,10 +101,98 @@ _TEMPLATE_NOISE: frozenset[str] = frozenset(
|
|
|
99
101
|
# knowledge gap — 2026-06-04 queue audit top false positives.
|
|
100
102
|
"ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL", "FATAL",
|
|
101
103
|
"TRACE", "VERBOSE", "NOTICE",
|
|
104
|
+
# HTTP methods — always known in coding context.
|
|
105
|
+
"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT",
|
|
106
|
+
# HTTP/web protocol abbreviations.
|
|
107
|
+
"SSE", "WS", "WSS", "RPC", "JSONRPC",
|
|
108
|
+
# Web/style formats.
|
|
109
|
+
"CSS", "SASS", "SCSS", "LESS",
|
|
110
|
+
# Common programming concepts always known in coding context.
|
|
111
|
+
"AST", "CFG", "DAG", "FSM", "DSL", "BNF", "EBNF", "REPL",
|
|
112
|
+
# Caching strategies.
|
|
113
|
+
"LRU", "LFU", "FIFO", "LIFO", "MRU",
|
|
114
|
+
# Encoding names with hyphen variants.
|
|
115
|
+
"UTF-8", "UTF-16", "UTF-32",
|
|
116
|
+
# Common placeholder / schema column-type words.
|
|
117
|
+
"VALUE", "DATE", "TIME", "SIZE", "HASH", "RANK",
|
|
118
|
+
# Project doc file names always known to a coding assistant.
|
|
119
|
+
"FAQ", "CONTRIBUTING", "AUTHORS", "CODEOWNERS", "SECURITY",
|
|
120
|
+
"MAINTAINERS", "NOTICE",
|
|
121
|
+
# Connector prepositions that match short-string regexes but are prose.
|
|
122
|
+
"IN", "OF", "AT", "ON", "BY", "AS",
|
|
123
|
+
# PRD section headers — always prose in template specs, not entities.
|
|
124
|
+
"OPEN QUESTIONS", "USE CASES", "NON-GOALS", "NON GOALS",
|
|
125
|
+
"EDGE CASES", "GETTING STARTED", "QUICK START", "OVERVIEW",
|
|
126
|
+
"BACKGROUND", "MOTIVATION", "RATIONALE", "OBJECTIVES", "SCOPE",
|
|
127
|
+
# Pytest / CI test-status words — appear as "pytest is RED / GREEN"
|
|
128
|
+
# in task prompts but are never GraphRAG-retrievable knowledge.
|
|
129
|
+
"RED", "GREEN", "PASS", "FAIL", "SKIP", "XFAIL",
|
|
130
|
+
"PASSED", "FAILED", "SKIPPED", "BROKEN", "XPASS",
|
|
102
131
|
"STATUS", "STATE", "MODE", "TYPE", "KIND", "FLAG", "OPTION",
|
|
103
132
|
"FINDINGS", "PATTERNS", "REGEXES", "FIELDS", "METHODS",
|
|
104
133
|
"VERSION", "NAME", "PATH", "DATA", "OUTPUT", "INPUT",
|
|
105
134
|
"CONFIG", "SCHEMA", "FORMAT", "TEMPLATE", "LAYOUT",
|
|
135
|
+
# SQL DDL keywords — written in ALL-CAPS in schema code but never
|
|
136
|
+
# a GraphRAG knowledge gap for a coding assistant.
|
|
137
|
+
"TEXT", "INTEGER", "REAL", "BLOB", "BOOLEAN", "NUMERIC",
|
|
138
|
+
"PRIMARY", "KEY", "UNIQUE", "INDEX", "FOREIGN", "REFERENCES",
|
|
139
|
+
"CONSTRAINT", "DEFAULT", "NOT NULL", "NULL", "AUTO INCREMENT",
|
|
140
|
+
"CREATE", "TABLE", "SELECT", "INSERT", "UPDATE", "DELETE",
|
|
141
|
+
"FROM", "WHERE", "JOIN", "LEFT", "RIGHT", "INNER", "OUTER",
|
|
142
|
+
"GROUP BY", "ORDER BY", "HAVING", "LIMIT", "OFFSET",
|
|
143
|
+
"BEGIN", "COMMIT", "ROLLBACK", "TRANSACTION",
|
|
144
|
+
# Common English words used in ALL-CAPS for emphasis in user specs —
|
|
145
|
+
# they match _RE_ACRONYM (≥3 uppercase) but carry no knowledge gap.
|
|
146
|
+
"OFFLINE", "ONLINE", "LOCAL", "REMOTE", "ALWAYS", "NEVER",
|
|
147
|
+
"ONLY", "ALSO", "MUST", "SHOULD", "WILL", "FULL", "EMPTY",
|
|
148
|
+
"DONE", "NEXT", "LAST", "FIRST", "EACH", "BOTH", "SAME",
|
|
149
|
+
"EVERY", "KEEP", "NEED", "ABLE", "MAKE", "WRITE", "READ",
|
|
150
|
+
"STORE", "CACHE", "DISK", "FILE", "PARSE", "LOAD", "CALL",
|
|
151
|
+
"SEND", "RECV", "OPEN", "CLOSE", "INIT", "STOP", "WAIT",
|
|
152
|
+
"SYNC", "ASYNC", "COPY", "MOVE", "PUSH", "PULL", "FETCH",
|
|
153
|
+
# Temporal conjunctions/prepositions used for emphasis in specs
|
|
154
|
+
"BEFORE", "AFTER", "DURING", "WHILE", "SINCE", "UNTIL",
|
|
155
|
+
"WHEN", "THEN", "ONCE", "ALREADY", "STILL", "AGAIN",
|
|
156
|
+
"ACROSS", "BETWEEN", "WITHIN", "WITHOUT", "THROUGH",
|
|
157
|
+
"ABOVE", "BELOW", "UNDER", "OVER", "INTO", "ONTO", "FROM",
|
|
158
|
+
"AGAINST", "BEYOND", "DESPITE", "EXCEPT", "INSTEAD",
|
|
159
|
+
"CLARIFICATION", "IMPLEMENTATION", "REQUIREMENT", "SPECIFICATION",
|
|
160
|
+
"DEFINITION", "DESCRIPTION", "DOCUMENTATION", "EXAMPLE",
|
|
161
|
+
"FEATURE", "FUNCTION", "INTERFACE", "PROPERTY", "ATTRIBUTE",
|
|
162
|
+
"INSTANCE", "OBJECT", "CLASS", "MODULE", "PACKAGE", "LIBRARY",
|
|
163
|
+
"MILK", # from "buy milk" test prompt — common English word
|
|
164
|
+
# Single-word emphasis — match _RE_ACRONYM (≥3 uppercase) but are
|
|
165
|
+
# common English words used for stress in PRD specs, not identifiers.
|
|
166
|
+
"ONE", "OLD", "END", "POST", "MOSTLY", "QUITE", "VERY",
|
|
167
|
+
# Networking / infra abbreviations always known in coding context.
|
|
168
|
+
"TTL", "ACL", "NAT", "DNS", "VPN", "LAN", "WAN",
|
|
169
|
+
# Product / project management abbreviations used in PRD prompts.
|
|
170
|
+
"PRD", "RFC", "ADR", "SLA", "SLO", "SLI", "KPI", "OKR",
|
|
171
|
+
# iCalendar (RFC 5545) protocol keywords — appear in iCal-format PRDs.
|
|
172
|
+
"VCALENDAR", "VEVENT", "VTODO", "VJOURNAL", "VALARM",
|
|
173
|
+
"DTSTART", "DTEND", "DTSTAMP", "DURATION", "RRULE",
|
|
174
|
+
# Common English nouns used as PRD field / attribute names — never a
|
|
175
|
+
# GraphRAG knowledge gap. 2026-06-04 queue audit: recency (215×),
|
|
176
|
+
# tasks (188×), untitled (67×), username (65×).
|
|
177
|
+
"recency", "tasks", "untitled", "username", "summary",
|
|
178
|
+
"legacy", "snapshot", "artifact", "payload", "metadata",
|
|
179
|
+
"endpoint", "workflow", "pipeline", "plugin", "widget",
|
|
180
|
+
"sidebar", "toolbar", "viewport", "canvas", "panel",
|
|
181
|
+
"dialog", "modal", "popup", "tooltip", "banner", "badge",
|
|
182
|
+
# Well-known infrastructure / framework names always known to a coding
|
|
183
|
+
# assistant — appear as lowercase terms in stress-run sessions where
|
|
184
|
+
# the model is asked to add support for common servers/tools.
|
|
185
|
+
"nginx", "gunicorn", "uwsgi", "celery", "supervisor",
|
|
186
|
+
"flask", "django", "fastapi", "tornado", "aiohttp", "bottle",
|
|
187
|
+
"pytest", "unittest", "nose", "tox",
|
|
188
|
+
"pandas", "numpy", "scipy", "matplotlib", "seaborn", "sklearn",
|
|
189
|
+
"docker", "kubernetes", "helm", "terraform", "ansible",
|
|
190
|
+
"webpack", "vite", "rollup", "esbuild", "babel",
|
|
191
|
+
# Generic technical snake_case nouns that are code-artifact names,
|
|
192
|
+
# not external library knowledge gaps.
|
|
193
|
+
"stack_trace", "word_count", "line_count", "byte_count", "char_count",
|
|
194
|
+
"legacy_modules", "legacy_module", "legacy_code",
|
|
195
|
+
"drydock_lifecycle", "drydock_test",
|
|
106
196
|
}
|
|
107
197
|
)
|
|
108
198
|
|
|
@@ -112,6 +202,39 @@ _CONNECTOR_WORDS: frozenset[str] = frozenset({
|
|
|
112
202
|
"of", "the", "and", "for", "in", "de", "von", "a", "an",
|
|
113
203
|
})
|
|
114
204
|
|
|
205
|
+
# Snake-case identifiers that start with a common action verb are generated
|
|
206
|
+
# code artifacts (CRUD methods, helpers), not external knowledge gaps.
|
|
207
|
+
_VERB_PREFIXES: frozenset[str] = frozenset({
|
|
208
|
+
"get_", "set_", "add_", "put_", "has_", "is_",
|
|
209
|
+
"list_", "count_", "delete_", "remove_", "create_", "make_",
|
|
210
|
+
"build_", "update_", "edit_", "save_", "load_", "read_", "write_",
|
|
211
|
+
"parse_", "format_", "render_", "handle_", "process_", "compute_",
|
|
212
|
+
"calc_", "check_", "validate_", "fetch_", "send_", "recv_",
|
|
213
|
+
"run_", "exec_", "init_", "reset_", "clear_", "close_", "open_",
|
|
214
|
+
"find_", "search_", "query_", "filter_", "sort_", "group_",
|
|
215
|
+
"encode_", "decode_", "serialize_", "deserialize_", "convert_",
|
|
216
|
+
"show_", "hide_", "display_", "print_", "log_", "report_",
|
|
217
|
+
"sample_", "generate_", "emit_", "merge_", "patch_", "register_",
|
|
218
|
+
"unregister_", "subscribe_", "publish_", "notify_", "watch_",
|
|
219
|
+
"require_", "resolve_", "dispatch_", "route_", "map_", "reduce_",
|
|
220
|
+
"collect_", "gather_", "aggregate_", "transform_", "extract_",
|
|
221
|
+
"inject_", "wrap_", "unwrap_", "clone_", "copy_", "move_",
|
|
222
|
+
"import_", "export_", "upload_", "download_", "stream_",
|
|
223
|
+
"test_", "assert_", "expect_", "mock_", "stub_", "spy_",
|
|
224
|
+
# Architecture-layer prefixes — snake_case with these prefixes are
|
|
225
|
+
# internal variables/types, not external library knowledge gaps.
|
|
226
|
+
"backend_", "frontend_", "status_", "top_", "base_", "main_",
|
|
227
|
+
"core_", "util_", "helper_", "common_", "shared_", "default_",
|
|
228
|
+
"current_", "prev_", "next_", "max_", "min_", "total_", "avg_",
|
|
229
|
+
"num_", "idx_", "pos_", "key_", "val_", "src_", "dst_", "tmp_",
|
|
230
|
+
"raw_", "cached_", "parsed_", "formatted_", "rendered_", "computed_",
|
|
231
|
+
# Format-sniffing / detection / request-field prefixes — code artifacts
|
|
232
|
+
# generated by the agent, not external library knowledge gaps.
|
|
233
|
+
"sniff_", "detect_", "infer_", "guess_",
|
|
234
|
+
"req_", "resp_", "res_", "body_", "header_", "param_",
|
|
235
|
+
"source_", "target_", "dest_", "output_", "input_",
|
|
236
|
+
})
|
|
237
|
+
|
|
115
238
|
|
|
116
239
|
def _is_template_noise(candidate: str) -> bool:
|
|
117
240
|
"""True if the candidate is HLE/admiral boilerplate, not a real term."""
|
|
@@ -144,16 +267,38 @@ def _is_template_noise(candidate: str) -> bool:
|
|
|
144
267
|
".toml", ".log", ".html", ".xml", ".sql", ".sh", ".rs",
|
|
145
268
|
".go", ".ts", ".js", ".jsx", ".tsx", ".css", ".scss",
|
|
146
269
|
".bak", ".tmp", ".lock", ".pid", ".gz", ".zip", ".tar",
|
|
270
|
+
".db", ".sqlite3", ".cache", ".dat", ".bin",
|
|
147
271
|
)
|
|
148
272
|
if "/" not in norm and any(norm.endswith(ext) for ext in _CODE_EXTS):
|
|
149
273
|
return True
|
|
150
274
|
# Dotted identifier where the post-dot component is a common English
|
|
151
|
-
# word → sentence boundary artifact
|
|
275
|
+
# word OR starts with a verb-prefix → sentence boundary artifact or
|
|
276
|
+
# code artifact ("scratch.Step", "fail.Stop", "parser.sniff_format").
|
|
152
277
|
if "." in norm:
|
|
153
278
|
parts = norm.split(".")
|
|
154
279
|
_sw_lower = {w.lower() for w in _STOPWORDS}
|
|
155
280
|
if any(p in _sw_lower for p in parts[1:]):
|
|
156
281
|
return True
|
|
282
|
+
if any(any(p.startswith(vp) for vp in _VERB_PREFIXES) for p in parts[1:]):
|
|
283
|
+
return True
|
|
284
|
+
# Python stdlib module dotted names (json.loads, http.server, os.path)
|
|
285
|
+
# are always known to a coding assistant.
|
|
286
|
+
_STDLIB_MODULES: frozenset[str] = frozenset({
|
|
287
|
+
"os", "sys", "re", "io", "json", "csv", "xml", "html", "http",
|
|
288
|
+
"urllib", "email", "logging", "threading", "multiprocessing",
|
|
289
|
+
"subprocess", "socket", "ssl", "hashlib", "hmac", "uuid",
|
|
290
|
+
"datetime", "time", "calendar", "random", "math", "statistics",
|
|
291
|
+
"collections", "itertools", "functools", "operator", "copy",
|
|
292
|
+
"abc", "typing", "dataclasses", "enum", "pathlib", "shutil",
|
|
293
|
+
"tempfile", "glob", "fnmatch", "pickle", "shelve", "sqlite3",
|
|
294
|
+
"struct", "array", "queue", "heapq", "bisect", "weakref",
|
|
295
|
+
"contextlib", "inspect", "ast", "dis", "gc", "traceback",
|
|
296
|
+
"warnings", "unittest", "doctest", "pprint", "textwrap",
|
|
297
|
+
"string", "difflib", "argparse", "configparser", "platform",
|
|
298
|
+
"signal", "asyncio", "base64", "binascii", "codecs",
|
|
299
|
+
})
|
|
300
|
+
if parts[0] in _STDLIB_MODULES:
|
|
301
|
+
return True
|
|
157
302
|
# LaTeX math expressions — false positives from HLE/academic prompts.
|
|
158
303
|
# A term starting with $ or a LaTeX command backslash is math notation,
|
|
159
304
|
# not a GraphRAG-retrievable identifier.
|
|
@@ -175,18 +320,74 @@ def _is_template_noise(candidate: str) -> bool:
|
|
|
175
320
|
# generic utility patterns, not external library gaps.
|
|
176
321
|
if norm.startswith("to_"):
|
|
177
322
|
return True
|
|
323
|
+
# Snake_case names ending in common implementation-pattern suffixes are
|
|
324
|
+
# code artifacts generated by the agent, not external knowledge gaps.
|
|
325
|
+
# E.g. stack_trace, error_handler, config_manager, log_formatter.
|
|
326
|
+
_NOUN_SUFFIXES: frozenset[str] = frozenset({
|
|
327
|
+
"_trace", "_count", "_handler", "_manager", "_parser",
|
|
328
|
+
"_formatter", "_reader", "_writer", "_builder", "_factory",
|
|
329
|
+
"_registry", "_provider", "_consumer", "_producer",
|
|
330
|
+
"_iterator", "_generator", "_validator", "_serializer",
|
|
331
|
+
"_deserializer", "_encoder", "_decoder", "_processor",
|
|
332
|
+
"_executor", "_scheduler", "_dispatcher", "_router",
|
|
333
|
+
"_resolver", "_collector", "_aggregator", "_transformer",
|
|
334
|
+
"_extractor", "_injector", "_wrapper", "_observer",
|
|
335
|
+
"_listener", "_emitter", "_subscriber", "_publisher",
|
|
336
|
+
"_module", "_modules", "_helper", "_util", "_utils",
|
|
337
|
+
"_config", "_settings", "_options", "_params",
|
|
338
|
+
"_result", "_results", "_response", "_request",
|
|
339
|
+
"_context", "_session", "_client", "_server",
|
|
340
|
+
"_queue", "_stack", "_buffer", "_cache", "_store",
|
|
341
|
+
"_pool", "_cluster", "_node", "_worker", "_runner",
|
|
342
|
+
"_loop", "_cycle", "_tick", "_batch", "_chunk",
|
|
343
|
+
})
|
|
344
|
+
if "_" in norm and any(norm.endswith(s) for s in _NOUN_SUFFIXES):
|
|
345
|
+
return True
|
|
346
|
+
# Common action-verb prefixed snake_case names are code artifacts.
|
|
347
|
+
if any(norm.startswith(p) for p in _VERB_PREFIXES):
|
|
348
|
+
return True
|
|
349
|
+
# Roman numerals (MCMXCIV, XIV, etc.) — matched by _RE_ACRONYM but
|
|
350
|
+
# carry no knowledge gap for a coding assistant.
|
|
351
|
+
if len(norm) > 2 and re.match(
|
|
352
|
+
r'^m{0,4}(?:cm|cd|d?c{0,3})(?:xc|xl|l?x{0,3})(?:ix|iv|v?i{0,3})$',
|
|
353
|
+
norm
|
|
354
|
+
) and norm:
|
|
355
|
+
return True
|
|
356
|
+
# Sentence fragments starting with a single lowercase letter then a space
|
|
357
|
+
# are contraction tails ("Don't" → "t ...", "Let's" → "s ..."). These
|
|
358
|
+
# are never retrievable identifiers.
|
|
359
|
+
if re.match(r"^[a-z] ", norm):
|
|
360
|
+
return True
|
|
178
361
|
# All-lowercase multi-word phrases (e.g. "buy milk", "sample logs") —
|
|
179
362
|
# quoted prose from task prompts, not identifiers worth retrieving.
|
|
180
363
|
# Only filter if the *original* candidate is already lowercase — Title Case
|
|
181
364
|
# phrases like "Attention Is All You Need" must still be detected.
|
|
365
|
+
# Strip punctuation before the regex so commas/periods don't block matches.
|
|
182
366
|
orig = candidate.strip(" :.,;")
|
|
183
|
-
|
|
367
|
+
norm_alphanum = re.sub(r"[^a-z0-9 _-]", "", norm)
|
|
368
|
+
if " " in norm and orig == orig.lower() and re.match(r"^[a-z][a-z0-9 _-]+$", norm_alphanum) and len(norm_alphanum) > 3:
|
|
184
369
|
return True
|
|
185
370
|
# Date format strings like "YYYY-MM", "YYYY-MM-DD", "/DD/YYYY" — these
|
|
186
371
|
# are template tokens that contain YYYY/MM/DD components (now in
|
|
187
372
|
# TEMPLATE_NOISE) separated by punctuation but the combined string isn't.
|
|
188
373
|
if re.match(r"^[/\-]?(?:yyyy|mm|dd|hh|ss)(?:[/\-](?:yyyy|mm|dd|hh|ss))+$", norm):
|
|
189
374
|
return True
|
|
375
|
+
# Hyphenated lowercase adjective phrases from PRD prose
|
|
376
|
+
# ("tab-separated", "human-readable", "newline-delimited") — these are
|
|
377
|
+
# format descriptors, not library identifiers worth retrieving.
|
|
378
|
+
if re.match(r"^[a-z][a-z0-9]+-[a-z][a-z0-9]+(?:-[a-z][a-z0-9]+)*$", norm):
|
|
379
|
+
return True
|
|
380
|
+
# Paths that contain known test-run or lifecycle directories — these are
|
|
381
|
+
# ephemeral artifacts from stress/lifecycle sessions, not real projects.
|
|
382
|
+
if re.search(r"(/drydock_lifecycle/|/pytest-of-|/pytest-\d|/tmp/drydock_|/swe_bench_|/test_harness_)", norm):
|
|
383
|
+
return True
|
|
384
|
+
# Latin abbreviations used as prose connectors ("i.e", "e.g", "etc").
|
|
385
|
+
if norm in ("i.e", "e.g", "etc", "i.e.", "e.g.", "etc.", "cf.", "cf", "vs", "vs."):
|
|
386
|
+
return True
|
|
387
|
+
# Snake_case identifiers containing _to_ in the middle are converter helpers
|
|
388
|
+
# (csv_to_json, rgb_to_hex) — project-generated code artifacts, not gaps.
|
|
389
|
+
if re.match(r"^[a-z][a-z0-9]*_to_[a-z][a-z0-9_]*$", norm):
|
|
390
|
+
return True
|
|
190
391
|
return False
|
|
191
392
|
|
|
192
393
|
# Acronyms shorter than this are too noisy to chase ("ID", "OK", "OS").
|
|
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
|