drydock-cli 2.7.27__tar.gz → 2.7.28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. drydock_cli-2.7.28/.auto_release.lock +1 -0
  2. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/PKG-INFO +1 -1
  3. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/agent_loop.py +46 -2
  4. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/pyproject.toml +1 -1
  5. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_loop_detection.py +90 -0
  6. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/trip_log.md +71 -0
  7. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/uv.lock +1 -1
  8. drydock_cli-2.7.27/.auto_release.lock +0 -1
  9. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.claude/scheduled_tasks.lock +0 -0
  10. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/CODEOWNERS +0 -0
  11. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  12. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  13. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/workflows/build-and-upload.yml +0 -0
  15. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/workflows/ci.yml +0 -0
  16. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/workflows/issue-labeler.yml +0 -0
  17. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.github/workflows/release.yml +0 -0
  18. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.gitignore +0 -0
  19. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.pre-commit-config.yaml +0 -0
  20. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.python-version +0 -0
  21. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.typos.toml +0 -0
  22. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.vscode/extensions.json +0 -0
  23. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.vscode/launch.json +0 -0
  24. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/.vscode/settings.json +0 -0
  25. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/AGENTS.md +0 -0
  26. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/Admiral.md +0 -0
  27. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/BASELINE_412.md +0 -0
  28. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/CHANGELOG.md +0 -0
  29. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/CLAUDE.md +0 -0
  30. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/CONTRIBUTING.md +0 -0
  31. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/DEPLOYMENT.md +0 -0
  32. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/Drydock_rebrand.md +0 -0
  33. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/LICENSE +0 -0
  34. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/MODEL_SHORTCOMINGS.md +0 -0
  35. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/NOTICE +0 -0
  36. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/OVERNIGHT_PROGRESS.md +0 -0
  37. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  38. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/PRD.md +0 -0
  39. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/README.md +0 -0
  40. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/action.yml +0 -0
  41. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/README.md +0 -0
  42. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results1.tsv +0 -0
  43. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results13.tsv +0 -0
  44. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results14.tsv +0 -0
  45. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results15.tsv +0 -0
  46. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results16.tsv +0 -0
  47. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results17.tsv +0 -0
  48. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results18.tsv +0 -0
  49. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results19.tsv +0 -0
  50. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results2.tsv +0 -0
  51. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results20.tsv +0 -0
  52. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results3.tsv +0 -0
  53. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results4.tsv +0 -0
  54. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results5.tsv +0 -0
  55. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results6.tsv +0 -0
  56. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results7.tsv +0 -0
  57. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results8.tsv +0 -0
  58. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results9.tsv +0 -0
  59. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/baseline_history/results_evolved_v1.tsv +0 -0
  60. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/distribution/zed/LICENSE +0 -0
  61. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/distribution/zed/extension.toml +0 -0
  62. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/distribution/zed/icons/mistral_vibe.svg +0 -0
  63. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/docs/README.md +0 -0
  64. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/docs/acp-setup.md +0 -0
  65. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/docs/proxy-setup.md +0 -0
  66. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/__init__.py +0 -0
  67. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/__init__.py +0 -0
  68. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/acp_agent_loop.py +0 -0
  69. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/acp_logger.py +0 -0
  70. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/entrypoint.py +0 -0
  71. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/__init__.py +0 -0
  72. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/base.py +0 -0
  73. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/bash.py +0 -0
  74. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/read_file.py +0 -0
  75. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/search_replace.py +0 -0
  76. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/todo.py +0 -0
  77. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/write_file.py +0 -0
  78. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/tools/session_update.py +0 -0
  79. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/acp/utils.py +0 -0
  80. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/__init__.py +0 -0
  81. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/detectors.py +0 -0
  82. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/detectors_proposed.py +0 -0
  83. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/history.py +0 -0
  84. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/interventions.py +0 -0
  85. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/llm_analyzer.py +0 -0
  86. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/metrics.py +0 -0
  87. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/opus_escalator.py +0 -0
  88. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/persistence.py +0 -0
  89. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/policy.py +0 -0
  90. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/proposer.py +0 -0
  91. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/stager.py +0 -0
  92. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/task_classifier.py +0 -0
  93. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/tuning.py +0 -0
  94. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/validator.py +0 -0
  95. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/admiral/worker.py +0 -0
  96. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/__init__.py +0 -0
  97. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/autocompletion/__init__.py +0 -0
  98. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/autocompletion/base.py +0 -0
  99. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/autocompletion/path_completion.py +0 -0
  100. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/autocompletion/slash_command.py +0 -0
  101. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/cli.py +0 -0
  102. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/clipboard.py +0 -0
  103. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/commands.py +0 -0
  104. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/entrypoint.py +0 -0
  105. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/history_manager.py +0 -0
  106. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  107. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  108. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  109. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/terminal_setup.py +0 -0
  110. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/__init__.py +0 -0
  111. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  112. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/app.py +0 -0
  113. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/app.tcss +0 -0
  114. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/external_editor.py +0 -0
  115. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  116. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  117. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  118. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  119. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  120. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  121. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  122. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  123. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  124. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  125. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  126. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  127. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  128. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  129. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  130. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  131. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  132. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  133. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  134. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  135. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  136. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  137. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  138. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  139. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  140. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  141. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  142. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  143. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  144. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  145. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  146. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  147. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  148. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  149. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  150. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  151. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  152. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/history.py +0 -0
  153. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  154. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/state.py +0 -0
  155. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/__init__.py +0 -0
  156. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  157. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  158. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  159. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  160. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  161. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/update.py +0 -0
  162. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/cli/update_notifier/whats_new.py +0 -0
  163. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/__init__.py +0 -0
  164. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/agents/__init__.py +0 -0
  165. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/agents/manager.py +0 -0
  166. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/agents/models.py +0 -0
  167. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/auth/__init__.py +0 -0
  168. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/auth/crypto.py +0 -0
  169. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/auth/github.py +0 -0
  170. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/__init__.py +0 -0
  171. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/completers.py +0 -0
  172. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  173. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  174. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  175. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  176. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  177. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/fuzzy.py +0 -0
  178. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/path_prompt.py +0 -0
  179. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  180. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/build_orchestrator.py +0 -0
  181. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/checkpoint.py +0 -0
  182. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/config/__init__.py +0 -0
  183. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/config/_settings.py +0 -0
  184. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/config/doctor.py +0 -0
  185. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/config/harness_files/__init__.py +0 -0
  186. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  187. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/config/harness_files/_paths.py +0 -0
  188. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/consultant.py +0 -0
  189. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/drydock_states.py +0 -0
  190. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/hooks.py +0 -0
  191. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/__init__.py +0 -0
  192. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/anthropic.py +0 -0
  193. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/base.py +0 -0
  194. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/factory.py +0 -0
  195. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/generic.py +0 -0
  196. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/mistral.py +0 -0
  197. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  198. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/backend/vertex.py +0 -0
  199. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/exceptions.py +0 -0
  200. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/format.py +0 -0
  201. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/message_utils.py +0 -0
  202. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/llm/types.py +0 -0
  203. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/logger.py +0 -0
  204. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/middleware.py +0 -0
  205. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/output_formatters.py +0 -0
  206. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/paths/__init__.py +0 -0
  207. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/paths/_drydock_home.py +0 -0
  208. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/paths/_local_config_walk.py +0 -0
  209. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/paths/conventions.py +0 -0
  210. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/plan_session.py +0 -0
  211. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/plugins.py +0 -0
  212. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/programmatic.py +0 -0
  213. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/__init__.py +0 -0
  214. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/builder.md +0 -0
  215. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/cli.md +0 -0
  216. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/compact.md +0 -0
  217. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/dangerous_directory.md +0 -0
  218. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/diagnostic.md +0 -0
  219. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/explore.md +0 -0
  220. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/gemma4.md +0 -0
  221. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/planner.md +0 -0
  222. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/project_context.md +0 -0
  223. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/prompts/tests.md +0 -0
  224. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/proxy_setup.py +0 -0
  225. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session/agent_memory.py +0 -0
  226. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session/checkpoints.py +0 -0
  227. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session/session_loader.py +0 -0
  228. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session/session_logger.py +0 -0
  229. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session/session_migration.py +0 -0
  230. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session/state_file.py +0 -0
  231. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/session_checker.py +0 -0
  232. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/skills/__init__.py +0 -0
  233. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/skills/manager.py +0 -0
  234. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/skills/models.py +0 -0
  235. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/skills/parser.py +0 -0
  236. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/slug.py +0 -0
  237. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/system_prompt.py +0 -0
  238. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/telemetry/__init__.py +0 -0
  239. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/telemetry/send.py +0 -0
  240. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/teleport/errors.py +0 -0
  241. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/teleport/git.py +0 -0
  242. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/teleport/nuage.py +0 -0
  243. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/teleport/teleport.py +0 -0
  244. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/teleport/types.py +0 -0
  245. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/base.py +0 -0
  246. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/_task_manager.py +0 -0
  247. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  248. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/bash.py +0 -0
  249. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/cron.py +0 -0
  250. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  251. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/glob_tool.py +0 -0
  252. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/grep.py +0 -0
  253. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  254. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/lsp.py +0 -0
  255. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  256. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  257. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/powershell.py +0 -0
  258. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  259. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  260. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  261. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  262. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  263. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  264. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  265. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  266. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  267. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  268. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  269. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  270. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  271. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  272. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/task.md +0 -0
  273. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  274. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  275. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  276. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  277. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  278. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  279. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  280. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/read_file.py +0 -0
  281. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/search_replace.py +0 -0
  282. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/task.py +0 -0
  283. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/todo.py +0 -0
  284. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/tool_search.py +0 -0
  285. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/webfetch.py +0 -0
  286. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/websearch.py +0 -0
  287. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/worktree.py +0 -0
  288. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/builtins/write_file.py +0 -0
  289. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/injection_guard.py +0 -0
  290. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/manager.py +0 -0
  291. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/mcp/__init__.py +0 -0
  292. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/mcp/registry.py +0 -0
  293. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/mcp/tools.py +0 -0
  294. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/mcp_sampling.py +0 -0
  295. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/ui.py +0 -0
  296. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/tools/utils.py +0 -0
  297. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/trusted_folders.py +0 -0
  298. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/types.py +0 -0
  299. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/core/utils.py +0 -0
  300. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/__init__.py +0 -0
  301. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/base.py +0 -0
  302. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/onboarding.tcss +0 -0
  303. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/__init__.py +0 -0
  304. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/api_key.py +0 -0
  305. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/choice.py +0 -0
  306. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/local_model.py +0 -0
  307. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/welcome.py +0 -0
  308. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  309. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  310. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/__init__.py +0 -0
  311. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/api-design/SKILL.md +0 -0
  312. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/audit-tests/SKILL.md +0 -0
  313. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/batch/SKILL.md +0 -0
  314. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/commit-code/SKILL.md +0 -0
  315. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/context-summary/SKILL.md +0 -0
  316. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/create-presentation/SKILL.md +0 -0
  317. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/deep-research/SKILL.md +0 -0
  318. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/deploy/SKILL.md +0 -0
  319. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/diff-review/SKILL.md +0 -0
  320. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/doc-gen/SKILL.md +0 -0
  321. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/explain-code/SKILL.md +0 -0
  322. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/explore-code/SKILL.md +0 -0
  323. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/fix-issue/SKILL.md +0 -0
  324. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/git-ops/SKILL.md +0 -0
  325. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/init-project/SKILL.md +0 -0
  326. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/investigate/SKILL.md +0 -0
  327. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/loop/SKILL.md +0 -0
  328. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/migrate/SKILL.md +0 -0
  329. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/perf-analyze/SKILL.md +0 -0
  330. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/plan-impl/SKILL.md +0 -0
  331. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/pr-review/SKILL.md +0 -0
  332. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/refactor/SKILL.md +0 -0
  333. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/regex-help/SKILL.md +0 -0
  334. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/review/SKILL.md +0 -0
  335. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/security-review/SKILL.md +0 -0
  336. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/ship/SKILL.md +0 -0
  337. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/simplify/SKILL.md +0 -0
  338. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/strong-tests/SKILL.md +0 -0
  339. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/skills/test-verify/SKILL.md +0 -0
  340. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock/whats_new.md +0 -0
  341. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock-acp.spec +0 -0
  342. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/drydock_terms.md +0 -0
  343. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/flake.lock +0 -0
  344. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/flake.nix +0 -0
  345. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/nohup.out +0 -0
  346. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/README.md +0 -0
  347. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/config_base.toml +0 -0
  348. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/config_best.toml +0 -0
  349. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/domain_spec.md +0 -0
  350. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/experimenter.py +0 -0
  351. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/kernel.py +0 -0
  352. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/mini_prd.md +0 -0
  353. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/mini_prompts.txt +0 -0
  354. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/proposer.py +0 -0
  355. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/research/results.tsv +0 -0
  356. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/resume.md +0 -0
  357. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/README.md +0 -0
  358. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/admiral_probe.py +0 -0
  359. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/audit_sampler.py +0 -0
  360. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/auto_generate_tests.py +0 -0
  361. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/auto_release.sh +0 -0
  362. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/auto_test_loop.sh +0 -0
  363. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/autonomous_review.sh +0 -0
  364. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/autonomous_review_prompt.md +0 -0
  365. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/backup.sh +0 -0
  366. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/bump_version.py +0 -0
  367. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/comprehensive_loop.py +0 -0
  368. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/deploy_to_github.sh +0 -0
  369. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/discover_cli_tools.sh +0 -0
  370. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/evolve_tests.py +0 -0
  371. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/gen_2000_prompts.py +0 -0
  372. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/install.sh +0 -0
  373. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/llm_balancer.py +0 -0
  374. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/mega_loop.py +0 -0
  375. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/meta_ralph_loop.py +0 -0
  376. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/monitor_swebench.sh +0 -0
  377. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/monitor_test_battery.sh +0 -0
  378. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/notify_release.py +0 -0
  379. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/oss_task_harness.py +0 -0
  380. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/overnight_agents_test.sh +0 -0
  381. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/poll_issues.sh +0 -0
  382. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/port_task.py +0 -0
  383. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/prepare_release.py +0 -0
  384. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/publish_to_pypi.sh +0 -0
  385. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/ralph_loop.py +0 -0
  386. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/research_babysitter.sh +0 -0
  387. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/session_loop_audit.py +0 -0
  388. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/shakedown.py +0 -0
  389. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/shakedown_interactive.py +0 -0
  390. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/shakedown_regression.sh +0 -0
  391. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/shakedown_suite.sh +0 -0
  392. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/shakedown_variance.sh +0 -0
  393. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_babysitter.sh +0 -0
  394. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_prompts_50.txt +0 -0
  395. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_prompts_realuser.txt +0 -0
  396. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_prompts_tool_agent.txt +0 -0
  397. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  398. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_shakedown.py +0 -0
  399. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_telegram_status.py +0 -0
  400. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/stress_watcher.py +0 -0
  401. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/telegram_bot.py +0 -0
  402. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/test_bank.sh +0 -0
  403. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/test_full.sh +0 -0
  404. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/test_smoke.sh +0 -0
  405. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/test_tui_path.py +0 -0
  406. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/tui_test.py +0 -0
  407. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/scripts/vllm_failover.sh +0 -0
  408. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/test/project/dummy +0 -0
  409. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/__init__.py +0 -0
  410. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/conftest.py +0 -0
  411. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_acp.py +0 -0
  412. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_agent_thought.py +0 -0
  413. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_bash.py +0 -0
  414. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_compact_session_updates.py +0 -0
  415. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_content.py +0 -0
  416. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_initialize.py +0 -0
  417. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_list_sessions.py +0 -0
  418. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_load_session.py +0 -0
  419. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_multi_session.py +0 -0
  420. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_new_session.py +0 -0
  421. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_proxy_setup_acp.py +0 -0
  422. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_read_file.py +0 -0
  423. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_search_replace.py +0 -0
  424. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_set_config_option.py +0 -0
  425. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_set_mode.py +0 -0
  426. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_set_model.py +0 -0
  427. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_tool_call_session_update.py +0 -0
  428. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_utils.py +0 -0
  429. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/acp/test_write_file.py +0 -0
  430. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_file_indexer.py +0 -0
  431. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_fuzzy.py +0 -0
  432. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  433. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  434. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_path_completion_controller.py +0 -0
  435. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  436. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_slash_command_controller.py +0 -0
  437. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  438. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/__init__.py +0 -0
  439. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/data/__init__.py +0 -0
  440. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/data/fireworks.py +0 -0
  441. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/data/mistral.py +0 -0
  442. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/test_anthropic_adapter.py +0 -0
  443. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/test_backend.py +0 -0
  444. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  445. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/test_reasoning_adapter.py +0 -0
  446. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  447. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  448. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  449. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  450. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_bell_notifications.py +0 -0
  451. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_braille_renderer.py +0 -0
  452. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_clipboard.py +0 -0
  453. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_commands.py +0 -0
  454. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_copy_shortcuts.py +0 -0
  455. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_external_editor.py +0 -0
  456. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_no_markup_static.py +0 -0
  457. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_question_app.py +0 -0
  458. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_spinner.py +0 -0
  459. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_switching_mode.py +0 -0
  460. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  461. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  462. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_ui_session_resume.py +0 -0
  463. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/test_ui_skill_dispatch.py +0 -0
  464. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/textual_ui/__init__.py +0 -0
  465. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/cli/textual_ui/test_session_picker.py +0 -0
  466. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/conftest.py +0 -0
  467. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_agents.py +0 -0
  468. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_auth_crypto.py +0 -0
  469. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_auth_github.py +0 -0
  470. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  471. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  472. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_config_load_dotenv.py +0 -0
  473. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_config_paths.py +0 -0
  474. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_config_resolution.py +0 -0
  475. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_file_logging.py +0 -0
  476. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_plan_session.py +0 -0
  477. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_proxy_setup.py +0 -0
  478. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_slug.py +0 -0
  479. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_telemetry_send.py +0 -0
  480. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_teleport_git.py +0 -0
  481. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_teleport_nuage.py +0 -0
  482. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_teleport_service.py +0 -0
  483. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_trusted_folders.py +0 -0
  484. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/core/test_utils.py +0 -0
  485. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/e2e/common.py +0 -0
  486. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/e2e/conftest.py +0 -0
  487. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/e2e/mock_server.py +0 -0
  488. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  489. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/e2e/test_cli_tui_streaming.py +0 -0
  490. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  491. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/fixtures/doc_qa_system_prd.md +0 -0
  492. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/mock/__init__.py +0 -0
  493. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/mock/mock_backend_factory.py +0 -0
  494. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/mock/mock_entrypoint.py +0 -0
  495. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/mock/utils.py +0 -0
  496. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/onboarding/test_run_onboarding.py +0 -0
  497. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/onboarding/test_ui_onboarding.py +0 -0
  498. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/session/test_session_loader.py +0 -0
  499. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/session/test_session_logger.py +0 -0
  500. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/session/test_session_migration.py +0 -0
  501. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/skills/conftest.py +0 -0
  502. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/skills/test_manager.py +0 -0
  503. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/skills/test_models.py +0 -0
  504. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/skills/test_parser.py +0 -0
  505. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  506. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  507. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  508. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  509. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  510. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  511. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  512. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  513. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  514. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  515. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  516. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  517. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  518. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  519. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  520. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  521. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  522. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  523. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  524. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  525. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  526. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  527. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  528. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  529. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  530. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  531. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  532. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  533. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  534. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  535. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  536. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  537. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  538. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  539. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  540. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  541. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  542. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  543. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  544. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  545. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  546. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  547. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  548. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  549. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  550. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  551. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  552. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  553. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  554. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  555. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  556. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  557. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  558. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  559. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  560. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  561. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  562. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  563. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  564. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  565. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/base_snapshot_test_app.py +0 -0
  566. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/conftest.py +0 -0
  567. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/snap_compare.py +0 -0
  568. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  569. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  570. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  571. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  572. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  573. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  574. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  575. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  576. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  577. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  578. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  579. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  580. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  581. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  582. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/stubs/fake_backend.py +0 -0
  583. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/stubs/fake_client.py +0 -0
  584. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/stubs/fake_tool.py +0 -0
  585. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_admiral.py +0 -0
  586. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_admiral_phase3.py +0 -0
  587. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_admiral_proposed.py +0 -0
  588. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_admiral_struggle_dedup.py +0 -0
  589. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agent_auto_compact.py +0 -0
  590. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agent_backend.py +0 -0
  591. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agent_observer_streaming.py +0 -0
  592. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agent_stats.py +0 -0
  593. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agent_tasks.py +0 -0
  594. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agent_tool_call.py +0 -0
  595. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_agents.py +0 -0
  596. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_build.py +0 -0
  597. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_debug.py +0 -0
  598. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_multiagent.py +0 -0
  599. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_prd.py +0 -0
  600. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_prd_extended.py +0 -0
  601. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_tools.py +0 -0
  602. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_bank_update.py +0 -0
  603. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_build_projects.py +0 -0
  604. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_checkpoint.py +0 -0
  605. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_cli_programmatic_preload.py +0 -0
  606. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_current_bugs.py +0 -0
  607. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_drydock_regression.py +0 -0
  608. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_drydock_tasks.py +0 -0
  609. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  610. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_full_regression.py +0 -0
  611. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_hallucinated_tool_suppression.py +0 -0
  612. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_history_manager.py +0 -0
  613. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_integration.py +0 -0
  614. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_issue_fixes.py +0 -0
  615. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_message_id.py +0 -0
  616. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_message_merging.py +0 -0
  617. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_middleware.py +0 -0
  618. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_multi_agent.py +0 -0
  619. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_read_file_not_found_listing.py +0 -0
  620. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_real_failures.py +0 -0
  621. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_real_issues.py +0 -0
  622. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_real_workflow.py +0 -0
  623. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_reasoning_content.py +0 -0
  624. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_search_replace_args_not_truncated.py +0 -0
  625. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_smoke.py +0 -0
  626. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_system_prompt.py +0 -0
  627. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_tagged_text.py +0 -0
  628. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_task_complete_nudge.py +0 -0
  629. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_tool_args.py +0 -0
  630. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_truncate_args_valid_json.py +0 -0
  631. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_truncated_arg_path_hint.py +0 -0
  632. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_truncated_search_replace_escalation.py +0 -0
  633. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_truncated_write_escalation.py +0 -0
  634. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_ui_external_editor.py +0 -0
  635. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_ui_input_history.py +0 -0
  636. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_user_issues.py +0 -0
  637. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_wall_of_text_rescue.py +0 -0
  638. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_workloads.py +0 -0
  639. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/test_write_file_missing_path.py +0 -0
  640. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/testbank_helpers.py +0 -0
  641. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_ask_user_question.py +0 -0
  642. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_bash.py +0 -0
  643. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_exit_plan_mode.py +0 -0
  644. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_grep.py +0 -0
  645. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_invoke_context.py +0 -0
  646. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  647. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_manager_get_tool_config.py +0 -0
  648. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_mcp.py +0 -0
  649. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_mcp_sampling.py +0 -0
  650. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  651. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_read_file_directory.py +0 -0
  652. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_read_file_limit_truncation.py +0 -0
  653. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_append_fallback.py +0 -0
  654. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_dir_path.py +0 -0
  655. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_empty_content.py +0 -0
  656. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_hard_stop.py +0 -0
  657. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_malformed_block.py +0 -0
  658. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  659. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  660. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_task.py +0 -0
  661. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_ui_bash_execution.py +0 -0
  662. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_webfetch.py +0 -0
  663. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_websearch.py +0 -0
  664. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  665. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  666. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  667. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  668. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_do_update.py +0 -0
  669. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  670. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_github_update_gateway.py +0 -0
  671. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  672. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_ui_update_notification.py +0 -0
  673. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_update_use_case.py +0 -0
  674. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/tests/update_notifier/test_whats_new.py +0 -0
  675. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/worked_examples/README.md +0 -0
  676. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/worked_examples/cli_subcommand_dispatch.py +0 -0
  677. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/worked_examples/lookup.json +0 -0
  678. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/worked_examples/sql_parser.py +0 -0
  679. {drydock_cli-2.7.27 → drydock_cli-2.7.28}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2010664
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.27
3
+ Version: 2.7.28
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -2414,7 +2414,8 @@ class AgentLoop:
2414
2414
  # edit that already succeeded or that keeps failing with the same
