drydock-cli 2.9.54__tar.gz → 2.9.57__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.54 → drydock_cli-2.9.57}/PKG-INFO +1 -1
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/llm_analyzer.py +7 -2
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agent_loop.py +30 -4
- drydock_cli-2.9.57/drydock/curiosity/gap_detector.py +484 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/pyproject.toml +1 -1
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_curiosity.py +34 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/uv.lock +1 -1
- drydock_cli-2.9.54/drydock/curiosity/gap_detector.py +0 -224
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/.gitignore +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/LICENSE +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/NOTICE +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/docs/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/__main__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/goal.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/logger.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/gemma4_math.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/gemma4_slim.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/slug.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/spec_check.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prolog_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/types.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/ingest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/checklist/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/config.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/whats_new.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/install_tests/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/install_tests/publish/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/install_tests/windows/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/scripts/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/scripts/_archived_eval_harness/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/scripts/llm/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/conftest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/conftest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/common.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/utils.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/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.54 → drydock_cli-2.9.57}/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.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agents.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_api_error_recovery.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_approval_modal_stray_keys.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_classifier.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_gemma4_anti_loop_migration.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_goal.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_integration.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_math_docs_lazy_injection.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_mcp_stdio_command_normalization.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_message_id.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_middleware.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_prolog_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_read_file_notebook_slim.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_retrieve_project_detection.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_safe_parse_tool_args.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_search_replace_syntax_rollback.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_session_log_event.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_session_publish_on_resume.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_smoke.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_specialist_math_tools_hidden.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tool_call_loops_regression_suite.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tool_stop_injected_scope.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_validation_error_scrub.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_workloads.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_pre_rename_hook.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_missing_main_module.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_multifile_rename.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/web/README.md +0 -0
- {drydock_cli-2.9.54 → drydock_cli-2.9.57}/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.57
|
|
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
|
|
@@ -143,8 +143,13 @@ async def analyze(agent_loop: AgentLoop, finding: Finding) -> str | None:
|
|
|
143
143
|
# Strip reasoning tokens that some models leak.
|
|
144
144
|
if text.startswith("STUMPED"):
|
|
145
145
|
return None
|
|
146
|
-
|
|
147
|
-
|
|
146
|
+
# The expected format is `DIRECTIVE [Bx,Cy]: <text>` — the colon comes
|
|
147
|
+
# after the bracket group, not immediately after "DIRECTIVE". A plain
|
|
148
|
+
# `"DIRECTIVE:" in text` check fails for this format, so use a regex.
|
|
149
|
+
import re as _re
|
|
150
|
+
m = _re.search(r"DIRECTIVE(?:\s*\[[^\]]*\])?\s*:(.*)", text, _re.DOTALL)
|
|
151
|
+
if m:
|
|
152
|
+
proposal = m.group(1).strip()
|
|
148
153
|
# Take only the first line/paragraph — discard chain-of-thought.
|
|
149
154
|
proposal = proposal.split("\n\n")[0].strip()
|
|
150
155
|
return proposal or None
|
|
@@ -1690,16 +1690,24 @@ class AgentLoop:
|
|
|
1690
1690
|
# The verifier never ran for any of them. Nudging late
|
|
1691
1691
|
# forces them to run the verifier and iterate.
|
|
1692
1692
|
#
|
|
1693
|
-
#
|
|
1694
|
-
# `
|
|
1695
|
-
#
|
|
1693
|
+
# Count `verify` tool calls for the nudge text. Note:
|
|
1694
|
+
# `last_verify_passed` is NOT used as a gate anymore.
|
|
1695
|
+
# 2026-06-04 v2.9.55 batch: the model's `verify` tool
|
|
1696
|
+
# checks MODEL-CHOSEN criteria, not the external tbench
|
|
1697
|
+
# verifier. Self-pass happens easily (chess-best-move had
|
|
1698
|
+
# 4 verify calls, last passed=True, model's answer was
|
|
1699
|
+
# wrong, external tbench verifier rejected). Using
|
|
1700
|
+
# last_verify_passed as a gate silenced the nudge across
|
|
1701
|
+
# 37/37 fails in that batch. The nudge cap (10) is
|
|
1702
|
+
# already a sufficient bound; let it fire so Fix A
|
|
1703
|
+
# (path-aware nudge) actually runs.
|
|
1696
1704
|
verify_count = 0
|
|
1697
1705
|
last_verify_passed = False
|
|
1698
1706
|
for msg in self.messages:
|
|
1699
1707
|
if msg.role == Role.tool and (msg.name == "verify"):
|
|
1700
1708
|
verify_count += 1
|
|
1701
1709
|
last_verify_passed = "passed: True" in (msg.content or "")
|
|
1702
|
-
if is_programmatic and nudges < 10
|
|
1710
|
+
if is_programmatic and nudges < 10:
|
|
1703
1711
|
self._premature_exit_nudges = nudges + 1
|
|
1704
1712
|
if zero_writes:
|
|
1705
1713
|
paths_hint = ""
|
|
@@ -1740,6 +1748,24 @@ class AgentLoop:
|
|
|
1740
1748
|
f"no file, and partial-credit verifiers reward "
|
|
1741
1749
|
f"format correctness even when content is off."
|
|
1742
1750
|
)
|
|
1751
|
+
elif last_verify_passed:
|
|
1752
|
+
# 2026-06-04: model self-verified with its OWN
|
|
1753
|
+
# criterion. Real tbench/pytest verifier runs
|
|
1754
|
+
# later and is stricter. Warn explicitly.
|
|
1755
|
+
note = (
|
|
1756
|
+
f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
|
|
1757
|
+
f"Your `verify` call passed, but that checks "
|
|
1758
|
+
f"the criterion YOU wrote — not the external "
|
|
1759
|
+
f"pytest the harness will run after you exit. "
|
|
1760
|
+
f"Common gap: your verify checks 'file exists' "
|
|
1761
|
+
f"or 'output contains X', but the verifier "
|
|
1762
|
+
f"checks EXACT format / EXACT path / specific "
|
|
1763
|
+
f"line content. Re-read the task literally: "
|
|
1764
|
+
f"the path it names, the format it specifies, "
|
|
1765
|
+
f"the example outputs it shows. Run a stricter "
|
|
1766
|
+
f"check (cat the file, run pytest if installed, "
|
|
1767
|
+
f"diff against the example) BEFORE exiting."
|
|
1768
|
+
)
|
|
1743
1769
|
else:
|
|
1744
1770
|
note = (
|
|
1745
1771
|
f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
|
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
"""Gap detector — find unfamiliar terms in user input.
|
|
2
|
+
|
|
3
|
+
A "gap" is a token in a user message that looks like a named entity or
|
|
4
|
+
identifier the agent probably has no context for: paper titles, library
|
|
5
|
+
names, API identifiers, file paths, multi-word Title Case phrases,
|
|
6
|
+
ALL-CAPS acronyms, version-like tokens.
|
|
7
|
+
|
|
8
|
+
The detector is HEURISTIC, not exhaustive. False positives are cheap
|
|
9
|
+
(an extra retrieve call) and false negatives are the failure mode the
|
|
10
|
+
PRD §5.7 calls out (Gemma 4 answers from prior on a general-knowledge
|
|
11
|
+
HLE question because it never noticed there was something to look up).
|
|
12
|
+
Bias the heuristics toward firing.
|
|
13
|
+
|
|
14
|
+
Public surface:
|
|
15
|
+
|
|
16
|
+
gaps: list[str] = detect_gaps(user_text)
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import re
|
|
21
|
+
from typing import Iterable
|
|
22
|
+
|
|
23
|
+
# Common English words that look like Title Case but aren't entities.
|
|
24
|
+
# Keep small — the goal is "minimize false positives on conversational
|
|
25
|
+
# openers", not exhaustive linguistic filtering.
|
|
26
|
+
_STOPWORDS: frozenset[str] = frozenset({
|
|
27
|
+
# Sentence-start common Title-Case words.
|
|
28
|
+
"The", "A", "An", "I", "We", "You", "It", "He", "She", "They",
|
|
29
|
+
"This", "That", "These", "Those", "What", "When", "Where", "Why",
|
|
30
|
+
"How", "Who", "Which", "If", "But", "And", "Or", "So", "Yes", "No",
|
|
31
|
+
"Please", "Can", "Could", "Would", "Should", "Will", "Let", "Do",
|
|
32
|
+
"Does", "Did", "Is", "Are", "Was", "Were", "Be", "Been", "Being",
|
|
33
|
+
"Have", "Has", "Had", "Get", "Got", "Make", "Made", "Take", "Took",
|
|
34
|
+
# Common imperative openers for drydock tasks.
|
|
35
|
+
"Build", "Fix", "Add", "Remove", "Update", "Refactor", "Test",
|
|
36
|
+
"Run", "Check", "Review", "Show", "List", "Explain", "Find", "Look",
|
|
37
|
+
# Sentence-starting verbs that appear after periods in numbered lists
|
|
38
|
+
# ("scratch.Step 1", "fail.Step 2") — dotted-identifier regex treats
|
|
39
|
+
# these as module.attr but they're sentence boundaries.
|
|
40
|
+
"Step", "Stop", "Start", "Read", "Write", "Open", "Use", "See",
|
|
41
|
+
"Try", "Note", "Save", "Load", "Copy", "Move", "Call", "Pass",
|
|
42
|
+
# HLE/exam prose openers — flagged in 2026-05-14 queue audit
|
|
43
|
+
# because they always lead a Title-Case phrase ("Consider the X").
|
|
44
|
+
"Consider", "Suppose", "Given", "Let", "Define", "Compute",
|
|
45
|
+
"Determine", "Evaluate", "Prove", "Recall", "Note", "Assume",
|
|
46
|
+
"Render", "Parse", "Scan", "Detect", "Match", "Merge",
|
|
47
|
+
"Insert", "Delete", "Select", "Update", "Create", "Drop",
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
# HLE / harness prompt-template tokens that the detector kept flagging
|
|
51
|
+
# as "unknown terms" — 2026-05-14 queue audit found FINAL (45×),
|
|
52
|
+
# ANSWER (44×), QUESTION (44×), FINAL ANSWER: (47×) all in the curiosity
|
|
53
|
+
# queue as false positives. Compared case-insensitively. Any candidate
|
|
54
|
+
# whose stripped form (case-folded, trailing colon stripped) is in this
|
|
55
|
+
# set is dropped before enqueue.
|
|
56
|
+
_TEMPLATE_NOISE: frozenset[str] = frozenset(
|
|
57
|
+
s.lower() for s in {
|
|
58
|
+
"FINAL", "ANSWER", "QUESTION", "FINAL ANSWER",
|
|
59
|
+
"GROUND TRUTH", "PREDICTED ANSWER", "VERDICT",
|
|
60
|
+
# autonomous_review / admiral output tokens
|
|
61
|
+
"CONSIDER", "RESPONSE", "RESULT", "VERIFIED",
|
|
62
|
+
# Common prose openers that pass acronym + title-case regexes
|
|
63
|
+
"CHAPTER", "SECTION", "PART", "INTRODUCTION", "CONCLUSION",
|
|
64
|
+
# HLE multiple-choice format boilerplate — 2026-05-16 queue audit
|
|
65
|
+
# found "Answer Choices" (95×), "None of the" (13×), etc. leaking
|
|
66
|
+
# through because they match the title-case phrase regex.
|
|
67
|
+
"ANSWER CHOICES", "ANSWER CHOICE",
|
|
68
|
+
"NONE OF THE", "NONE OF THE ABOVE", "NONE OF THESE",
|
|
69
|
+
"ALL OF THE", "ALL OF THE ABOVE", "ALL OF THESE",
|
|
70
|
+
"ALL OF ABOVE", "NONE OF ABOVE",
|
|
71
|
+
"CHOOSE ONE", "SELECT ONE", "WHICH OF THE",
|
|
72
|
+
"WHICH OF THE FOLLOWING",
|
|
73
|
+
# Python keywords — match _RE_ACRONYM (≥3 uppercase) but are never
|
|
74
|
+
# unknown to a coding assistant. 2026-05-22 queue audit: CLI (300×),
|
|
75
|
+
# NOT (200×), README (102×) in top false positives.
|
|
76
|
+
"NOT", "AND", "OR", "FOR", "DEF", "CLASS", "PASS", "RETURN",
|
|
77
|
+
"IMPORT", "FROM", "WITH", "TRY", "EXCEPT", "RAISE", "YIELD",
|
|
78
|
+
"ASYNC", "AWAIT", "TRUE", "FALSE", "NONE",
|
|
79
|
+
# Common coding / CLI abbreviations always known in coding context
|
|
80
|
+
"CLI", "GUI", "TUI", "URL", "HTTP", "HTTPS", "TCP", "UDP",
|
|
81
|
+
"README", "CHANGELOG", "LICENSE", "TODO", "FIXME", "HACK",
|
|
82
|
+
"ENV", "DIR", "STR", "INT", "BOOL", "DICT", "LIST", "SET",
|
|
83
|
+
"OBJ", "ERR", "MSG", "NUM", "VAR", "FMT", "RES", "REQ",
|
|
84
|
+
"LOG", "PID", "CWD", "SRC", "LIB", "BIN", "TMP",
|
|
85
|
+
# File formats and data interchange standards — always known
|
|
86
|
+
"JSON", "CSV", "TSV", "XML", "HTML", "YAML", "YML", "TOML",
|
|
87
|
+
"SQL", "SQLITE", "POSTGRESQL", "MYSQL", "REDIS",
|
|
88
|
+
"PDF", "SVG", "PNG", "JPG", "JPEG", "GIF", "ICO", "WEBP",
|
|
89
|
+
"ISO", "ASCII", "UTF", "UTF8", "UTF16", "BASE64",
|
|
90
|
+
"API", "SDK", "REST", "SOAP", "RPC", "GRPC", "CRUD",
|
|
91
|
+
"ORM", "MVC", "MVP", "MVVM", "OOP", "FP",
|
|
92
|
+
"CI", "CD", "PR", "MR", "WIP",
|
|
93
|
+
"SSH", "SSL", "TLS", "JWT", "OAUTH", "SAML",
|
|
94
|
+
"CPU", "GPU", "RAM", "SSD", "HDD", "NFS",
|
|
95
|
+
# Date/time format placeholders — appear in PRD prompts as template
|
|
96
|
+
# strings, never a meaningful GraphRAG ingest target.
|
|
97
|
+
"YYYY", "YY", "MM", "DD", "HH", "SS", "UTC", "GMT",
|
|
98
|
+
# Open-source license / protocol names — always known in coding context
|
|
99
|
+
"APACHE", "APACHE2", "MIT", "BSD", "GPL", "LGPL", "MPL", "ISC",
|
|
100
|
+
# Generic status/signal words that match _RE_ACRONYM but carry no
|
|
101
|
+
# knowledge gap — 2026-06-04 queue audit top false positives.
|
|
102
|
+
"ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL", "FATAL",
|
|
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",
|
|
131
|
+
"STATUS", "STATE", "MODE", "TYPE", "KIND", "FLAG", "OPTION",
|
|
132
|
+
"FINDINGS", "PATTERNS", "REGEXES", "FIELDS", "METHODS",
|
|
133
|
+
"VERSION", "NAME", "PATH", "DATA", "OUTPUT", "INPUT",
|
|
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",
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Words that are only ever connectors — a Title-Case phrase composed
|
|
200
|
+
# entirely of these (after stripping the leading word) is prose filler.
|
|
201
|
+
_CONNECTOR_WORDS: frozenset[str] = frozenset({
|
|
202
|
+
"of", "the", "and", "for", "in", "de", "von", "a", "an",
|
|
203
|
+
})
|
|
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
|
+
|
|
238
|
+
|
|
239
|
+
def _is_template_noise(candidate: str) -> bool:
|
|
240
|
+
"""True if the candidate is HLE/admiral boilerplate, not a real term."""
|
|
241
|
+
norm = candidate.strip(" :.,;").lower()
|
|
242
|
+
if not norm:
|
|
243
|
+
return True
|
|
244
|
+
if norm in _TEMPLATE_NOISE:
|
|
245
|
+
return True
|
|
246
|
+
# Drop bare English stopword tokens too (the user prompt sometimes
|
|
247
|
+
# gets fragmented and "the" / "is" leak through the quoted-string
|
|
248
|
+
# path with 3-char minimum length).
|
|
249
|
+
if norm in {sw.lower() for sw in _STOPWORDS}:
|
|
250
|
+
return True
|
|
251
|
+
# A multi-word phrase whose non-first words are all connectors is
|
|
252
|
+
# prose filler, not an entity ("None of the", "All of the", etc.).
|
|
253
|
+
words = norm.split()
|
|
254
|
+
if len(words) >= 2 and all(w in _CONNECTOR_WORDS for w in words[1:]):
|
|
255
|
+
return True
|
|
256
|
+
# Python source filenames (cli.py, __init__.py, main.py, etc.) are
|
|
257
|
+
# never unknown to a coding assistant — they're being written. Matched
|
|
258
|
+
# by _RE_DOTTED_IDENT because "name.py" has a dot. 2026-05-22 audit:
|
|
259
|
+
# __init__.py (100×), cli.py (80×), renderer.py (69×) top false
|
|
260
|
+
# positives.
|
|
261
|
+
# Bare filenames (no directory separator) with common extensions are
|
|
262
|
+
# always known in a coding context — filter them to prevent spam.
|
|
263
|
+
# Full paths ("/data3/foo/bar.csv") are kept as they reference specific
|
|
264
|
+
# resources worth looking up.
|
|
265
|
+
_CODE_EXTS = (
|
|
266
|
+
".py", ".md", ".txt", ".csv", ".json", ".yaml", ".yml",
|
|
267
|
+
".toml", ".log", ".html", ".xml", ".sql", ".sh", ".rs",
|
|
268
|
+
".go", ".ts", ".js", ".jsx", ".tsx", ".css", ".scss",
|
|
269
|
+
".bak", ".tmp", ".lock", ".pid", ".gz", ".zip", ".tar",
|
|
270
|
+
".db", ".sqlite3", ".cache", ".dat", ".bin",
|
|
271
|
+
)
|
|
272
|
+
if "/" not in norm and any(norm.endswith(ext) for ext in _CODE_EXTS):
|
|
273
|
+
return True
|
|
274
|
+
# Dotted identifier where the post-dot component is a common English
|
|
275
|
+
# word OR starts with a verb-prefix → sentence boundary artifact or
|
|
276
|
+
# code artifact ("scratch.Step", "fail.Stop", "parser.sniff_format").
|
|
277
|
+
if "." in norm:
|
|
278
|
+
parts = norm.split(".")
|
|
279
|
+
_sw_lower = {w.lower() for w in _STOPWORDS}
|
|
280
|
+
if any(p in _sw_lower for p in parts[1:]):
|
|
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
|
|
302
|
+
# LaTeX math expressions — false positives from HLE/academic prompts.
|
|
303
|
+
# A term starting with $ or a LaTeX command backslash is math notation,
|
|
304
|
+
# not a GraphRAG-retrievable identifier.
|
|
305
|
+
if norm.startswith("$") or norm.startswith("\\"):
|
|
306
|
+
return True
|
|
307
|
+
# Pure numeric/punctuation strings — quoted answer-choice values like
|
|
308
|
+
# "33,1" or "0.5" from HLE prompts; never a meaningful ingest target.
|
|
309
|
+
if re.match(r"^[\d\s,./\-+%()]+$", norm):
|
|
310
|
+
return True
|
|
311
|
+
# Python dunder attributes (__all__, __init__.__all__, etc.) are always
|
|
312
|
+
# known in a coding context — never a GraphRAG gap.
|
|
313
|
+
if "__" in norm:
|
|
314
|
+
return True
|
|
315
|
+
# Test file / function names (test_cli, test_routes) are project artifacts
|
|
316
|
+
# produced by the agent, not external knowledge worth retrieving.
|
|
317
|
+
if norm.startswith("test_") or norm.startswith("tests_"):
|
|
318
|
+
return True
|
|
319
|
+
# Type-conversion function names (to_int, to_roman, to_snake_case) —
|
|
320
|
+
# generic utility patterns, not external library gaps.
|
|
321
|
+
if norm.startswith("to_"):
|
|
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
|
|
361
|
+
# All-lowercase multi-word phrases (e.g. "buy milk", "sample logs") —
|
|
362
|
+
# quoted prose from task prompts, not identifiers worth retrieving.
|
|
363
|
+
# Only filter if the *original* candidate is already lowercase — Title Case
|
|
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.
|
|
366
|
+
orig = candidate.strip(" :.,;")
|
|
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:
|
|
369
|
+
return True
|
|
370
|
+
# Date format strings like "YYYY-MM", "YYYY-MM-DD", "/DD/YYYY" — these
|
|
371
|
+
# are template tokens that contain YYYY/MM/DD components (now in
|
|
372
|
+
# TEMPLATE_NOISE) separated by punctuation but the combined string isn't.
|
|
373
|
+
if re.match(r"^[/\-]?(?:yyyy|mm|dd|hh|ss)(?:[/\-](?:yyyy|mm|dd|hh|ss))+$", norm):
|
|
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
|
|
391
|
+
return False
|
|
392
|
+
|
|
393
|
+
# Acronyms shorter than this are too noisy to chase ("ID", "OK", "OS").
|
|
394
|
+
_MIN_ACRONYM_LEN = 3
|
|
395
|
+
|
|
396
|
+
# Maximum gaps to return per call. The retrieve consumer can only act
|
|
397
|
+
# on so many before context bloats; truncate at the source.
|
|
398
|
+
_MAX_GAPS = 8
|
|
399
|
+
|
|
400
|
+
_RE_ACRONYM = re.compile(r"\b[A-Z]{%d,}(?:-?[A-Z0-9]+)?\b" % _MIN_ACRONYM_LEN)
|
|
401
|
+
_RE_TITLE_CASE_PHRASE = re.compile(
|
|
402
|
+
r"\b(?:[A-Z][a-z]+(?:[-'][A-Z][a-z]+)?)(?:\s+(?:[A-Z][a-z]+(?:[-'][A-Z][a-z]+)?|of|the|and|for|in|de|von)){1,4}"
|
|
403
|
+
)
|
|
404
|
+
_RE_DOTTED_IDENT = re.compile(r"\b[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*){1,}\b")
|
|
405
|
+
_RE_SNAKE_IDENT = re.compile(r"\b[a-z][a-z0-9_]*_[a-z0-9_]+\b")
|
|
406
|
+
_RE_VERSIONED = re.compile(r"\b[a-zA-Z][a-zA-Z0-9_-]*-\d+(?:\.\d+)+\b")
|
|
407
|
+
_RE_QUOTED = re.compile(r'"([^"\n]{3,80})"|\'([^\'\n]{3,80})\'')
|
|
408
|
+
_RE_PATH = re.compile(r"\b(?:/[A-Za-z0-9_.-]+){2,}\b")
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def _strip_punct(s: str) -> str:
|
|
412
|
+
return s.strip(" \t\n.,;:!?\"'()[]{}<>")
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def _dedup_preserve_order(items: Iterable[str]) -> list[str]:
|
|
416
|
+
seen: set[str] = set()
|
|
417
|
+
out: list[str] = []
|
|
418
|
+
for it in items:
|
|
419
|
+
k = it.lower()
|
|
420
|
+
if k in seen:
|
|
421
|
+
continue
|
|
422
|
+
seen.add(k)
|
|
423
|
+
out.append(it)
|
|
424
|
+
return out
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def detect_gaps(text: str, max_gaps: int = _MAX_GAPS) -> list[str]:
|
|
428
|
+
"""Extract candidate unfamiliar terms from `text`.
|
|
429
|
+
|
|
430
|
+
The agent_loop's curiosity hook calls this on every new user
|
|
431
|
+
message. Anything returned becomes a retrieve target before the
|
|
432
|
+
first LLM turn.
|
|
433
|
+
"""
|
|
434
|
+
if not text or not text.strip():
|
|
435
|
+
return []
|
|
436
|
+
|
|
437
|
+
candidates: list[str] = []
|
|
438
|
+
|
|
439
|
+
# Quoted strings of meaningful length — strongest signal (user
|
|
440
|
+
# explicitly delimited a name).
|
|
441
|
+
for m in _RE_QUOTED.finditer(text):
|
|
442
|
+
val = m.group(1) or m.group(2) or ""
|
|
443
|
+
val = val.strip()
|
|
444
|
+
if val:
|
|
445
|
+
candidates.append(val)
|
|
446
|
+
|
|
447
|
+
# Filesystem paths — almost always worth knowing about.
|
|
448
|
+
for m in _RE_PATH.finditer(text):
|
|
449
|
+
candidates.append(m.group(0))
|
|
450
|
+
|
|
451
|
+
# Versioned package-like tokens ("django-4.2", "torch-2.0.1").
|
|
452
|
+
for m in _RE_VERSIONED.finditer(text):
|
|
453
|
+
candidates.append(m.group(0))
|
|
454
|
+
|
|
455
|
+
# Dotted identifiers (module.path or Type.method).
|
|
456
|
+
for m in _RE_DOTTED_IDENT.finditer(text):
|
|
457
|
+
candidates.append(m.group(0))
|
|
458
|
+
|
|
459
|
+
# Snake-case identifiers (likely function or symbol names).
|
|
460
|
+
for m in _RE_SNAKE_IDENT.finditer(text):
|
|
461
|
+
candidates.append(m.group(0))
|
|
462
|
+
|
|
463
|
+
# ALL-CAPS acronyms (RAG, MCP, GraphRAG-style).
|
|
464
|
+
for m in _RE_ACRONYM.finditer(text):
|
|
465
|
+
tok = m.group(0)
|
|
466
|
+
if tok not in _STOPWORDS:
|
|
467
|
+
candidates.append(tok)
|
|
468
|
+
|
|
469
|
+
# Title-Case multi-word phrases (paper titles, product names).
|
|
470
|
+
for m in _RE_TITLE_CASE_PHRASE.finditer(text):
|
|
471
|
+
phrase = _strip_punct(m.group(0))
|
|
472
|
+
if not phrase:
|
|
473
|
+
continue
|
|
474
|
+
first = phrase.split()[0]
|
|
475
|
+
if first in _STOPWORDS:
|
|
476
|
+
# Drop the leading stopword — "The Curiosity Layer" → "Curiosity Layer"
|
|
477
|
+
phrase = " ".join(phrase.split()[1:])
|
|
478
|
+
if not phrase:
|
|
479
|
+
continue
|
|
480
|
+
candidates.append(phrase)
|
|
481
|
+
|
|
482
|
+
return _dedup_preserve_order(
|
|
483
|
+
c for c in candidates if c and not _is_template_noise(c)
|
|
484
|
+
)[:max_gaps]
|
|
@@ -112,6 +112,40 @@ class TestGapDetector:
|
|
|
112
112
|
for noise in ("Consider", "Suppose", "Consider the"):
|
|
113
113
|
assert noise not in gaps, f"detected noise: {noise!r} in {gaps}"
|
|
114
114
|
|
|
115
|
+
def test_drops_sentence_boundary_dotted_idents(self):
|
|
116
|
+
"""Numbered-step prompts produce 'scratch.Step', 'fail.Step', etc.
|
|
117
|
+
when the gap-detector sees period+uppercase-word at a sentence
|
|
118
|
+
boundary. These must not be queued as unknown terms (2026-06-04
|
|
119
|
+
curiosity queue filled with 9988 junk entries from one session)."""
|
|
120
|
+
text = (
|
|
121
|
+
"DO NOT scaffold from scratch.Step 1: cd here and run pytest -q."
|
|
122
|
+
" You'll see 24 tests pass and 3 fail.Step 2: Read the output."
|
|
123
|
+
)
|
|
124
|
+
gaps = detect_gaps(text)
|
|
125
|
+
for noise in ("scratch.Step", "fail.Step", "green.Stop"):
|
|
126
|
+
assert noise not in gaps, f"detected noise: {noise!r} in {gaps}"
|
|
127
|
+
# Real dotted identifiers (module.attr) must still be detected.
|
|
128
|
+
real = detect_gaps("Use sklearn.metrics.f1_score here.")
|
|
129
|
+
assert any("sklearn" in g for g in real), real
|
|
130
|
+
|
|
131
|
+
def test_drops_to_x_converter_names(self):
|
|
132
|
+
"""to_int, to_roman, to_snake_case etc. are project-defined converters,
|
|
133
|
+
not external library gaps. The to_ prefix alone is sufficient."""
|
|
134
|
+
for term in ("to_int", "to_roman", "to_str", "to_bool", "to_snake_case"):
|
|
135
|
+
gaps = detect_gaps(f"Implement `{term}` function.")
|
|
136
|
+
assert term not in gaps, f"to_X converter leaked into gaps: {term!r} in {gaps}"
|
|
137
|
+
|
|
138
|
+
def test_drops_lowercase_prose_phrases(self):
|
|
139
|
+
"""Quoted lowercase multi-word phrases like 'buy milk' or 'sample logs'
|
|
140
|
+
are prose noise from task prompts, not retrievable identifiers."""
|
|
141
|
+
for phrase in ("buy milk", "sample logs", "backend disk"):
|
|
142
|
+
gaps = detect_gaps(f'Remember to "{phrase}" today.')
|
|
143
|
+
assert phrase not in gaps, f"prose phrase leaked into gaps: {phrase!r} in {gaps}"
|
|
144
|
+
# Real snake_case identifiers with spaces should still be detected
|
|
145
|
+
# via the snake_case pattern (no space version).
|
|
146
|
+
real = detect_gaps("Call backend_memory.flush() to clear.")
|
|
147
|
+
assert any("backend_memory" in g for g in real), real
|
|
148
|
+
|
|
115
149
|
def test_keeps_real_terms_amid_hle_noise(self):
|
|
116
150
|
"""Validates the fix isn't over-broad: real entity names must
|
|
117
151
|
survive alongside the boilerplate."""
|