drydock-cli 2.8.27__tar.gz → 2.8.28__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.8.28/.auto_release.lock +1 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/CLAUDE.md +59 -3
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/DEEP_NOIR_PRD.md +33 -1
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/HLE_PRD.md +83 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/PKG-INFO +1 -1
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agent_loop.py +66 -21
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/dispatcher.py +63 -2
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/rules.py +19 -1
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/gemma4.md +5 -1
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/retrieve.py +45 -3
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/__main__.py +86 -7
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/gap_detector.py +39 -1
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/extract_pairs.py +83 -12
- drydock_cli-2.8.28/drydock/steering/train/scan_sessions.py +310 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/pyproject.toml +1 -1
- drydock_cli-2.8.28/research/deep_noir/pairs/empty_after_bash.jsonl +82 -0
- drydock_cli-2.8.28/research/deep_noir/pairs/scan_empty_after_bash.jsonl +203 -0
- drydock_cli-2.8.28/resume.md +132 -0
- drydock_cli-2.8.28/scripts/dedupe_dispatch_queues.py +155 -0
- drydock_cli-2.8.28/scripts/dispatch_report.py +153 -0
- drydock_cli-2.8.28/scripts/drydock_status.sh +129 -0
- drydock_cli-2.8.28/scripts/hle_aggregate.py +181 -0
- drydock_cli-2.8.28/scripts/hle_babysitter.sh +171 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/hle_eval.py +172 -36
- drydock_cli-2.8.28/scripts/rejudge_hle.py +194 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_auto_retrieve_soft_nudge.py +128 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_classifier.py +37 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_curiosity.py +33 -0
- drydock_cli-2.8.28/tests/test_dispatch_report.py +141 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_dispatcher.py +43 -0
- drydock_cli-2.8.28/tests/test_hle_aggregate.py +123 -0
- drydock_cli-2.8.28/tests/test_hle_score_method_split.py +152 -0
- drydock_cli-2.8.28/tests/test_rejudge_hle.py +184 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_retrieve_tool.py +59 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/trip_log.md +126 -0
- drydock_cli-2.8.27/.auto_release.lock +0 -1
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.gitignore +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.python-version +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.typos.toml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/AGENTS.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/Admiral.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/DRYDOCK.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/LICENSE +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/NOTICE +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/README.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/action.yml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/README.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/flake.lock +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/flake.nix +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/README.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/config_base.toml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/config_best.toml +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/experimenter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/kernel.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/proposer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/results.tsv +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/README.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/backfill_hle_curiosity.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/bench_inference.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/curiosity_idle_cycle.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/tool_usage_report.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/conftest.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/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.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_integration.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/uv.lock +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1359290
|
|
@@ -6,9 +6,18 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
|
6
6
|
- **Repo:** https://github.com/fbobe321/drydock
|
|
7
7
|
- **PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.32)
|
|
8
8
|
- **Goal:** Reliable TUI coding agent with local LLMs. PRD-driven project building.
|
|
9
|
-
- **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B)
|
|
9
|
+
- **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B)
|
|
10
10
|
- **Server:** remus (Ubuntu 22.04, user: bobef)
|
|
11
|
-
- **Active model:** Gemma
|
|
11
|
+
- **Active model (2026-05-14):** **Gemma-4-26B-A4B-it-UD-Q3_K_M.gguf** via
|
|
12
|
+
llama.cpp Docker (`ghcr.io/ggml-org/llama.cpp:server-cuda`) on :8000.
|
|
13
|
+
Q4_K_M was trialed 2026-05-12→14 but rolled back because the
|
|
14
|
+
quant shift produced no measurable HLE-correctness lift and added
|
|
15
|
+
~9% per-token latency. Re-swap to Q4 via
|
|
16
|
+
`docker stop llamacpp-gemma4 && docker rm llamacpp-gemma4`
|
|
17
|
+
and a `docker run` with `-m /models/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf`.
|
|
18
|
+
AWQ-4bit on vLLM is the historical alternate path and stays available
|
|
19
|
+
via `/data3/Models/start_gemma4.sh` (the vLLM script — NOT the
|
|
20
|
+
llama.cpp one). Speed: ~64 tok/s e2e on Q3.
|
|
12
21
|
- **The honest test:** `scripts/shakedown_interactive.py` — drives the real TUI
|
|
13
22
|
via pexpect with a multi-step user conversation (24 steps per PRD: plan,
|
|
14
23
|
build, test, add features, debug, review code, edge cases, README).
|
|
@@ -23,7 +32,54 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
|
23
32
|
testing.
|
|
24
33
|
- **Priority:** TUI experience first. Fix drydock bugs, don't simplify PRDs.
|
|
25
34
|
- **370 PRDs** at /data3/drydock_test_projects/ — the benchmark suite
|
|
26
|
-
- **Current version:** v2.
|
|
35
|
+
- **Current version:** v2.8.27 on PyPI (auto-released every 6h from `main`)
|
|
36
|
+
- **Active continuous loops:** stress harness (hourly), autonomous_review
|
|
37
|
+
(30-min), classify_pulse (10-min), telegram_bot keepalive (2-min),
|
|
38
|
+
hle_babysitter (hourly @ :45 — 10-Q math HLE batch per tick, see
|
|
39
|
+
HLE_PRD §"Continuous HLE evaluation"). Anything new the operator
|
|
40
|
+
adds should not run at :00 or :30 (autonomous_review owns those).
|
|
41
|
+
|
|
42
|
+
## Current plan (2026-05-14)
|
|
43
|
+
|
|
44
|
+
Three vectors moving in parallel. Each has a queue of concrete fixes
|
|
45
|
+
tracked as TaskCreate items; the high-level shape is:
|
|
46
|
+
|
|
47
|
+
1. **HLE** — keep pushing the floor up from 6.7% on Math. The
|
|
48
|
+
`scripts/hle_babysitter.sh` cron runs 10-Q Math batches every hour.
|
|
49
|
+
Open work: rotate categories beyond Math; build a multi-batch
|
|
50
|
+
aggregator (`scripts/hle_aggregate.py`); produce a clean Q3 vs Q4
|
|
51
|
+
stall-rate comparison once 30+ Q3 Math attempts have accumulated;
|
|
52
|
+
verify the gemma4.md tool-inventory change (e47cc4e) actually
|
|
53
|
+
lifted math/count/memory/verify call rates.
|
|
54
|
+
|
|
55
|
+
2. **GraphRAG** — the auto-prefetch hook is shipping good chunks on
|
|
56
|
+
trivia but not on hard symbolic Math. Two concrete moves: lower
|
|
57
|
+
`QUALITY_THRESHOLD` (currently 8.0 in `agent_loop.py:3391`) once
|
|
58
|
+
we know the real score distribution, and add an arxiv-corpus
|
|
59
|
+
fallback (`/data3/arxiv_corpus/graphrag.sqlite`) when the primary
|
|
60
|
+
index returns nothing above threshold.
|
|
61
|
+
|
|
62
|
+
3. **Deep Noir** — sidecar/hooks/capture/train all coded; the
|
|
63
|
+
`apply_chat_template` API-drift fix shipped 2026-05-14 (f02aa4b).
|
|
64
|
+
Real blocker for v1 vectors: contrastive-pair extraction is
|
|
65
|
+
currently broken — admiral records full UUIDs (e.g.
|
|
66
|
+
`5b55aacd-3606-4656-ad4b-eacf86506eda`) but session dirs are named
|
|
67
|
+
`session_<date>_<time>_<short_uuid>` where the `short_uuid` is the
|
|
68
|
+
first 8 chars of the SESSION's own UUID, not admiral's recorded
|
|
69
|
+
one. `extract_pairs._find_session_dir` matches on session_dir name
|
|
70
|
+
endswith(admiral_short) which only succeeds for the rare case
|
|
71
|
+
where both happen to match. Yield on `empty_after_tool:bash`:
|
|
72
|
+
2 / 88 derailed sessions found. Needs a real mapping layer
|
|
73
|
+
(meta.json → admiral) or admiral has to be fixed to record the
|
|
74
|
+
short hash used by session dirs.
|
|
75
|
+
|
|
76
|
+
Operator controls for the continuous loops:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
touch /data3/drydock/.pause_hle_babysitter # pause continuous HLE
|
|
80
|
+
touch /data3/drydock_test_projects/.pause_watchdog
|
|
81
|
+
touch /data3/drydock/.pause_auto_release # pause 6h PyPI publish
|
|
82
|
+
```
|
|
27
83
|
|
|
28
84
|
## Build & Test
|
|
29
85
|
|
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
# Deep Noir activation-patching PRD — reasoning steering, transformers-backed sidecar
|
|
2
2
|
|
|
3
|
-
**Status:** Draft, 2026-05-
|
|
3
|
+
**Status:** Draft, last updated 2026-05-14. Phase 3 of HLE_PRD.
|
|
4
|
+
|
|
5
|
+
## 2026-05-14 progress update
|
|
6
|
+
|
|
7
|
+
- ✅ Milestones 1-4 are coded and unit-test green (91/91 in
|
|
8
|
+
`tests/test_steering*`).
|
|
9
|
+
- ✅ Sidecar `apply_chat_template` API-drift bug fixed (f02aa4b) +
|
|
10
|
+
5 dedicated tests against fake tokenizers.
|
|
11
|
+
- ⚠ **Live-GPU smoke deferred.** First attempt 2026-05-13 11:21 UTC
|
|
12
|
+
loaded the AWQ weights but crashed in `model.generate()` (the bug
|
|
13
|
+
fixed above). The crashed Python kept ~29 GB of VRAM until manually
|
|
14
|
+
killed; production Q4 then refused to restart for ~30 seconds. With
|
|
15
|
+
the fix shipped, the next attempt is expected clean — but needs an
|
|
16
|
+
operator-approved Q3-stop window.
|
|
17
|
+
- 🚨 **Pair extraction is broken.** `extract_pairs.py` resolves admiral
|
|
18
|
+
session UUIDs against `~/.vibe/logs/session/session_<date>_<short>`
|
|
19
|
+
via name-suffix match on the first 8 hex chars of the admiral UUID.
|
|
20
|
+
This only succeeds when the admiral UUID and the session's own UUID
|
|
21
|
+
happen to share those 8 chars — they don't, because admiral and
|
|
22
|
+
session generate UUIDs independently. Yield on
|
|
23
|
+
`empty_after_tool:bash`: **2 / 88 derailed pairs** found
|
|
24
|
+
(`/data3/drydock/research/deep_noir/pairs/empty_after_bash.jsonl`,
|
|
25
|
+
82 total = 2 derailed + 80 good). That's not enough to train a
|
|
26
|
+
vector. Fix candidates:
|
|
27
|
+
1. Crawl every session dir's `meta.json`, build a `{full_uuid →
|
|
28
|
+
dir}` map, look up admiral UUIDs against that map. Highest
|
|
29
|
+
fidelity. The crawl is one-shot and cacheable.
|
|
30
|
+
2. Change admiral to record the same short-hash that session dirs
|
|
31
|
+
use (would require coordinating with `drydock.admiral`).
|
|
32
|
+
Path 1 is unblocked and surgical; path 2 is bigger surgery for
|
|
33
|
+
marginal benefit. Default to path 1.
|
|
34
|
+
|
|
35
|
+
## Next concrete steps
|
|
4
36
|
|
|
5
37
|
The v0 token-bias path (`LogitBiasSteeringApplier`) hit its expected ceiling: phase1_steered scored 1/20 = 5% on the worked-example seed, identical to the unsteered baseline. This PRD scopes the next-tier applier — real activation patching at a configurable decoder layer — using a `transformers`-backed sidecar process so we can validate the architecture before the bigger vLLM forward-hook port. Goal: get one steering vector to lift Phase 1 above 5/20 on the existing 20-question seed, proving reasoning steering works at all on quantized Gemma 4. Then port to vLLM for production speed.
|
|
6
38
|
|
|
@@ -6,6 +6,89 @@ the dominant cause of thinking-stalls. Deep Noir sidecar wiring (M1-M4)
|
|
|
6
6
|
is in tree; M1 end-to-end GPU smoke pending after the transformers 5.x
|
|
7
7
|
apply_chat_template fix (f02aa4b).
|
|
8
8
|
|
|
9
|
+
## HLE was retrieving against the WRONG corpus (fixed edb61c9)
|
|
10
|
+
|
|
11
|
+
Trace from a Q3 session 2026-05-14: a local-field-theory HLE Math
|
|
12
|
+
question pulled `/data3/drydock_test_projects/403_tool_agent/help_output.txt`
|
|
13
|
+
(score 38.7) as the top retrieve hit. hle_eval.py spawns drydock
|
|
14
|
+
subprocesses that, until now, defaulted to
|
|
15
|
+
`~/.drydock/graphrag.sqlite` — the project corpus full of test
|
|
16
|
+
artifacts — not the arXiv corpus (1.18M chunks, math/physics/CS).
|
|
17
|
+
The Q3-with-AR run effectively had the model answering math
|
|
18
|
+
questions with a tool_agent CLI help page as "evidence."
|
|
19
|
+
|
|
20
|
+
Fixed in `scripts/hle_babysitter.sh`: every per-batch invocation
|
|
21
|
+
now sets `DRYDOCK_GRAPHRAG_DB=/data3/arxiv_corpus/graphrag.sqlite`
|
|
22
|
+
for the subprocess only. User TUI / stress / other drydock sessions
|
|
23
|
+
still see the project corpus.
|
|
24
|
+
|
|
25
|
+
Takes effect on the next cron tick after this commit lands —
|
|
26
|
+
shell scripts run from the source tree, not site-packages, so this
|
|
27
|
+
fix is live without waiting for v2.8.28.
|
|
28
|
+
|
|
29
|
+
## Judge was broken for the entire history (fixed bc12eee)
|
|
30
|
+
|
|
31
|
+
Audit 2026-05-14: across all 165 HLE results on disk, the judge was
|
|
32
|
+
invoked 22 times and returned **ERROR every single time (100%)**.
|
|
33
|
+
Zero YES verdicts, zero NO verdicts — every judged answer dropped
|
|
34
|
+
to ERROR because `text.splitlines()[0]` raised IndexError on empty
|
|
35
|
+
content (Gemma 4 thinking-budget exhaustion on the judge call,
|
|
36
|
+
emitting only `reasoning_content` with no `content`).
|
|
37
|
+
|
|
38
|
+
The 5/163 = 3.1% lifetime score came entirely from `exact` (5) and
|
|
39
|
+
`fuzzy` (0) matches — judge YES count was zero. **The real correctness
|
|
40
|
+
rate is unknown until the fix ships.** Q3 Math Q1 today produced
|
|
41
|
+
`e^{-\gamma} \frac{q-1}{h} q^{g-1} \log q` against gold
|
|
42
|
+
`\frac{q^{g-1}(q-1)\log q}{e^\gamma h}` (mathematically identical)
|
|
43
|
+
and got marked ERROR. That alone changes the 0/N batch verdict for
|
|
44
|
+
that session.
|
|
45
|
+
|
|
46
|
+
Fix in commit `bc12eee` (will ship in v2.8.28):
|
|
47
|
+
- Read `reasoning_content` when `content` is empty
|
|
48
|
+
- Scan the whole response for YES/NO/PARTIAL with word-boundary
|
|
49
|
+
- max_tokens 80 → 200, plus a tighter "one word only" retry
|
|
50
|
+
- ERROR reason now echoes the raw text so failures are diagnosable
|
|
51
|
+
|
|
52
|
+
**Backfill applied 2026-05-14 01:48 UTC.** Ran
|
|
53
|
+
`scripts/rejudge_hle.py --apply --apply-to-summary` across all 22
|
|
54
|
+
historical ERROR rows. Outcome:
|
|
55
|
+
- 4 new YES (judged correct)
|
|
56
|
+
- 13 new NO (judged wrong but valid)
|
|
57
|
+
- 2 new PARTIAL
|
|
58
|
+
- 3 still ERROR (genuinely undecidable / model returned nothing)
|
|
59
|
+
|
|
60
|
+
Lifetime aggregate jumped **5/171 = 2.9% → 9/171 = 5.3%**. Per-category
|
|
61
|
+
deltas: Math +1, Bio/Med +1, Humanities/Social Science +2. Aggregator
|
|
62
|
+
now prefers `rejudged.jsonl` over `results.jsonl` when present
|
|
63
|
+
(commit c1981fe).
|
|
64
|
+
|
|
65
|
+
## Q4 → Q3 rollback (2026-05-14 00:26 UTC)
|
|
66
|
+
|
|
67
|
+
User decision after the Q4 30-Q math overnight (2/30 = 6.7%, 87%
|
|
68
|
+
stall rate) and the AR-OFF disambiguation: **no measurable Q4
|
|
69
|
+
benefit**, swap back to Q3_K_M. Container now serves
|
|
70
|
+
`/models/gemma-4-26B-A4B-it-UD-Q3_K_M.gguf` via
|
|
71
|
+
`/data3/Models/start_gemma4_llamacpp.sh`. Swap took 18s. Frees ~4 GB
|
|
72
|
+
VRAM (12.1 GB vs Q4's 16.2 GB). The Q3 vs Q4 stall-rate comparison
|
|
73
|
+
will fall out naturally as the hourly babysitter accumulates 30+ Q3
|
|
74
|
+
attempts (~3 cron ticks at 10-Q each).
|
|
75
|
+
|
|
76
|
+
## Continuous HLE evaluation (2026-05-14)
|
|
77
|
+
|
|
78
|
+
`scripts/hle_babysitter.sh` (cron line `45 * * * * ...`) keeps a 10-Q
|
|
79
|
+
math HLE batch running every hour. Skips on its own if (a) a prior
|
|
80
|
+
batch is still alive, (b) stress is mid-run, (c) autonomous_review
|
|
81
|
+
is firing, or (d) the balancer at :8001 isn't healthy. Operator
|
|
82
|
+
controls:
|
|
83
|
+
|
|
84
|
+
- `touch /data3/drydock/.pause_hle_babysitter` — pause future batches
|
|
85
|
+
- `rm /data3/drydock/.pause_hle_babysitter` — resume
|
|
86
|
+
- `kill $(cat /tmp/hle_continuous.pid)` — stop current batch
|
|
87
|
+
- `tail -f /tmp/hle_babysitter.log` — cron-tick history
|
|
88
|
+
|
|
89
|
+
Each batch lands in `hle_results/run_<ts>/` with results.jsonl +
|
|
90
|
+
summary.json. Multi-batch aggregation is a separate (future) job.
|
|
91
|
+
|
|
9
92
|
## Q4 vs AR-OFF disambiguation (2026-05-13)
|
|
10
93
|
|
|
11
94
|
Two variables shifted simultaneously when the v1 baseline ran (Q3+AR-off
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.28
|
|
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
|
|
@@ -805,8 +805,10 @@ class AgentLoop:
|
|
|
805
805
|
HARD_STOP_CALLS = int(
|
|
806
806
|
getattr(self, "_admiral_hard_stop_tool_calls", 100)
|
|
807
807
|
)
|
|
808
|
-
WRAP_UP_WARN_AT = int(getattr(self, "_admiral_wrap_up_warn_at",
|
|
809
|
-
|
|
808
|
+
WRAP_UP_WARN_AT = int(getattr(self, "_admiral_wrap_up_warn_at",
|
|
809
|
+
int(os.environ.get("DRYDOCK_WRAP_UP_WARN_AT", 30))))
|
|
810
|
+
STOP_NOW_WARN_AT = int(getattr(self, "_admiral_stop_now_warn_at",
|
|
811
|
+
int(os.environ.get("DRYDOCK_STOP_NOW_WARN_AT", 60))))
|
|
810
812
|
_prompt_start = time.perf_counter()
|
|
811
813
|
logger.warning("[TIMING] entering conversation while loop")
|
|
812
814
|
while not should_break_loop:
|
|
@@ -852,11 +854,13 @@ class AgentLoop:
|
|
|
852
854
|
"summary so the user can review."
|
|
853
855
|
)
|
|
854
856
|
elif tool_turns == STOP_NOW_WARN_AT:
|
|
857
|
+
_stop_suffix = os.environ.get("DRYDOCK_STOP_NOW_SUFFIX", "")
|
|
855
858
|
self._inject_system_note(
|
|
856
859
|
f"You have used {tool_turns} tool calls on this "
|
|
857
860
|
"single request. STOP NOW. Emit a final text "
|
|
858
861
|
"response summarizing what you did (or what is "
|
|
859
|
-
"blocked) so the user can take the next step."
|
|
862
|
+
f"blocked) so the user can take the next step."
|
|
863
|
+
+ (f" {_stop_suffix}" if _stop_suffix else "")
|
|
860
864
|
)
|
|
861
865
|
elif tool_turns >= HARD_STOP_CALLS:
|
|
862
866
|
# Hard end-of-turn: synthesize a user-facing message
|
|
@@ -3350,13 +3354,6 @@ class AgentLoop:
|
|
|
3350
3354
|
"""
|
|
3351
3355
|
try:
|
|
3352
3356
|
from drydock.graphrag import Index
|
|
3353
|
-
db = os.environ.get("DRYDOCK_GRAPHRAG_DB") or str(
|
|
3354
|
-
Path.home() / ".drydock" / "graphrag.sqlite"
|
|
3355
|
-
)
|
|
3356
|
-
if not Path(db).is_file():
|
|
3357
|
-
logger.warning("[AUTO-RETRIEVE] db missing: %s", db)
|
|
3358
|
-
return
|
|
3359
|
-
idx = Index(db)
|
|
3360
3357
|
except Exception as e:
|
|
3361
3358
|
logger.warning("[AUTO-RETRIEVE] setup failed: %s", e, exc_info=True)
|
|
3362
3359
|
return
|
|
@@ -3381,19 +3378,62 @@ class AgentLoop:
|
|
|
3381
3378
|
return
|
|
3382
3379
|
logger.warning("[AUTO-RETRIEVE] extracted query: %r", query[:120])
|
|
3383
3380
|
|
|
3384
|
-
try:
|
|
3385
|
-
result = idx.retrieve(query, symbol_limit=0, text_limit=4)
|
|
3386
|
-
except Exception as e:
|
|
3387
|
-
logger.warning("[AUTO-RETRIEVE] query failed: %s", e, exc_info=True)
|
|
3388
|
-
return
|
|
3389
|
-
|
|
3390
|
-
text_hits = getattr(result, "text", None) or getattr(result, "text_hits", []) or []
|
|
3391
3381
|
QUALITY_THRESHOLD = 8.0
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3382
|
+
|
|
3383
|
+
# DB chain: try the primary index first, then fall back to the
|
|
3384
|
+
# arXiv corpus (if present) on miss. As of 2026-05-14, 77% of
|
|
3385
|
+
# HLE-eval sessions had retrieve return zero above-threshold hits
|
|
3386
|
+
# from the primary corpus — for generic STEM questions the arXiv
|
|
3387
|
+
# corpus at /data3/arxiv_corpus/graphrag.sqlite (1.18M chunks)
|
|
3388
|
+
# has much better recall. The fallback path is operator-tunable
|
|
3389
|
+
# via DRYDOCK_GRAPHRAG_FALLBACK_DB; set to empty to disable.
|
|
3390
|
+
primary_db = os.environ.get("DRYDOCK_GRAPHRAG_DB") or str(
|
|
3391
|
+
Path.home() / ".drydock" / "graphrag.sqlite"
|
|
3392
|
+
)
|
|
3393
|
+
fallback_default = "/data3/arxiv_corpus/graphrag.sqlite"
|
|
3394
|
+
fallback_db_raw = os.environ.get(
|
|
3395
|
+
"DRYDOCK_GRAPHRAG_FALLBACK_DB", fallback_default
|
|
3396
|
+
)
|
|
3397
|
+
fallback_db = fallback_db_raw if fallback_db_raw else None
|
|
3398
|
+
# Don't double-search the same db.
|
|
3399
|
+
db_chain: list[str] = [primary_db]
|
|
3400
|
+
if fallback_db and Path(fallback_db).resolve() != Path(primary_db).resolve():
|
|
3401
|
+
db_chain.append(fallback_db)
|
|
3402
|
+
|
|
3403
|
+
good_hits: list = []
|
|
3404
|
+
text_hits: list = []
|
|
3405
|
+
used_db: str | None = None
|
|
3406
|
+
for db in db_chain:
|
|
3407
|
+
if not Path(db).is_file():
|
|
3408
|
+
logger.warning("[AUTO-RETRIEVE] db missing: %s", db)
|
|
3409
|
+
continue
|
|
3410
|
+
try:
|
|
3411
|
+
idx = Index(db)
|
|
3412
|
+
result = idx.retrieve(query, symbol_limit=0, text_limit=4)
|
|
3413
|
+
except Exception as e:
|
|
3414
|
+
logger.warning(
|
|
3415
|
+
"[AUTO-RETRIEVE] retrieve failed on %s: %s", db, e
|
|
3416
|
+
)
|
|
3417
|
+
continue
|
|
3418
|
+
hits = getattr(result, "text", None) or getattr(result, "text_hits", []) or []
|
|
3419
|
+
gh = [h for h in hits if getattr(h, "score", 0) >= QUALITY_THRESHOLD]
|
|
3420
|
+
logger.warning(
|
|
3421
|
+
"[AUTO-RETRIEVE] %s: %d total hits, %d above threshold %.1f",
|
|
3422
|
+
db, len(hits), len(gh), QUALITY_THRESHOLD,
|
|
3423
|
+
)
|
|
3424
|
+
if gh:
|
|
3425
|
+
text_hits = hits
|
|
3426
|
+
good_hits = gh
|
|
3427
|
+
used_db = db
|
|
3428
|
+
break
|
|
3429
|
+
|
|
3395
3430
|
if not good_hits:
|
|
3396
3431
|
return
|
|
3432
|
+
if used_db != primary_db:
|
|
3433
|
+
logger.warning(
|
|
3434
|
+
"[AUTO-RETRIEVE] primary corpus returned 0 above-threshold "
|
|
3435
|
+
"hits; using fallback %s", used_db,
|
|
3436
|
+
)
|
|
3397
3437
|
|
|
3398
3438
|
# Build the system note. Cap at ~2000 chars total.
|
|
3399
3439
|
chunks = []
|
|
@@ -3426,7 +3466,12 @@ class AgentLoop:
|
|
|
3426
3466
|
import uuid
|
|
3427
3467
|
|
|
3428
3468
|
tool_call_id = f"auto-retrieve-{uuid.uuid4().hex[:16]}"
|
|
3429
|
-
|
|
3469
|
+
# Reflect the CLEANED query (with QUESTION:/FINAL ANSWER: boilerplate
|
|
3470
|
+
# stripped) in the synthesized tool_call arguments — not the raw
|
|
3471
|
+
# user_msg. Operators reading messages.jsonl could otherwise mistake
|
|
3472
|
+
# the noisy full prompt for what BM25 actually scored against, and
|
|
3473
|
+
# the model itself sees the same arguments echoed back in compaction.
|
|
3474
|
+
tool_args = json.dumps({"query": query[:200]})
|
|
3430
3475
|
synth_assistant = LLMMessage(
|
|
3431
3476
|
role=Role.assistant,
|
|
3432
3477
|
content="",
|
|
@@ -56,17 +56,78 @@ def _queue_path_for(bucket: Bucket, root: Path | None = None) -> Path:
|
|
|
56
56
|
return (root or _default_queue_root()) / f"{bucket}.jsonl"
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
_FINGERPRINT_CAP = 20_000 # keep at most this many fingerprints per bucket
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _fingerprint_path(bucket: Bucket, root: Path | None = None) -> Path:
|
|
63
|
+
return (root or _default_queue_root()) / f".fp_{bucket}"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _signal_fingerprint(signal: FailureSignal) -> str:
|
|
67
|
+
"""Stable hash of (pattern_id, evidence). Used to dedupe a signal
|
|
68
|
+
that fires repeatedly across cron ticks — without this, a single
|
|
69
|
+
admiral_history line getting re-classified produces a queue entry
|
|
70
|
+
per re-classification (observed 2026-05-14: thinking_stall queue
|
|
71
|
+
had 73.6× amplification, 14213 entries / 193 unique strings)."""
|
|
72
|
+
import hashlib
|
|
73
|
+
src = f"{signal.pattern_id}\0{signal.evidence or ''}"
|
|
74
|
+
return hashlib.sha1(src.encode("utf-8", errors="replace")).hexdigest()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _load_fingerprints(path: Path) -> set[str]:
|
|
78
|
+
if not path.is_file():
|
|
79
|
+
return set()
|
|
80
|
+
try:
|
|
81
|
+
return set(path.read_text().splitlines())
|
|
82
|
+
except OSError:
|
|
83
|
+
return set()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _append_fingerprint(path: Path, fp: str, cap: int = _FINGERPRINT_CAP) -> None:
|
|
87
|
+
"""Append a fingerprint to disk; truncate the file when it exceeds
|
|
88
|
+
the cap to bound storage."""
|
|
89
|
+
try:
|
|
90
|
+
with path.open("a", encoding="utf-8") as f:
|
|
91
|
+
f.write(fp + "\n")
|
|
92
|
+
except OSError:
|
|
93
|
+
return
|
|
94
|
+
try:
|
|
95
|
+
if path.stat().st_size > cap * 64: # rough size guard
|
|
96
|
+
lines = path.read_text().splitlines()
|
|
97
|
+
if len(lines) > cap:
|
|
98
|
+
path.write_text("\n".join(lines[-cap:]) + "\n")
|
|
99
|
+
except OSError:
|
|
100
|
+
pass
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def make_jsonl_handler(
|
|
104
|
+
bucket: Bucket, root: Path | None = None, *, dedup: bool = True
|
|
105
|
+
) -> DispatchHandler:
|
|
60
106
|
"""Build a handler that appends each signal as one JSON line under
|
|
61
107
|
~/.drydock/dispatch/<bucket>.jsonl (or `root`/<bucket>.jsonl).
|
|
62
108
|
|
|
63
109
|
Atomicity: each write is one line per signal, with a timestamp.
|
|
64
110
|
The append is open-write-flush-close so concurrent runs don't
|
|
65
|
-
interleave half-lines.
|
|
111
|
+
interleave half-lines.
|
|
112
|
+
|
|
113
|
+
Cross-run dedup (`dedup=True`, default): a sidecar file
|
|
114
|
+
`.fp_<bucket>` holds sha1 fingerprints of `(pattern_id, evidence)`
|
|
115
|
+
tuples seen in this queue. A signal whose fingerprint is already
|
|
116
|
+
present is dropped at write time. Bounded to ~20k fingerprints
|
|
117
|
+
via rolling truncation. The amplification factor observed on
|
|
118
|
+
2026-05-14 (thinking_stall 73.6×) drops to ~1× with this enabled."""
|
|
66
119
|
path = _queue_path_for(bucket, root)
|
|
67
120
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
121
|
+
fp_path = _fingerprint_path(bucket, root)
|
|
122
|
+
fingerprints: set[str] = _load_fingerprints(fp_path) if dedup else set()
|
|
68
123
|
|
|
69
124
|
def handler(signal: FailureSignal) -> None:
|
|
125
|
+
if dedup:
|
|
126
|
+
fp = _signal_fingerprint(signal)
|
|
127
|
+
if fp in fingerprints:
|
|
128
|
+
return
|
|
129
|
+
fingerprints.add(fp)
|
|
130
|
+
_append_fingerprint(fp_path, fp)
|
|
70
131
|
record = signal.to_jsonable()
|
|
71
132
|
record["ts"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
|
|
72
133
|
with path.open("a", encoding="utf-8") as f:
|
|
@@ -91,7 +91,25 @@ RULES: tuple[ClassificationRule, ...] = (
|
|
|
91
91
|
),
|
|
92
92
|
ClassificationRule(
|
|
93
93
|
pattern_id="harness:tool:hallucinated_name",
|
|
94
|
-
|
|
94
|
+
# Require the line to either name a specific hallucinated tool or
|
|
95
|
+
# quote the format.py suppression-redirect message. The old regex
|
|
96
|
+
# `(unknown\s+tool|hallucinated.*tool)` matched any narrative
|
|
97
|
+
# mention of "hallucinated tools" — autonomous_review.log summary
|
|
98
|
+
# entries like "addressed thinking_stall, bash loops, hallucinated
|
|
99
|
+
# tools" fired this 48× during the 2026-05-11→14 window with no
|
|
100
|
+
# real hallucinated call behind them.
|
|
101
|
+
regex=_r(
|
|
102
|
+
# 'unknown tool: <name>' — require colon then an identifier
|
|
103
|
+
r"(unknown\s+tool:\s*[\w_.-]{3,}"
|
|
104
|
+
# 'hallucinated tool '<name>'' — require QUOTED name. Excludes
|
|
105
|
+
# narrative phrases like "hallucinated tool name to ..." that
|
|
106
|
+
# leaked through the prior regex.
|
|
107
|
+
r"|hallucinated\s+tool\s+['\"][\w_.-]+['\"]"
|
|
108
|
+
# format.py redirect-message signature (verbatim) — em-dash + tail
|
|
109
|
+
r"|'[^']{2,40}'\s+does\s+not\s+exist\s+—\s+do\s+not\s+call"
|
|
110
|
+
# admiral / detectors narrative phrasing
|
|
111
|
+
r"|model\s+invented\s+(?:a\s+)?tool\s+['\"][\w_.-]+['\"])"
|
|
112
|
+
),
|
|
95
113
|
bucket=Bucket.HARNESS,
|
|
96
114
|
suggested_action="Add the hallucinated tool name to _IGNORE_TOOLS suppression list.",
|
|
97
115
|
),
|
|
@@ -2,7 +2,7 @@ You are DryDock, a CLI coding agent. You write code, fix bugs, and build project
|
|
|
2
2
|
|
|
3
3
|
ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
|
|
4
4
|
|
|
5
|
-
When answering a direct factual or math question (not writing code), you MUST write visible text — never produce a response with only thinking tokens and no visible content. End your response with "FINAL ANSWER: <your answer>" on its own line so the judge can extract it.
|
|
5
|
+
When answering a direct factual or math question (not writing code), you MUST write visible text — never produce a response with only thinking tokens and no visible content. End your response with "FINAL ANSWER: <your answer>" on its own line so the judge can extract it. Even if you are uncertain, always attempt an answer and write "FINAL ANSWER: <best guess>" — an empty response scores 0 regardless of how good your reasoning was.
|
|
6
6
|
|
|
7
7
|
Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify.
|
|
8
8
|
|
|
@@ -91,6 +91,10 @@ prior alone. The math tool is sandboxed Python (`math.factorial(20)`,
|
|
|
91
91
|
`math.comb(50,5)`, `Fraction(1,3)+Fraction(1,6)`, `statistics.mean([...])`)
|
|
92
92
|
and returns exact results. Use it. Don't compute in your head.
|
|
93
93
|
|
|
94
|
+
For "maximize revenue/profit" or "how many X fit in Y" combinatorial problems,
|
|
95
|
+
enumerate ALL feasible combinations with a Python loop in the math tool rather
|
|
96
|
+
than computing by hand — brute-force is exact; manual decomposition is not.
|
|
97
|
+
|
|
94
98
|
USE THE count TOOL for "how many X" questions over text or files —
|
|
95
99
|
substring, regex, lines, words, chars, bytes. Eyeballing miscounts;
|
|
96
100
|
`count(pattern="def ", path="src/foo.py")` doesn't.
|
|
@@ -199,10 +199,11 @@ class Retrieve(
|
|
|
199
199
|
)
|
|
200
200
|
return
|
|
201
201
|
|
|
202
|
+
text_limit = args.text_limit or self.config.default_text_limit
|
|
203
|
+
symbol_limit = args.symbol_limit or self.config.default_symbol_limit
|
|
204
|
+
|
|
202
205
|
try:
|
|
203
206
|
idx = Index(db_path)
|
|
204
|
-
text_limit = args.text_limit or self.config.default_text_limit
|
|
205
|
-
symbol_limit = args.symbol_limit or self.config.default_symbol_limit
|
|
206
207
|
result = idx.retrieve(
|
|
207
208
|
args.query,
|
|
208
209
|
text_limit=text_limit,
|
|
@@ -211,7 +212,48 @@ class Retrieve(
|
|
|
211
212
|
except Exception as e:
|
|
212
213
|
raise ToolError(f"retrieve failed: {e}") from e
|
|
213
214
|
|
|
214
|
-
|
|
215
|
+
# Fallback chain — same shape as the auto-prefetch hook in
|
|
216
|
+
# agent_loop._auto_prefetch_retrieve. When the primary DB returns
|
|
217
|
+
# nothing useful, fall through to the arXiv corpus (1.18M chunks
|
|
218
|
+
# of STEM coverage) before giving up. The 2026-05-14 HLE audit
|
|
219
|
+
# found 77% of sessions hit empty primary — the model-invoked
|
|
220
|
+
# retrieve path was carrying the same gap.
|
|
221
|
+
#
|
|
222
|
+
# Skip fallback when the operator overrode args.db explicitly
|
|
223
|
+
# (they pointed us at a specific DB on purpose).
|
|
224
|
+
fallback_note = ""
|
|
225
|
+
if result.is_empty() and not args.db:
|
|
226
|
+
fallback_default = "/data3/arxiv_corpus/graphrag.sqlite"
|
|
227
|
+
fallback_db_raw = os.environ.get(
|
|
228
|
+
"DRYDOCK_GRAPHRAG_FALLBACK_DB", fallback_default
|
|
229
|
+
)
|
|
230
|
+
if fallback_db_raw:
|
|
231
|
+
fb_path = Path(fallback_db_raw).expanduser()
|
|
232
|
+
if (fb_path.is_file()
|
|
233
|
+
and fb_path.resolve() != db_path.resolve()):
|
|
234
|
+
try:
|
|
235
|
+
fb_idx = Index(fb_path)
|
|
236
|
+
fb_result = fb_idx.retrieve(
|
|
237
|
+
args.query,
|
|
238
|
+
text_limit=text_limit,
|
|
239
|
+
symbol_limit=symbol_limit,
|
|
240
|
+
)
|
|
241
|
+
if not fb_result.is_empty():
|
|
242
|
+
result = fb_result
|
|
243
|
+
db_path = fb_path
|
|
244
|
+
fallback_note = (
|
|
245
|
+
f"[primary index empty; using fallback {fb_path}]\n"
|
|
246
|
+
)
|
|
247
|
+
except Exception:
|
|
248
|
+
# Fallback failure is non-fatal — just emit the
|
|
249
|
+
# primary's empty result.
|
|
250
|
+
pass
|
|
251
|
+
|
|
252
|
+
formatted = (
|
|
253
|
+
fallback_note + ingest_note + result.format()
|
|
254
|
+
if (fallback_note or ingest_note)
|
|
255
|
+
else result.format()
|
|
256
|
+
)
|
|
215
257
|
yield RetrieveResult(
|
|
216
258
|
found=not result.is_empty(),
|
|
217
259
|
db_path=str(db_path),
|
|
@@ -146,12 +146,75 @@ def cmd_consume(args: argparse.Namespace) -> int:
|
|
|
146
146
|
return 0
|
|
147
147
|
|
|
148
148
|
|
|
149
|
-
def cmd_reset(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
149
|
+
def cmd_reset(args: argparse.Namespace) -> int:
|
|
150
|
+
"""Two modes:
|
|
151
|
+
- default: clear the entire consumed-state file (legacy)
|
|
152
|
+
- --since DATE / --kind NAME / --term-pattern REGEX: bulk-MARK
|
|
153
|
+
matching items consumed without losing the rest. Useful when
|
|
154
|
+
a batch of noise (e.g. pre-2026-05-14 FINAL/ANSWER/QUESTION
|
|
155
|
+
false positives) needs draining without resetting the whole
|
|
156
|
+
queue.
|
|
157
|
+
"""
|
|
158
|
+
if not (args.since or args.kind or args.term_pattern):
|
|
159
|
+
if CONSUMED_STATE.is_file():
|
|
160
|
+
CONSUMED_STATE.unlink()
|
|
161
|
+
print(f"Cleared {CONSUMED_STATE}")
|
|
162
|
+
else:
|
|
163
|
+
print("No consumed-state file to clear.")
|
|
164
|
+
return 0
|
|
165
|
+
|
|
166
|
+
# Bulk-mark mode.
|
|
167
|
+
import re
|
|
168
|
+
from datetime import datetime, timezone
|
|
169
|
+
cutoff: datetime | None = None
|
|
170
|
+
if args.since:
|
|
171
|
+
try:
|
|
172
|
+
cutoff = datetime.strptime(args.since, "%Y-%m-%d").replace(
|
|
173
|
+
tzinfo=timezone.utc
|
|
174
|
+
)
|
|
175
|
+
except ValueError:
|
|
176
|
+
print(f"bad --since: {args.since!r} (expect YYYY-MM-DD)")
|
|
177
|
+
return 2
|
|
178
|
+
term_re = re.compile(args.term_pattern) if args.term_pattern else None
|
|
179
|
+
|
|
180
|
+
consumed = _load_consumed()
|
|
181
|
+
matched = 0
|
|
182
|
+
skipped = 0
|
|
183
|
+
qpath = queue_path()
|
|
184
|
+
if not qpath.is_file():
|
|
185
|
+
print(f"No queue at {qpath}")
|
|
186
|
+
return 0
|
|
187
|
+
for line in qpath.read_text(errors="replace").splitlines():
|
|
188
|
+
line = line.strip()
|
|
189
|
+
if not line:
|
|
190
|
+
continue
|
|
191
|
+
try:
|
|
192
|
+
item = json.loads(line)
|
|
193
|
+
except json.JSONDecodeError:
|
|
194
|
+
continue
|
|
195
|
+
# Date filter
|
|
196
|
+
if cutoff is not None:
|
|
197
|
+
ts = item.get("ts") or item.get("created_at") or ""
|
|
198
|
+
try:
|
|
199
|
+
ts_dt = datetime.fromisoformat((ts or "").replace("Z", "+00:00"))
|
|
200
|
+
except (TypeError, ValueError):
|
|
201
|
+
skipped += 1
|
|
202
|
+
continue
|
|
203
|
+
if ts_dt >= cutoff:
|
|
204
|
+
continue
|
|
205
|
+
# Kind filter
|
|
206
|
+
if args.kind and item.get("kind") != args.kind:
|
|
207
|
+
continue
|
|
208
|
+
# Term pattern filter
|
|
209
|
+
if term_re is not None and not term_re.search(item.get("term") or ""):
|
|
210
|
+
continue
|
|
211
|
+
iid = item.get("id")
|
|
212
|
+
if iid and iid not in consumed:
|
|
213
|
+
consumed.add(iid)
|
|
214
|
+
matched += 1
|
|
215
|
+
_save_consumed(consumed)
|
|
216
|
+
print(f"Marked {matched} items consumed (skipped {skipped} undated).")
|
|
217
|
+
print(f"Total consumed now: {len(consumed)}")
|
|
155
218
|
return 0
|
|
156
219
|
|
|
157
220
|
|
|
@@ -172,7 +235,23 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
172
235
|
ap_consume.add_argument("id")
|
|
173
236
|
ap_consume.set_defaults(func=cmd_consume)
|
|
174
237
|
|
|
175
|
-
ap_reset = sub.add_parser(
|
|
238
|
+
ap_reset = sub.add_parser(
|
|
239
|
+
"reset",
|
|
240
|
+
help=("clear consumed state, OR bulk-mark items matching "
|
|
241
|
+
"--since / --kind / --term-pattern"),
|
|
242
|
+
)
|
|
243
|
+
ap_reset.add_argument(
|
|
244
|
+
"--since", default="",
|
|
245
|
+
help="YYYY-MM-DD UTC. Marks items older than this consumed.",
|
|
246
|
+
)
|
|
247
|
+
ap_reset.add_argument(
|
|
248
|
+
"--kind", default="",
|
|
249
|
+
help="Only items with this kind (e.g. unknown_term).",
|
|
250
|
+
)
|
|
251
|
+
ap_reset.add_argument(
|
|
252
|
+
"--term-pattern", default="",
|
|
253
|
+
help="Regex matched against the term field.",
|
|
254
|
+
)
|
|
176
255
|
ap_reset.set_defaults(func=cmd_reset)
|
|
177
256
|
|
|
178
257
|
args = ap.parse_args(argv)
|