2415
2415
  # "not found" error. Nudge after just 2 identical attempts.
2416
2416
  recent_sr: list[str] = []
2417
- for msg in reversed(self.messages[-20:]):
2417
+ recent_sr_files: list[str] = []
2418
+ for msg in reversed(self.messages[-30:]):
2418
2419
  if msg.role == Role.assistant and msg.tool_calls:
2419
2420
  for tc in msg.tool_calls:
2420
2421
  if tc.function and tc.function.name == "search_replace":
@@ -2423,12 +2424,27 @@ class AgentLoop:
2423
2424
  # Build a key from file_path + old_string (content block)
2424
2425
  key = f"{args.get('file_path', '')}:{args.get('content', '')}"
2425
2426
  recent_sr.append(key)
2427
+ recent_sr_files.append(args.get("file_path", ""))
2426
2428
  except (json.JSONDecodeError, AttributeError):
2427
2429
  pass
2428
- if len(recent_sr) >= 4:
2430
+ if len(recent_sr) >= 6:
2429
2431
  break
2430
2432
  if len(recent_sr) >= 2 and recent_sr[0] == recent_sr[1]:
2431
2433
  return "WARNING|search_replace"
2434
+ # Detect when 5+ search_replace calls target the same file with
2435
+ # varying search text (model adapts after HARD-STOP but still
2436
+ # cannot find the right text). The per-file fail counter in
2437
+ # search_replace.py escalates at count 3 — this adds a
2438
+ # loop-detection layer that fires FORCE_STOP when the same file
2439
+ # dominates 5 of the last 6 search_replace calls.
2440
+ if len(recent_sr_files) >= 5:
2441
+ from collections import Counter as _SRCounter
2442
+ _sr_counts = _SRCounter(f for f in recent_sr_files if f)
2443
+ if _sr_counts:
2444
+ _top_sr_file, _top_sr_count = _sr_counts.most_common(1)[0]
2445
+ if _top_sr_count >= 5:
2446
+ self._hot_tool_path = ("search_replace", _top_sr_file)
2447
+ return "FORCE_STOP"
2432
2448
 
