drydock-cli 2.6.147__tar.gz → 2.7.0__tar.gz

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