drydock-cli 2.7.27__tar.gz → 2.7.29__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- drydock_cli-2.7.29/.auto_release.lock +1 -0
- drydock_cli-2.7.29/PERF_SWEEP_PLAN.md +109 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/PKG-INFO +1 -1
- drydock_cli-2.7.29/SOVEREIGN_PRD.md +520 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/agent_loop.py +57 -8
- drydock_cli-2.7.29/perf_results/baseline_1777672181.json +76 -0
- drydock_cli-2.7.29/perf_results/baseline_1777672218.json +96 -0
- drydock_cli-2.7.29/perf_results/baseline_1777672322.json +112 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/pyproject.toml +1 -1
- drydock_cli-2.7.29/scripts/perf_baseline_when_idle.sh +92 -0
- drydock_cli-2.7.29/scripts/perf_sweep.py +332 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_babysitter.sh +13 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_loop_detection.py +90 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/trip_log.md +171 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/uv.lock +1 -1
- drydock_cli-2.7.27/.auto_release.lock +0 -1
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.gitignore +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.python-version +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.typos.toml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.vscode/extensions.json +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.vscode/launch.json +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/.vscode/settings.json +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/AGENTS.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/Admiral.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/BASELINE_412.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/CHANGELOG.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/CLAUDE.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/LICENSE +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/NOTICE +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/PRD.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/README.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/action.yml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/README.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/docs/README.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/docs/acp-setup.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/logger.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/slug.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/types.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/core/utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock/whats_new.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock-acp.spec +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/drydock_terms.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/flake.lock +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/flake.nix +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/nohup.out +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/README.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/config_base.toml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/config_best.toml +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/domain_spec.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/experimenter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/kernel.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/mini_prd.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/proposer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/research/results.tsv +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/resume.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/README.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/backup.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/bump_version.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/evolve_tests.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/install.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/mega_loop.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/meta_ralph_loop.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/notify_release.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/port_task.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/session_loop_audit.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/shakedown.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/test_full.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/tui_test.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/test/project/dummy +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/conftest.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/e2e/common.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/mock/utils.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/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.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_admiral.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_agents.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_integration.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_message_id.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_middleware.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_smoke.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_workloads.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/worked_examples/README.md +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.7.27 → drydock_cli-2.7.29}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2064199
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# vLLM / Gemma 4 Hosting Performance Sweep — Plan & Baseline
|
|
2
|
+
|
|
3
|
+
**Status:** harness built, baseline collected (noisy), full sweep deferred until stress run completes.
|
|
4
|
+
|
|
5
|
+
**Owner artifact:** `scripts/perf_sweep.py`
|
|
6
|
+
**Results:** `/data3/drydock/perf_results/*.json`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Why this exists
|
|
11
|
+
|
|
12
|
+
Step 1 of the Sovereign v2 framework: lock the inference performance floor before building the failure-classification loop. If the floor is wobbly, the classifier can't tell "config bug" from "real failure class."
|
|
13
|
+
|
|
14
|
+
Article-driven hypotheses to test:
|
|
15
|
+
|
|
16
|
+
| Article claim | Currently we use | Test |
|
|
17
|
+
| ------------------------------ | --------------------- | ------------------------------------- |
|
|
18
|
+
| Flash attention enabled | `TRITON_ATTN` | swap to `--attention-backend FLASH_ATTN` |
|
|
19
|
+
| KV cache quant `q8_0` | `--kv-cache-dtype fp8`| swap to `auto` (fp16) — does fp8 cost quality? |
|
|
20
|
+
| `temperature: 1.0` | 0.0–0.2 | **Skipped — known bad for coding agents** |
|
|
21
|
+
| `top_k: 40` | unset | **Skipped — same reason** |
|
|
22
|
+
| Q3\_K\_M quantization | AWQ-4bit | **N/A — different ecosystem (vLLM not llama.cpp)** |
|
|
23
|
+
| (vLLM-native, not in article) | | `--enable-prefix-caching` on/off |
|
|
24
|
+
| (vLLM-native, not in article) | `--max-num-seqs 2` | sweep 2 / 4 / 8 |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Harness design
|
|
29
|
+
|
|
30
|
+
`scripts/perf_sweep.py baseline` runs four workloads sized to mirror real Drydock turns:
|
|
31
|
+
|
|
32
|
+
| Workload | Input tokens | Description | Max output |
|
|
33
|
+
| -------- | ------------ | ------------------------------------------------- | ---------- |
|
|
34
|
+
| short | ~50 | chat-style | 64 |
|
|
35
|
+
| medium | ~2 000 | typical drydock turn (system + few tool results) | 256 |
|
|
36
|
+
| long | ~16 000 | drydock with substantial tool history | 256 |
|
|
37
|
+
| xlong | ~64 000 | heavy context, near-half max | 256 |
|
|
38
|
+
|
|
39
|
+
Metrics reported per workload (median + p95 across iters):
|
|
40
|
+
|
|
41
|
+
- **TTFT** — time to first content delta (prefill cost)
|
|
42
|
+
- **e2e tok/s** — `output_tokens / total_wall_clock` (user-visible)
|
|
43
|
+
- **decode tok/s** — only meaningful when content chunks span >50 ms; otherwise marked `n/a (server buffered)`
|
|
44
|
+
- `streamed`, `chunk_count` for diagnosis
|
|
45
|
+
|
|
46
|
+
vLLM with `--tool-call-parser gemma4` buffers chunks server-side until tool-call boundaries are resolved, so decode-only measurements are usually meaningless on this stack. **Prefer e2e tok/s.**
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Baseline (noisy — taken during stress run)
|
|
51
|
+
|
|
52
|
+
Captured 2026-05-01 at ~16:30 CDT against live vLLM on :8001, while the 1700-prompt stress run was active. **Numbers are contaminated** — the same prompt swung 25× in TTFT depending on whether the stress harness was mid-request. Treat as ceiling, not signal.
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
short ttft p50=3.47s e2e p50=9.5 tok/s out p50=33 tok
|
|
56
|
+
medium ttft p50=1.41s e2e p50=44.8 tok/s out p50=65 tok
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Best uncontended values observed (single iter):
|
|
60
|
+
- short: ttft 0.73 s / e2e 44.6 tok/s
|
|
61
|
+
- medium: ttft 1.24 s / e2e 48.4 tok/s
|
|
62
|
+
|
|
63
|
+
Even uncontended, e2e is below the ~70 tok/s documented in `CLAUDE.md`. Likely explanation: small outputs are TTFT-dominated. Long-output workload needed to isolate decode rate.
|
|
64
|
+
|
|
65
|
+
**Files:** `perf_results/baseline_1777672322.json`
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Sweep matrix (run after stress completes)
|
|
70
|
+
|
|
71
|
+
7 configs total. Each = restart vLLM + re-run `perf_sweep.py baseline` with all four workloads × 5 iters.
|
|
72
|
+
|
|
73
|
+
| # | Config name | Change vs current | Hypothesis |
|
|
74
|
+
| -- | --------------------- | ------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
75
|
+
| 0 | `current` | (none — re-measure cleanly without stress) | Establishes uncontaminated baseline |
|
|
76
|
+
| 1 | `flash_attn` | `--attention-backend FLASH_ATTN` | Article: flash improves TTFT and decode |
|
|
77
|
+
| 2 | `kv_fp16` | drop `--kv-cache-dtype fp8` (=fp16 default) | Does fp8 cost quality? Compare e2e + spot-check answers |
|
|
78
|
+
| 3 | `prefix_cache_on` | add `--enable-prefix-caching` | Big win for repeated system prompts (huge for Drydock TUI) |
|
|
79
|
+
| 4 | `seqs_4` | `--max-num-seqs 4` | Better concurrency under stress harness load |
|
|
80
|
+
| 5 | `seqs_8` | `--max-num-seqs 8` | Stress test concurrency limit |
|
|
81
|
+
| 6 | `winner_combo` | best of 1+3 (likely flash + prefix cache) | Combined effect |
|
|
82
|
+
|
|
83
|
+
**Total wall time:** ~7 configs × ~5 min restart + ~3 min benchmark ≈ 1 h.
|
|
84
|
+
|
|
85
|
+
**Pass criteria for "winner":**
|
|
86
|
+
1. Equal or better e2e tok/s on `medium` workload (drydock-typical)
|
|
87
|
+
2. No quality regression on a 5-PRD spot check (run `shakedown.py` on 5 PRDs, must still pass)
|
|
88
|
+
3. No timeouts on `xlong` workload (catches OOM under long contexts)
|
|
89
|
+
4. Either equal-or-lower TTFT on `medium`, or a documented justification why higher TTFT is acceptable
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## What's NOT in the sweep (and why)
|
|
94
|
+
|
|
95
|
+
- **`temperature: 1.0` / `top_k: 40`** — bad advice for coding agents. We escalate temp deliberately as a loop-break lever (`agent_loop.py:2032`), not a default. Skipped.
|
|
96
|
+
- **Q3\_K\_M (Unsloth GGUF)** — different ecosystem (llama.cpp). Becomes relevant only when bringing up the customer-hardware portability path (Phase 1 tail of the Sovereign PRD).
|
|
97
|
+
- **`gpu-memory-utilization` higher than 0.95** — already at the practical ceiling.
|
|
98
|
+
- **Tensor-parallel size > 2** — only have 2 GPUs.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Next actions
|
|
103
|
+
|
|
104
|
+
1. ⏸ Wait for stress harness to drain to `0/0` (ETA ~10–12 h from 16:30 CDT 2026-05-01).
|
|
105
|
+
2. ▢ Run `current` config clean baseline (5 iters, all four workloads).
|
|
106
|
+
3. ▢ Run configs 1–5 sequentially, comparing against `current`.
|
|
107
|
+
4. ▢ Build winning combo, validate via `shakedown.py` 5-PRD spot check.
|
|
108
|
+
5. ▢ Lock the winner into `start_gemma4.sh` and `CLAUDE.md`.
|
|
109
|
+
6. ▢ Move on to Step 2 of the framework: **manual failure triage** of `MODEL_SHORTCOMINGS.md` + Admiral logs + `BASELINE_412.md` to seed the classification taxonomy.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.29
|
|
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
|
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
# Product Requirements Document (PRD)
|
|
2
|
+
|
|
3
|
+
# Project Name: **Drydock Sovereign AI Stack v2**
|
|
4
|
+
|
|
5
|
+
### Local Adaptive AI System — Gemma 4 26B + Drydock + GraphRAG (roadmap) + Deep Noir (roadmap)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Adaptation Notes (vs. upstream PRD draft)
|
|
10
|
+
|
|
11
|
+
This doc starts from a community PRD draft. Where the draft conflicts with what
|
|
12
|
+
Drydock has already committed to or measured, the draft loses. Specifically:
|
|
13
|
+
|
|
14
|
+
| Upstream draft says | What we actually do | Why |
|
|
15
|
+
| -------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
16
|
+
| Runtime: llama.cpp / llama-server (Q3\_K\_M) | vLLM Docker (`vllm/vllm-openai:gemma4`), AWQ-4bit | Already shipped, 0% timeouts, 70% SWE-bench file match. llama.cpp/Ollama become **portability roadmap**. |
|
|
17
|
+
| Context window: 32 768 | **131 072** (`--max-model-len 131072`) | Our hardware (2× RTX 4060 Ti 16GB) handles it with `fp8` KV cache. |
|
|
18
|
+
| `temperature: 1.0`, `top_k: 40` | `temperature: 0.0–0.2` baseline | Article advice targets chat/prose. For agentic coding, temp 1.0 *causes* the loops it claims to fix. We only |
|
|
19
|
+
| | | escalate temp to ~1.0 deliberately as a loop-break lever (`agent_loop.py:2032`). |
|
|
20
|
+
| KV cache `q8_0` | `--kv-cache-dtype fp8` | vLLM-native equivalent. Different ecosystem (vLLM vs. llama.cpp). |
|
|
21
|
+
| Tier 3: Jetson AGX Orin as supported | **Explicitly out of scope for v2** | Per operator rule — Jetson is not to be modified or treated as a deployment target this cycle. |
|
|
22
|
+
| GraphRAG / Deep Noir / full Evaluator | **Roadmap**, not "current components" | We have Admiral, stress harness, MetaHarness, autonomous\_review. GraphRAG and Deep Noir are real future work. |
|
|
23
|
+
| Cloud-assisted proposer (anywhere) | **Local-only proposer** | Air-gap is the product pitch; cloud proposer contradicts the brand. |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# 1. Executive Summary
|
|
28
|
+
|
|
29
|
+
Drydock Sovereign AI Stack v2 is a fully local, privacy-first AI platform for
|
|
30
|
+
secure environments, defense-adjacent customers, regulated enterprises, and
|
|
31
|
+
research labs that need frontier-style assistance without sending data to the
|
|
32
|
+
cloud.
|
|
33
|
+
|
|
34
|
+
The system pairs:
|
|
35
|
+
|
|
36
|
+
- **Gemma 4 26B-A4B-it (AWQ-4bit)** — Google's MoE reasoning model (only ~4B
|
|
37
|
+
active params per token)
|
|
38
|
+
- **vLLM** — production-grade inference server (Docker, tensor-parallel)
|
|
39
|
+
- **Drydock harness** — orchestration, tool use, loop detection, Admiral
|
|
40
|
+
observer, MetaHarness self-improvement
|
|
41
|
+
- **GraphRAG memory** — *roadmap, Phase 2*
|
|
42
|
+
- **Deep Noir activation steering** — *roadmap, Phase 4 — leverages the
|
|
43
|
+
operator's own research*
|
|
44
|
+
- **Evaluator loop** — already partially shipped (Admiral + stress + autonomous
|
|
45
|
+
review); deepens in Phase 3
|
|
46
|
+
|
|
47
|
+
Category claim: **AI that improves after installation.**
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
# 2. Product Vision
|
|
52
|
+
|
|
53
|
+
A sovereign AI system that:
|
|
54
|
+
|
|
55
|
+
- Runs offline on customer hardware
|
|
56
|
+
- Uses local GPUs only
|
|
57
|
+
- Protects sensitive data (no telemetry, no remote model calls)
|
|
58
|
+
- Learns customer-specific knowledge
|
|
59
|
+
- Performs coding and reasoning tasks autonomously
|
|
60
|
+
- Self-diagnoses failures (Admiral) and self-improves (MetaHarness, evaluator)
|
|
61
|
+
- Improves continuously without phoning home
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
# 3. Core Problem Statement
|
|
66
|
+
|
|
67
|
+
## Cloud AI problems
|
|
68
|
+
|
|
69
|
+
- Data exposure
|
|
70
|
+
- Recurring per-seat subscriptions
|
|
71
|
+
- Vendor lock-in
|
|
72
|
+
- No control over model updates / silent regressions
|
|
73
|
+
- Unavailable in air-gapped or classified networks
|
|
74
|
+
|
|
75
|
+
## DIY local AI problems
|
|
76
|
+
|
|
77
|
+
- Difficult setup, hardware-specific tuning
|
|
78
|
+
- Poor inference performance without serving expertise
|
|
79
|
+
- Weak retrieval / no persistent memory
|
|
80
|
+
- No orchestration layer (raw chat ≠ agent)
|
|
81
|
+
- No self-improvement
|
|
82
|
+
- Hard to tune behavior per domain
|
|
83
|
+
|
|
84
|
+
Drydock Sovereign solves both.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
# 4. System Architecture
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
┌────────────────────┐
|
|
92
|
+
│ Gemma 4 26B-A4B │ ← MoE, ~4B active/token
|
|
93
|
+
│ (AWQ-4bit) │
|
|
94
|
+
└────────┬───────────┘
|
|
95
|
+
│
|
|
96
|
+
┌────────▼───────────┐
|
|
97
|
+
│ vLLM (Docker) │ ← :8000, fp8 KV cache,
|
|
98
|
+
│ tensor-parallel 2 │ 131K ctx, gemma4 tool parser
|
|
99
|
+
└────────┬───────────┘
|
|
100
|
+
│
|
|
101
|
+
┌────────▼───────────┐
|
|
102
|
+
│ llm_balancer │ ← :8001, OpenAI-compatible,
|
|
103
|
+
│ (failover/health) │ cron keepalive
|
|
104
|
+
└────────┬───────────┘
|
|
105
|
+
│
|
|
106
|
+
┌────────▼───────────┐
|
|
107
|
+
│ Drydock Harness │ ← v2 (TUI) + v3 (clean rewrite)
|
|
108
|
+
│ • Tool execution │
|
|
109
|
+
│ • Loop detection │
|
|
110
|
+
│ • Adaptive think │
|
|
111
|
+
│ • search_replace │
|
|
112
|
+
│ • write_file safety
|
|
113
|
+
│ • Subagents │
|
|
114
|
+
└────────┬───────────┘
|
|
115
|
+
│
|
|
116
|
+
┌─────────────────────┼─────────────────────────┐
|
|
117
|
+
│ │ │
|
|
118
|
+
┌────────▼─────────┐ ┌────────▼────────┐ ┌───────────▼──────────┐
|
|
119
|
+
│ Admiral observer │ │ MetaHarness │ │ Stress harness + │
|
|
120
|
+
│ (ship) │ │ self-improve │ │ stress_watcher │
|
|
121
|
+
│ │ │ (local-only) │ │ (continuous regression)
|
|
122
|
+
└──────────────────┘ └─────────────────┘ └──────────────────────┘
|
|
123
|
+
│
|
|
124
|
+
┌────────▼───────────┐
|
|
125
|
+
│ GraphRAG (Phase 2)│ ← persistent memory
|
|
126
|
+
└────────┬───────────┘
|
|
127
|
+
│
|
|
128
|
+
┌────────▼───────────┐
|
|
129
|
+
│ Deep Noir (Phase 4)│ ← activation steering
|
|
130
|
+
└────────────────────┘
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
# 5. Core Components
|
|
136
|
+
|
|
137
|
+
## 5.1 Base Model Layer
|
|
138
|
+
|
|
139
|
+
**Gemma 4 26B-A4B-it-AWQ-4bit** (Google, MoE, ~4B active per token).
|
|
140
|
+
|
|
141
|
+
Used for:
|
|
142
|
+
|
|
143
|
+
- Coding (primary)
|
|
144
|
+
- Reasoning over local repos and documents
|
|
145
|
+
- Technical assistance / shell automation
|
|
146
|
+
- Document understanding (text)
|
|
147
|
+
|
|
148
|
+
Operational notes:
|
|
149
|
+
|
|
150
|
+
- Thinking-token leak (`<|channel>thought<channel|>`) is filtered in
|
|
151
|
+
`providers.py` before display and before message-history storage.
|
|
152
|
+
- `tool_choice="auto"`; the gemma4 tool-call parser handles native tool
|
|
153
|
+
decisions.
|
|
154
|
+
- Adaptive thinking: OFF for routine writes, HIGH for planning and user
|
|
155
|
+
messages, LOW for error recovery — eliminates 30–120s hangs between file
|
|
156
|
+
writes (see `CLAUDE.md` learnings).
|
|
157
|
+
|
|
158
|
+
## 5.2 Hosting / Runtime Layer
|
|
159
|
+
|
|
160
|
+
### Primary runtime: **vLLM (already shipped)**
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# /data3/Models/start_gemma4.sh
|
|
164
|
+
docker run -d --gpus all --name gemma4 -p 8000:8000 \
|
|
165
|
+
-v /data3/Models:/models --ipc=host \
|
|
166
|
+
vllm/vllm-openai:gemma4 \
|
|
167
|
+
--model /models/Gemma-4-26B-A4B-it-AWQ-4bit \
|
|
168
|
+
--quantization compressed-tensors \
|
|
169
|
+
--tensor-parallel-size 2 \
|
|
170
|
+
--max-model-len 131072 \
|
|
171
|
+
--max-num-seqs 2 \
|
|
172
|
+
--gpu-memory-utilization 0.95 \
|
|
173
|
+
--kv-cache-dtype fp8 \
|
|
174
|
+
--served-model-name gemma4 \
|
|
175
|
+
--trust-remote-code \
|
|
176
|
+
--tool-call-parser gemma4 \
|
|
177
|
+
--enable-auto-tool-choice \
|
|
178
|
+
--attention-backend TRITON_ATTN
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
| Setting | Value | Why |
|
|
182
|
+
| ------------------- | ---------------------- | ------------------------------------------------ |
|
|
183
|
+
| Quantization | AWQ-4bit (compressed-tensors) | Fits 2× RTX 4060 Ti 16GB |
|
|
184
|
+
| Context | 131 072 | Coding/RAG headroom |
|
|
185
|
+
| Tensor parallel | 2 | Both GPUs |
|
|
186
|
+
| KV cache dtype | `fp8` | vLLM equivalent of `q8_0` |
|
|
187
|
+
| Tool-call parser | `gemma4` | Native function-call decoding |
|
|
188
|
+
| Attention backend | `TRITON_ATTN` | Stable on Ampere/Ada; flash-attn benchmark TBD |
|
|
189
|
+
| Max sequences | 2 | Matches 2-GPU serving budget |
|
|
190
|
+
|
|
191
|
+
### Portability runtimes (roadmap, customer-hardware story)
|
|
192
|
+
|
|
193
|
+
To ship onto customer hardware that prefers other stacks, Drydock must support:
|
|
194
|
+
|
|
195
|
+
- **llama.cpp / llama-server** — for single-GPU customers (RTX 3090/4090).
|
|
196
|
+
Recommended GGUF: **Q3\_K\_M** (community sweet spot for 24GB cards).
|
|
197
|
+
- **Ollama** — easiest first-install path; same Q3\_K\_M.
|
|
198
|
+
- **vLLM** — current baseline; multi-GPU, AWQ.
|
|
199
|
+
- **Failover** between providers via `llm_balancer.py` (already present).
|
|
200
|
+
|
|
201
|
+
### Drydock connection spec (customer-tunable)
|
|
202
|
+
|
|
203
|
+
```yaml
|
|
204
|
+
provider: openai_compatible
|
|
205
|
+
base_url: http://localhost:8001/v1 # llm_balancer in front of vLLM
|
|
206
|
+
model: gemma4
|
|
207
|
+
context_window: 131072
|
|
208
|
+
temperature: 0.2 # coding default; 1.0 ONLY as a loop-break lever
|
|
209
|
+
top_p: 0.95 # vLLM default; do not set top_k unless tuning
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
> ⚠ **Do not** copy the `temperature: 1.0`, `top_k: 40` values from generic
|
|
213
|
+
> "run Gemma locally" articles. Those are tuned for chat/prose. Used as the
|
|
214
|
+
> default for an agentic coding harness, they cause exactly the loops and
|
|
215
|
+
> typos those articles attribute to "the model." Drydock uses temp 1.0
|
|
216
|
+
> deliberately as a loop-break escalation, not a baseline.
|
|
217
|
+
|
|
218
|
+
## 5.3 Drydock Harness Layer
|
|
219
|
+
|
|
220
|
+
The control plane. Already shipped (v2 TUI + v3 clean rewrite).
|
|
221
|
+
|
|
222
|
+
**Already shipped:**
|
|
223
|
+
|
|
224
|
+
- Prompt routing, tool execution, shell automation
|
|
225
|
+
- Loop detection (advisory nudges + FORCE_STOP only on pure no-op duplicates)
|
|
226
|
+
- `search_replace` quality-of-life: file_path inference, "already applied"
|
|
227
|
+
detection, raw-code fallback
|
|
228
|
+
- `write_file` safety: dedup escalation, missing-sibling-import check,
|
|
229
|
+
stub-class anti-pattern detection
|
|
230
|
+
- Adaptive thinking (per-call thinking budget)
|
|
231
|
+
- Subagent progress streaming
|
|
232
|
+
- Hallucinated-tool suppression (`exit_plan_mode`, etc.)
|
|
233
|
+
- Auto-AGENTS.md per project (devstral-era; Gemma 4 doesn't strictly need it)
|
|
234
|
+
|
|
235
|
+
**Planned for this PRD:**
|
|
236
|
+
|
|
237
|
+
- **Read-before-write enforcement** — block / warn when a tool call would
|
|
238
|
+
modify a file the agent never read in this session. Directly addresses the
|
|
239
|
+
"model leans on internal priors instead of retrieval" failure mode (see §10).
|
|
240
|
+
- Pluggable retriever interface for GraphRAG (Phase 2)
|
|
241
|
+
- Steering hook for Deep Noir vectors (Phase 4)
|
|
242
|
+
|
|
243
|
+
## 5.4 GraphRAG Memory Layer (Phase 2)
|
|
244
|
+
|
|
245
|
+
Persistent organisational memory — **not yet implemented.**
|
|
246
|
+
|
|
247
|
+
Sources: PDFs, Office docs, spreadsheets, markdown vaults, source code,
|
|
248
|
+
ticketing exports, manuals, research papers.
|
|
249
|
+
|
|
250
|
+
Pipeline:
|
|
251
|
+
|
|
252
|
+
```text
|
|
253
|
+
ingest → parse → chunk → embed → vector index → graph links → reranker
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Used when:
|
|
257
|
+
|
|
258
|
+
- Internal knowledge required
|
|
259
|
+
- Context missing in working set
|
|
260
|
+
- Cross-session continuity matters
|
|
261
|
+
|
|
262
|
+
Operational requirement (per §10): retrieval must beat the model's prior.
|
|
263
|
+
|
|
264
|
+
## 5.5 Deep Noir Layer (Phase 4)
|
|
265
|
+
|
|
266
|
+
Activation-steering vectors derived from the operator's own Deep Noir research
|
|
267
|
+
(see project memory). Targeted use cases:
|
|
268
|
+
|
|
269
|
+
- Reduced hallucinations (suppress "make stuff up" directions)
|
|
270
|
+
- Secure-coding mode (suppress eval/exec/shell-injection prone outputs)
|
|
271
|
+
- Citation mode (boost "quote source" directions in RAG flows)
|
|
272
|
+
- Legal-precision / analyst / domain-bias presets
|
|
273
|
+
|
|
274
|
+
Local-only. No hosted steering service.
|
|
275
|
+
|
|
276
|
+
## 5.6 Evaluator Layer
|
|
277
|
+
|
|
278
|
+
Already partially shipped — the system already self-observes.
|
|
279
|
+
|
|
280
|
+
**Already shipped:**
|
|
281
|
+
|
|
282
|
+
- **Admiral** — live observer that detects skip clusters, RSS bloat,
|
|
283
|
+
raw-markdown leakage, TUI-recycle conditions, and intervenes
|
|
284
|
+
- **Stress harness + `stress_watcher.py`** — continuous regression run
|
|
285
|
+
(~1700 prompts), watcher kills leaky TUIs, babysitter relaunches harness
|
|
286
|
+
- **`autonomous_review.sh`** — cron-driven Claude review every 30 min
|
|
287
|
+
- **`functional_tests.sh` per PRD** + `BASELINE_412.md` — real feature
|
|
288
|
+
tests, no `--help`-only signals
|
|
289
|
+
|
|
290
|
+
**To ship in Phase 3:**
|
|
291
|
+
|
|
292
|
+
- Per-task evaluator that classifies failures into:
|
|
293
|
+
```
|
|
294
|
+
Need memory? → enqueue GraphRAG ingest
|
|
295
|
+
Need retrieval? → tune reranker / chunking
|
|
296
|
+
Need tool? → suggest harness extension
|
|
297
|
+
Need steering? → flag for Deep Noir
|
|
298
|
+
Need fine-tune? → recommend LoRA candidate
|
|
299
|
+
```
|
|
300
|
+
- Pareto frontier tracking (accuracy vs. token cost vs. time)
|
|
301
|
+
- Execution trace logging per task (Meta-Harness arXiv:2603.28052)
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
# 6. Adaptive Failure Logic
|
|
306
|
+
|
|
307
|
+
```text
|
|
308
|
+
If context missing:
|
|
309
|
+
→ enqueue GraphRAG ingest (Phase 2) | meanwhile: inject AGENTS.md hints
|
|
310
|
+
|
|
311
|
+
If no tool available:
|
|
312
|
+
→ emit harness extension suggestion to evaluator queue
|
|
313
|
+
|
|
314
|
+
If behavior poor on a category (e.g., language interpreters):
|
|
315
|
+
→ surface worked example in stuck mode (already wired for tree-walking interpreter)
|
|
316
|
+
→ Phase 4: apply Deep Noir vector
|
|
317
|
+
|
|
318
|
+
If repeated reasoning failures across sessions:
|
|
319
|
+
→ recommend LoRA candidate (data captured by execution trace logging)
|
|
320
|
+
|
|
321
|
+
If loops detected:
|
|
322
|
+
→ loop-break sampling (temp+0.3/0.5, freq_pen 0.4–0.7, fresh seed)
|
|
323
|
+
→ planner reset + diversity strategy
|
|
324
|
+
→ only escalates to FORCE_STOP on pure no-op duplicates
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
All logic is **advisory-first**. Hard stops are reserved for objectively useless
|
|
328
|
+
work (identical-content rewrites). Per operator rule: safety mechanisms must
|
|
329
|
+
not block legitimate retries.
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
# 7. Markets
|
|
334
|
+
|
|
335
|
+
## Primary
|
|
336
|
+
|
|
337
|
+
- Government secure systems (defense-adjacent first; classified later)
|
|
338
|
+
- Defense contractors
|
|
339
|
+
- Regulated industries: legal, healthcare, financial services
|
|
340
|
+
- Industrial / OT environments
|
|
341
|
+
- Engineering teams with sensitive IP
|
|
342
|
+
- Research labs requiring data isolation
|
|
343
|
+
|
|
344
|
+
## Beachhead (per startup direction)
|
|
345
|
+
|
|
346
|
+
Defense / gov-adjacent vertical. Target a first paid pilot ($5–25K) within
|
|
347
|
+
90 days of v2 alpha.
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
# 8. Hardware Targets
|
|
352
|
+
|
|
353
|
+
| Tier | Hardware | Status |
|
|
354
|
+
| ----------- | --------------------------------- | ---------------------------------------- |
|
|
355
|
+
| Tier 0 dev | 2× RTX 4060 Ti 16GB (current) | ✅ shipped, baseline |
|
|
356
|
+
| Tier 1 | RTX 3090 / 4090 (single 24GB) | Roadmap — needs llama.cpp Q3\_K\_M path |
|
|
357
|
+
| Tier 2 | RTX A6000 / RTX 6000 Ada (48GB) | Roadmap — single-card vLLM AWQ |
|
|
358
|
+
| Tier 3 | Multi-GPU server rack | Roadmap — tensor-parallel vLLM |
|
|
359
|
+
| **Out of scope** | Jetson AGX Orin | Explicitly excluded this cycle |
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
# 9. Key Use Cases
|
|
364
|
+
|
|
365
|
+
### Secure coding assistant (current strength)
|
|
366
|
+
|
|
367
|
+
- Local repo coding, bug fixing, refactors
|
|
368
|
+
- Shell automation with allowlist/denylist enforcement
|
|
369
|
+
- PRD-driven project building (370-PRD test suite)
|
|
370
|
+
|
|
371
|
+
### Internal knowledge AI (Phase 2)
|
|
372
|
+
|
|
373
|
+
- Policy lookup, contract review, manual Q&A
|
|
374
|
+
- Cross-document reasoning over GraphRAG corpus
|
|
375
|
+
|
|
376
|
+
### Research copilot (Phase 2+)
|
|
377
|
+
|
|
378
|
+
- Paper summarisation and method comparison
|
|
379
|
+
- Drafting with grounded citations
|
|
380
|
+
|
|
381
|
+
### Ops assistant (current)
|
|
382
|
+
|
|
383
|
+
- Script generation, log triage, workflow automation
|
|
384
|
+
- Already proven by `autonomous_review.sh` running on Drydock itself
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
# 10. Gemma 4 Operational Warning — Retrieval vs. Prior
|
|
389
|
+
|
|
390
|
+
Confirmed in real-world deployments and consistent with Drydock's own failure
|
|
391
|
+
modes (stub-class anti-pattern, missing-sibling-imports, "writes a function
|
|
392
|
+
without reading the file"): **Gemma 4 leans on its training prior even when
|
|
393
|
+
ground truth is in retrieved context.**
|
|
394
|
+
|
|
395
|
+
Drydock must enforce:
|
|
396
|
+
|
|
397
|
+
1. **Retrieval-first prompts** — "answer using the provided context; if the
|
|
398
|
+
context is insufficient, say so." (system-prompt update)
|
|
399
|
+
2. **Mandatory citations** in RAG flows — answer must reference a chunk id
|
|
400
|
+
3. **Read-before-write enforcement** in the harness — if `write_file` /
|
|
401
|
+
`search_replace` targets an existing file the agent never read in this
|
|
402
|
+
session, return an advisory and inject a `read_file` nudge before
|
|
403
|
+
permitting the write
|
|
404
|
+
4. **Evaluator grounding checks** — sample answers and verify retrieved
|
|
405
|
+
chunks were actually used (token overlap or citation presence)
|
|
406
|
+
5. **Source-priority templates** — RAG prompt templates that pin retrieved
|
|
407
|
+
evidence above the model's prior
|
|
408
|
+
|
|
409
|
+
The read-before-write check is the highest-value low-risk item; it directly
|
|
410
|
+
mitigates several of the failure classes already in `MODEL_SHORTCOMINGS.md`.
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
# 11. Roadmap
|
|
415
|
+
|
|
416
|
+
### Phase 1 — 30 days (Foundation, mostly done)
|
|
417
|
+
|
|
418
|
+
- ✅ Gemma 4 local hosting (vLLM Docker)
|
|
419
|
+
- ✅ Drydock harness (v2 TUI + v3 rewrite)
|
|
420
|
+
- ✅ Coding workflows + 370-PRD benchmark
|
|
421
|
+
- ✅ Admiral, stress harness, autonomous review
|
|
422
|
+
- ▢ **Read-before-write enforcement** (this PRD's first new build)
|
|
423
|
+
- ▢ Customer-hardware portability bring-up (llama.cpp + Ollama backends)
|
|
424
|
+
|
|
425
|
+
### Phase 2 — 60 days (Memory)
|
|
426
|
+
|
|
427
|
+
- ▢ GraphRAG ingestion pipeline (PDFs, code, markdown)
|
|
428
|
+
- ▢ Pluggable retriever interface in Drydock
|
|
429
|
+
- ▢ Memory routing (when to retrieve, when not to)
|
|
430
|
+
- ▢ Citation-mode prompt templates
|
|
431
|
+
- ▢ Operator dashboards
|
|
432
|
+
|
|
433
|
+
### Phase 3 — 90 days (Self-Improvement)
|
|
434
|
+
|
|
435
|
+
- ▢ Per-task evaluator with classifier (memory / retrieval / tool / steering / tune)
|
|
436
|
+
- ▢ Execution trace logging (full prompts + tool calls per task)
|
|
437
|
+
- ▢ Anti-loop signal feedback into proposer
|
|
438
|
+
- ▢ Autonomous upgrade loop (local-only proposer)
|
|
439
|
+
- ▢ First paid pilot ($5–25K, defense-adjacent)
|
|
440
|
+
|
|
441
|
+
### Phase 4 — 120 days (Steering)
|
|
442
|
+
|
|
443
|
+
- ▢ Deep Noir vector pipeline
|
|
444
|
+
- ▢ Domain modules (secure-coding, legal-precision, analyst, citation)
|
|
445
|
+
- ▢ Measured improvements on per-domain benchmarks
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
# 12. Metrics
|
|
450
|
+
|
|
451
|
+
| Metric | Target | Baseline |
|
|
452
|
+
| ------------------------------------- | ------ | -------------------------- |
|
|
453
|
+
| Coding success (functional\_tests) | +25 % | 94 % on 412-suite (current)|
|
|
454
|
+
| Hallucinations (RAG citation miss) | −40 % | TBD — establish in Phase 2 |
|
|
455
|
+
| Repeat failures across sessions | −50 % | TBD — needs trace logging |
|
|
456
|
+
| Retrieval relevance (P@5) | +60 % | TBD — Phase 2 baseline |
|
|
457
|
+
| Customer cloud dependency | −70 % | Brand promise, qualitative |
|
|
458
|
+
| Task completion rate (interactive) | +35 % | Current shakedown baseline |
|
|
459
|
+
| SWE-bench file match | maintain ≥70 % | 70 % current |
|
|
460
|
+
|
|
461
|
+
Metrics with "TBD" baselines are explicitly required to be **measured** before
|
|
462
|
+
Phase 2 begins, not estimated.
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
# 13. Risks
|
|
467
|
+
|
|
468
|
+
| Risk | Mitigation |
|
|
469
|
+
| --------------------------------------------- | --------------------------------------------------- |
|
|
470
|
+
| Local model weaker than frontier cloud | Harness compensates; pick tasks where local wins |
|
|
471
|
+
| Poor retrieval quality | Reranker, chunking discipline, evaluator gating |
|
|
472
|
+
| Steering instability (Deep Noir) | Sandbox eval, per-domain regression suite |
|
|
473
|
+
| Hardware fragmentation | Preset configs per Tier; portability roadmap above |
|
|
474
|
+
| Model regression from upstream releases | Pin model + image; gate updates through stress run |
|
|
475
|
+
| DIY copycats (open weights + Ollama) | Moat is harness + memory + steering, not weights |
|
|
476
|
+
| Cron clobbering active edits | `.pause_auto_release` and `.pause_watchdog` flags |
|
|
477
|
+
| Cloud creep in proposer / evaluator | Hard architectural rule: local-only proposer |
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
# 14. Business Model
|
|
482
|
+
|
|
483
|
+
- **Software license** — install on customer hardware, per-seat or per-node
|
|
484
|
+
- **Appliance** — prebuilt secure workstation (Tier 1/2 hardware, image
|
|
485
|
+
preloaded, factory-trusted)
|
|
486
|
+
- **Enterprise support** — annual maintenance, signed updates
|
|
487
|
+
- **Premium secure deployments** — government / classified pricing, on-prem
|
|
488
|
+
build/audit support
|
|
489
|
+
- **Open core** — harness + agent loop OSS, evaluator/steering/retrieval
|
|
490
|
+
bundles commercial
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
# 15. Strategic Moat
|
|
495
|
+
|
|
496
|
+
Not the model weights (open). Not the quantization (commodity). Not the
|
|
497
|
+
harness alone (replicable).
|
|
498
|
+
|
|
499
|
+
The compound moat:
|
|
500
|
+
|
|
501
|
+
- Self-improvement logic (evaluator + autonomous review + stress)
|
|
502
|
+
- Memory systems (GraphRAG + retrieval discipline)
|
|
503
|
+
- Adaptive routing (per-failure-class actions)
|
|
504
|
+
- Activation steering (Deep Noir, derived from operator's own research)
|
|
505
|
+
- Secure deployment expertise (air-gap, signed updates, audit logs)
|
|
506
|
+
- Polished local UX (TUI today, appliance tomorrow)
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
# 16. Final Thesis
|
|
511
|
+
|
|
512
|
+
Open models are commodities.
|
|
513
|
+
Inference hosting is commoditizing.
|
|
514
|
+
RAG is commoditizing.
|
|
515
|
+
|
|
516
|
+
What stays valuable:
|
|
517
|
+
|
|
518
|
+
> **A local AI system that knows why it failed and fixes itself.**
|
|
519
|
+
|
|
520
|
+
That is Drydock Sovereign AI Stack v2.
|