2433
2449
  # Early check: write_file with _truncated args twice in a row for the
2434
2450
  # same path. format.py already embeds the file content in the error,
@@ -2454,6 +2470,34 @@ class AgentLoop:
2454
2470
  self._hot_tool_path = ("write_file", recent_wf_truncated[0])
2455
2471
  return "FORCE_STOP"
2456
2472
 
2473
+ # Early check: same bash command 5+ times across last 20 tool calls.
2474
+ # Catches alternating bash/read_file exploration loops where neither
2475
+ # the consecutive-N check nor the 9/12 path-dominance check fires
2476
+ # (because bash and read_file alternate, keeping bash below 9/12).
2477
+ _bash_cmds: list[str] = []
2478
+ _total_tc = 0
2479
+ for _msg in reversed(self.messages[-40:]):
2480
+ if _msg.role == Role.assistant and _msg.tool_calls:
2481
+ for _tc in _msg.tool_calls:
2482
+ _total_tc += 1
2483
+ if _tc.function and _tc.function.name == "bash":
2484
+ try:
2485
+ _a = json.loads(_tc.function.arguments or "{}")
2486
+ _cmd = _a.get("command", "")
2487
+ if _cmd:
2488
+ _bash_cmds.append(_cmd)
2489
+ except (json.JSONDecodeError, AttributeError):
2490
+ pass
2491
+ if _total_tc >= 20:
2492
+ break
2493
+ if len(_bash_cmds) >= 5:
2494
+ from collections import Counter as _Counter
2495
+ _cmd_counts = _Counter(_bash_cmds)
2496
+ _top_cmd, _top_count = _cmd_counts.most_common(1)[0]
2497
+ if _top_count >= 5:
2498
+ self._hot_tool_path = ("bash", _top_cmd)
2499
+ return "FORCE_STOP"
2500
+
2457
2501
  sigs: list[str] = []
