drydock-cli 2.7.26__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.26 → drydock_cli-2.7.28}/PKG-INFO +1 -1
  3. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/detectors.py +7 -1
  4. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/agent_loop.py +46 -2
  5. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/pyproject.toml +1 -1
  6. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_admiral.py +24 -0
  7. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_loop_detection.py +90 -0
  8. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/trip_log.md +271 -0
  9. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/uv.lock +1 -1
  10. drydock_cli-2.7.26/.auto_release.lock +0 -1
  11. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.claude/scheduled_tasks.lock +0 -0
  12. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/CODEOWNERS +0 -0
  13. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  14. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  15. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/workflows/build-and-upload.yml +0 -0
  17. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/workflows/ci.yml +0 -0
  18. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/workflows/issue-labeler.yml +0 -0
  19. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.github/workflows/release.yml +0 -0
  20. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.gitignore +0 -0
  21. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.pre-commit-config.yaml +0 -0
  22. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.python-version +0 -0
  23. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.typos.toml +0 -0
  24. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.vscode/extensions.json +0 -0
  25. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.vscode/launch.json +0 -0
  26. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/.vscode/settings.json +0 -0
  27. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/AGENTS.md +0 -0
  28. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/Admiral.md +0 -0
  29. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/BASELINE_412.md +0 -0
  30. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/CHANGELOG.md +0 -0
  31. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/CLAUDE.md +0 -0
  32. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/CONTRIBUTING.md +0 -0
  33. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/DEPLOYMENT.md +0 -0
  34. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/Drydock_rebrand.md +0 -0
  35. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/LICENSE +0 -0
  36. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/MODEL_SHORTCOMINGS.md +0 -0
  37. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/NOTICE +0 -0
  38. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/OVERNIGHT_PROGRESS.md +0 -0
  39. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  40. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/PRD.md +0 -0
  41. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/README.md +0 -0
  42. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/action.yml +0 -0
  43. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/README.md +0 -0
  44. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results1.tsv +0 -0
  45. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results13.tsv +0 -0
  46. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results14.tsv +0 -0
  47. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results15.tsv +0 -0
  48. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results16.tsv +0 -0
  49. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results17.tsv +0 -0
  50. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results18.tsv +0 -0
  51. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results19.tsv +0 -0
  52. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results2.tsv +0 -0
  53. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results20.tsv +0 -0
  54. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results3.tsv +0 -0
  55. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results4.tsv +0 -0
  56. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results5.tsv +0 -0
  57. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results6.tsv +0 -0
  58. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results7.tsv +0 -0
  59. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results8.tsv +0 -0
  60. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results9.tsv +0 -0
  61. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/baseline_history/results_evolved_v1.tsv +0 -0
  62. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/distribution/zed/LICENSE +0 -0
  63. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/distribution/zed/extension.toml +0 -0
  64. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/distribution/zed/icons/mistral_vibe.svg +0 -0
  65. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/docs/README.md +0 -0
  66. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/docs/acp-setup.md +0 -0
  67. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/docs/proxy-setup.md +0 -0
  68. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/__init__.py +0 -0
  69. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/__init__.py +0 -0
  70. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/acp_agent_loop.py +0 -0
  71. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/acp_logger.py +0 -0
  72. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/entrypoint.py +0 -0
  73. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/__init__.py +0 -0
  74. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/base.py +0 -0
  75. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/bash.py +0 -0
  76. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/read_file.py +0 -0
  77. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/search_replace.py +0 -0
  78. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/todo.py +0 -0
  79. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/builtins/write_file.py +0 -0
  80. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/tools/session_update.py +0 -0
  81. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/acp/utils.py +0 -0
  82. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/__init__.py +0 -0
  83. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/detectors_proposed.py +0 -0
  84. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/history.py +0 -0
  85. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/interventions.py +0 -0
  86. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/llm_analyzer.py +0 -0
  87. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/metrics.py +0 -0
  88. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/opus_escalator.py +0 -0
  89. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/persistence.py +0 -0
  90. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/policy.py +0 -0
  91. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/proposer.py +0 -0
  92. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/stager.py +0 -0
  93. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/task_classifier.py +0 -0
  94. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/tuning.py +0 -0
  95. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/validator.py +0 -0
  96. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/admiral/worker.py +0 -0
  97. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/__init__.py +0 -0
  98. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/autocompletion/__init__.py +0 -0
  99. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/autocompletion/base.py +0 -0
  100. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/autocompletion/path_completion.py +0 -0
  101. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/autocompletion/slash_command.py +0 -0
  102. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/cli.py +0 -0
  103. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/clipboard.py +0 -0
  104. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/commands.py +0 -0
  105. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/entrypoint.py +0 -0
  106. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/history_manager.py +0 -0
  107. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  108. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  109. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  110. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/terminal_setup.py +0 -0
  111. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/__init__.py +0 -0
  112. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  113. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/app.py +0 -0
  114. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/app.tcss +0 -0
  115. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/external_editor.py +0 -0
  116. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  117. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  118. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  119. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  120. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  121. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  122. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  123. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  124. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  125. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  126. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  127. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  128. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  129. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  130. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  131. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  132. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  133. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  134. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  135. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  136. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  137. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  138. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  139. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  140. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  141. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  142. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  143. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  144. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  145. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  146. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  147. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  148. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  149. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  150. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  151. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  152. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  153. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/history.py +0 -0
  154. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  155. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/textual_ui/windowing/state.py +0 -0
  156. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/__init__.py +0 -0
  157. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  158. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  159. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  160. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  161. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  162. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/update.py +0 -0
  163. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/cli/update_notifier/whats_new.py +0 -0
  164. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/__init__.py +0 -0
  165. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/agents/__init__.py +0 -0
  166. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/agents/manager.py +0 -0
  167. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/agents/models.py +0 -0
  168. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/auth/__init__.py +0 -0
  169. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/auth/crypto.py +0 -0
  170. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/auth/github.py +0 -0
  171. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/__init__.py +0 -0
  172. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/completers.py +0 -0
  173. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  174. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  175. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  176. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  177. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  178. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/fuzzy.py +0 -0
  179. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/path_prompt.py +0 -0
  180. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  181. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/build_orchestrator.py +0 -0
  182. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/checkpoint.py +0 -0
  183. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/config/__init__.py +0 -0
  184. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/config/_settings.py +0 -0
  185. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/config/doctor.py +0 -0
  186. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/config/harness_files/__init__.py +0 -0
  187. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  188. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/config/harness_files/_paths.py +0 -0
  189. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/consultant.py +0 -0
  190. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/drydock_states.py +0 -0
  191. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/hooks.py +0 -0
  192. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/__init__.py +0 -0
  193. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/anthropic.py +0 -0
  194. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/base.py +0 -0
  195. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/factory.py +0 -0
  196. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/generic.py +0 -0
  197. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/mistral.py +0 -0
  198. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  199. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/backend/vertex.py +0 -0
  200. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/exceptions.py +0 -0
  201. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/format.py +0 -0
  202. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/message_utils.py +0 -0
  203. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/llm/types.py +0 -0
  204. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/logger.py +0 -0
  205. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/middleware.py +0 -0
  206. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/output_formatters.py +0 -0
  207. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/paths/__init__.py +0 -0
  208. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/paths/_drydock_home.py +0 -0
  209. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/paths/_local_config_walk.py +0 -0
  210. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/paths/conventions.py +0 -0
  211. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/plan_session.py +0 -0
  212. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/plugins.py +0 -0
  213. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/programmatic.py +0 -0
  214. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/__init__.py +0 -0
  215. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/builder.md +0 -0
  216. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/cli.md +0 -0
  217. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/compact.md +0 -0
  218. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/dangerous_directory.md +0 -0
  219. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/diagnostic.md +0 -0
  220. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/explore.md +0 -0
  221. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/gemma4.md +0 -0
  222. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/planner.md +0 -0
  223. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/project_context.md +0 -0
  224. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/prompts/tests.md +0 -0
  225. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/proxy_setup.py +0 -0
  226. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session/agent_memory.py +0 -0
  227. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session/checkpoints.py +0 -0
  228. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session/session_loader.py +0 -0
  229. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session/session_logger.py +0 -0
  230. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session/session_migration.py +0 -0
  231. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session/state_file.py +0 -0
  232. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/session_checker.py +0 -0
  233. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/skills/__init__.py +0 -0
  234. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/skills/manager.py +0 -0
  235. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/skills/models.py +0 -0
  236. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/skills/parser.py +0 -0
  237. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/slug.py +0 -0
  238. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/system_prompt.py +0 -0
  239. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/telemetry/__init__.py +0 -0
  240. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/telemetry/send.py +0 -0
  241. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/teleport/errors.py +0 -0
  242. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/teleport/git.py +0 -0
  243. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/teleport/nuage.py +0 -0
  244. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/teleport/teleport.py +0 -0
  245. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/teleport/types.py +0 -0
  246. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/base.py +0 -0
  247. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/_task_manager.py +0 -0
  248. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  249. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/bash.py +0 -0
  250. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/cron.py +0 -0
  251. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  252. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/glob_tool.py +0 -0
  253. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/grep.py +0 -0
  254. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  255. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/lsp.py +0 -0
  256. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  257. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  258. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/powershell.py +0 -0
  259. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  260. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  261. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  262. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  263. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  264. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  265. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  266. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  267. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  268. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  269. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  270. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  271. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  272. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  273. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/task.md +0 -0
  274. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  275. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  276. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  277. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  278. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  279. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  280. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  281. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/read_file.py +0 -0
  282. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/search_replace.py +0 -0
  283. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/task.py +0 -0
  284. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/todo.py +0 -0
  285. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/tool_search.py +0 -0
  286. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/webfetch.py +0 -0
  287. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/websearch.py +0 -0
  288. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/worktree.py +0 -0
  289. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/builtins/write_file.py +0 -0
  290. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/injection_guard.py +0 -0
  291. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/manager.py +0 -0
  292. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/mcp/__init__.py +0 -0
  293. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/mcp/registry.py +0 -0
  294. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/mcp/tools.py +0 -0
  295. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/mcp_sampling.py +0 -0
  296. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/ui.py +0 -0
  297. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/tools/utils.py +0 -0
  298. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/trusted_folders.py +0 -0
  299. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/types.py +0 -0
  300. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/core/utils.py +0 -0
  301. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/__init__.py +0 -0
  302. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/base.py +0 -0
  303. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/onboarding.tcss +0 -0
  304. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/__init__.py +0 -0
  305. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/api_key.py +0 -0
  306. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/choice.py +0 -0
  307. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/local_model.py +0 -0
  308. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/onboarding/screens/welcome.py +0 -0
  309. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  310. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  311. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/__init__.py +0 -0
  312. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/api-design/SKILL.md +0 -0
  313. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/audit-tests/SKILL.md +0 -0
  314. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/batch/SKILL.md +0 -0
  315. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/commit-code/SKILL.md +0 -0
  316. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/context-summary/SKILL.md +0 -0
  317. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/create-presentation/SKILL.md +0 -0
  318. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/deep-research/SKILL.md +0 -0
  319. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/deploy/SKILL.md +0 -0
  320. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/diff-review/SKILL.md +0 -0
  321. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/doc-gen/SKILL.md +0 -0
  322. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/explain-code/SKILL.md +0 -0
  323. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/explore-code/SKILL.md +0 -0
  324. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/fix-issue/SKILL.md +0 -0
  325. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/git-ops/SKILL.md +0 -0
  326. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/init-project/SKILL.md +0 -0
  327. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/investigate/SKILL.md +0 -0
  328. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/loop/SKILL.md +0 -0
  329. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/migrate/SKILL.md +0 -0
  330. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/perf-analyze/SKILL.md +0 -0
  331. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/plan-impl/SKILL.md +0 -0
  332. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/pr-review/SKILL.md +0 -0
  333. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/refactor/SKILL.md +0 -0
  334. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/regex-help/SKILL.md +0 -0
  335. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/review/SKILL.md +0 -0
  336. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/security-review/SKILL.md +0 -0
  337. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/ship/SKILL.md +0 -0
  338. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/simplify/SKILL.md +0 -0
  339. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/strong-tests/SKILL.md +0 -0
  340. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/skills/test-verify/SKILL.md +0 -0
  341. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock/whats_new.md +0 -0
  342. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock-acp.spec +0 -0
  343. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/drydock_terms.md +0 -0
  344. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/flake.lock +0 -0
  345. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/flake.nix +0 -0
  346. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/nohup.out +0 -0
  347. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/README.md +0 -0
  348. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/config_base.toml +0 -0
  349. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/config_best.toml +0 -0
  350. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/domain_spec.md +0 -0
  351. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/experimenter.py +0 -0
  352. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/kernel.py +0 -0
  353. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/mini_prd.md +0 -0
  354. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/mini_prompts.txt +0 -0
  355. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/proposer.py +0 -0
  356. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/research/results.tsv +0 -0
  357. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/resume.md +0 -0
  358. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/README.md +0 -0
  359. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/admiral_probe.py +0 -0
  360. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/audit_sampler.py +0 -0
  361. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/auto_generate_tests.py +0 -0
  362. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/auto_release.sh +0 -0
  363. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/auto_test_loop.sh +0 -0
  364. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/autonomous_review.sh +0 -0
  365. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/autonomous_review_prompt.md +0 -0
  366. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/backup.sh +0 -0
  367. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/bump_version.py +0 -0
  368. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/comprehensive_loop.py +0 -0
  369. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/deploy_to_github.sh +0 -0
  370. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/discover_cli_tools.sh +0 -0
  371. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/evolve_tests.py +0 -0
  372. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/gen_2000_prompts.py +0 -0
  373. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/install.sh +0 -0
  374. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/llm_balancer.py +0 -0
  375. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/mega_loop.py +0 -0
  376. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/meta_ralph_loop.py +0 -0
  377. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/monitor_swebench.sh +0 -0
  378. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/monitor_test_battery.sh +0 -0
  379. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/notify_release.py +0 -0
  380. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/oss_task_harness.py +0 -0
  381. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/overnight_agents_test.sh +0 -0
  382. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/poll_issues.sh +0 -0
  383. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/port_task.py +0 -0
  384. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/prepare_release.py +0 -0
  385. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/publish_to_pypi.sh +0 -0
  386. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/ralph_loop.py +0 -0
  387. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/research_babysitter.sh +0 -0
  388. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/session_loop_audit.py +0 -0
  389. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/shakedown.py +0 -0
  390. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/shakedown_interactive.py +0 -0
  391. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/shakedown_regression.sh +0 -0
  392. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/shakedown_suite.sh +0 -0
  393. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/shakedown_variance.sh +0 -0
  394. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_babysitter.sh +0 -0
  395. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_prompts_50.txt +0 -0
  396. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_prompts_realuser.txt +0 -0
  397. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_prompts_tool_agent.txt +0 -0
  398. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  399. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_shakedown.py +0 -0
  400. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_telegram_status.py +0 -0
  401. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/stress_watcher.py +0 -0
  402. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/telegram_bot.py +0 -0
  403. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/test_bank.sh +0 -0
  404. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/test_full.sh +0 -0
  405. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/test_smoke.sh +0 -0
  406. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/test_tui_path.py +0 -0
  407. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/tui_test.py +0 -0
  408. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/scripts/vllm_failover.sh +0 -0
  409. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/test/project/dummy +0 -0
  410. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/__init__.py +0 -0
  411. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/conftest.py +0 -0
  412. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_acp.py +0 -0
  413. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_agent_thought.py +0 -0
  414. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_bash.py +0 -0
  415. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_compact_session_updates.py +0 -0
  416. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_content.py +0 -0
  417. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_initialize.py +0 -0
  418. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_list_sessions.py +0 -0
  419. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_load_session.py +0 -0
  420. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_multi_session.py +0 -0
  421. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_new_session.py +0 -0
  422. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_proxy_setup_acp.py +0 -0
  423. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_read_file.py +0 -0
  424. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_search_replace.py +0 -0
  425. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_set_config_option.py +0 -0
  426. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_set_mode.py +0 -0
  427. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_set_model.py +0 -0
  428. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_tool_call_session_update.py +0 -0
  429. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_utils.py +0 -0
  430. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/acp/test_write_file.py +0 -0
  431. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_file_indexer.py +0 -0
  432. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_fuzzy.py +0 -0
  433. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  434. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  435. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_path_completion_controller.py +0 -0
  436. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  437. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_slash_command_controller.py +0 -0
  438. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  439. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/__init__.py +0 -0
  440. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/data/__init__.py +0 -0
  441. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/data/fireworks.py +0 -0
  442. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/data/mistral.py +0 -0
  443. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/test_anthropic_adapter.py +0 -0
  444. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/test_backend.py +0 -0
  445. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  446. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/test_reasoning_adapter.py +0 -0
  447. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  448. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  449. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  450. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  451. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_bell_notifications.py +0 -0
  452. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_braille_renderer.py +0 -0
  453. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_clipboard.py +0 -0
  454. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_commands.py +0 -0
  455. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_copy_shortcuts.py +0 -0
  456. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_external_editor.py +0 -0
  457. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_no_markup_static.py +0 -0
  458. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_question_app.py +0 -0
  459. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_spinner.py +0 -0
  460. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_switching_mode.py +0 -0
  461. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  462. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  463. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_ui_session_resume.py +0 -0
  464. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/test_ui_skill_dispatch.py +0 -0
  465. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/textual_ui/__init__.py +0 -0
  466. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/cli/textual_ui/test_session_picker.py +0 -0
  467. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/conftest.py +0 -0
  468. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_agents.py +0 -0
  469. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_auth_crypto.py +0 -0
  470. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_auth_github.py +0 -0
  471. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  472. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  473. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_config_load_dotenv.py +0 -0
  474. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_config_paths.py +0 -0
  475. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_config_resolution.py +0 -0
  476. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_file_logging.py +0 -0
  477. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_plan_session.py +0 -0
  478. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_proxy_setup.py +0 -0
  479. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_slug.py +0 -0
  480. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_telemetry_send.py +0 -0
  481. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_teleport_git.py +0 -0
  482. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_teleport_nuage.py +0 -0
  483. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_teleport_service.py +0 -0
  484. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_trusted_folders.py +0 -0
  485. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/core/test_utils.py +0 -0
  486. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/e2e/common.py +0 -0
  487. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/e2e/conftest.py +0 -0
  488. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/e2e/mock_server.py +0 -0
  489. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  490. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/e2e/test_cli_tui_streaming.py +0 -0
  491. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  492. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/fixtures/doc_qa_system_prd.md +0 -0
  493. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/mock/__init__.py +0 -0
  494. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/mock/mock_backend_factory.py +0 -0
  495. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/mock/mock_entrypoint.py +0 -0
  496. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/mock/utils.py +0 -0
  497. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/onboarding/test_run_onboarding.py +0 -0
  498. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/onboarding/test_ui_onboarding.py +0 -0
  499. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/session/test_session_loader.py +0 -0
  500. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/session/test_session_logger.py +0 -0
  501. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/session/test_session_migration.py +0 -0
  502. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/skills/conftest.py +0 -0
  503. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/skills/test_manager.py +0 -0
  504. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/skills/test_models.py +0 -0
  505. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/skills/test_parser.py +0 -0
  506. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  507. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  508. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  509. {drydock_cli-2.7.26 → 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
  510. {drydock_cli-2.7.26 → 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
  511. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  512. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  513. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  514. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  515. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  516. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  517. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  518. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  519. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  520. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  521. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  522. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  523. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  524. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  525. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  526. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  527. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  528. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  529. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  530. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  531. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  532. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  533. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  534. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  535. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  536. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  537. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  538. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  539. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  540. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  541. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  542. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  543. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  544. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  545. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  546. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  547. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  548. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  549. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  550. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  551. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  552. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  553. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  554. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  555. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  556. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  557. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  558. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  559. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  560. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  561. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  562. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  563. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  564. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  565. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  566. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/base_snapshot_test_app.py +0 -0
  567. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/conftest.py +0 -0
  568. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/snap_compare.py +0 -0
  569. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  570. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  571. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  572. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  573. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  574. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  575. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  576. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  577. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  578. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  579. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  580. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  581. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  582. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  583. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/stubs/fake_backend.py +0 -0
  584. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/stubs/fake_client.py +0 -0
  585. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/stubs/fake_tool.py +0 -0
  586. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_admiral_phase3.py +0 -0
  587. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_admiral_proposed.py +0 -0
  588. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_admiral_struggle_dedup.py +0 -0
  589. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agent_auto_compact.py +0 -0
  590. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agent_backend.py +0 -0
  591. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agent_observer_streaming.py +0 -0
  592. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agent_stats.py +0 -0
  593. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agent_tasks.py +0 -0
  594. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agent_tool_call.py +0 -0
  595. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_agents.py +0 -0
  596. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_build.py +0 -0
  597. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_debug.py +0 -0
  598. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_multiagent.py +0 -0
  599. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_prd.py +0 -0
  600. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_prd_extended.py +0 -0
  601. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_tools.py +0 -0
  602. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_bank_update.py +0 -0
  603. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_build_projects.py +0 -0
  604. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_checkpoint.py +0 -0
  605. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_cli_programmatic_preload.py +0 -0
  606. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_current_bugs.py +0 -0
  607. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_drydock_regression.py +0 -0
  608. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_drydock_tasks.py +0 -0
  609. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  610. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_full_regression.py +0 -0
  611. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_hallucinated_tool_suppression.py +0 -0
  612. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_history_manager.py +0 -0
  613. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_integration.py +0 -0
  614. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_issue_fixes.py +0 -0
  615. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_message_id.py +0 -0
  616. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_message_merging.py +0 -0
  617. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_middleware.py +0 -0
  618. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_multi_agent.py +0 -0
  619. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_read_file_not_found_listing.py +0 -0
  620. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_real_failures.py +0 -0
  621. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_real_issues.py +0 -0
  622. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_real_workflow.py +0 -0
  623. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_reasoning_content.py +0 -0
  624. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_search_replace_args_not_truncated.py +0 -0
  625. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_smoke.py +0 -0
  626. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_system_prompt.py +0 -0
  627. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_tagged_text.py +0 -0
  628. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_task_complete_nudge.py +0 -0
  629. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_tool_args.py +0 -0
  630. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_truncate_args_valid_json.py +0 -0
  631. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_truncated_arg_path_hint.py +0 -0
  632. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_truncated_search_replace_escalation.py +0 -0
  633. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_truncated_write_escalation.py +0 -0
  634. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_ui_external_editor.py +0 -0
  635. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_ui_input_history.py +0 -0
  636. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_user_issues.py +0 -0
  637. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_wall_of_text_rescue.py +0 -0
  638. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_workloads.py +0 -0
  639. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/test_write_file_missing_path.py +0 -0
  640. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/testbank_helpers.py +0 -0
  641. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_ask_user_question.py +0 -0
  642. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_bash.py +0 -0
  643. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_exit_plan_mode.py +0 -0
  644. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_grep.py +0 -0
  645. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_invoke_context.py +0 -0
  646. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  647. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_manager_get_tool_config.py +0 -0
  648. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_mcp.py +0 -0
  649. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_mcp_sampling.py +0 -0
  650. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  651. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_read_file_directory.py +0 -0
  652. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_read_file_limit_truncation.py +0 -0
  653. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_append_fallback.py +0 -0
  654. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_dir_path.py +0 -0
  655. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_empty_content.py +0 -0
  656. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_hard_stop.py +0 -0
  657. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_malformed_block.py +0 -0
  658. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  659. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  660. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_task.py +0 -0
  661. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_ui_bash_execution.py +0 -0
  662. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_webfetch.py +0 -0
  663. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_websearch.py +0 -0
  664. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  665. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  666. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  667. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  668. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_do_update.py +0 -0
  669. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  670. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_github_update_gateway.py +0 -0
  671. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  672. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_ui_update_notification.py +0 -0
  673. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_update_use_case.py +0 -0
  674. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/tests/update_notifier/test_whats_new.py +0 -0
  675. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/worked_examples/README.md +0 -0
  676. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/worked_examples/cli_subcommand_dispatch.py +0 -0
  677. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/worked_examples/lookup.json +0 -0
  678. {drydock_cli-2.7.26 → drydock_cli-2.7.28}/worked_examples/sql_parser.py +0 -0
  679. {drydock_cli-2.7.26 → 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.26
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
@@ -64,11 +64,17 @@ def detect_struggle(messages: Sequence[LLMMessage], threshold: int = 20) -> Find
64
64
  """Fires when `threshold` tool calls have happened without any write.
65
65
 
66
66
  Reading + grepping forever without writing code is the classic
67
- "stuck exploring" failure mode.
67
+ "stuck exploring" failure mode. Counter resets on each user turn so
68
+ test-only prompts (run tests, report results) don't accumulate across
69
+ turns and cause false positives.
68
70
  """
69
71
  calls_since_write = 0
70
72
  last_write_tool: str | None = None
71
73
  for m in messages:
74
+ if m.role == Role.user:
75
+ # Each new user prompt gives the model a fresh budget.
76
+ calls_since_write = 0
77
+ continue
72
78
  if m.role != Role.assistant or not m.tool_calls:
73
79
  continue
74
80
  for tc in m.tool_calls:
@@ -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.26"
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"
@@ -64,6 +64,30 @@ def test_struggle_resets_on_write() -> None:
64
64
  assert detect_struggle(msgs) is None
65
65
 
66
66
 
67
+ def test_struggle_resets_on_user_turn() -> None:
68
+ """Multiple test-only prompts must not accumulate into a false struggle."""
69
+ msgs: list[LLMMessage] = []
70
+ # 5 user prompts, each generating 8 bash calls (total 40 non-write calls)
71
+ for _ in range(5):
72
+ msgs.append(LLMMessage(role=Role.user, content="Test: run benchmarks"))
73
+ for _ in range(8):
74
+ msgs.append(_assistant("bash", '{"command":"python3 test.py"}'))
75
+ msgs.append(LLMMessage(role=Role.tool, content="ok"))
76
+ msgs.append(LLMMessage(role=Role.assistant, content="Tests passed."))
77
+ assert detect_struggle(msgs) is None
78
+
79
+
80
+ def test_struggle_still_fires_within_single_turn() -> None:
81
+ """A single turn with 25+ non-write calls still fires struggle."""
82
+ msgs: list[LLMMessage] = [LLMMessage(role=Role.user, content="implement feature X")]
83
+ for i in range(25):
84
+ msgs.append(_assistant("read_file", f'{{"path":"f{i}.py"}}'))
85
+ msgs.append(LLMMessage(role=Role.tool, content="..."))
86
+ f = detect_struggle(msgs)
87
+ assert f is not None
88
+ assert "without writing" in f.directive
89
+
90
+
67
91
  def test_run_all_returns_multiple_findings() -> None:
68
92
  msgs: list[LLMMessage] = []
69
93
  for i in range(25):
@@ -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,82 @@
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
+
16
+ ## 2026-05-01 11:33 UTC tick
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)
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)
19
+ - Skip rate: 75/311 = 24% (down from 33% last tick; TUI wedge on API/Test server prompts, FORCE-RESET recovering normally; no orphan processes on ports)
20
+ - Admiral last 30 min: 3 fires of loop:bash::k_anonymity_golden_test.py (10:28-10:30 UTC), 2 empty_after_tool:bash; no new retry_after_error:search_replace since 08:23 UTC
21
+ - vLLM 400s: 0
22
+ - GH issues: 0 open
23
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 healthy; admiral_probe PID 4075121 on :8878 healthy; current version v2.7.26 (latest tag)
24
+ - Action this tick: no fix committed — system healthy; write rate/skip rate consistent with prior ticks at "Test:" prompt block; search_replace LOOP-BREAKER and loop detection already in place for observed admiral patterns; no new actionable drydock bugs found
25
+
26
+ ## 2026-05-01 09:33 UTC tick
27
+ - Stress: 982/1658 (PID 675181, alive 18h29m, writing to stress_2000_v10_restart_1777561483.log; 303 entries this run; block is "Test: regression/smoke/performance/memory" prompts)
28
+ - Write rate: 17% last 100 prompts (expected — all current prompts are "Test: X" type; model runs bash tests and reports results, not writing files)
29
+ - Skip rate: 101/303 = 33% (TUI wedge pattern consistent with prior ticks; FORCE-RESET recovering; no orphan servers on :8001/:8000/:8878)
30
+ - Admiral last 30 min: 7 fires (all struggle:search_replace — model doing 20-21 tool calls without writing during a long search_replace session around 09:28-09:32 UTC; fixed by user-turn reset from 71cb046 for cross-turn accumulation but within-turn depth still fires normally)
31
+ - vLLM 400s: 0
32
+ - GH issues: 0 open
33
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 up 7 days healthy; admiral_probe PID 4075121 on :8878 healthy; current version v2.7.26; 1 commit ahead of latest tag (ships at next 0/6/12/18 auto-release)
34
+ - Action this tick: no fix committed — system healthy; write rate and skip rate consistent with prior ticks at same "Test:" prompt block; no new drydock bugs identified; harness progressing normally
35
+
36
+ ## 2026-05-01 07:31 UTC tick
37
+ - Stress: 950/1658 (PID 675181, alive 16h27m, log stress_2000_v10_restart_1777561483.log; 271 entries this run)
38
+ - Write rate: 21% last 100 prompts (expected — current block is "Test: fuzz/property/integration" prompts; model asks clarifying questions instead of writing, producing 0-writes responses; prompt-category effect, not regression)
39
+ - Skip rate: 68/271 = 25% (TUI wedge on API/server prompts, FORCE-RESET recovering; no orphan servers on ports 50051/8765/8080 at this tick — clean)
40
+ - Admiral last 30 min: 0 fires (model in text-response mode on Test: prompts, no tool-call loops observed)
41
+ - vLLM 400s: 0
42
+ - GH issues: 0 open
43
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 up 7 days; 1 commit ahead of latest tag (fix(admiral): reset struggle counter on each user turn — ships at next 0/6/12/18 auto-release)
44
+ - Action this tick: no fix committed — system healthy, no new drydock bugs identified; harness progressing; write rate and skip rate consistent with prior ticks at same prompt block
45
+
46
+ ## 2026-05-01 03:45 UTC tick
47
+ - Stress: 680/1658 (PID 675181, alive, resumed from step 679; currently in "Add storage backend: X" / "API: JSON-RPC" prompt block)
48
+ - Write rate: 32% last 100 prompts (low due to "Add storage backend: X" cluster — session already has implementations, model correctly returns 0 writes; prompt-category effect, not regression)
49
+ - Admiral last 30 min: loop:bash::{fuser -k 8765/tcp} x11 (01:00–01:10 UTC, ~10-min port-kill spiral); loop:bash::{fuser -k 8000/tcp} x1; loop:search_replace conflict markers x1; empty_after_tool:task x1; empty_after_tool:read_file x1; retry_after_error:write_file truncated-history x2 (03:18, 03:30 — existing escalation logic in format.py handles these); struggle:none x3; loop:bash memory_benchmark x3; retry_after_error:search_replace x1
50
+ - vLLM 400s: 0
51
+ - GH issues: 0 open
52
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 on :8000 healthy; admiral_probe PID 4075121 on :8878 healthy
53
+ - Action this tick: no fix committed — all observed patterns are known types; write rate drop is prompt-category effect; no new drydock bugs identified; harness alive and progressing
54
+
55
+ ## 2026-05-01 04:52 UTC tick
56
+ - Stress: 907/1658 (PID 675181, alive 14h25m, in "API surfaces" / "Test:" prompt block)
57
+ - Write rate: 26% last 100 prompts (expected — current block is "Test: integration test / fuzz test" which produce 0 writes; first 100 prompts in this log also showed 20%)
58
+ - Admiral top patterns overall: loop:read_file x302, loop:search_replace x234, loop:bash x181, struggle:none x92, retry_after_error:search_replace x75+71, empty_after_tool:ralph_repo_index x74 — all known, all handled; no new patterns
59
+ - vLLM 400s: 0 (last 30m)
60
+ - GH issues: 0 open
61
+ - Services: llm_balancer PID 713929 on :8001 healthy (auto-restarted from PID 1230765); vLLM gemma4 on :8000 healthy (0 JSONDecodeErrors); stress PID 675181 alive; current version v2.7.26
62
+ - Action this tick: no fix committed — system healthy, no actionable new bugs; write rate drop is prompt-category effect not regression; 32 total retry_after_error:write_file truncated-history fires across run (existing escalation logic handles each one); no drydock source changes needed
63
+
64
+ ## 2026-05-01 02:05 UTC tick
65
+ - Stress: 866/1658 (PID 675181, alive 11h, writing to stress_2000_v10_restart_1777561483.log; 187 entries this run; 84 SKIPs = 45% SKIP rate; currently stuck at "Test:" block — integration/fuzz/property test prompts causing TUI wedge; FORCE-RESET not unsticking; rec-check shows raw_md=1 but no API-error banner)
66
+ - Write rate: 24% this run (28/113 prompts with writes; "Test:" prompts tend to run bash rather than write files; also high SKIP rate artificially depresses metric)
67
+ - Admiral last 30 min: 11x loop:bash::{fuser -k 8765/tcp} (model looping on port-kill for orphaned WebSocket server — cleared by this tick); 1x loop:search_replace conflict markers; 1x loop:bash::fuser -k 8000/tcp; 1x empty_after_tool:task; 1x empty_after_tool:read_file; 1x retry_after_error:bash
68
+ - vLLM 400s: 0
69
+ - GH issues: 0 open
70
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 on :8000 healthy; RSS 3.3GB (babysitter threshold 4GB — not triggered); 11 orphan test server processes killed (PIDs 767439 on :8765 websocket_demo/server; 751293 751940 757659 758295 759238 764436 on :50051 gRPC servers)
71
+ - Action this tick: killed 7 orphan test server processes squatting ports 8765 and 50051; these were causing 11-minute loop:bash spirals as the model tried fuser -k 8765 to reclaim the port; no drydock source bug fix committed (TUI wedge at Test: prompts is harness-side recovery gap, not drydock source bug; all other patterns are known)
72
+
73
+ ## 2026-05-01 00:35 UTC tick
74
+ - Stress: 854/1658 (PID 675181, alive 9h25m, log stress_2000_v10_restart_1777561483.log; 174 prompts logged this run; harness in SKIP/FORCE-RESET cycle at current "API: SSE/gRPC" block — 50 total SKIPs and 19 FORCE-RESETs in log)
75
+ - Write rate: 21% last 100 prompts (same API: block pattern — gRPC bidi-streaming, WebSocket, SSE prompts; model runs server+client bash tests rather than writing new files; expected depression for this prompt category)
76
+ - Admiral last 30 min: empty_after_tool:bash firing every 15-20 min (model generates thinking-only response after long bash server/client commands; admiral intervenes each time; pattern is recurring but handled); struggle:none (2 fires); loop:search_replace and loop:bash (1 each); retry_after_error:write_file "truncated history" (1 — existing pattern, escalation logic in format.py handles it)
77
+ - vLLM 400s: 0
78
+ - GH issues: 0 open
79
+ - Services: llm_balancer PID 713929 on :8001 healthy (confirmed cmd match); vLLM gemma4 on :8000 healthy; admiral_probe PID 4075121 on :8878 healthy; RSS 3.0GB
80
+ - Action this tick: no fix committed — all observed patterns are known (empty_after_tool:bash, struggle:none, loop:search_replace); stress run progressing through hard API prompt block; no new drydock bugs identified; write rate drop is prompt-category effect, not regression
81
+
6
82
  ## 2026-04-30 17:55 UTC tick
7
83
  - Stress: 233/1658 in new run (PID 675181, --resume-from-step 679 but babysitter triggered a fresh wipe; log stress_2000_1777408317.log); 55 SKIPs (24%), 3 TIMEOUTs — elevated SKIP rate (was ~8%) is harness timing, not a drydock regression
8
84
  - Write rate: 19% last 100 prompts (expected for current prompt block — hash/cipher/math tools added via search_replace to existing files; metric only counts write_file, not search_replace edits)
@@ -12,6 +88,24 @@ chronologically. Cron-driven every 30 min from `/data3/drydock/scripts/autonomou
12
88
  - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 on :8000 healthy; killed 5 orphaned gRPC server processes (PIDs 737458,738127,738759,744524,745299) that were squatting on port 50051 — stress run spawned these as background servers but never cleaned up; port 50051 now clear
13
89
  - Action this tick: killed orphaned gRPC servers; no drydock source fix committed (SKIP rate is harness timing, not a code bug; write rate drop is metric artifact from prompt type)
14
90
 
91
+ ## 2026-04-30 23:32 UTC tick
92
+ - Stress: 843/1658 (PID 675181, alive 8h26m; same TUI session since 18:30 UTC — no new session dirs created in 5h, harness is reusing PID 675184 drydock process via /clear; harness RSS at 3.2GB and growing; 44/164 SKIPs this run = 27% SKIP rate in current log, elevated from prior ticks)
93
+ - Write rate: 20% last 100 prompts (current "API:" block — GraphQL/REST/gRPC prompts; model gives text explanations, few file writes; known prompt-type effect)
94
+ - Admiral last 30 min: not checked (budget limited)
95
+ - vLLM 400s: 0
96
+ - GH issues: 0 open
97
+ - Services: llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 on :8000 healthy; harness RSS 3.2GB (babysitter will warn but admiral threshold 4GB not reached)
98
+ - Action this tick: no fix committed — harness alive and progressing through API prompt block; high SKIP rate (27%) is post-reset TUI timing, not a drydock code bug; no new GitHub issues; nothing actionable found
99
+
100
+ ## 2026-04-30 23:02 UTC tick
101
+ - Stress: 838/1658 (PID 675181, alive 7h55m; 118 done, 40 SKIP, 0 TIMEOUT this run; babysitter restart at ~15:04 UTC, writing to stress_2000_v10_restart_1777561483.log)
102
+ - Write rate: 20% last 100 prompts (current batch is "API:" prompts — REST GET/POST, rate limiters, GraphQL endpoints; model explores/tests servers; metric depressed by server-start loops)
103
+ - Admiral last 30 min: loop:bash (pkill/restart rest_api_server pattern — orphan port squatting on model-spawned servers, known issue), loop:search_replace, struggle:none, empty_after_tool:bash/task — all known patterns, no new ones
104
+ - vLLM 400s: 0
105
+ - GH issues: 0 open
106
+ - Services: llm_balancer PID 713929 on :8001 healthy, vLLM gemma4 on :8000 healthy; RSS 3018MB (babysitter warns >2GB; admiral actuator threshold 4GB, not reached)
107
+ - Action this tick: no fix committed — infrastructure healthy, no new drydock bugs found; write rate drop is prompt-category effect (API server prompts harder for model)
108
+
15
109
  ## 2026-04-30 20:35 UTC tick
16
110
  - Stress: 812/1658 (PID 675181, alive 5h25m, writing to stress_2000_v10_restart_1777561483.log; 134 prompts this run, 107 done, 26 SKIP, 0 TIMEOUT; resume from step 679 by babysitter)
17
111
  - Write rate: 10% last 50 prompts (expected — currently in abstract "API:" prompt block: API versioning, rate limiters, REST/GraphQL endpoints; model explores 20-33 files before giving text responses; session reset at step 810 restored normal 4-write behavior for rate_limiter prompts after reset)
@@ -1150,3 +1244,180 @@ restarted, cron self-match bug fixed in this same session).
1150
1244
  - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy (restarted by keepalive cron at ~19:00 UTC); vLLM gemma4 on :8000 healthy; TUI RSS 422MB, harness RSS 2753MB (below 4GB threshold)
1151
1245
  - GH issues: 0 open
1152
1246
  - Action this tick: no new drydock bugs found. Both recent fixes active in source (4e49bbe task continuation nudge, 92e5b3f successful_test_runs reset). Stress harness is alive and progressing; high skip rate is API-section timing behavior, not a drydock code bug. No uncommitted fixes.
1247
+
1248
+ ## 2026-05-01 00:01 UTC tick
1249
+ - Stress: 849/1658 (PID 675181 alive 8h56m, writing to stress_2000_v10_restart_1777561483.log, sessions resetting every 15 prompts through API block)
1250
+ - Write rate: 21% last 100 prompts (API gRPC/REST/GraphQL section — model generates long text explanations, expected low write rate)
1251
+ - SKIP rate: 63/170 = 37% in current session (elevated vs ~8% baseline; API prompts cause long model output that delays TUI readiness; FORCE-RESETs are recovering correctly)
1252
+ - Admiral last 30 min: struggle:none at 23:47–23:48 UTC (model exploring gRPC structure without writing), all known patterns, no new failure modes
1253
+ - vLLM 400s: 0; llm_balancer on :8001 healthy; vLLM gemma4 on :8000 healthy; no exceptions in drydock.log; GH issues: 0 open
1254
+ - Action this tick: no drydock bugs found; v2.7.26 deployed with both fixes (task-tool nudge + successful_test_runs reset); high SKIP rate is API-section harness timing, not a source regression; no fix committed
1255
+
1256
+ ## 2026-05-01 01:20 UTC tick
1257
+ - Stress: 857/1658 (PID 675181 alive, etime=9h55m, resumed from step 679; log /tmp/stress_2000_v10_restart_1777561483.log)
1258
+ - Write rate: 21% last 100 prompts (API/WebSocket/gRPC/GraphQL section — model generates long text explanations for network-server prompts; expected low write rate)
1259
+ - SKIP rate: 76/178 = 43% in current session (elevated — TUI stuck on 300s bash timeouts from WebSocket server tests; FORCE-RESET recovering correctly; harness progressing)
1260
+ - Admiral last 30 min: empty_after_tool:bash recurring (~8 fires since 22:19 UTC); loop:bash at 01:00 UTC (fuser -k 8765/tcp WebSocket server loop); all handled by existing canned interventions, sessions recover
1261
+ - vLLM 400s: 0; llm_balancer on :8001 healthy (PID 713929, different from resume.md PID 1230765 — was restarted by keepalive cron); vLLM gemma4 on :8000 healthy; GH issues: 0 open
1262
+ - Action this tick: investigated empty_after_tool:bash pattern (recurring ~8x in 3h); traced to _ensure_assistant_after_tools filler being detected by admiral detector at start of new user turns — not a real stall, just housekeeping filler; sessions recover without code change needed. No new drydock bugs found; v2.7.26 current (ships both task-tool nudge + successful_test_runs reset fixes). No commits.
1263
+
1264
+ ## 2026-05-01 02:31 UTC tick
1265
+ - Stress: 871/1658 (PID 675181 alive, etime=11h25m; step 871 "Test: concurrency" section, +1 write — past the API/gRPC/WebSocket SKIP cluster)
1266
+ - Write rate: 22% last 100 prompts (API/server section — expected; step 871 showed +1 write, transitioning back to test prompts)
1267
+ - SKIP rate: 64/192 = 33% in this restart run (elevated but consistent with prior ticks for API section; FORCE-RESETs recovering correctly)
1268
+ - Admiral last 30 min: 2 fires (empty_after_tool:read_file at 02:02, empty_after_tool:bash at 02:22) — all known patterns, handled by canned interventions
1269
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; admiral_probe PID 4075121 on :8878 healthy; vLLM gemma4 on :8000 healthy; GH issues: 0 open
1270
+ - Action this tick: no new drydock bugs found; harness progressing normally through test-prompts section after API cluster; both v2.7.26 fixes active (task-tool nudge + successful_test_runs reset); no commits
1271
+
1272
+ ## 2026-05-01 02:35 UTC tick
1273
+ - Stress: 861/1658 (PID 675181 alive, etime=10h25m; currently stuck at step 861 with SKIP retries; 57/182 SKIPs = 31% in this restart run)
1274
+ - Write rate: 21% last 100 prompts (API/rate-limiter section — long conceptual text responses, expected)
1275
+ - SKIP rate elevated: TUI (PID 675184) is processing turn 11 on remote vLLM (192.168.50.21:8000) — request has been in-flight ~56 min; remote host confirmed alive (0.6s latency, test inference returns in <15s); vLLM shows 1 running request now. Likely large context at step 861 causing very long generation on remote host. Local vLLM idle since 01:34 UTC.
1276
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 round-robin healthy; both hosts up; orphan WebSocket server PID 767439 on :8765 present (from prior session, not impacting current run)
1277
+ - GH issues: 0 open
1278
+ - Action this tick: no drydock bugs found. Admiral last fires at 01:23 UTC (loop:bash fuser-k-8765, retry_after_error:bash — all known patterns, canned responses). Remote host processing long-running turn is benign — 300s socket timeout in balancer will recover if remote stalls. No commits.
1279
+
1280
+ ## 2026-05-01 03:02 UTC tick
1281
+ - Stress: 874/1658 (PID 675181 alive, etime=11h56m, writing to /tmp/stress_2000_v10_restart_1777561483.log; step 874 "Test: rollback test for I" with retry in progress)
1282
+ - Write rate: 23% last 100 prompts (test/API/concurrency section — model generates long text explanations, few file writes; expected low rate in this prompt cluster)
1283
+ - SKIP rate: 92/220 = 42% in current restart run (elevated but consistent with prior ticks for this section; FORCE-RESETs recovering correctly; harness progressing)
1284
+ - Admiral last 30 min: last fire at 01:48 UTC (empty_after_tool:task), quiet since — all known patterns, no new failure modes
1285
+ - vLLM 400s: 0; llm_balancer on :8001 healthy; vLLM gemma4 container up 7 days; no errors in today's drydock.log; GH issues: 0 open
1286
+ - Action this tick: no new drydock bugs found; v2.7.26 current; harness progressing normally through test-prompt cluster; no commits
1287
+
1288
+ ## 2026-05-01 03:36 UTC tick
1289
+ - Stress: 878/1658 (PID 675181 alive, etime=12h25m; log /tmp/stress_2000_v10_restart_1777561483.log)
1290
+ - Write rate: 25% last 100 prompts (test-writing prompt cluster — "Test: golden test for K" had TIMEOUT with 101 msgs, 15 writes)
1291
+ - SKIP rate: 67/196 = 34% in this restart run (consistent with prior ticks; 874 and 878 needed retries; 875-877 completed cleanly)
1292
+ - Admiral last 30 min: 2 fires (retry_after_error:write_file at 03:18 and 03:30 — truncated-history template; escalation logic in format.py already handles with file-content embed and escalating directives; no new failure modes)
1293
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up; raw_md=0 (TUI rendering clean); GH issues: 0 open
1294
+ - Action this tick: was reading wrong log file (/tmp/stress_2000_1777408317.log, stale); confirmed actual log via lsof; no drydock bugs found; v2.7.26 current; no commits
1295
+
1296
+ ## 2026-05-01 04:33 UTC tick
1297
+ - Stress: 890/1658 (PID 675181 alive, etime=13h26m, resuming from step 679 in /tmp/stress_2000_v10_restart_1777561483.log; 211 steps done since restart at ~15.7 steps/hr)
1298
+ - Write rate: 20% last 100 prompts (25% overall in current restart run — "Test: ..." and "API: ..." prompt cluster; 0-write results expected when model runs existing tests rather than writing new files)
1299
+ - SKIP rate: 67/211 = 32% (consistent with prior ticks; FORCE-RESETs recovering; harness progressing; elevated but not new pattern)
1300
+ - Admiral last fires: 04:05 UTC retry_after_error:write_file (truncated-history template, escalation logic in format.py handling), 04:19 UTC empty_after_tool:ralph_repo_index — all known patterns, no new failure modes
1301
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy (round-robin returns models list); vLLM gemma4 container up; GH issues: 0 open; v2.7.26 current
1302
+ - Action this tick: no new drydock bugs found; admiral shows same known patterns as prior ticks; all services healthy; no commits
1303
+
1304
+ ## 2026-05-01 05:21 UTC tick
1305
+ - Stress: 898/1658 (PID 675181 alive, etime=14h55m, resuming from step 679 in /tmp/stress_2000_v10_restart_1777561483.log; 219 steps done since restart)
1306
+ - Write rate: 23% last 100 prompts (Testing section — "Test: unit test", "Test: integration test" prompts; model runs existing tests rather than writing files; expected low write rate)
1307
+ - SKIP rate: 68/219 = 31% in this restart run (consistent with prior ticks; Test-section SKIP cluster around steps 863-869 recovered after session reset; steps 893-898 completing cleanly)
1308
+ - Admiral last 30 min: loop:search_replace at 04:46 and 04:53 UTC (<<<SEARCH loop on GrepTool and instruction block — both known patterns, canned interventions firing correctly); no new failure modes since 04:53 UTC
1309
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy (confirmed /data3/drydock/scripts/llm_balancer.py); admiral_probe PID 4075121 on :8878 healthy; vLLM gemma4 on :8000 healthy; GH issues: 0 open
1310
+ - Action this tick: no new drydock bugs found; all services healthy; retry_after_error:write_file (truncated-history template) pattern continues at ~3/hr during bad sessions — escalation logic in format.py already handles; no fix warranted. v2.7.26 current. No commits.
1311
+
1312
+ ## 2026-05-01 06:00 UTC tick
1313
+ - Stress: 918/1658 (PID 675181 alive, etime=14h55m, resuming from step 679; 239 steps done since last restart; current prompt cluster: "Test:" idempotency/rollback/snapshot/race/golden)
1314
+ - Write rate: 23% last 100 prompts (low but expected — "Test:" prompt block exercises existing code rather than writing new files)
1315
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up 7 days; GH issues: 0 open; v2.7.26 current
1316
+ - Action this tick: no new drydock bugs found; all services healthy; stress run progressing normally; no commits
1317
+
1318
+ ## 2026-05-01 06:35 UTC tick
1319
+ - Stress: 928/1658 (PID 675181, alive, 15h25m elapsed; currently in "Test:" prompt block — memory benchmark, concurrency, race condition prompts)
1320
+ - Write rate: 23% last 100 prompts (expected low — these are "Test:" prompts that run bash test files; no writes needed)
1321
+ - Admiral last 30 min: struggle:none x18, struggle:search_replace x12, empty_after_tool:bash x7 — bulk of struggle:none was false positives from test prompts accumulating tool calls across turns
1322
+ - vLLM 400s: 0
1323
+ - GH issues: 0 open
1324
+ - Action this tick: committed fix(admiral): reset struggle counter on each user turn — detect_struggle was accumulating calls_since_write across all messages, so 5 test prompts × 8 bash calls = 40 non-write calls triggered struggle:none every minute even when model was working correctly. Counter now resets on each user message. 2 regression tests added.
1325
+
1326
+ ## 2026-05-01 07:02 UTC tick
1327
+ - Stress: 938/1658 (PID 675181, alive 15:57 elapsed; TUI PID 675184 active; log /tmp/stress_shakedown_1777561484.tui.log growing normally — timezone CDT vs UTC caused false "log stalled" alarm)
1328
+ - Write rate: 22% last 100 prompts (expected: current prompt block is "Test: unit test / integration test / fuzz test / smoke test" vague prompts; model makes 20-31 tool calls reading files but rarely writes; admiral fires ~1/min "no writes" on these)
1329
+ - Admiral last 30 min: struggle:none firing repeatedly (~1/min) on "Test:" prompts — model explores deeply (20-31 tool calls) without writing test files; not a drydock code bug, model behavioral on vague test requests
1330
+ - vLLM 400s: 0
1331
+ - GH issues: 0 open
1332
+ - Action this tick: no fix committed — harness healthy, no actionable drydock bug found; write rate drop 74%→22% is prompt-category effect (test prompts vs build prompts), not regression
1333
+
1334
+ ## 2026-05-01 08:01 UTC tick
1335
+ - Stress: 960/1658 (PID 675181 alive, 16h55m elapsed; log /tmp/stress_2000_v10_restart_1777561483.log updating normally; prompt 960 "Test: golden test for K" in-flight)
1336
+ - Write rate: 20% last 100 prompts (expected — current block is "Test:" prompts, model responds with clarifying text or bash-only exploration; no file writes needed)
1337
+ - Admiral last 30 min: struggle:none fired repeatedly from 07:00-07:19 UTC on previous session (22-24 tool calls w/o write); session reset at 07:19 cleared it; new session quiet since
1338
+ - vLLM 400s: 0
1339
+ - GH issues: 0 open
1340
+ - Action this tick: no new drydock bugs found; all services healthy; no commits
1341
+
1342
+ ## 2026-05-01 08:31 UTC tick
1343
+ - Stress: 966/1658 (PID 675181 alive, 17h25m elapsed; log /tmp/stress_2000_v10_restart_1777561483.log; currently at "Test: smoke test for CLI C" prompt cluster)
1344
+ - Write rate: 23% last 100 prompts (expected — current block is "Test:" prompts; model reads and runs bash rather than writing files; 4 TIMEOUT events from integration/property test prompts with 58-84 msgs each)
1345
+ - Admiral last 30 min: single retry_after_error:search_replace:file at 08:09 UTC (model retried a failed search_replace on test_integ path; canned intervention fired correctly); no struggle:none false positives in current session (admiral counter reset fix 71cb046 working as intended)
1346
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; vLLM gemma4 container up; GH issues: 0 open; v2.7.26 current
1347
+ - Action this tick: no new drydock bugs found; all services healthy; no commits
1348
+
1349
+ ## 2026-05-01 08:30 UTC tick
1350
+ - Stress: 977/1658 (PID 675181 alive, 18h elapsed; log /tmp/stress_2000_v10_restart_1777561483.log; session reset at 975, now on "Test:" prompt cluster)
1351
+ - Write rate: 19% last 100 prompts (expected — entire range is "Test: unit/integration/fuzz/property/regression test" prompts; model runs bash to explore, rarely writes files; this matches prompt-type not a regression)
1352
+ - Admiral last 30 min: 1 retry_after_error:write_file (truncated history, model retried same call once then self-corrected); 2 retry_after_error:search_replace; 1 loop:search_replace (BaseTool class replacement); 107 interventions total today, all normal patterns
1353
+ - vLLM 400s: 0; GH issues: 0 open; 1 pending commit (71cb046 fix(admiral): reset struggle counter per user turn) ships at next 12:00 UTC auto-release as v2.7.27
1354
+ - Action this tick: no new drydock bugs found; stress healthy and progressing; no commits
1355
+
1356
+ ## 2026-05-01 10:01 UTC tick
1357
+ - Stress: 984/1658 (PID 675181 alive, 19h elapsed; babysitter reporting done=229 skip=72 at 10:00 UTC tick)
1358
+ - Write rate: 17% last 100 prompts (slight dip from 19% prior; same "Test:" prompt cluster, expected low-write range)
1359
+ - Admiral last 30 min: 6x struggle:search_replace (model making 20-28 read-only calls before attempting edits; count reaching 28 in one session), 2x empty_after_tool:bash; all canned interventions; no new unknown patterns
1360
+ - vLLM 400s: 0; llm_balancer healthy (PID 713929 on :8001, forwarding confirmed); GH issues: 0 open
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
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.25"
329
+ version = "2.7.27"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },
@@ -1 +0,0 @@
1
- 749372
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes