drydock-cli 2.7.29__tar.gz → 2.7.30__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.30/.auto_release.lock +1 -0
- drydock_cli-2.7.30/.claude/scheduled_tasks.lock +1 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/PKG-INFO +1 -1
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/SOVEREIGN_PRD.md +112 -36
- drydock_cli-2.7.30/TRIAGE_v1.md +128 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/bash.py +18 -10
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/read_file.py +28 -12
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/pyproject.toml +1 -1
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_bash.py +12 -1
- drydock_cli-2.7.30/tests/tools/test_read_file_dedup_alternating_offset.py +109 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_read_file_dedup_reembed.py +6 -3
- drydock_cli-2.7.30/trip_log.md +719 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/uv.lock +1 -1
- drydock_cli-2.7.29/.auto_release.lock +0 -1
- drydock_cli-2.7.29/.claude/scheduled_tasks.lock +0 -1
- drydock_cli-2.7.29/trip_log.md +0 -1523
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.gitignore +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.python-version +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.typos.toml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.vscode/extensions.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.vscode/launch.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.vscode/settings.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/AGENTS.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/Admiral.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/BASELINE_412.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/CHANGELOG.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/CLAUDE.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/LICENSE +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/NOTICE +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/PRD.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/README.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/action.yml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/README.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/docs/README.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/docs/acp-setup.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/logger.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/slug.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/types.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/whats_new.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock-acp.spec +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock_terms.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/flake.lock +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/flake.nix +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/nohup.out +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/perf_results/baseline_1777672181.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/perf_results/baseline_1777672218.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/perf_results/baseline_1777672322.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/README.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/config_base.toml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/config_best.toml +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/domain_spec.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/experimenter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/kernel.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/mini_prd.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/proposer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/results.tsv +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/resume.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/README.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/backup.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/bump_version.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/evolve_tests.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/install.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/mega_loop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/meta_ralph_loop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/notify_release.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/port_task.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/session_loop_audit.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_full.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/tui_test.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/test/project/dummy +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/conftest.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/common.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/utils.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/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.29 → drydock_cli-2.7.30}/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.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agents.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_integration.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_message_id.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_middleware.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_smoke.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_workloads.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/README.md +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2123904
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"sessionId":"71137671-5857-422e-ac69-082962e223e2","pid":2049518,"procStart":"416025348","acquiredAt":1777694583206}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.30
|
|
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
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Project Name: **Drydock Sovereign AI Stack v2**
|
|
4
4
|
|
|
5
|
-
### Local Adaptive AI System — Gemma 4 26B + Drydock + GraphRAG
|
|
5
|
+
### Local Adaptive AI System — Gemma 4 26B + Drydock + GraphRAG + Deep Noir (parallel v2 modules)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -19,7 +19,7 @@ Drydock has already committed to or measured, the draft loses. Specifically:
|
|
|
19
19
|
| | | escalate temp to ~1.0 deliberately as a loop-break lever (`agent_loop.py:2032`). |
|
|
20
20
|
| KV cache `q8_0` | `--kv-cache-dtype fp8` | vLLM-native equivalent. Different ecosystem (vLLM vs. llama.cpp). |
|
|
21
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
|
|
22
|
+
| GraphRAG / Deep Noir as faith-based "current" | **First-class roadmap modules**, both ship | They are deployable v2 capabilities, not contingent on classifier verdict. Classifier sequences engineering attention; it doesn't gate module existence. |
|
|
23
23
|
| Cloud-assisted proposer (anywhere) | **Local-only proposer** | Air-gap is the product pitch; cloud proposer contradicts the brand. |
|
|
24
24
|
|
|
25
25
|
---
|
|
@@ -38,14 +38,36 @@ The system pairs:
|
|
|
38
38
|
- **vLLM** — production-grade inference server (Docker, tensor-parallel)
|
|
39
39
|
- **Drydock harness** — orchestration, tool use, loop detection, Admiral
|
|
40
40
|
observer, MetaHarness self-improvement
|
|
41
|
-
- **GraphRAG memory** —
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- **
|
|
45
|
-
|
|
41
|
+
- **GraphRAG memory** — first-class deployable module; persistent context for
|
|
42
|
+
customer corpora (PDFs, code, manuals, tickets). Roadmap: Phase 2 first cut,
|
|
43
|
+
hardened in Phase 3.
|
|
44
|
+
- **Deep Noir activation steering** — first-class deployable module; behavior
|
|
45
|
+
shaping via activation vectors derived from the operator's own research.
|
|
46
|
+
Roadmap: Phase 3 first cut, deepened in Phase 4.
|
|
47
|
+
- **Evaluator + classifier loop** — already partially shipped (Admiral + stress
|
|
48
|
+
+ autonomous review). The classifier (added in Phase 2) sequences which
|
|
49
|
+
module gets engineering attention next; it does **not** gate whether a module
|
|
50
|
+
ships.
|
|
46
51
|
|
|
47
52
|
Category claim: **AI that improves after installation.**
|
|
48
53
|
|
|
54
|
+
### Module posture (read this before reading the rest)
|
|
55
|
+
|
|
56
|
+
Two questions are kept separate throughout this PRD:
|
|
57
|
+
|
|
58
|
+
1. **What ships as a deployable customer module?**
|
|
59
|
+
*All three:* harness, GraphRAG, Deep Noir. Defense-adjacent and regulated
|
|
60
|
+
customers ask for these by name; the answer is "yes, here's the module."
|
|
61
|
+
2. **Where does engineering attention go next?**
|
|
62
|
+
*Classifier-driven.* The Phase 2 classifier tags each failure as
|
|
63
|
+
harness-class / steering-class / retrieval-class / model-prior /
|
|
64
|
+
ambiguous-input and feeds a prioritized backlog. The classifier sequences
|
|
65
|
+
our work; it does **not** decide whether a module exists.
|
|
66
|
+
|
|
67
|
+
The product is the **living loop** that ties these together: failures get
|
|
68
|
+
classified, the right module gets the fix, the customer's deployment quietly
|
|
69
|
+
improves over time.
|
|
70
|
+
|
|
49
71
|
---
|
|
50
72
|
|
|
51
73
|
# 2. Product Vision
|
|
@@ -122,11 +144,11 @@ Drydock Sovereign solves both.
|
|
|
122
144
|
└──────────────────┘ └─────────────────┘ └──────────────────────┘
|
|
123
145
|
│
|
|
124
146
|
┌────────▼───────────┐
|
|
125
|
-
│ GraphRAG (Phase 2)│ ← persistent memory
|
|
147
|
+
│ GraphRAG (Phase 2)│ ← persistent memory module
|
|
126
148
|
└────────┬───────────┘
|
|
127
149
|
│
|
|
128
150
|
┌────────▼───────────┐
|
|
129
|
-
│ Deep Noir (Phase
|
|
151
|
+
│ Deep Noir (Phase 3)│ ← activation steering module
|
|
130
152
|
└────────────────────┘
|
|
131
153
|
```
|
|
132
154
|
|
|
@@ -237,12 +259,18 @@ The control plane. Already shipped (v2 TUI + v3 clean rewrite).
|
|
|
237
259
|
- **Read-before-write enforcement** — block / warn when a tool call would
|
|
238
260
|
modify a file the agent never read in this session. Directly addresses the
|
|
239
261
|
"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
|
|
262
|
+
- Pluggable **retriever interface** for GraphRAG (Phase 2 — module ships then)
|
|
263
|
+
- **Steering hook** for Deep Noir vectors (Phase 3 — module ships then)
|
|
264
|
+
- Failure-class **classifier** signal consumer (routes incoming
|
|
265
|
+
classifier output to harness / GraphRAG / Deep Noir dispatchers)
|
|
266
|
+
|
|
267
|
+
## 5.4 GraphRAG Memory Layer — Phase 2 first cut, hardened in Phase 3
|
|
242
268
|
|
|
243
|
-
|
|
269
|
+
**Status:** first-class deployable module. Not yet implemented; ships as a
|
|
270
|
+
parallel v2 deliverable alongside Deep Noir.
|
|
244
271
|
|
|
245
|
-
Persistent organisational memory
|
|
272
|
+
Persistent organisational memory. Customers turn it on by pointing it at their
|
|
273
|
+
corpus; it ingests, indexes, and serves grounded retrieval to Drydock.
|
|
246
274
|
|
|
247
275
|
Sources: PDFs, Office docs, spreadsheets, markdown vaults, source code,
|
|
248
276
|
ticketing exports, manuals, research papers.
|
|
@@ -250,9 +278,22 @@ ticketing exports, manuals, research papers.
|
|
|
250
278
|
Pipeline:
|
|
251
279
|
|
|
252
280
|
```text
|
|
253
|
-
ingest → parse → chunk → embed → vector index → graph links → reranker
|
|
281
|
+
ingest → parse → chunk → embed → vector index → graph links → reranker → citation
|
|
254
282
|
```
|
|
255
283
|
|
|
284
|
+
Drydock-side integration:
|
|
285
|
+
|
|
286
|
+
- Pluggable retriever interface in the harness (so vector-only and
|
|
287
|
+
graph-augmented retrievers swap cleanly)
|
|
288
|
+
- Source-priority prompt templates (retrieved evidence pinned above prior)
|
|
289
|
+
- Mandatory citation in RAG flows; evaluator verifies citations resolve to
|
|
290
|
+
retrieved chunks
|
|
291
|
+
- Read-before-write enforcement (§5.3) makes retrievals actually get used,
|
|
292
|
+
not bypassed in favor of the model's prior
|
|
293
|
+
|
|
294
|
+
Local-only. No hosted vector DB. Embedding model and reranker run on the same
|
|
295
|
+
host as vLLM.
|
|
296
|
+
|
|
256
297
|
Used when:
|
|
257
298
|
|
|
258
299
|
- Internal knowledge required
|
|
@@ -261,17 +302,37 @@ Used when:
|
|
|
261
302
|
|
|
262
303
|
Operational requirement (per §10): retrieval must beat the model's prior.
|
|
263
304
|
|
|
264
|
-
## 5.5 Deep Noir
|
|
305
|
+
## 5.5 Deep Noir Activation Steering — Phase 3 first cut, deepened in Phase 4
|
|
306
|
+
|
|
307
|
+
**Status:** first-class deployable module. Ships as a parallel v2 deliverable
|
|
308
|
+
alongside GraphRAG.
|
|
265
309
|
|
|
266
310
|
Activation-steering vectors derived from the operator's own Deep Noir research
|
|
267
|
-
(see project memory).
|
|
311
|
+
(see project memory). Customers select preset modes per session or per
|
|
312
|
+
deployment; Drydock applies the chosen vector via vLLM's logit/activation
|
|
313
|
+
hooks (or a sidecar if vLLM upstream support lags).
|
|
314
|
+
|
|
315
|
+
Targeted use cases:
|
|
316
|
+
|
|
317
|
+
- **Reduced-hallucination mode** — suppress "make stuff up" directions; pairs
|
|
318
|
+
well with GraphRAG citation enforcement
|
|
319
|
+
- **Secure-coding mode** — suppress eval/exec/shell-injection-prone outputs
|
|
320
|
+
- **Citation mode** — boost "quote source" directions in RAG flows
|
|
321
|
+
- **Legal-precision / analyst / domain-bias presets** — opinionated stacks
|
|
322
|
+
for verticals
|
|
323
|
+
|
|
324
|
+
Drydock-side integration:
|
|
268
325
|
|
|
269
|
-
-
|
|
270
|
-
-
|
|
271
|
-
-
|
|
272
|
-
|
|
326
|
+
- Steering hook in the harness so the active vector is applied per request
|
|
327
|
+
- Per-failure-class routing: if the classifier tags a failure as
|
|
328
|
+
steering-class, Drydock surfaces "try mode X" to the user / queues a vector
|
|
329
|
+
refinement candidate
|
|
330
|
+
- Sandbox eval suite: each new vector is regression-tested against a category
|
|
331
|
+
benchmark before promotion
|
|
273
332
|
|
|
274
|
-
Local-only. No hosted steering service.
|
|
333
|
+
Local-only. No hosted steering service. Vectors ship with the deployment;
|
|
334
|
+
retraining / refinement runs on customer hardware (per local-only-proposer
|
|
335
|
+
rule).
|
|
275
336
|
|
|
276
337
|
## 5.6 Evaluator Layer
|
|
277
338
|
|
|
@@ -313,7 +374,7 @@ If no tool available:
|
|
|
313
374
|
|
|
314
375
|
If behavior poor on a category (e.g., language interpreters):
|
|
315
376
|
→ surface worked example in stuck mode (already wired for tree-walking interpreter)
|
|
316
|
-
→ Phase
|
|
377
|
+
→ Phase 3+: apply Deep Noir vector for that category
|
|
317
378
|
|
|
318
379
|
If repeated reasoning failures across sessions:
|
|
319
380
|
→ recommend LoRA candidate (data captured by execution trace logging)
|
|
@@ -413,36 +474,51 @@ mitigates several of the failure classes already in `MODEL_SHORTCOMINGS.md`.
|
|
|
413
474
|
|
|
414
475
|
# 11. Roadmap
|
|
415
476
|
|
|
416
|
-
### Phase 1 — 30 days (Foundation
|
|
477
|
+
### Phase 1 — 30 days (Foundation + perf floor)
|
|
417
478
|
|
|
418
479
|
- ✅ Gemma 4 local hosting (vLLM Docker)
|
|
419
480
|
- ✅ Drydock harness (v2 TUI + v3 rewrite)
|
|
420
481
|
- ✅ Coding workflows + 370-PRD benchmark
|
|
421
482
|
- ✅ Admiral, stress harness, autonomous review
|
|
422
|
-
- ▢ **
|
|
483
|
+
- ▢ **Hosting performance sweep** — lock the inference floor (`PERF_SWEEP_PLAN.md`)
|
|
484
|
+
- ▢ **Manual failure triage** — seed the classifier taxonomy from existing
|
|
485
|
+
diagnostic data (`MODEL_SHORTCOMINGS.md`, `BASELINE_412.md`, Admiral logs)
|
|
486
|
+
- ▢ **Read-before-write enforcement** in the harness
|
|
423
487
|
- ▢ Customer-hardware portability bring-up (llama.cpp + Ollama backends)
|
|
424
488
|
|
|
425
|
-
### Phase 2 — 60 days (
|
|
489
|
+
### Phase 2 — 60 days (Classifier + GraphRAG first cut)
|
|
426
490
|
|
|
427
|
-
- ▢
|
|
428
|
-
-
|
|
491
|
+
- ▢ **Failure classifier** — extends Admiral / runs as a sibling; emits
|
|
492
|
+
structured signals tagged harness-class / retrieval-class / steering-class /
|
|
493
|
+
model-prior / ambiguous-input
|
|
494
|
+
- ▢ **GraphRAG ingestion pipeline** (PDFs, code, markdown) — first cut, ships
|
|
495
|
+
as a deployable module
|
|
496
|
+
- ▢ **Pluggable retriever interface** in Drydock (vector + graph backends)
|
|
429
497
|
- ▢ Memory routing (when to retrieve, when not to)
|
|
430
|
-
- ▢ Citation-mode prompt templates
|
|
431
|
-
- ▢ Operator dashboards
|
|
498
|
+
- ▢ Citation-mode prompt templates + grounding eval
|
|
499
|
+
- ▢ Operator dashboards (per-class failure rates over time)
|
|
432
500
|
|
|
433
|
-
### Phase 3 — 90 days (
|
|
501
|
+
### Phase 3 — 90 days (Deep Noir first cut + self-improvement)
|
|
434
502
|
|
|
435
|
-
- ▢
|
|
503
|
+
- ▢ **Deep Noir steering** — first cut, ships as a deployable module;
|
|
504
|
+
initial vectors for reduced-hallucination, secure-coding, citation modes
|
|
505
|
+
- ▢ Steering hook in the harness; sandbox eval per new vector
|
|
506
|
+
- ▢ Classifier-driven dispatch: harness-class signals open auto-PRs to
|
|
507
|
+
drydock; retrieval-class signals queue corpus gaps; steering-class signals
|
|
508
|
+
queue vector candidates
|
|
436
509
|
- ▢ Execution trace logging (full prompts + tool calls per task)
|
|
437
|
-
- ▢
|
|
438
|
-
- ▢ Autonomous upgrade loop (local-only proposer)
|
|
510
|
+
- ▢ Autonomous upgrade loop (**local-only** proposer)
|
|
439
511
|
- ▢ First paid pilot ($5–25K, defense-adjacent)
|
|
440
512
|
|
|
441
|
-
### Phase 4 — 120 days (
|
|
513
|
+
### Phase 4 — 120 days (Hardening + verticals)
|
|
442
514
|
|
|
443
|
-
- ▢ Deep Noir vector
|
|
444
|
-
|
|
515
|
+
- ▢ Deep Noir vector deepening — additional vectors driven by classifier
|
|
516
|
+
evidence (legal-precision, analyst, per-vertical bias presets)
|
|
517
|
+
- ▢ GraphRAG hardening — graph-augmented retrieval, hybrid reranker,
|
|
518
|
+
ingestion freshness signals
|
|
519
|
+
- ▢ Domain bundles per vertical (secure-coding, legal-precision, analyst)
|
|
445
520
|
- ▢ Measured improvements on per-domain benchmarks
|
|
521
|
+
- ▢ Appliance image (factory-trusted, signed updates, audit logs)
|
|
446
522
|
|
|
447
523
|
---
|
|
448
524
|
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Failure Triage v1 — Sovereign Stack v2 Framework, Step 2
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-05-02
|
|
4
|
+
**Source data:** `MODEL_SHORTCOMINGS.md` (11 patterns) + `BASELINE_412.md` (32 dirty PRDs as of 2026-04-13) + open GH issues (0 at time of write).
|
|
5
|
+
**Goal:** Validate the classifier taxonomy and produce a starter backlog with the right module attached to each bucket.
|
|
6
|
+
|
|
7
|
+
This is a manual pass. Output of this triage drives:
|
|
8
|
+
|
|
9
|
+
1. The taxonomy schema the Phase-2 classifier must be able to produce.
|
|
10
|
+
2. Per-bucket evidence justifying GraphRAG and Deep Noir as first-class modules (vs. infra-on-faith).
|
|
11
|
+
3. A prioritized engineering backlog by failure volume.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Taxonomy (validated against existing data)
|
|
16
|
+
|
|
17
|
+
| Bucket | Definition | Primary dispatcher |
|
|
18
|
+
| ------------------- | ----------------------------------------------------------------------------------- | ---------------------------- |
|
|
19
|
+
| **harness** | Tool plumbing, prompt structure, control flow, write/edit safety, loop detection. | Drydock harness |
|
|
20
|
+
| **retrieval** | Missing context the model has no way to know without external lookup or memory. | GraphRAG / read-before-write |
|
|
21
|
+
| **steering** | Stable behavioral priors (direction biases) — what the model *tends* to reach for. | Deep Noir vectors |
|
|
22
|
+
| **model-prior** | Reasoning / world-knowledge gaps that aren't behavioral — true capability ceiling. | LoRA fine-tune / model swap |
|
|
23
|
+
| **ambiguous-input** | PRD / user prompt is genuinely under-specified; not a model failure. | Prompt template / ask-user |
|
|
24
|
+
|
|
25
|
+
A single failure can have a **primary** and a **secondary** bucket. The classifier's job is to emit the primary; the secondary is for prioritization.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Per-pattern classification
|
|
30
|
+
|
|
31
|
+
Mapping each `MODEL_SHORTCOMINGS.md` pattern to bucket(s):
|
|
32
|
+
|
|
33
|
+
| # | Pattern (short) | Primary | Secondary | Status / dispatcher |
|
|
34
|
+
| - | ---------------------------------------------- | ------------- | --------- | ----------------------------------------------------------------------------------------------- |
|
|
35
|
+
| 1 | Catastrophic tool-arg malformation | harness | model | ✅ mitigated (`>50%` shrink refusal, raw-code fallback in `search_replace`) |
|
|
36
|
+
| 2 | Scaffolding without wiring | model-prior | retrieval | partially mitigated by worked examples + meta_ralph; model can't trace call graphs end-to-end |
|
|
37
|
+
| 3 | Subtle logic bugs undiagnosed | model-prior | steering | "trace failing line first" steering vector candidate |
|
|
38
|
+
| 4 | Inheritance blindness across packages | **retrieval** | model | **GraphRAG candidate.** Model can't grep parent-class packages without a hint |
|
|
39
|
+
| 5 | Regression during targeted fixes | harness | steering | ✅ mitigated (snapshot + rollback in ralph_loop). Steering candidate: "minimal-patch" direction |
|
|
40
|
+
| 6 | Blindness to own stuckness | harness | steering | partially mitigated (loop detection, dedup escalation). Steering: "switch approach when stuck" |
|
|
41
|
+
| 7 | Doesn't use web_search even when enabled | **steering** | model | **Deep Noir candidate.** Prompt rule alone insufficient; need to boost "search-when-stuck" dir |
|
|
42
|
+
| 8 | Hallucinated tool names | harness | — | ✅ mitigated (`_IGNORE_TOOLS` silent drop) |
|
|
43
|
+
| 9 | Empty response / thinking stall | harness | model | ✅ partially mitigated (truncate old tool results + thinking-stall nudge). Still seen on hard PRDs|
|
|
44
|
+
| 10a| Stub-class anti-pattern | harness | model | ✅ mitigated (`_check_stub_classes` in write_file) |
|
|
45
|
+
| 10b| Interactive fallback with CLI args present | model-prior | harness | minor; AST-check has weak signal. Steering candidate: "prefer-explicit-args" direction |
|
|
46
|
+
| 10c| Multi-module rewrites exceed 3-stage iteration| **retrieval** | model | **GraphRAG candidate.** Need persistent design memory across sessions (~3-4 file context limit) |
|
|
47
|
+
| 10 | Weak reasoning about performance / abstract | model-prior | steering | "abstract reasoning" prompt + worked examples. Hard problem; possibly model-ceiling |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Per-bucket distribution
|
|
52
|
+
|
|
53
|
+
| Bucket | Primary count | With secondary | Comment |
|
|
54
|
+
| ------------------ | ------------- | -------------- | --------------------------------------------------------------------------------------------- |
|
|
55
|
+
| **harness** | 6 | 8 | 5/6 already mitigated. The harness is paying its rent and continues to be the highest-volume bucket. |
|
|
56
|
+
| **retrieval** | **2** | 4 | Cross-package inheritance + multi-module memory. **GraphRAG earns its slot** on these alone. |
|
|
57
|
+
| **steering** | **1** | 6 | Web-search habit is the cleanest steering candidate. Six others have steering as a viable secondary lever. **Deep Noir earns its slot.** |
|
|
58
|
+
| **model-prior** | 4 | 7 | Reasoning gaps (logic, abstract optimization, scaffolding-wiring). LoRA territory. |
|
|
59
|
+
| **ambiguous-input**| 0 | 0 | Not represented in MODEL_SHORTCOMINGS (curated for model issues). Will appear when classifier runs against live stress data. |
|
|
60
|
+
|
|
61
|
+
**Headline finding:** the existing failure corpus *does* justify GraphRAG and Deep Noir as parallel v2 modules. They're not infra-on-faith — there are concrete failure patterns for each.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Module-by-module: what the data says
|
|
66
|
+
|
|
67
|
+
### Harness (already shipping; deepest investment to date)
|
|
68
|
+
|
|
69
|
+
5/6 primary-harness patterns are already mitigated. The classifier still routes harness-class signals here, and the autonomous_review cron is the half-built dispatcher. **Phase-1 work:** read-before-write enforcement (will move some pattern-4 / pattern-10c-style failures from "retrieval" into "this should have been caught at write time").
|
|
70
|
+
|
|
71
|
+
### GraphRAG (Phase 2 first cut — justified)
|
|
72
|
+
|
|
73
|
+
Two clean primary signals:
|
|
74
|
+
|
|
75
|
+
- **Pattern 4: cross-package inheritance.** Flask `request.is_xml` — model read `wrappers.py` 13× looking for a method that lives in a parent class in a different package. With a one-line hint pointing at the parent, model solved it in 61s. This is exactly what code-aware GraphRAG should serve: "where is `is_json` actually defined across the package graph?"
|
|
76
|
+
- **Pattern 10c: multi-module architectural rewrites.** lang_interp's lexer→parser→type_checker→interpreter→repl chain exceeded the model's working-memory budget. Rolling design memory across sessions (PRD goals + per-module contracts + decisions made) is what GraphRAG would store.
|
|
77
|
+
|
|
78
|
+
**Implication:** the GraphRAG first cut shouldn't optimize for arbitrary PDF Q&A. It should optimize for two specific shapes:
|
|
79
|
+
1. **Code graph** — symbol → definition site, including parent-class chains across packages.
|
|
80
|
+
2. **Project memory** — PRD + design decisions + per-module contracts, persistent across drydock sessions.
|
|
81
|
+
|
|
82
|
+
This is a sharper, smaller scope than "ingest everything." Easier to ship in 60 days.
|
|
83
|
+
|
|
84
|
+
### Deep Noir (Phase 3 first cut — justified)
|
|
85
|
+
|
|
86
|
+
One primary signal + six viable secondaries:
|
|
87
|
+
|
|
88
|
+
- **Primary: pattern 7, web-search habit.** Prompt rules don't move the needle. The model has a stable behavioral prior of "stay in local-only failure loop." A vector that boosts the "external lookup when stuck" direction is the textbook Deep Noir use case.
|
|
89
|
+
- **Secondary candidates (1 vector each):**
|
|
90
|
+
- "minimal-patch direction" (pattern 5: rewrites whole file when a 3-line change would do)
|
|
91
|
+
- "switch-approach-when-stuck direction" (pattern 6: keeps trying same pattern)
|
|
92
|
+
- "prefer-explicit-args direction" (pattern 10b: ignores `--password` flag, falls to `getpass()`)
|
|
93
|
+
- "trace-failing-line direction" (pattern 3: rewrites file instead of tracing the bug)
|
|
94
|
+
|
|
95
|
+
**Implication:** the Deep Noir first cut should ship **one well-tuned vector** (web-search habit) with a sandbox eval, not five vectors built in parallel. Volume of viable secondaries proves the program's value; engineering attention goes to the one with the cleanest signal first.
|
|
96
|
+
|
|
97
|
+
### Model-prior (LoRA territory, longer horizon)
|
|
98
|
+
|
|
99
|
+
Patterns 2, 3, 10b, 10 — reasoning gaps, not behavior gaps. Steering can move some of these (5/4 secondary on pattern 3); LoRA fine-tuning is the eventual answer. **Out of scope for v2 first cuts.** Tracked in the project `feedback_finetuning_deep_noir.md` memory.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Pareto: what to build next, in order
|
|
104
|
+
|
|
105
|
+
1. **Hosting sweep** — already queued via `*/15` cron. Locks the perf floor before classifier has any meaning.
|
|
106
|
+
2. **Read-before-write enforcement** in the harness (Phase 1, already in PRD). Cheapest way to convert some pattern-4 / pattern-10c failures into clean errors before the model commits to bad output.
|
|
107
|
+
3. **Classifier first cut** (Phase 2) — emits the buckets in the table above, validated against this manual pass.
|
|
108
|
+
4. **Code-graph GraphRAG first cut** (Phase 2) — narrowed scope: symbol/inheritance lookup + per-project design memory. Skip arbitrary PDF Q&A in v0.
|
|
109
|
+
5. **Deep Noir vector v0** (Phase 3) — single vector for the web-search habit pattern, with a sandbox eval gating promotion.
|
|
110
|
+
6. Successive vectors / GraphRAG hardening as the live classifier produces volume in those buckets.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## What this triage produced
|
|
115
|
+
|
|
116
|
+
- A 5-bucket taxonomy that fits all 11 documented patterns (no "other").
|
|
117
|
+
- Concrete justification (with cited evidence) for both GraphRAG and Deep Noir as v2 modules.
|
|
118
|
+
- A scoped first cut for each module — code-graph GraphRAG (not arbitrary corpora), single-vector Deep Noir (not five at once).
|
|
119
|
+
- A prioritized backlog where engineering attention follows volume.
|
|
120
|
+
- A schema for the classifier to emit. Phase-2 classifier work has a target now.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Open questions for next pass (post-perf-baseline)
|
|
125
|
+
|
|
126
|
+
- Live stress-run failures — are the failure modes the same as the curated ones? Should add ambiguous-input bucket if PRDs are under-specified at observed rates.
|
|
127
|
+
- BASELINE_412 dirty PRDs — 32 packages × N tests is real failure volume. Per-PRD triage could surface patterns missing from MODEL_SHORTCOMINGS (e.g. pattern-12, pattern-13).
|
|
128
|
+
- Inter-rater check — once the Phase-2 classifier is built, run it on this same data and check agreement with this manual pass. <80% agreement = taxonomy is wrong.
|
|
@@ -505,16 +505,24 @@ class Bash(
|
|
|
505
505
|
return
|
|
506
506
|
|
|
507
507
|
encoding = _get_subprocess_encoding()
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
508
|
+
stdout_raw = stdout_bytes.decode(encoding, errors="replace") if stdout_bytes else ""
|
|
509
|
+
stderr_raw = stderr_bytes.decode(encoding, errors="replace") if stderr_bytes else ""
|
|
510
|
+
if len(stdout_raw) > max_bytes:
|
|
511
|
+
stdout = stdout_raw[:max_bytes] + (
|
|
512
|
+
f"\n[OUTPUT TRUNCATED: stdout exceeded {max_bytes} bytes. "
|
|
513
|
+
"Use 'grep -l' to list matching files only, narrow your "
|
|
514
|
+
"pattern, or pipe through 'head -50' to limit output. "
|
|
515
|
+
"Do NOT re-run the same command — the result will be "
|
|
516
|
+
"identical.]"
|
|
517
|
+
)
|
|
518
|
+
else:
|
|
519
|
+
stdout = stdout_raw
|
|
520
|
+
if len(stderr_raw) > max_bytes:
|
|
521
|
+
stderr = stderr_raw[:max_bytes] + (
|
|
522
|
+
f"\n[STDERR TRUNCATED: exceeded {max_bytes} bytes]"
|
|
523
|
+
)
|
|
524
|
+
else:
|
|
525
|
+
stderr = stderr_raw
|
|
518
526
|
|
|
519
527
|
returncode = proc.returncode or 0
|
|
520
528
|
|
|
@@ -98,25 +98,28 @@ class ReadFile(
|
|
|
98
98
|
# pointing to the earlier tool_result. Saves context + kills the
|
|
99
99
|
# "re-read 50x for no reason" pattern. Also preserves Read-before-
|
|
100
100
|
# Write because the stub still counts as having read the file.
|
|
101
|
+
#
|
|
102
|
+
# Per-slot dedup: track ALL (offset, limit) combinations independently.
|
|
103
|
+
# The old single-slot approach allowed alternating offsets to bypass
|
|
104
|
+
# dedup (read offset=0, read offset=50, read offset=0 again — the
|
|
105
|
+
# offset=50 read evicted the offset=0 cache entry each time).
|
|
101
106
|
read_state = ctx.read_file_state if ctx else None
|
|
102
107
|
path_key = str(file_path)
|
|
103
108
|
try:
|
|
104
109
|
current_mtime = file_path.stat().st_mtime_ns
|
|
105
110
|
except OSError:
|
|
106
111
|
current_mtime = 0
|
|
107
|
-
|
|
108
|
-
if
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
and prior.get("limit") == args.limit
|
|
113
|
-
):
|
|
112
|
+
slot_key = (args.offset, args.limit)
|
|
113
|
+
existing_entry = read_state.get(path_key, {}) if read_state is not None else {}
|
|
114
|
+
slots: dict = existing_entry.get("_slots", {})
|
|
115
|
+
prior_slot = slots.get(slot_key)
|
|
116
|
+
if prior_slot is not None and prior_slot.get("timestamp") == current_mtime:
|
|
114
117
|
# Re-embed the cached content so the model has it even if the
|
|
115
118
|
# earlier tool_result was truncated by _truncate_old_tool_results.
|
|
116
119
|
# Pointing at a stale/truncated prior result causes re-read loops.
|
|
117
|
-
cached_content =
|
|
118
|
-
prior_lines =
|
|
119
|
-
dedup_count =
|
|
120
|
+
cached_content = prior_slot.get("content", "")
|
|
121
|
+
prior_lines = prior_slot.get("lines_read", 0)
|
|
122
|
+
dedup_count = prior_slot.get("dedup_count", 0)
|
|
120
123
|
if dedup_count == 0:
|
|
121
124
|
header = "[Unchanged since last read — content re-embedded]\n"
|
|
122
125
|
else:
|
|
@@ -128,12 +131,13 @@ class ReadFile(
|
|
|
128
131
|
f"or move on to the next task.]\n"
|
|
129
132
|
)
|
|
130
133
|
if read_state is not None:
|
|
131
|
-
|
|
134
|
+
slots[slot_key] = {**prior_slot, "dedup_count": dedup_count + 1}
|
|
135
|
+
read_state[path_key] = {**existing_entry, "_slots": slots}
|
|
132
136
|
yield ReadFileResult(
|
|
133
137
|
path=path_key,
|
|
134
138
|
content=f"{header}{cached_content}",
|
|
135
139
|
lines_read=prior_lines,
|
|
136
|
-
was_truncated=
|
|
140
|
+
was_truncated=prior_slot.get("was_truncated", False),
|
|
137
141
|
)
|
|
138
142
|
return
|
|
139
143
|
|
|
@@ -155,7 +159,18 @@ class ReadFile(
|
|
|
155
159
|
|
|
156
160
|
# Record read state so Write/Edit can enforce Read-before-Write
|
|
157
161
|
# and so future re-reads can dedup against this one.
|
|
162
|
+
# Top-level entry (backward-compat: write_file/search_replace check
|
|
163
|
+
# read_state.get(path_key) is not None). Per-slot entry enables
|
|
164
|
+
# independent dedup for every (offset, limit) combination so that
|
|
165
|
+
# alternating offsets can't bypass dedup.
|
|
158
166
|
if read_state is not None:
|
|
167
|
+
slots[slot_key] = {
|
|
168
|
+
"content": content,
|
|
169
|
+
"timestamp": current_mtime,
|
|
170
|
+
"lines_read": len(read_result.lines),
|
|
171
|
+
"was_truncated": read_result.was_truncated,
|
|
172
|
+
"dedup_count": 0,
|
|
173
|
+
}
|
|
159
174
|
read_state[path_key] = {
|
|
160
175
|
"content": content,
|
|
161
176
|
"timestamp": current_mtime,
|
|
@@ -163,6 +178,7 @@ class ReadFile(
|
|
|
163
178
|
"limit": args.limit,
|
|
164
179
|
"lines_read": len(read_result.lines),
|
|
165
180
|
"was_truncated": read_result.was_truncated,
|
|
181
|
+
"_slots": slots,
|
|
166
182
|
}
|
|
167
183
|
|
|
168
184
|
yield ReadFileResult(
|
|
@@ -94,11 +94,22 @@ async def test_truncates_output_to_max_bytes(bash):
|
|
|
94
94
|
bash_tool.run(BashArgs(command="printf 'abcdefghij'"))
|
|
95
95
|
)
|
|
96
96
|
|
|
97
|
-
assert result.stdout
|
|
97
|
+
assert result.stdout.startswith("abcde")
|
|
98
|
+
assert "[OUTPUT TRUNCATED" in result.stdout
|
|
99
|
+
assert "Do NOT re-run" in result.stdout
|
|
98
100
|
assert result.stderr == ""
|
|
99
101
|
assert result.returncode == 0
|
|
100
102
|
|
|
101
103
|
|
|
104
|
+
@pytest.mark.asyncio
|
|
105
|
+
async def test_truncation_notice_absent_when_output_fits(bash):
|
|
106
|
+
# No truncation notice when output is within max_output_bytes.
|
|
107
|
+
result = await collect_result(bash.run(BashArgs(command="printf 'short'")))
|
|
108
|
+
|
|
109
|
+
assert result.stdout == "short"
|
|
110
|
+
assert "[OUTPUT TRUNCATED" not in result.stdout
|
|
111
|
+
|
|
112
|
+
|
|
102
113
|
@pytest.mark.asyncio
|
|
103
114
|
async def test_decodes_non_utf8_bytes(bash):
|
|
104
115
|
result = await collect_result(bash.run(BashArgs(command="printf '\\xff\\xfe'")))
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Regression test: read_file dedup fires correctly when model alternates offsets.
|
|
2
|
+
|
|
3
|
+
Bug: the single-slot cache (read_state[path_key]) was overwritten on every new
|
|
4
|
+
(offset, limit) pair. Reading at offset=0 stored slot A; reading at offset=50
|
|
5
|
+
(empty, past EOF) overwrote slot A with slot B. Re-reading at offset=0 then
|
|
6
|
+
saw no cache hit because the slot had offset=50, triggering a fresh disk read
|
|
7
|
+
and leaving the model in an infinite alternating-offset loop.
|
|
8
|
+
|
|
9
|
+
Fix: track each (offset, limit) combination independently in _slots so all
|
|
10
|
+
combinations are deduped regardless of read order.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import pytest
|
|
15
|
+
from unittest.mock import MagicMock
|
|
16
|
+
|
|
17
|
+
from drydock.core.tools.base import BaseToolState
|
|
18
|
+
from drydock.core.tools.builtins.read_file import (
|
|
19
|
+
ReadFile,
|
|
20
|
+
ReadFileArgs,
|
|
21
|
+
ReadFileResult,
|
|
22
|
+
ReadFileToolConfig,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def _run(tool, args, ctx) -> ReadFileResult:
|
|
27
|
+
async for event in tool.run(args, ctx):
|
|
28
|
+
if isinstance(event, ReadFileResult):
|
|
29
|
+
return event
|
|
30
|
+
raise AssertionError("no ReadFileResult yielded")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.mark.asyncio
|
|
34
|
+
async def test_alternating_offsets_both_deduped(tmp_path):
|
|
35
|
+
"""offset=0 dedup survives an interleaved offset=50 read on a short file."""
|
|
36
|
+
f = tmp_path / "short.py"
|
|
37
|
+
f.write_text("line1\nline2\nline3\n") # only 3 lines
|
|
38
|
+
|
|
39
|
+
tool = ReadFile(ReadFileToolConfig(), BaseToolState())
|
|
40
|
+
read_state: dict = {}
|
|
41
|
+
ctx = MagicMock()
|
|
42
|
+
ctx.read_file_state = read_state
|
|
43
|
+
|
|
44
|
+
args0 = ReadFileArgs(path=str(f), offset=0)
|
|
45
|
+
args50 = ReadFileArgs(path=str(f), offset=50)
|
|
46
|
+
|
|
47
|
+
# First read at offset=0 — populates cache for (0, None).
|
|
48
|
+
r1 = await _run(tool, args0, ctx)
|
|
49
|
+
assert "line1" in r1.content
|
|
50
|
+
|
|
51
|
+
# Read at offset=50 — past EOF, returns empty (or minimal) content.
|
|
52
|
+
r2 = await _run(tool, args50, ctx)
|
|
53
|
+
# Content may be empty; just ensure it doesn't crash.
|
|
54
|
+
|
|
55
|
+
# Re-read at offset=0 — MUST dedup and re-embed, NOT do a fresh disk read.
|
|
56
|
+
r3 = await _run(tool, args0, ctx)
|
|
57
|
+
assert "line1" in r3.content, "offset=0 dedup must survive interleaved offset=50 read"
|
|
58
|
+
assert "re-embedded" in r3.content or "REPEATED" in r3.content
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@pytest.mark.asyncio
|
|
62
|
+
async def test_each_slot_deduped_independently(tmp_path):
|
|
63
|
+
"""Each (offset, limit) slot fires dedup independently."""
|
|
64
|
+
f = tmp_path / "multi.py"
|
|
65
|
+
f.write_text("\n".join(f"line{i}" for i in range(200)) + "\n")
|
|
66
|
+
|
|
67
|
+
tool = ReadFile(ReadFileToolConfig(), BaseToolState())
|
|
68
|
+
read_state: dict = {}
|
|
69
|
+
ctx = MagicMock()
|
|
70
|
+
ctx.read_file_state = read_state
|
|
71
|
+
|
|
72
|
+
args_a = ReadFileArgs(path=str(f), offset=0, limit=50)
|
|
73
|
+
args_b = ReadFileArgs(path=str(f), offset=50, limit=50)
|
|
74
|
+
|
|
75
|
+
# First reads populate two independent slots.
|
|
76
|
+
r_a1 = await _run(tool, args_a, ctx)
|
|
77
|
+
r_b1 = await _run(tool, args_b, ctx)
|
|
78
|
+
assert "line0" in r_a1.content
|
|
79
|
+
assert "line50" in r_b1.content
|
|
80
|
+
|
|
81
|
+
# Re-read slot A after slot B — must dedup.
|
|
82
|
+
r_a2 = await _run(tool, args_a, ctx)
|
|
83
|
+
assert "line0" in r_a2.content
|
|
84
|
+
assert "re-embedded" in r_a2.content or "REPEATED" in r_a2.content
|
|
85
|
+
|
|
86
|
+
# Re-read slot B — must also dedup.
|
|
87
|
+
r_b2 = await _run(tool, args_b, ctx)
|
|
88
|
+
assert "line50" in r_b2.content
|
|
89
|
+
assert "re-embedded" in r_b2.content or "REPEATED" in r_b2.content
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@pytest.mark.asyncio
|
|
93
|
+
async def test_write_file_compat_after_read(tmp_path):
|
|
94
|
+
"""read_state[path_key] remains non-None after reads, so write_file can proceed."""
|
|
95
|
+
f = tmp_path / "code.py"
|
|
96
|
+
f.write_text("x = 1\n")
|
|
97
|
+
|
|
98
|
+
tool = ReadFile(ReadFileToolConfig(), BaseToolState())
|
|
99
|
+
read_state: dict = {}
|
|
100
|
+
ctx = MagicMock()
|
|
101
|
+
ctx.read_file_state = read_state
|
|
102
|
+
|
|
103
|
+
args = ReadFileArgs(path=str(f), offset=0)
|
|
104
|
+
await _run(tool, args, ctx)
|
|
105
|
+
|
|
106
|
+
# write_file checks: read_state.get(path_key) is not None
|
|
107
|
+
path_key = str(f)
|
|
108
|
+
assert read_state.get(path_key) is not None, "top-level entry must exist for write_file compat"
|
|
109
|
+
assert read_state[path_key].get("timestamp") is not None
|