2458
2502
  tool_names: list[str] = []
2459
2503
  lookback = 0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.27"
3
+ version = "2.7.28"
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"
@@ -347,6 +347,96 @@ class TestAlternatingPattern:
347
347
  assert result is None or "FORCE_STOP" not in result
348
348
 
349
349
 
350
+ # ============================================================================
351
+ # Bash Exploration Loop (same command alternating with other tools)
352
+ # ============================================================================
353
+
354
+ class TestBashExplorationLoop:
355
+ """Same bash command 5+ times across 20 tool calls triggers FORCE_STOP."""
356
+
357
+ def test_alternating_bash_read_triggers(self):
358
+ """bash(same_cmd) + read_file(different) alternating 10x → FORCE_STOP."""
359
+ al = _make_agent()
360
+ cmd = "python3 -m tool_agent --list-tools"
361
+ for i in range(10):
362
+ if i % 2 == 0:
363
+ _add_tool_call(al, "bash", json.dumps({"command": cmd}))
364
+ else:
365
+ _add_tool_call(al, "read_file", json.dumps({"path": f"file_{i}.py"}))
366
+ result = al._check_tool_call_repetition()
367
+ assert result == "FORCE_STOP"
368
+ assert getattr(al, "_hot_tool_path", None) == ("bash", cmd)
369
+
370
+ def test_5_identical_bash_triggers(self):
371
+ """5 identical bash calls in a row → FORCE_STOP."""
372
+ al = _make_agent()
373
+ cmd = "python3 -m tool_agent --list-tools"
374
+ for _ in range(5):
375
+ _add_tool_call(al, "bash", json.dumps({"command": cmd}))
376
+ result = al._check_tool_call_repetition()
377
+ assert result == "FORCE_STOP"
378
+
379
+ def test_4_identical_bash_no_trigger(self):
380
+ """4 identical bash calls should not trigger (below threshold)."""
381
+ al = _make_agent()
382
+ cmd = "python3 app.py"
383
+ for _ in range(4):
384
+ _add_tool_call(al, "bash", json.dumps({"command": cmd}))
385
+ result = al._check_tool_call_repetition()
386
+ # Should not trigger the bash-exploration check
387
+ assert result != "FORCE_STOP"
388
+
389
+ def test_varied_bash_no_trigger(self):
390
+ """Different bash commands should not trigger."""
391
+ al = _make_agent()
392
+ cmds = ["ls -la", "cat README.md", "python3 app.py", "pwd", "echo hi"]
393
+ for cmd in cmds:
394
+ _add_tool_call(al, "bash", json.dumps({"command": cmd}))
395
+ result = al._check_tool_call_repetition()
396
+ assert result != "FORCE_STOP"
397
+
398
+
399
+ # ============================================================================
400
+ # Search/Replace File-Dominance Loop Detection
401
+ # ============================================================================
402
+
403
+ class TestSearchReplaceFileDominance:
404
+ """search_replace on same file 5+ times with varying content → FORCE_STOP."""
405
+
406
+ def test_five_sr_same_file_triggers(self):
407
+ """5 search_replace calls on same file (different search text) → FORCE_STOP."""
408
+ al = _make_agent()
409
+ for i in range(5):
410
+ _add_tool_call(
411
+ al, "search_replace",
412
+ json.dumps({"file_path": "tool_agent/cli.py", "content": f"text{i}"})
413
+ )
414
+ result = al._check_tool_call_repetition()
415
+ assert result == "FORCE_STOP"
416
+
417
+ def test_four_sr_same_file_no_trigger(self):
418
+ """4 search_replace on same file should not trigger."""
419
+ al = _make_agent()
420
+ for i in range(4):
421
+ _add_tool_call(
422
+ al, "search_replace",
423
+ json.dumps({"file_path": "tool_agent/cli.py", "content": f"text{i}"})
424
+ )
425
+ result = al._check_tool_call_repetition()
426
+ assert result != "FORCE_STOP"
427
+
428
+ def test_sr_different_files_no_trigger(self):
429
+ """search_replace spread across different files should not trigger."""
430
+ al = _make_agent()
431
+ for i in range(5):
432
+ _add_tool_call(
433
+ al, "search_replace",
434
+ json.dumps({"file_path": f"tool_agent/file{i}.py", "content": "text"})
435
+ )
436
+ result = al._check_tool_call_repetition()
437
+ assert result != "FORCE_STOP"
438
+
439
+
350
440
  # ============================================================================
