drydock-cli 2.6.147__tar.gz → 2.7.0__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.7.0/.auto_release.lock +1 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/CHANGELOG.md +85 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/PKG-INFO +1 -1
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/agent_loop.py +92 -8
- drydock_cli-2.7.0/drydock/core/prompts/__init__.py +56 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/pyproject.toml +1 -1
- drydock_cli-2.7.0/research/config_best.toml +145 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/experimenter.py +25 -1
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/kernel.py +82 -8
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/proposer.py +42 -4
- drydock_cli-2.7.0/research/results.tsv +2 -0
- drydock_cli-2.7.0/research/staged/exp_1776806574_0001.toml +145 -0
- drydock_cli-2.7.0/research/staged/exp_1776806920_0002.toml +145 -0
- drydock_cli-2.7.0/research/staged/exp_1776807004_0001.toml +145 -0
- drydock_cli-2.7.0/research/staged/exp_1776807135_0001.toml +145 -0
- drydock_cli-2.7.0/research/traces/exp_1776806574_0001/summary.json +14 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/auto_release.sh +18 -8
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_shakedown.py +58 -17
- drydock_cli-2.7.0/tests/mock/__init__.py +0 -0
- drydock_cli-2.6.147/.auto_release.lock +0 -1
- drydock_cli-2.6.147/drydock/core/prompts/__init__.py +0 -36
- drydock_cli-2.6.147/research/results.tsv +0 -1
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.gitignore +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.python-version +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.typos.toml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/AGENTS.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/Admiral.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/BASELINE_412.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/CLAUDE.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/LICENSE +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/NOTICE +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/PRD.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/README.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/action.yml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/README.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/docs/README.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/drydock_terms.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/flake.lock +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/flake.nix +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/README.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/config_base.toml +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/domain_spec.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/mini_prd.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/research/mini_prompts.txt +0 -0
- /drydock_cli-2.6.147/tests/backend/__init__.py → /drydock_cli-2.7.0/research/traces/exp_1776806574_0001/rec_check.jsonl +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/README.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/evolve_tests.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/install.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/mega_loop.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/meta_ralph_loop.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/port_task.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/session_loop_audit.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/shakedown.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.147/tests/cli/textual_ui → drydock_cli-2.7.0/tests/backend}/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.147/tests/mock → drydock_cli-2.7.0/tests/cli/textual_ui}/__init__.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/conftest.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/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.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_admiral.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/uv.lock +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/worked_examples/README.md +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.6.147 → drydock_cli-2.7.0}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2797280
|
|
@@ -5,6 +5,91 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.7.0] - 2026-04-21
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Meta-Harness autoresearch loop** (`research/` subsystem). Opus-driven
|
|
13
|
+
search over a bounded mutation surface. Fixed 5-minute kernel,
|
|
14
|
+
append-only results log, contrastive proposer with access to source +
|
|
15
|
+
top/bottom traces. See `research/domain_spec.md` for the design.
|
|
16
|
+
- **Admiral actuator**: `scripts/stress_watcher.py` sends SIGUSR1 to the
|
|
17
|
+
stress harness on unrecoverable TUI wedges; the harness respawns its
|
|
18
|
+
drydock child at the next iteration boundary. Rate-limited. First loop
|
|
19
|
+
where admiral *acts* on its observations.
|
|
20
|
+
- **Env override surface** for experiments:
|
|
21
|
+
`DRYDOCK_AUTO_CONTINUE_DISABLE`,
|
|
22
|
+
`DRYDOCK_STRESS_{SESSION_RESET_EVERY,MAX_CONSECUTIVE_SKIPS_BEFORE_RESET,SEND_PROMPT_RETRY_COUNT,SEND_PROMPT_WAIT_PER_RETRY_SEC}`,
|
|
23
|
+
`DRYDOCK_ADMIRAL_{REPEAT_WARNING_THRESHOLD,REPEAT_FORCE_STOP_THRESHOLD,EMPTY_RESULT_THRESHOLD,SAME_TOOL_NAME_REPEAT_LIMIT_{BASH,READ}}`,
|
|
24
|
+
`DRYDOCK_PROMPTS_DIR`. All default to the prior hardcoded values;
|
|
25
|
+
production behavior unchanged.
|
|
26
|
+
- **`DEPLOYMENT.md`**: known-working hardware + vLLM Docker flags +
|
|
27
|
+
`~/.drydock/config.toml` template + env var table + diagnostic
|
|
28
|
+
checklist. Answers the "works on your machine, not mine" question.
|
|
29
|
+
- **`scripts/stress_babysitter.sh`**: hourly monitor cron that
|
|
30
|
+
auto-restarts long stress runs from the last successful step. Silent
|
|
31
|
+
when healthy; Telegrams only on state change.
|
|
32
|
+
- **Check 0 empty-result loop detector** in `agent_loop.py`. Fires
|
|
33
|
+
FORCE_STOP at 3 identical tool calls when the result matches an
|
|
34
|
+
empty pattern (`total_count: 0`, `no todos`, `no tasks`,
|
|
35
|
+
`no matches`, blank). Catches todo / task / grep-empty loops that
|
|
36
|
+
Check 1's threshold-of-8 is too lax for.
|
|
37
|
+
- **Proactive write-oscillation prune** in
|
|
38
|
+
`_sanitize_message_ordering`. Any path with ≥3 `write_file` history
|
|
39
|
+
entries gets its older copies pruned before the next LLM call, so
|
|
40
|
+
context stays below Gemma 4's 131K ceiling instead of waiting for
|
|
41
|
+
a 400.
|
|
42
|
+
- **Raw-markdown leakage detector** in stress harness + admiral.
|
|
43
|
+
Surfaces TUI rendering regressions as `stress-alert/raw-markdown-
|
|
44
|
+
leakage` on the admiral dashboard.
|
|
45
|
+
- **`OVERNIGHT_PROGRESS.md`** session-continuity doc template.
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
- **`should_break_loop`** in `agent_loop.py:876` — the condition
|
|
50
|
+
`tool_turns == 0` was unreachable since the file's current structure
|
|
51
|
+
landed. Text-only assistant responses now cleanly close the user
|
|
52
|
+
turn instead of regenerating until `PER_PROMPT_BUDGET_SEC` times
|
|
53
|
+
out. **This is a behavior fix users will notice immediately** —
|
|
54
|
+
questions the model asks now wait for input.
|
|
55
|
+
- **Continue-loop**: env-gated via `DRYDOCK_AUTO_CONTINUE_DISABLE=1`
|
|
56
|
+
so stress runs (and any workflow hitting text-only prompt loops)
|
|
57
|
+
can opt out.
|
|
58
|
+
- **`SESSION_ROOT` resolution** in `scripts/shakedown_interactive.py`:
|
|
59
|
+
now reads the path from `~/.drydock/config.toml`'s
|
|
60
|
+
`[session_logging].save_dir` instead of hardcoding
|
|
61
|
+
`~/.drydock/logs/session/`. Fixes false-SKIP reporting on any
|
|
62
|
+
machine whose drydock config has the newer default
|
|
63
|
+
`~/.vibe/logs/session/`.
|
|
64
|
+
- **Todo tool** (`todo.py`): empty-read response now escalates.
|
|
65
|
+
First empty: *"No todos yet. Write one or proceed with the task."*
|
|
66
|
+
Second+: *"Still no todos. Stop calling read. Empty state will
|
|
67
|
+
not change on its own."* Closes GitHub #10.
|
|
68
|
+
- **Fresh-start wipe** in stress harness: wipes cwd to fixtures
|
|
69
|
+
(PRD/AGENTS/functional_tests) instead of accumulating prior
|
|
70
|
+
runs' half-written artifacts.
|
|
71
|
+
- **Raw-markdown detector** patterns tightened (`**bold**`,
|
|
72
|
+
`##heading`, `[link](url)` only — dropped bullet + numbered-list
|
|
73
|
+
patterns that matched rendered lists and generated 45 % false
|
|
74
|
+
positives).
|
|
75
|
+
|
|
76
|
+
### Infrastructure
|
|
77
|
+
|
|
78
|
+
- First clean 1658-prompt stress run completed 2026-04-21.
|
|
79
|
+
~1622 successful prompts (run + babysitter auto-restart),
|
|
80
|
+
35 SKIPs, 0 TIMEOUTs, ~60 admiral-initiated TUI recycles.
|
|
81
|
+
~46-hour wall-clock. Reference baseline for future experiments.
|
|
82
|
+
- `scripts/auto_release.sh` supports `DRYDOCK_FORCE_VERSION` for
|
|
83
|
+
MINOR / MAJOR bumps (the ordinary PATCH-bumper would have taken
|
|
84
|
+
us to 2.6.149, not 2.7.0).
|
|
85
|
+
|
|
86
|
+
### Known follow-ups
|
|
87
|
+
|
|
88
|
+
- Meta-Harness median-of-3 replication before promotion (currently
|
|
89
|
+
single-sample).
|
|
90
|
+
- TUI Markdown widget regression surfaced by admiral but not yet
|
|
91
|
+
fixed.
|
|
92
|
+
|
|
8
93
|
## [2.4.2] - 2026-03-12
|
|
9
94
|
|
|
10
95
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.7.0
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -125,8 +125,36 @@ class ToolDecision(BaseModel):
|
|
|
125
125
|
|
|
126
126
|
MAX_TOOL_TURNS = 200 # Bug fixes rarely need more than 50 turns; 200 is generous ceiling
|
|
127
127
|
MAX_API_ERRORS = 5
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _admiral_env_int(name: str, default: int) -> int:
|
|
131
|
+
"""Read a DRYDOCK_ADMIRAL_<name> env var at module-load; fall back
|
|
132
|
+
to the hardcoded default on missing / empty / unparseable. This is
|
|
133
|
+
the knob the meta-harness kernel writes when running a variant
|
|
134
|
+
from research/experimenter.py. Production installs never set
|
|
135
|
+
these vars, so behavior is unchanged for normal drydock users."""
|
|
136
|
+
import os as _os
|
|
137
|
+
v = _os.environ.get(f"DRYDOCK_ADMIRAL_{name}", "")
|
|
138
|
+
if not v:
|
|
139
|
+
return default
|
|
140
|
+
try:
|
|
141
|
+
return int(v)
|
|
142
|
+
except (TypeError, ValueError):
|
|
143
|
+
return default
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
# Same exact call N+ times before warning. Env: DRYDOCK_ADMIRAL_REPEAT_WARNING_THRESHOLD
|
|
147
|
+
REPEAT_WARNING_THRESHOLD = _admiral_env_int("REPEAT_WARNING_THRESHOLD", 4)
|
|
148
|
+
# Same exact call N+ times before force-stop. Env: DRYDOCK_ADMIRAL_REPEAT_FORCE_STOP_THRESHOLD
|
|
149
|
+
REPEAT_FORCE_STOP_THRESHOLD = _admiral_env_int(
|
|
150
|
+
"REPEAT_FORCE_STOP_THRESHOLD", 8)
|
|
151
|
+
# Check 0 (empty-result) threshold. Env: DRYDOCK_ADMIRAL_EMPTY_RESULT_THRESHOLD
|
|
152
|
+
EMPTY_RESULT_THRESHOLD = _admiral_env_int("EMPTY_RESULT_THRESHOLD", 3)
|
|
153
|
+
# Per-tool consecutive-call limits. Env: DRYDOCK_ADMIRAL_SAME_TOOL_NAME_REPEAT_LIMIT_{BASH,READ}
|
|
154
|
+
SAME_TOOL_NAME_REPEAT_LIMIT_BASH = _admiral_env_int(
|
|
155
|
+
"SAME_TOOL_NAME_REPEAT_LIMIT_BASH", 5)
|
|
156
|
+
SAME_TOOL_NAME_REPEAT_LIMIT_READ = _admiral_env_int(
|
|
157
|
+
"SAME_TOOL_NAME_REPEAT_LIMIT_READ", 7)
|
|
130
158
|
|
|
131
159
|
logger = logging.getLogger(__name__)
|
|
132
160
|
|
|
@@ -1607,6 +1635,58 @@ class AgentLoop:
|
|
|
1607
1635
|
)
|
|
1608
1636
|
self.messages.reset(kept)
|
|
1609
1637
|
|
|
1638
|
+
def _proactive_prune_write_oscillation(self) -> None:
|
|
1639
|
+
"""Prune duplicate writes BEFORE they push the session into a
|
|
1640
|
+
vLLM 400 Bad Request (context overflow).
|
|
1641
|
+
|
|
1642
|
+
`_prune_duplicate_writes` above only fires after the hard-block
|
|
1643
|
+
trips on the Nth write. By that point the model has already
|
|
1644
|
+
written the file 4+ times, the context contains 4+ full copies
|
|
1645
|
+
of the file content, and vLLM has started returning 400s on
|
|
1646
|
+
every call.
|
|
1647
|
+
|
|
1648
|
+
This method runs as part of _sanitize_message_ordering, BEFORE
|
|
1649
|
+
every LLM call. Any path with ≥3 `write_file` assistant-tool-
|
|
1650
|
+
call entries in history gets pruned down to the most recent 2.
|
|
1651
|
+
That leaves the latest attempt + one priored to compare against,
|
|
1652
|
+
without carrying an arbitrary number of historical copies.
|
|
1653
|
+
|
|
1654
|
+
GitHub issue from 2026-04-21 user report: session wrote
|
|
1655
|
+
prepare.py 4× before hitting 15+ 400 errors and giving up.
|
|
1656
|
+
The existing `_prune_duplicate_writes` would have caught this,
|
|
1657
|
+
but only AFTER the hard-block fired (8+ identical calls).
|
|
1658
|
+
By 4× on a 600-line file we're already at ~75K tokens of
|
|
1659
|
+
duplicate content.
|
|
1660
|
+
"""
|
|
1661
|
+
PROACTIVE_PRUNE_THRESHOLD = 3
|
|
1662
|
+
try:
|
|
1663
|
+
path_counts: dict[str, int] = {}
|
|
1664
|
+
for msg in self.messages:
|
|
1665
|
+
if msg.role != Role.assistant or not msg.tool_calls:
|
|
1666
|
+
continue
|
|
1667
|
+
for tc in msg.tool_calls:
|
|
1668
|
+
if not tc.function or tc.function.name != "write_file":
|
|
1669
|
+
continue
|
|
1670
|
+
try:
|
|
1671
|
+
args = json.loads(tc.function.arguments or "{}")
|
|
1672
|
+
except (json.JSONDecodeError, TypeError):
|
|
1673
|
+
continue
|
|
1674
|
+
target = args.get("file_path") or args.get("path") or ""
|
|
1675
|
+
if not target:
|
|
1676
|
+
continue
|
|
1677
|
+
path_counts[target] = path_counts.get(target, 0) + 1
|
|
1678
|
+
for target_path, count in path_counts.items():
|
|
1679
|
+
if count >= PROACTIVE_PRUNE_THRESHOLD:
|
|
1680
|
+
logger.info(
|
|
1681
|
+
"Proactive prune: path %s has %d write_file "
|
|
1682
|
+
"entries (threshold %d). Pruning older writes "
|
|
1683
|
+
"before next LLM call to avoid context overflow.",
|
|
1684
|
+
target_path, count, PROACTIVE_PRUNE_THRESHOLD,
|
|
1685
|
+
)
|
|
1686
|
+
self._prune_duplicate_writes(target_path)
|
|
1687
|
+
except Exception as e:
|
|
1688
|
+
logger.debug("Proactive write prune failed: %s", e)
|
|
1689
|
+
|
|
1610
1690
|
def _truncate_old_tool_results(self) -> None:
|
|
1611
1691
|
"""Shrink old verbose tool results before they bloat context.
|
|
1612
1692
|
|
|
@@ -1697,6 +1777,7 @@ class AgentLoop:
|
|
|
1697
1777
|
# Proactive context shrinkage runs first so the LLM call sees the
|
|
1698
1778
|
# smaller payload.
|
|
1699
1779
|
self._truncate_old_tool_results()
|
|
1780
|
+
self._proactive_prune_write_oscillation()
|
|
1700
1781
|
|
|
1701
1782
|
if not self.messages:
|
|
1702
1783
|
return
|
|
@@ -2315,14 +2396,15 @@ class AgentLoop:
|
|
|
2315
2396
|
if p in s:
|
|
2316
2397
|
return True
|
|
2317
2398
|
return False
|
|
2318
|
-
if len(sigs) >=
|
|
2399
|
+
if (len(sigs) >= EMPTY_RESULT_THRESHOLD
|
|
2400
|
+
and all(s == sigs[-1] for s in sigs[-EMPTY_RESULT_THRESHOLD:])):
|
|
2319
2401
|
recent_results: list[str] = []
|
|
2320
2402
|
for msg in reversed(self.messages):
|
|
2321
2403
|
if msg.role == Role.tool:
|
|
2322
2404
|
recent_results.append(str(msg.content or ""))
|
|
2323
|
-
if len(recent_results) >=
|
|
2405
|
+
if len(recent_results) >= EMPTY_RESULT_THRESHOLD:
|
|
2324
2406
|
break
|
|
2325
|
-
if (len(recent_results) >=
|
|
2407
|
+
if (len(recent_results) >= EMPTY_RESULT_THRESHOLD
|
|
2326
2408
|
and all(_looks_empty(r) for r in recent_results)):
|
|
2327
2409
|
return "FORCE_STOP"
|
|
2328
2410
|
|
|
@@ -2430,12 +2512,14 @@ class AgentLoop:
|
|
|
2430
2512
|
# Check 2: Same tool called N+ times consecutively with different args
|
|
2431
2513
|
# Lower thresholds catch loops where the model uses the same tool
|
|
2432
2514
|
# with slightly different args (e.g., grep with different paths).
|
|
2515
|
+
# Limits are env-overridable via DRYDOCK_ADMIRAL_SAME_TOOL_NAME_REPEAT_LIMIT_*.
|
|
2433
2516
|
if last_tool in ("bash", "run_command"):
|
|
2434
|
-
same_tool_limit =
|
|
2517
|
+
same_tool_limit = SAME_TOOL_NAME_REPEAT_LIMIT_BASH
|
|
2435
2518
|
elif last_tool in ("grep", "read_file"):
|
|
2436
|
-
|
|
2519
|
+
# investigation tools need some room
|
|
2520
|
+
same_tool_limit = SAME_TOOL_NAME_REPEAT_LIMIT_READ
|
|
2437
2521
|
else:
|
|
2438
|
-
same_tool_limit =
|
|
2522
|
+
same_tool_limit = SAME_TOOL_NAME_REPEAT_LIMIT_BASH
|
|
2439
2523
|
if (
|
|
2440
2524
|
len(tool_names) >= same_tool_limit
|
|
2441
2525
|
and all(n == tool_names[-1] for n in tool_names[-same_tool_limit:])
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from enum import StrEnum, auto
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from drydock import DRYDOCK_ROOT
|
|
8
|
+
|
|
9
|
+
_PROMPTS_DIR = DRYDOCK_ROOT / "core" / "prompts"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _resolve_prompt_path(name: str) -> Path:
|
|
13
|
+
"""Return the .md file for a prompt name.
|
|
14
|
+
|
|
15
|
+
If DRYDOCK_PROMPTS_DIR is set and contains a matching file, use that
|
|
16
|
+
override. Falls back to the shipped prompt. Used by the Meta-Harness
|
|
17
|
+
research kernel (research/kernel.py) to swap in per-experiment
|
|
18
|
+
prompt variants without mutating the installed package.
|
|
19
|
+
|
|
20
|
+
Missing override file = use shipped (not an error) so experiments
|
|
21
|
+
can mutate only gemma4 without also overriding every other prompt.
|
|
22
|
+
"""
|
|
23
|
+
override_dir = os.environ.get("DRYDOCK_PROMPTS_DIR", "")
|
|
24
|
+
if override_dir:
|
|
25
|
+
candidate = Path(override_dir) / f"{name}.md"
|
|
26
|
+
if candidate.is_file():
|
|
27
|
+
return candidate
|
|
28
|
+
return (_PROMPTS_DIR / name).with_suffix(".md")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Prompt(StrEnum):
|
|
32
|
+
@property
|
|
33
|
+
def path(self) -> Path:
|
|
34
|
+
return _resolve_prompt_path(self.value)
|
|
35
|
+
|
|
36
|
+
def read(self) -> str:
|
|
37
|
+
return self.path.read_text(encoding="utf-8").strip()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class SystemPrompt(Prompt):
|
|
41
|
+
CLI = auto()
|
|
42
|
+
EXPLORE = auto()
|
|
43
|
+
TESTS = auto()
|
|
44
|
+
BUILDER = auto()
|
|
45
|
+
PLANNER = auto()
|
|
46
|
+
DIAGNOSTIC = auto()
|
|
47
|
+
GEMMA4 = auto()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class UtilityPrompt(Prompt):
|
|
51
|
+
COMPACT = auto()
|
|
52
|
+
DANGEROUS_DIRECTORY = auto()
|
|
53
|
+
PROJECT_CONTEXT = auto()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
__all__ = ["SystemPrompt", "UtilityPrompt"]
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
[target]
|
|
2
|
+
model = "mistral-vibe-cli-latest"
|
|
3
|
+
task = "unknown"
|
|
4
|
+
|
|
5
|
+
[[knob]]
|
|
6
|
+
name = "per_prompt_budget_sec"
|
|
7
|
+
default = 300
|
|
8
|
+
min = 300
|
|
9
|
+
max = 3600
|
|
10
|
+
mutable = true
|
|
11
|
+
why = "Hard ceiling on a single user turn. Too low wastes work; too high lets loops run wild."
|
|
12
|
+
value = 600
|
|
13
|
+
|
|
14
|
+
[[knob]]
|
|
15
|
+
name = "hard_stop_tool_calls"
|
|
16
|
+
default = 100
|
|
17
|
+
min = 30
|
|
18
|
+
max = 250
|
|
19
|
+
mutable = true
|
|
20
|
+
why = "HARD_STOP_CALLS in agent_loop. Cap on tool-call depth per user turn."
|
|
21
|
+
|
|
22
|
+
[[knob]]
|
|
23
|
+
name = "wrap_up_warn_at"
|
|
24
|
+
default = 40
|
|
25
|
+
min = 10
|
|
26
|
+
max = 100
|
|
27
|
+
mutable = true
|
|
28
|
+
why = "First progressive nudge. Earlier = tighter turns, may lose quality."
|
|
29
|
+
|
|
30
|
+
[[knob]]
|
|
31
|
+
name = "stop_now_warn_at"
|
|
32
|
+
default = 60
|
|
33
|
+
min = 20
|
|
34
|
+
max = 150
|
|
35
|
+
mutable = true
|
|
36
|
+
why = "Second progressive nudge. Gemma often ignores the wrap-up; this is the harder prod."
|
|
37
|
+
|
|
38
|
+
[[knob]]
|
|
39
|
+
name = "temperature"
|
|
40
|
+
default = 0.3
|
|
41
|
+
min = 0.0
|
|
42
|
+
max = 0.9
|
|
43
|
+
mutable = true
|
|
44
|
+
why = "Sampling temperature. Lower = more deterministic; higher = more exploration."
|
|
45
|
+
|
|
46
|
+
[[knob]]
|
|
47
|
+
name = "loop_detector_window"
|
|
48
|
+
default = 3
|
|
49
|
+
min = 2
|
|
50
|
+
max = 6
|
|
51
|
+
mutable = true
|
|
52
|
+
why = "How many consecutive identical tool calls trigger the loop advisor."
|
|
53
|
+
|
|
54
|
+
[[knob]]
|
|
55
|
+
name = "struggle_threshold"
|
|
56
|
+
default = 20
|
|
57
|
+
min = 10
|
|
58
|
+
max = 40
|
|
59
|
+
mutable = true
|
|
60
|
+
why = "Reads-without-a-write before admiral fires the struggle directive."
|
|
61
|
+
|
|
62
|
+
[env_flags]
|
|
63
|
+
DRYDOCK_AUTO_CONTINUE_DISABLE = "1"
|
|
64
|
+
|
|
65
|
+
[prompts.gemma4]
|
|
66
|
+
source_path = ""
|
|
67
|
+
mutable = true
|
|
68
|
+
why = "Single highest-leverage mutable target. Governs how Gemma 4 interprets every turn."
|
|
69
|
+
|
|
70
|
+
[prompts.cli]
|
|
71
|
+
source_path = ""
|
|
72
|
+
mutable = true
|
|
73
|
+
why = "Alternate non-Gemma system prompt. Rarely the right target but available for cross-model experiments."
|
|
74
|
+
|
|
75
|
+
[[harness_threshold]]
|
|
76
|
+
name = "MAX_CONSECUTIVE_SKIPS_BEFORE_RESET"
|
|
77
|
+
default = 2
|
|
78
|
+
min = 1
|
|
79
|
+
max = 5
|
|
80
|
+
mutable = true
|
|
81
|
+
why = "Force ESC+/clear after N consecutive SKIPs. Lower = aggressive recycling; higher = tolerant of transient wedges."
|
|
82
|
+
|
|
83
|
+
[[harness_threshold]]
|
|
84
|
+
name = "SESSION_RESET_EVERY"
|
|
85
|
+
default = 15
|
|
86
|
+
min = 5
|
|
87
|
+
max = 50
|
|
88
|
+
mutable = true
|
|
89
|
+
why = "Periodic /clear cadence in prompts. Tight cadence bounds context but costs reset overhead every N prompts."
|
|
90
|
+
|
|
91
|
+
[[harness_threshold]]
|
|
92
|
+
name = "SEND_PROMPT_RETRY_COUNT"
|
|
93
|
+
default = 3
|
|
94
|
+
min = 1
|
|
95
|
+
max = 6
|
|
96
|
+
mutable = true
|
|
97
|
+
why = "How many times send_prompt_and_confirm re-types before marking SKIP. Each retry is ~120s."
|
|
98
|
+
|
|
99
|
+
[[harness_threshold]]
|
|
100
|
+
name = "SEND_PROMPT_WAIT_PER_RETRY_SEC"
|
|
101
|
+
default = 120
|
|
102
|
+
min = 30
|
|
103
|
+
max = 300
|
|
104
|
+
mutable = true
|
|
105
|
+
why = "Seconds to wait for user-msg confirmation before retyping. Tighter = faster SKIP, may miss slow prompts."
|
|
106
|
+
|
|
107
|
+
[[admiral_detector]]
|
|
108
|
+
name = "REPEAT_WARNING_THRESHOLD"
|
|
109
|
+
default = 4
|
|
110
|
+
min = 2
|
|
111
|
+
max = 8
|
|
112
|
+
mutable = true
|
|
113
|
+
why = "Consecutive identical tool calls before a WARNING. Lower = early nudge; higher = tolerant of legit repetition."
|
|
114
|
+
|
|
115
|
+
[[admiral_detector]]
|
|
116
|
+
name = "REPEAT_FORCE_STOP_THRESHOLD"
|
|
117
|
+
default = 8
|
|
118
|
+
min = 4
|
|
119
|
+
max = 20
|
|
120
|
+
mutable = true
|
|
121
|
+
why = "Consecutive identical tool calls before FORCE_STOP. Must be >= REPEAT_WARNING_THRESHOLD."
|
|
122
|
+
|
|
123
|
+
[[admiral_detector]]
|
|
124
|
+
name = "EMPTY_RESULT_THRESHOLD"
|
|
125
|
+
default = 3
|
|
126
|
+
min = 2
|
|
127
|
+
max = 6
|
|
128
|
+
mutable = true
|
|
129
|
+
why = "Check 0 (empty-result loop). Fire FORCE_STOP after N identical-call + empty-result in a row."
|
|
130
|
+
|
|
131
|
+
[[admiral_detector]]
|
|
132
|
+
name = "SAME_TOOL_NAME_REPEAT_LIMIT_BASH"
|
|
133
|
+
default = 5
|
|
134
|
+
min = 3
|
|
135
|
+
max = 10
|
|
136
|
+
mutable = true
|
|
137
|
+
why = "Same-tool repetition limit for bash. Different from read/grep which need more headroom."
|
|
138
|
+
|
|
139
|
+
[[admiral_detector]]
|
|
140
|
+
name = "SAME_TOOL_NAME_REPEAT_LIMIT_READ"
|
|
141
|
+
default = 7
|
|
142
|
+
min = 4
|
|
143
|
+
max = 12
|
|
144
|
+
mutable = true
|
|
145
|
+
why = "Same-tool repetition limit for read_file + grep. Investigation tools legitimately repeat more."
|
|
@@ -135,10 +135,34 @@ def mutate_opus(cfg: dict) -> tuple[dict, str] | None:
|
|
|
135
135
|
elif target == "env_flag":
|
|
136
136
|
flags = new.setdefault("env_flags", {})
|
|
137
137
|
flags[name] = str(value)
|
|
138
|
+
elif target == "prompt":
|
|
139
|
+
# Materialize the proposed prompt to a candidate-local file and
|
|
140
|
+
# point the variant's source_path at it. The kernel will copy
|
|
141
|
+
# this into the isolated HOME's DRYDOCK_PROMPTS_DIR at spawn.
|
|
142
|
+
# Staging dir mirrors the variant toml: one sibling per exp.
|
|
143
|
+
# Using a stable-per-variant name (no exp_id here yet — caller
|
|
144
|
+
# provides it via the outer staged path). We write into the
|
|
145
|
+
# per-variant staged_prompts subdir and let the kernel resolve.
|
|
146
|
+
prompts = new.setdefault("prompts", {})
|
|
147
|
+
prompt_entry = prompts.setdefault(name, {})
|
|
148
|
+
prompts_dir = STAGED_DIR / "prompts"
|
|
149
|
+
prompts_dir.mkdir(parents=True, exist_ok=True)
|
|
150
|
+
# Use a content-hash so concurrent / retried variants don't
|
|
151
|
+
# stomp each other. Kernel reads the file by source_path.
|
|
152
|
+
import hashlib as _hashlib
|
|
153
|
+
h = _hashlib.sha1(str(value).encode()).hexdigest()[:12]
|
|
154
|
+
target_file = prompts_dir / f"{name}_{h}.md"
|
|
155
|
+
target_file.write_text(str(value))
|
|
156
|
+
prompt_entry["source_path"] = str(target_file)
|
|
157
|
+
prompt_entry["mutable"] = True
|
|
138
158
|
else:
|
|
139
159
|
return None
|
|
140
160
|
|
|
141
|
-
|
|
161
|
+
if target == "prompt":
|
|
162
|
+
size = len(str(value))
|
|
163
|
+
desc = f"opus prompt:{name} -> [{size} chars] ({reason})"
|
|
164
|
+
else:
|
|
165
|
+
desc = f"opus {target}:{name} -> {value} ({reason})"
|
|
142
166
|
return new, desc
|
|
143
167
|
|
|
144
168
|
|
|
@@ -93,14 +93,46 @@ def setup_isolated_home(tmpdir: Path, cfg: dict) -> tuple[Path, Path, Path]:
|
|
|
93
93
|
drydock_dir.mkdir(parents=True)
|
|
94
94
|
cwd.mkdir(parents=True)
|
|
95
95
|
|
|
96
|
-
# Drydock config —
|
|
97
|
-
#
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
)
|
|
96
|
+
# Drydock config — parse the USER'S real ~/.drydock/config.toml
|
|
97
|
+
# (so providers + models + tool permissions + MCP servers carry
|
|
98
|
+
# through) and overwrite ONLY [session_logging] with the
|
|
99
|
+
# per-experiment path. First pass just appended a second
|
|
100
|
+
# [session_logging] table, which tomllib correctly rejects with
|
|
101
|
+
# "Cannot declare ('session_logging',) twice". Parse → mutate →
|
|
102
|
+
# re-serialize is the only safe overlay.
|
|
103
|
+
real_config = Path.home() / ".drydock" / "config.toml"
|
|
104
|
+
base: dict = {}
|
|
105
|
+
if real_config.is_file():
|
|
106
|
+
try:
|
|
107
|
+
with real_config.open("rb") as f:
|
|
108
|
+
base = tomllib.load(f)
|
|
109
|
+
except (tomllib.TOMLDecodeError, OSError):
|
|
110
|
+
base = {}
|
|
111
|
+
base["session_logging"] = {
|
|
112
|
+
"save_dir": str(session_root),
|
|
113
|
+
"session_prefix": "session",
|
|
114
|
+
"enabled": True,
|
|
115
|
+
}
|
|
116
|
+
try:
|
|
117
|
+
import tomli_w
|
|
118
|
+
with (drydock_dir / "config.toml").open("wb") as f:
|
|
119
|
+
tomli_w.dump(base, f)
|
|
120
|
+
except ImportError:
|
|
121
|
+
# Fallback: if tomli_w isn't available, write just the minimal
|
|
122
|
+
# config. Drydock will start but without the user's providers
|
|
123
|
+
# — experiments will fail, but at least with a clear error.
|
|
124
|
+
(drydock_dir / "config.toml").write_text(
|
|
125
|
+
'[session_logging]\n'
|
|
126
|
+
f'save_dir = "{session_root}"\n'
|
|
127
|
+
'session_prefix = "session"\n'
|
|
128
|
+
'enabled = true\n'
|
|
129
|
+
)
|
|
130
|
+
# Trust the isolated cwd so drydock doesn't pop the modal — this
|
|
131
|
+
# is what shakedown_interactive's harness handles inline, but from
|
|
132
|
+
# a fresh HOME there's nothing to answer yet.
|
|
133
|
+
trusted = drydock_dir / "trusted_folders.toml"
|
|
134
|
+
if not trusted.exists():
|
|
135
|
+
trusted.write_text(f'trusted_folders = ["{cwd}"]\n')
|
|
104
136
|
|
|
105
137
|
# Admiral tuning — write variant knobs keyed on (model, task).
|
|
106
138
|
knobs = validate_and_collect_knobs(cfg)
|
|
@@ -153,6 +185,48 @@ def run_kernel(variant_path: Path, results_tsv: Path,
|
|
|
153
185
|
for k, v in (cfg.get("env_flags") or {}).items():
|
|
154
186
|
env[str(k)] = str(v)
|
|
155
187
|
|
|
188
|
+
# Translate variant TOML sections into DRYDOCK_* env overrides the
|
|
189
|
+
# harness + agent_loop read at startup. Admiral's KNOB_BOUNDS path
|
|
190
|
+
# still writes to admiral_tuning.json (see validate_and_collect_knobs
|
|
191
|
+
# above) because those tunables flow through a different apply hook;
|
|
192
|
+
# these env overrides cover the constants that live in scripts/ and
|
|
193
|
+
# drydock/core/ sources, not in admiral's tuning store.
|
|
194
|
+
for h in (cfg.get("harness_threshold") or []):
|
|
195
|
+
name = h.get("name")
|
|
196
|
+
val = h.get("value", h.get("default"))
|
|
197
|
+
if name and val is not None:
|
|
198
|
+
env[f"DRYDOCK_STRESS_{name}"] = str(val)
|
|
199
|
+
for d in (cfg.get("admiral_detector") or []):
|
|
200
|
+
name = d.get("name")
|
|
201
|
+
val = d.get("value", d.get("default"))
|
|
202
|
+
if name and val is not None:
|
|
203
|
+
env[f"DRYDOCK_ADMIRAL_{name}"] = str(val)
|
|
204
|
+
|
|
205
|
+
# Variant prompt overrides. For each [prompts.<name>] with a
|
|
206
|
+
# non-empty source_path, copy into the isolated HOME's prompts
|
|
207
|
+
# dir. DRYDOCK_PROMPTS_DIR tells drydock (see core/prompts/__init__.py)
|
|
208
|
+
# to check there before the shipped prompt. Unset prompts fall
|
|
209
|
+
# through to the installed package defaults.
|
|
210
|
+
prompts_override_dir = home / ".drydock" / "prompts"
|
|
211
|
+
prompts_override_dir.mkdir(parents=True, exist_ok=True)
|
|
212
|
+
any_prompt_override = False
|
|
213
|
+
for prompt_name, entry in (cfg.get("prompts") or {}).items():
|
|
214
|
+
if not isinstance(entry, dict):
|
|
215
|
+
continue
|
|
216
|
+
source_path = entry.get("source_path", "")
|
|
217
|
+
if not source_path:
|
|
218
|
+
continue
|
|
219
|
+
try:
|
|
220
|
+
src = Path(source_path)
|
|
221
|
+
if src.is_file():
|
|
222
|
+
dest = prompts_override_dir / f"{prompt_name}.md"
|
|
223
|
+
dest.write_bytes(src.read_bytes())
|
|
224
|
+
any_prompt_override = True
|
|
225
|
+
except OSError:
|
|
226
|
+
continue
|
|
227
|
+
if any_prompt_override:
|
|
228
|
+
env["DRYDOCK_PROMPTS_DIR"] = str(prompts_override_dir)
|
|
229
|
+
|
|
156
230
|
log_path = tmpdir / "tui.log"
|
|
157
231
|
start = time.time()
|
|
158
232
|
|
|
@@ -19,12 +19,20 @@ Scope (v1 — overnight build):
|
|
|
19
19
|
|
|
20
20
|
Contract: returns either
|
|
21
21
|
{
|
|
22
|
-
"target": "knob" | "harness_threshold" | "admiral_detector"
|
|
22
|
+
"target": "knob" | "harness_threshold" | "admiral_detector"
|
|
23
|
+
| "env_flag" | "prompt",
|
|
23
24
|
"name": "<field-name>",
|
|
24
|
-
"value": <numeric or string
|
|
25
|
+
"value": <numeric or string; for target=prompt, the FULL new
|
|
26
|
+
prompt text as a string>,
|
|
25
27
|
"reason": "<≤200 char human-readable>",
|
|
26
28
|
}
|
|
27
29
|
or None on any failure — experimenter then falls through to random.
|
|
30
|
+
|
|
31
|
+
For target="prompt", `name` must match a [prompts.<name>] entry with
|
|
32
|
+
mutable=true in config_base.toml (currently "gemma4" or "cli"). The
|
|
33
|
+
value is the complete replacement prompt. The kernel writes it to
|
|
34
|
+
the candidate's isolated prompts dir and the TUI picks it up via
|
|
35
|
+
DRYDOCK_PROMPTS_DIR.
|
|
28
36
|
"""
|
|
29
37
|
from __future__ import annotations
|
|
30
38
|
|
|
@@ -38,7 +46,7 @@ import tomllib
|
|
|
38
46
|
from pathlib import Path
|
|
39
47
|
|
|
40
48
|
RESEARCH_DIR = Path(__file__).resolve().parent
|
|
41
|
-
DRYDOCK_ROOT = RESEARCH_DIR.parent
|
|
49
|
+
DRYDOCK_ROOT = RESEARCH_DIR.parent # /data3/drydock — repo root
|
|
42
50
|
OPUS_MODEL = "claude-opus-4-7"
|
|
43
51
|
OPUS_TIMEOUT_SEC = 120
|
|
44
52
|
MAX_TRACES_EACH_SIDE = 3 # top-N + bottom-N contrastive
|
|
@@ -206,6 +214,27 @@ def _build_prompt(config_base: dict, config_best: dict,
|
|
|
206
214
|
for r in bottom
|
|
207
215
|
)
|
|
208
216
|
|
|
217
|
+
# Include the current gemma4.md baseline when the proposer might
|
|
218
|
+
# want to mutate it. Opus needs to see what it's replacing.
|
|
219
|
+
def _current_prompt(name: str) -> str:
|
|
220
|
+
prompt_file = DRYDOCK_ROOT / "drydock" / "core" / "prompts" / f"{name}.md"
|
|
221
|
+
try:
|
|
222
|
+
return prompt_file.read_text()
|
|
223
|
+
except OSError:
|
|
224
|
+
return f"<{name}.md unreadable>"
|
|
225
|
+
|
|
226
|
+
prompts_cfg = config_base.get("prompts", {})
|
|
227
|
+
mutable_prompts = {n: e for n, e in prompts_cfg.items()
|
|
228
|
+
if isinstance(e, dict) and e.get("mutable")}
|
|
229
|
+
prompt_bodies_section = ""
|
|
230
|
+
if mutable_prompts:
|
|
231
|
+
prompt_bodies_section = "\n# MUTABLE PROMPT BODIES (current)\n\n"
|
|
232
|
+
for name in mutable_prompts:
|
|
233
|
+
body = _current_prompt(name)
|
|
234
|
+
prompt_bodies_section += (
|
|
235
|
+
f"## prompts.{name}\n\n```\n{body}\n```\n\n"
|
|
236
|
+
)
|
|
237
|
+
|
|
209
238
|
return f"""You are Meta-Harness Proposer for drydock. Your job is to \
|
|
210
239
|
propose ONE mutation to the stress-harness config that will improve the \
|
|
211
240
|
`effective_rate` metric (done_per_minute, cliff at >50% failure).
|
|
@@ -221,7 +250,8 @@ within the bounded surface declared in config_base.toml.
|
|
|
221
250
|
"harness_thresholds": [h["name"] for h in config_base.get("harness_threshold", [])],
|
|
222
251
|
"admiral_detectors": [d["name"] for d in config_base.get("admiral_detector", [])],
|
|
223
252
|
"env_flags": list(config_base.get("env_flags", {}).keys()),
|
|
224
|
-
|
|
253
|
+
"prompts": list(mutable_prompts.keys()),
|
|
254
|
+
}, indent=2)}{prompt_bodies_section}
|
|
225
255
|
|
|
226
256
|
# CURRENT-BEST CONFIG
|
|
227
257
|
|
|
@@ -348,6 +378,14 @@ def _validate_mutation(m: dict, config_base: dict) -> bool:
|
|
|
348
378
|
if target == "env_flag":
|
|
349
379
|
flags = config_base.get("env_flags", {})
|
|
350
380
|
return name in flags and isinstance(value, str)
|
|
381
|
+
if target == "prompt":
|
|
382
|
+
prompts = config_base.get("prompts", {})
|
|
383
|
+
entry = prompts.get(name)
|
|
384
|
+
if not isinstance(entry, dict) or not entry.get("mutable"):
|
|
385
|
+
return False
|
|
386
|
+
# Prompt value must be a non-empty string; set a sanity cap so
|
|
387
|
+
# a hallucinated 200KB prompt can't blow up context.
|
|
388
|
+
return isinstance(value, str) and 0 < len(value) <= 50_000
|
|
351
389
|
return False
|
|
352
390
|
|
|
353
391
|
|