351
441
  # Threshold Constants
352
442
  # ============================================================================
@@ -3,6 +3,16 @@
3
3
  Autonomous Claude Code review ticks while the user is away. Each tick appended
4
4
  chronologically. Cron-driven every 30 min from `/data3/drydock/scripts/autonomous_review.sh`.
5
5
 
6
+ ## 2026-05-01 12:34 UTC tick
7
+ - Stress: 1020/1658 (PID 675181, alive 21h25m, log stress_2000_v10_restart_1777561483.log; write rate 10% last 100 prompts — all current prompts are "Test: unit/fuzz/property/golden" type; model runs bash tests and reports, not creating new files; overall 20% write rate for this restart run)
8
+ - Write rate: 10% last 100 (expected for test-running block; 20% overall for this restart)
9
+ - Skip rate: 109 total skips (babysitter confirmed skip=76 at 12:00 UTC); FORCE-RESET recovering normally
10
+ - Admiral last 30 min: struggle:none firing every 60s (12:00-12:08 UTC) during "add storage backend" explore-without-write block (36-45 tool calls, model not responding to directives — known Gemma 4 limitation); also struggle:search_replace at 12:28-12:30; empty_after_tool:ralph_repo_index at 11:33 (one-off, model moved on); retry_after_error:write_file:truncated-history at 08:19 (model re-used truncated args, known pattern)
11
+ - vLLM 400s: 0
12
+ - GH issues: 0 open
13
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 on :8000 healthy; admiral_probe PID 4075121 on :8878 healthy; harness RSS 7-8GB (harness TUI terminal log at 608MB, not a drydock leak); v2.7.27 is latest tag
14
+ - Action this tick: no fix committed — system healthy; all observed admiral patterns are known (struggle:none is advisory-only limitation, retry_after_error handled by existing code, truncated-history errors expected from context compaction); no new actionable drydock bugs found
15
+
6
16
  ## 2026-05-01 11:33 UTC tick
7
17
  - Stress: 990/1658 (PID 675181, alive 19h26m, log stress_2000_v10_restart_1777561483.log; 311 entries this restart; block is "Test: unit/integration" prompts)
8
18
  - Write rate: 17% last 100 prompts (expected — current block is "Test: X" prompts; model runs bash tests and reports, not writing files; matches 09:33 and 07:31 ticks)
@@ -1350,3 +1360,64 @@ restarted, cron self-match bug fixed in this same session).
1350
1360
  - vLLM 400s: 0; llm_balancer healthy (PID 713929 on :8001, forwarding confirmed); GH issues: 0 open
1351
1361
  - TUI session session_20260501_093430_40e5bc06 stuck in search_replace struggle loop for ~30min; harness FORCE-RESET (ESC+/clear) cycling; session last modified 09:58 UTC so still alive; harness will auto-recover
1352
1362
  - Action this tick: no actionable drydock bugs found; all failure patterns are known model-behavior (struggle:search_replace, empty_after_tool); no commits
1363
+
1364
+ ## 2026-05-01 11:01 UTC tick
1365
+ - Stress: 998/1658 (60% complete), PID 675181 alive ~20h, log /tmp/stress_2000_v10_restart_1777561483.log, progressing on "Test:" prompt cluster
1366
+ - Write rate: 17% last 100 prompts (expected — test prompts where model reads/runs bash rather than writing files)
1367
+ - Admiral last 30 min: loop:bash (k_anonymity_golden_test.py repeated 3x, 10:28-10:30), struggle:none (22 tool calls w/o write, 7 interventions 10:54-11:01); all canned interventions firing; patterns are known model-behavior
1368
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up; GH issues: 0 open
1369
+ - Action this tick: no new drydock bugs found; all services healthy; no commits
1370
+
1371
+ ## 2026-05-01 11:30 UTC tick
1372
+ - Stress: 1006/1658 (61% complete), PID 675181 alive 20h+ (--resume-from-step 679 active restart log /tmp/stress_2000_v10_restart_1777561483.log)
1373
+ - Write rate: 14% last 100 prompts (expected — model in "Test:" prompt block; running bash for test prompts, no file writes)
1374
+ - Admiral last 30 min: 20x struggle:none (model making bash calls for test prompts without writing, each turn 30+ tool calls), 1x empty_after_tool:ralph_repo_index (hallucinated tool, already handled); all known patterns, no new types
1375
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy (verified via /v1/models); vLLM gemma4 container up; GH issues: 0 open
1376
+ - Action this tick: no actionable drydock bugs found; system healthy; no commits
1377
+
1378
+ ## 2026-05-01 13:03 UTC tick
1379
+ - Stress: 1027/1658 (62% complete), PID 675181 alive ~27h, writing to /tmp/stress_2000_v10_restart_1777561483.log (stress_log_path.txt is stale — still points to old Apr 26 log, not a drydock bug)
1380
+ - Write rate: 10% last 100 prompts (expected — harness in "Test:" prompt cluster; model runs bash to verify code rather than writing files)
1381
+ - Admiral last 2h: 19 interventions, all known patterns (struggle:none, struggle:search_replace, retry_after_error:search_replace, empty_after_tool:bash); no new unknown types
1382
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy (verified /v1/models); vLLM gemma4 container up; GH issues: 0 open
1383
+ - Action this tick: no actionable drydock bugs found; all services healthy; no commits
1384
+
1385
+ ## 2026-05-01 14:30 UTC tick
1386
+ - Stress: 1041/1658 (62.8%), PID 675181 alive ~23h, idx at 1041 per babysitter; 280 done, 78 skip, 4 timeout
1387
+ - Write rate: 10% last 100 (expected — harness deep in "Test:" prompt cluster; these prompts run tests not build files); 18% overall in current log
1388
+ - Admiral last 30 min: 29 interventions, all struggle:none (model repeatedly making 30-42 bash calls without writing on test prompts; loop_detection nudges but doesn't stop — expected behavior); 1x loop:bash at 13:56 UTC (python3 race_condition_test.py repeated 3x)
1389
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up; GH issues: 0 open
1390
+ - Action this tick: committed fix(loop-detection): new bash exploration loop check catches same bash command 5+ times in last 20 tool calls (alternating bash/read_file pattern). 4 regression tests pass; 40 total tests pass. Will ship in next auto-release.
1391
+
1392
+ ## 2026-05-01 14:31 UTC tick
1393
+ - Stress: 1051/1658 (63.4%), PID 675181 alive ~23.5h, log /tmp/stress_2000_v10_restart_1777561483.log; harness in "Test:" prompt cluster (Test: concurrency/race-condition/idempotency/rollback/snapshot prompts)
1394
+ - Write rate: 9% last 100 prompts (expected — model runs bash to execute existing test code rather than write new files; same test-prompt behavior as prior ticks)
1395
+ - Admiral last 5 min: continuous struggle:none starting 14:12 UTC; model at 36 bash calls on single session with 0 writes; canned interventions firing every ~1 min; no new unknown patterns
1396
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up 7 days; GH issues: 0 open
1397
+ - Action this tick: no new drydock bugs; 1 pending commit (cc0c467 loop-detection bash/read pattern) will ship at 18:00 UTC auto-release as v2.7.28; all services healthy
1398
+
1399
+ ## 2026-05-01 15:20 UTC tick
1400
+ - Stress: 1057/1658 (PID 675181, alive 23h55m, log stress_2000_v10_restart_1777561483.log)
1401
+ - Write rate: 11% last 100 prompts — current block is test-analysis prompts ("Test: snapshot/race-condition/idempotency for X"); model correctly runs existing tests and summarizes without writing; expected for this prompt type
1402
+ - SKIPs: 78 total (7.4% skip rate); concentrated in steps 800-899 (42 SKIPs); FORCE-RESET handling working; skip rate improved to 3/50 in steps 1000-1049
1403
+ - Admiral last 2h: 53 struggle:none (model exploring 35+ calls before analyzing test prompts — expected), 11 struggle:write_file (search_replace retry loops), 1 retry_after_error:bash; all known patterns, no new unrecognized patterns
1404
+ - vLLM 400s: 0
1405
+ - GH issues: 0 open
1406
+ - cc0c467 unreleased (bash-exploration loop detection); auto_release will ship as v2.7.28 at 18:00 UTC
1407
+ - Notable observation: "progressive grep funnel" pattern in session — model runs same grep 7-8 times with incremental | grep -v additions; not caught by cc0c467 (requires exact match); minor inefficiency, not blocking
1408
+ - Action this tick: no action — healthy. Low write rate is prompt-type artifact, not a drydock regression. Stress progressing normally.
1409
+
1410
+ ## 2026-05-01 15:32 UTC tick
1411
+ - Stress: 1066/1658 (64.3%), PID 675181 alive ~24h30m; log /tmp/stress_2000_v10_restart_1777561483.log; active prompt "Doc: changelog entry for E"; harness self-restored after brief v8/v9 internal restarts (false alarm — main process never died)
1412
+ - Write rate: 11% last 100 prompts (expected — in "Doc:" prompt block; model responds to documentation prompts with text or raw_md, not file writes)
1413
+ - Admiral last 30 min: continuous struggle:write_file (15:06–15:25 UTC), 59 tool calls without write, same directive firing every 60s — model ignoring advisory nudges; known model behavior per CLAUDE.md #2, not a new drydock bug
1414
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy (verified /v1/models); vLLM gemma4 container up; GH issues: 0 open
1415
+ - Action this tick: no actionable drydock bugs found; 1 unreleased commit (cc0c467 bash/read loop detection) will ship as v2.7.28 at 18:00 UTC auto-release; all services healthy; no commits
1416
+
1417
+ ## 2026-05-01 16:33 UTC tick
1418
+ - Stress: 1083/1658 (65.3% complete), PID 675181 alive 25h+, log /tmp/stress_2000_v10_restart_1777561483.log; harness in "Doc:" prompt block (Doc: changelog/release-notes/architecture-diagram/README prompts)
1419
+ - Write rate: 8% last 100 prompts (expected — model responds with text to documentation prompts; after session reset at step 1080 writes resumed at +5 and +7 per prompt; prompt-type artifact not regression)
1420
+ - Admiral last hour: 0 new interventions since 15:25 UTC; admiral probe confirmed alive (PID 4075121, 4+ days uptime; resume.md had stale PID 2251231); current sessions not triggering patterns
1421
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up; GH issues: 0 open
1422
+ - 2 unreleased commits (8ddf09d search_replace-dominates-file FORCE_STOP, cc0c467 bash/read alternating loop) will ship as v2.7.28 at 17:00 UTC auto_release
1423
+ - Action this tick: no new drydock bugs found; all services healthy; no commits
@@ -326,7 +326,7 @@ wheels = [
326
326
 
327
327
  [[package]]
328
328
  name = "drydock-cli"
329
- version = "2.7.26"
329
+ version = "2.7.27"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },
@@ -1 +0,0 @@
1
- 1632550
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes