drydock-cli 2.7.36__tar.gz → 2.7.38__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 (744) hide show
  1. drydock_cli-2.7.38/.auto_release.lock +1 -0
  2. drydock_cli-2.7.38/.claude/scheduled_tasks.lock +1 -0
  3. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.gitignore +4 -0
  4. drydock_cli-2.7.38/HLE_PRD.md +193 -0
  5. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/PKG-INFO +1 -1
  6. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/classifier/rules.py +2 -2
  7. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/bash.py +110 -1
  8. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/pyproject.toml +1 -1
  9. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/autonomous_review_prompt.md +4 -0
  10. drydock_cli-2.7.38/scripts/consume_retrieval_queue.py +214 -0
  11. drydock_cli-2.7.38/scripts/hle_eval.py +526 -0
  12. drydock_cli-2.7.38/scripts/hle_eval_seed.jsonl +11 -0
  13. drydock_cli-2.7.38/tests/test_retrieval_consumer.py +178 -0
  14. drydock_cli-2.7.38/tests/tools/test_bash_consec_empty_search.py +81 -0
  15. drydock_cli-2.7.38/tests/tools/test_bash_empty_search_loop_breaker.py +77 -0
  16. drydock_cli-2.7.38/tests/tools/test_bash_heredoc_confirmation.py +76 -0
  17. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/trip_log.md +193 -0
  18. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/uv.lock +1 -1
  19. drydock_cli-2.7.36/.auto_release.lock +0 -1
  20. drydock_cli-2.7.36/.claude/scheduled_tasks.lock +0 -1
  21. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/CODEOWNERS +0 -0
  22. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  23. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  24. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/workflows/build-and-upload.yml +0 -0
  26. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/workflows/ci.yml +0 -0
  27. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/workflows/issue-labeler.yml +0 -0
  28. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.github/workflows/release.yml +0 -0
  29. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.perf_baseline_done +0 -0
  30. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.pre-commit-config.yaml +0 -0
  31. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.python-version +0 -0
  32. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.typos.toml +0 -0
  33. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.vscode/extensions.json +0 -0
  34. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.vscode/launch.json +0 -0
  35. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/.vscode/settings.json +0 -0
  36. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/AGENTS.md +0 -0
  37. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/Admiral.md +0 -0
  38. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/BASELINE_412.md +0 -0
  39. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/CHANGELOG.md +0 -0
  40. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/CLAUDE.md +0 -0
  41. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/CONTRIBUTING.md +0 -0
  42. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/DEPLOYMENT.md +0 -0
  43. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/Drydock_rebrand.md +0 -0
  44. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/JETSON_BENCH.md +0 -0
  45. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/LICENSE +0 -0
  46. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/MODEL_SHORTCOMINGS.md +0 -0
  47. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/NOTICE +0 -0
  48. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/OVERNIGHT_PROGRESS.md +0 -0
  49. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  50. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/PERF_SWEEP_PLAN.md +0 -0
  51. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/PRD.md +0 -0
  52. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/README.md +0 -0
  53. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/SOVEREIGN_PRD.md +0 -0
  54. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/TRIAGE_v1.md +0 -0
  55. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/action.yml +0 -0
  56. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/README.md +0 -0
  57. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results1.tsv +0 -0
  58. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results13.tsv +0 -0
  59. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results14.tsv +0 -0
  60. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results15.tsv +0 -0
  61. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results16.tsv +0 -0
  62. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results17.tsv +0 -0
  63. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results18.tsv +0 -0
  64. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results19.tsv +0 -0
  65. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results2.tsv +0 -0
  66. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results20.tsv +0 -0
  67. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results3.tsv +0 -0
  68. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results4.tsv +0 -0
  69. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results5.tsv +0 -0
  70. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results6.tsv +0 -0
  71. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results7.tsv +0 -0
  72. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results8.tsv +0 -0
  73. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results9.tsv +0 -0
  74. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/baseline_history/results_evolved_v1.tsv +0 -0
  75. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/distribution/zed/LICENSE +0 -0
  76. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/distribution/zed/extension.toml +0 -0
  77. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/distribution/zed/icons/mistral_vibe.svg +0 -0
  78. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/docs/README.md +0 -0
  79. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/docs/acp-setup.md +0 -0
  80. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/docs/proxy-setup.md +0 -0
  81. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/__init__.py +0 -0
  82. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/__init__.py +0 -0
  83. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/acp_agent_loop.py +0 -0
  84. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/acp_logger.py +0 -0
  85. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/entrypoint.py +0 -0
  86. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/__init__.py +0 -0
  87. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/base.py +0 -0
  88. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/builtins/bash.py +0 -0
  89. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/builtins/read_file.py +0 -0
  90. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/builtins/search_replace.py +0 -0
  91. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/builtins/todo.py +0 -0
  92. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/builtins/write_file.py +0 -0
  93. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/tools/session_update.py +0 -0
  94. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/acp/utils.py +0 -0
  95. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/__init__.py +0 -0
  96. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/detectors.py +0 -0
  97. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/detectors_proposed.py +0 -0
  98. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/history.py +0 -0
  99. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/interventions.py +0 -0
  100. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/llm_analyzer.py +0 -0
  101. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/metrics.py +0 -0
  102. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/opus_escalator.py +0 -0
  103. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/persistence.py +0 -0
  104. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/policy.py +0 -0
  105. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/proposer.py +0 -0
  106. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/stager.py +0 -0
  107. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/task_classifier.py +0 -0
  108. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/tuning.py +0 -0
  109. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/validator.py +0 -0
  110. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/admiral/worker.py +0 -0
  111. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/__init__.py +0 -0
  112. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/autocompletion/__init__.py +0 -0
  113. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/autocompletion/base.py +0 -0
  114. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/autocompletion/path_completion.py +0 -0
  115. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/autocompletion/slash_command.py +0 -0
  116. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/cli.py +0 -0
  117. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/clipboard.py +0 -0
  118. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/commands.py +0 -0
  119. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/entrypoint.py +0 -0
  120. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/history_manager.py +0 -0
  121. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  122. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  123. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  124. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/terminal_setup.py +0 -0
  125. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/__init__.py +0 -0
  126. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  127. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/app.py +0 -0
  128. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/app.tcss +0 -0
  129. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/external_editor.py +0 -0
  130. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  131. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  132. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  133. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  134. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  135. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  136. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  137. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  138. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  139. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  140. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  141. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  142. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  143. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  144. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  145. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  146. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  147. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  148. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  149. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  150. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  151. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  152. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  153. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  154. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  155. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  156. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  157. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  158. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  159. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  160. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  161. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  162. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  163. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  164. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  165. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  166. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  167. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/windowing/history.py +0 -0
  168. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  169. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/textual_ui/windowing/state.py +0 -0
  170. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/__init__.py +0 -0
  171. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  172. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  173. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  174. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  175. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  176. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/update.py +0 -0
  177. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/cli/update_notifier/whats_new.py +0 -0
  178. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/__init__.py +0 -0
  179. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/agent_loop.py +0 -0
  180. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/agents/__init__.py +0 -0
  181. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/agents/manager.py +0 -0
  182. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/agents/models.py +0 -0
  183. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/auth/__init__.py +0 -0
  184. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/auth/crypto.py +0 -0
  185. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/auth/github.py +0 -0
  186. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/__init__.py +0 -0
  187. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/completers.py +0 -0
  188. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  189. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  190. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  191. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  192. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  193. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/fuzzy.py +0 -0
  194. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/path_prompt.py +0 -0
  195. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  196. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/build_orchestrator.py +0 -0
  197. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/checkpoint.py +0 -0
  198. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/classifier/__init__.py +0 -0
  199. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/classifier/__main__.py +0 -0
  200. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/classifier/classifier.py +0 -0
  201. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/classifier/dispatcher.py +0 -0
  202. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/classifier/signal.py +0 -0
  203. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/__init__.py +0 -0
  204. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/_settings.py +0 -0
  205. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/doctor.py +0 -0
  206. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/harness_files/__init__.py +0 -0
  207. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  208. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/harness_files/_paths.py +0 -0
  209. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/config/local_detect.py +0 -0
  210. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/consultant.py +0 -0
  211. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/context_recovery.py +0 -0
  212. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/drydock_states.py +0 -0
  213. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/hooks.py +0 -0
  214. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/__init__.py +0 -0
  215. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/anthropic.py +0 -0
  216. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/base.py +0 -0
  217. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/factory.py +0 -0
  218. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/generic.py +0 -0
  219. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/mistral.py +0 -0
  220. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  221. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/backend/vertex.py +0 -0
  222. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/exceptions.py +0 -0
  223. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/format.py +0 -0
  224. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/message_utils.py +0 -0
  225. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/llm/types.py +0 -0
  226. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/logger.py +0 -0
  227. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/middleware.py +0 -0
  228. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/output_formatters.py +0 -0
  229. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/paths/__init__.py +0 -0
  230. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/paths/_drydock_home.py +0 -0
  231. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/paths/_local_config_walk.py +0 -0
  232. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/paths/conventions.py +0 -0
  233. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/plan_session.py +0 -0
  234. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/plugins.py +0 -0
  235. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/programmatic.py +0 -0
  236. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/__init__.py +0 -0
  237. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/builder.md +0 -0
  238. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/cli.md +0 -0
  239. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/compact.md +0 -0
  240. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/dangerous_directory.md +0 -0
  241. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/diagnostic.md +0 -0
  242. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/explore.md +0 -0
  243. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/gemma4.md +0 -0
  244. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/planner.md +0 -0
  245. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/project_context.md +0 -0
  246. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/prompts/tests.md +0 -0
  247. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/proxy_setup.py +0 -0
  248. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session/agent_memory.py +0 -0
  249. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session/checkpoints.py +0 -0
  250. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session/session_loader.py +0 -0
  251. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session/session_logger.py +0 -0
  252. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session/session_migration.py +0 -0
  253. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session/state_file.py +0 -0
  254. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/session_checker.py +0 -0
  255. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/skills/__init__.py +0 -0
  256. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/skills/manager.py +0 -0
  257. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/skills/models.py +0 -0
  258. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/skills/parser.py +0 -0
  259. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/slug.py +0 -0
  260. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/steering_hook.py +0 -0
  261. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/system_prompt.py +0 -0
  262. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/telemetry/__init__.py +0 -0
  263. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/telemetry/send.py +0 -0
  264. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/teleport/errors.py +0 -0
  265. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/teleport/git.py +0 -0
  266. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/teleport/nuage.py +0 -0
  267. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/teleport/teleport.py +0 -0
  268. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/teleport/types.py +0 -0
  269. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/base.py +0 -0
  270. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/_task_manager.py +0 -0
  271. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  272. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/cron.py +0 -0
  273. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  274. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/glob_tool.py +0 -0
  275. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/grep.py +0 -0
  276. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  277. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/lsp.py +0 -0
  278. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  279. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  280. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/powershell.py +0 -0
  281. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  282. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  283. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  284. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  285. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  286. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  287. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  288. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  289. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  290. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  291. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  292. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  293. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  294. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  295. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  296. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/task.md +0 -0
  297. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  298. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  299. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  300. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  301. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  302. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  303. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  304. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/read_file.py +0 -0
  305. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/retrieve.py +0 -0
  306. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/search_replace.py +0 -0
  307. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/task.py +0 -0
  308. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/todo.py +0 -0
  309. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/tool_search.py +0 -0
  310. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/webfetch.py +0 -0
  311. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/websearch.py +0 -0
  312. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/worktree.py +0 -0
  313. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/builtins/write_file.py +0 -0
  314. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/injection_guard.py +0 -0
  315. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/manager.py +0 -0
  316. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/mcp/__init__.py +0 -0
  317. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/mcp/registry.py +0 -0
  318. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/mcp/tools.py +0 -0
  319. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/mcp_sampling.py +0 -0
  320. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/ui.py +0 -0
  321. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/tools/utils.py +0 -0
  322. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/trusted_folders.py +0 -0
  323. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/types.py +0 -0
  324. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/core/utils.py +0 -0
  325. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/graphrag/__init__.py +0 -0
  326. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/graphrag/__main__.py +0 -0
  327. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/graphrag/code_indexer.py +0 -0
  328. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/graphrag/retriever.py +0 -0
  329. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/graphrag/storage.py +0 -0
  330. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/graphrag/text_indexer.py +0 -0
  331. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/__init__.py +0 -0
  332. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/base.py +0 -0
  333. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/onboarding.tcss +0 -0
  334. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/screens/__init__.py +0 -0
  335. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/screens/api_key.py +0 -0
  336. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/screens/choice.py +0 -0
  337. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/screens/local_model.py +0 -0
  338. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/onboarding/screens/welcome.py +0 -0
  339. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  340. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  341. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/__init__.py +0 -0
  342. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/api-design/SKILL.md +0 -0
  343. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/audit-tests/SKILL.md +0 -0
  344. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/batch/SKILL.md +0 -0
  345. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/commit-code/SKILL.md +0 -0
  346. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/context-summary/SKILL.md +0 -0
  347. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/create-presentation/SKILL.md +0 -0
  348. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/deep-research/SKILL.md +0 -0
  349. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/deploy/SKILL.md +0 -0
  350. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/diff-review/SKILL.md +0 -0
  351. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/doc-gen/SKILL.md +0 -0
  352. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/explain-code/SKILL.md +0 -0
  353. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/explore-code/SKILL.md +0 -0
  354. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/fix-issue/SKILL.md +0 -0
  355. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/git-ops/SKILL.md +0 -0
  356. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/init-project/SKILL.md +0 -0
  357. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/investigate/SKILL.md +0 -0
  358. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/loop/SKILL.md +0 -0
  359. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/migrate/SKILL.md +0 -0
  360. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/perf-analyze/SKILL.md +0 -0
  361. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/plan-impl/SKILL.md +0 -0
  362. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/pr-review/SKILL.md +0 -0
  363. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/refactor/SKILL.md +0 -0
  364. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/regex-help/SKILL.md +0 -0
  365. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/review/SKILL.md +0 -0
  366. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/security-review/SKILL.md +0 -0
  367. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/ship/SKILL.md +0 -0
  368. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/simplify/SKILL.md +0 -0
  369. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/strong-tests/SKILL.md +0 -0
  370. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/skills/test-verify/SKILL.md +0 -0
  371. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/__init__.py +0 -0
  372. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/__main__.py +0 -0
  373. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/applier.py +0 -0
  374. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/config.py +0 -0
  375. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/registry.py +0 -0
  376. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/sandbox.py +0 -0
  377. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/steering/vectors.py +0 -0
  378. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock/whats_new.md +0 -0
  379. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock-acp.spec +0 -0
  380. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/drydock_terms.md +0 -0
  381. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/flake.lock +0 -0
  382. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/flake.nix +0 -0
  383. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/nohup.out +0 -0
  384. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/perf_results/baseline_1777672181.json +0 -0
  385. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/perf_results/baseline_1777672218.json +0 -0
  386. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/perf_results/baseline_1777672322.json +0 -0
  387. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/perf_results/baseline_1777732278.json +0 -0
  388. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/perf_results/baseline_1777811293.json +0 -0
  389. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/perf_results/baseline_1777811401.json +0 -0
  390. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/README.md +0 -0
  391. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/config_base.toml +0 -0
  392. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/config_best.toml +0 -0
  393. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/domain_spec.md +0 -0
  394. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/experimenter.py +0 -0
  395. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/kernel.py +0 -0
  396. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/mini_prd.md +0 -0
  397. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/mini_prompts.txt +0 -0
  398. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/proposer.py +0 -0
  399. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/research/results.tsv +0 -0
  400. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/resume.md +0 -0
  401. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/README.md +0 -0
  402. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/admiral_probe.py +0 -0
  403. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/audit_sampler.py +0 -0
  404. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/auto_generate_tests.py +0 -0
  405. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/auto_release.sh +0 -0
  406. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/auto_test_loop.sh +0 -0
  407. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/autonomous_review.sh +0 -0
  408. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/backup.sh +0 -0
  409. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/bump_version.py +0 -0
  410. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/classify_pulse.sh +0 -0
  411. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/comprehensive_loop.py +0 -0
  412. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/deploy_to_github.sh +0 -0
  413. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/discover_cli_tools.sh +0 -0
  414. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/evolve_tests.py +0 -0
  415. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/gen_2000_prompts.py +0 -0
  416. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/install.sh +0 -0
  417. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/llm_balancer.py +0 -0
  418. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/mega_loop.py +0 -0
  419. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/meta_ralph_loop.py +0 -0
  420. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/monitor_swebench.sh +0 -0
  421. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/monitor_test_battery.sh +0 -0
  422. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/notify_release.py +0 -0
  423. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/oss_task_harness.py +0 -0
  424. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/overnight_agents_test.sh +0 -0
  425. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/perf_baseline_when_idle.sh +0 -0
  426. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/perf_sweep.py +0 -0
  427. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/poll_issues.sh +0 -0
  428. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/port_task.py +0 -0
  429. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/prepare_release.py +0 -0
  430. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/publish_to_pypi.sh +0 -0
  431. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/queue_top.py +0 -0
  432. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/ralph_loop.py +0 -0
  433. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/research_babysitter.sh +0 -0
  434. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/session_loop_audit.py +0 -0
  435. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/shakedown.py +0 -0
  436. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/shakedown_interactive.py +0 -0
  437. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/shakedown_regression.sh +0 -0
  438. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/shakedown_suite.sh +0 -0
  439. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/shakedown_variance.sh +0 -0
  440. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_babysitter.sh +0 -0
  441. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_prompts_50.txt +0 -0
  442. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_prompts_realuser.txt +0 -0
  443. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_prompts_tool_agent.txt +0 -0
  444. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  445. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_shakedown.py +0 -0
  446. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_telegram_status.py +0 -0
  447. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/stress_watcher.py +0 -0
  448. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/telegram_bot.py +0 -0
  449. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/test_bank.sh +0 -0
  450. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/test_full.sh +0 -0
  451. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/test_smoke.sh +0 -0
  452. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/test_tui_path.py +0 -0
  453. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/tui_test.py +0 -0
  454. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/scripts/vllm_failover.sh +0 -0
  455. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/test/project/dummy +0 -0
  456. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/__init__.py +0 -0
  457. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/conftest.py +0 -0
  458. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_acp.py +0 -0
  459. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_agent_thought.py +0 -0
  460. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_bash.py +0 -0
  461. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_compact_session_updates.py +0 -0
  462. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_content.py +0 -0
  463. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_initialize.py +0 -0
  464. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_list_sessions.py +0 -0
  465. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_load_session.py +0 -0
  466. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_multi_session.py +0 -0
  467. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_new_session.py +0 -0
  468. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_proxy_setup_acp.py +0 -0
  469. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_read_file.py +0 -0
  470. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_search_replace.py +0 -0
  471. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_set_config_option.py +0 -0
  472. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_set_mode.py +0 -0
  473. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_set_model.py +0 -0
  474. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_tool_call_session_update.py +0 -0
  475. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_utils.py +0 -0
  476. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/acp/test_write_file.py +0 -0
  477. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_file_indexer.py +0 -0
  478. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_fuzzy.py +0 -0
  479. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  480. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  481. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_path_completion_controller.py +0 -0
  482. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  483. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_slash_command_controller.py +0 -0
  484. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  485. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/__init__.py +0 -0
  486. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/data/__init__.py +0 -0
  487. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/data/fireworks.py +0 -0
  488. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/data/mistral.py +0 -0
  489. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/test_anthropic_adapter.py +0 -0
  490. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/test_backend.py +0 -0
  491. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  492. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/test_reasoning_adapter.py +0 -0
  493. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  494. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  495. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  496. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  497. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_bell_notifications.py +0 -0
  498. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_braille_renderer.py +0 -0
  499. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_clipboard.py +0 -0
  500. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_commands.py +0 -0
  501. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_copy_shortcuts.py +0 -0
  502. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_external_editor.py +0 -0
  503. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_no_markup_static.py +0 -0
  504. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_question_app.py +0 -0
  505. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_spinner.py +0 -0
  506. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_switching_mode.py +0 -0
  507. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  508. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  509. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_ui_session_resume.py +0 -0
  510. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/test_ui_skill_dispatch.py +0 -0
  511. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/textual_ui/__init__.py +0 -0
  512. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/cli/textual_ui/test_session_picker.py +0 -0
  513. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/conftest.py +0 -0
  514. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_agents.py +0 -0
  515. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_auth_crypto.py +0 -0
  516. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_auth_github.py +0 -0
  517. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  518. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  519. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_config_load_dotenv.py +0 -0
  520. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_config_paths.py +0 -0
  521. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_config_resolution.py +0 -0
  522. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_file_logging.py +0 -0
  523. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_plan_session.py +0 -0
  524. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_proxy_setup.py +0 -0
  525. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_slug.py +0 -0
  526. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_telemetry_send.py +0 -0
  527. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_teleport_git.py +0 -0
  528. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_teleport_nuage.py +0 -0
  529. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_teleport_service.py +0 -0
  530. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_trusted_folders.py +0 -0
  531. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/core/test_utils.py +0 -0
  532. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/e2e/common.py +0 -0
  533. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/e2e/conftest.py +0 -0
  534. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/e2e/mock_server.py +0 -0
  535. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  536. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/e2e/test_cli_tui_streaming.py +0 -0
  537. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  538. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/fixtures/doc_qa_system_prd.md +0 -0
  539. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/mock/__init__.py +0 -0
  540. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/mock/mock_backend_factory.py +0 -0
  541. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/mock/mock_entrypoint.py +0 -0
  542. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/mock/utils.py +0 -0
  543. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/onboarding/test_run_onboarding.py +0 -0
  544. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/onboarding/test_ui_onboarding.py +0 -0
  545. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/session/test_session_loader.py +0 -0
  546. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/session/test_session_logger.py +0 -0
  547. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/session/test_session_migration.py +0 -0
  548. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/skills/conftest.py +0 -0
  549. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/skills/test_manager.py +0 -0
  550. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/skills/test_models.py +0 -0
  551. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/skills/test_parser.py +0 -0
  552. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  553. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  554. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  555. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  556. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  557. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  558. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  559. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  560. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  561. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  562. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  563. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  564. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  565. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  566. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  567. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  568. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  569. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  570. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  571. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  572. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  573. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  574. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  575. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  576. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  577. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  578. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  579. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  580. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  581. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  582. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  583. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  584. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  585. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  586. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  587. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  588. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  589. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  590. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  591. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  592. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  593. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  594. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  595. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  596. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  597. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  598. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  599. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  600. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  601. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  602. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  603. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  604. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  605. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  606. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  607. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  608. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  609. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  610. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  611. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  612. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/base_snapshot_test_app.py +0 -0
  613. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/conftest.py +0 -0
  614. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/snap_compare.py +0 -0
  615. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  616. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  617. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  618. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  619. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  620. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  621. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  622. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  623. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  624. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  625. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  626. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  627. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  628. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  629. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/stubs/fake_backend.py +0 -0
  630. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/stubs/fake_client.py +0 -0
  631. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/stubs/fake_tool.py +0 -0
  632. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_admiral.py +0 -0
  633. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_admiral_phase3.py +0 -0
  634. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_admiral_proposed.py +0 -0
  635. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_admiral_struggle_dedup.py +0 -0
  636. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agent_auto_compact.py +0 -0
  637. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agent_backend.py +0 -0
  638. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agent_observer_streaming.py +0 -0
  639. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agent_stats.py +0 -0
  640. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agent_tasks.py +0 -0
  641. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agent_tool_call.py +0 -0
  642. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_agents.py +0 -0
  643. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_build.py +0 -0
  644. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_debug.py +0 -0
  645. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_multiagent.py +0 -0
  646. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_prd.py +0 -0
  647. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_prd_extended.py +0 -0
  648. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_tools.py +0 -0
  649. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_bank_update.py +0 -0
  650. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_build_projects.py +0 -0
  651. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_checkpoint.py +0 -0
  652. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_classifier.py +0 -0
  653. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_cli_programmatic_preload.py +0 -0
  654. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_context_recovery.py +0 -0
  655. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_current_bugs.py +0 -0
  656. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_dispatcher.py +0 -0
  657. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_drydock_regression.py +0 -0
  658. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_drydock_tasks.py +0 -0
  659. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  660. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_full_regression.py +0 -0
  661. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_graphrag.py +0 -0
  662. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_hallucinated_tool_suppression.py +0 -0
  663. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_history_manager.py +0 -0
  664. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_integration.py +0 -0
  665. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_issue_fixes.py +0 -0
  666. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_local_detect.py +0 -0
  667. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_loop_detection.py +0 -0
  668. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_message_id.py +0 -0
  669. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_message_merging.py +0 -0
  670. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_middleware.py +0 -0
  671. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_multi_agent.py +0 -0
  672. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_read_file_not_found_listing.py +0 -0
  673. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_real_failures.py +0 -0
  674. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_real_issues.py +0 -0
  675. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_real_workflow.py +0 -0
  676. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_reasoning_content.py +0 -0
  677. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_retrieve_tool.py +0 -0
  678. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_search_replace_args_not_truncated.py +0 -0
  679. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_smoke.py +0 -0
  680. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_steering.py +0 -0
  681. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_steering_hook.py +0 -0
  682. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_system_prompt.py +0 -0
  683. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_tagged_text.py +0 -0
  684. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_task_complete_nudge.py +0 -0
  685. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_tool_args.py +0 -0
  686. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_truncate_args_valid_json.py +0 -0
  687. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_truncated_arg_path_hint.py +0 -0
  688. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_truncated_search_replace_escalation.py +0 -0
  689. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_truncated_write_escalation.py +0 -0
  690. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_ui_external_editor.py +0 -0
  691. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_ui_input_history.py +0 -0
  692. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_user_issues.py +0 -0
  693. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_wall_of_text_rescue.py +0 -0
  694. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_workloads.py +0 -0
  695. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/test_write_file_missing_path.py +0 -0
  696. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/testbank_helpers.py +0 -0
  697. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_ask_user_question.py +0 -0
  698. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_bash.py +0 -0
  699. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  700. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  701. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  702. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  703. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_exit_plan_mode.py +0 -0
  704. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_grep.py +0 -0
  705. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  706. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_invoke_context.py +0 -0
  707. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  708. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_manager_get_tool_config.py +0 -0
  709. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_mcp.py +0 -0
  710. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_mcp_sampling.py +0 -0
  711. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  712. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  713. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_read_file_directory.py +0 -0
  714. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_read_file_limit_truncation.py +0 -0
  715. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_append_fallback.py +0 -0
  716. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_dir_path.py +0 -0
  717. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_empty_content.py +0 -0
  718. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_file_not_found.py +0 -0
  719. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  720. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_hard_stop.py +0 -0
  721. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_malformed_block.py +0 -0
  722. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  723. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_placeholder.py +0 -0
  724. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  725. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_task.py +0 -0
  726. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_ui_bash_execution.py +0 -0
  727. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_webfetch.py +0 -0
  728. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_websearch.py +0 -0
  729. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  730. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  731. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  732. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  733. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_do_update.py +0 -0
  734. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  735. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_github_update_gateway.py +0 -0
  736. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  737. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_ui_update_notification.py +0 -0
  738. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_update_use_case.py +0 -0
  739. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/tests/update_notifier/test_whats_new.py +0 -0
  740. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/worked_examples/README.md +0 -0
  741. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/worked_examples/cli_subcommand_dispatch.py +0 -0
  742. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/worked_examples/lookup.json +0 -0
  743. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/worked_examples/sql_parser.py +0 -0
  744. {drydock_cli-2.7.36 → drydock_cli-2.7.38}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2617636
@@ -0,0 +1 @@
1
+ {"sessionId":"31dea7d6-a654-4ba3-b084-169d213e9f36","pid":2530054,"procStart":"433206217","acquiredAt":1777842734259}
@@ -209,3 +209,7 @@ test_bank_results/
209
209
  research/staged/
210
210
  research/traces/
211
211
  research/STOP
212
+
213
+ # HLE eval outputs: per-run TUI logs, session symlinks, and copyrighted
214
+ # HLE dataset content. Never commit.
215
+ hle_results/
@@ -0,0 +1,193 @@
1
+ # HLE PRD — drydock + GraphRAG + Deep Noir vs Humanity's Last Exam
2
+
3
+ **Status as of 2026-05-04 00:40 UTC.** Update on resume.
4
+
5
+ ## Thesis
6
+
7
+ > drydock + GraphRAG + Deep Noir working together should be able to solve
8
+ > any problem.
9
+
10
+ HLE is the hardest possible PRD — explicitly designed to defeat frontier
11
+ models. Reaching a defensible local-26B score against it validates that
12
+ the three-leg architecture generalizes. Failures expose which leg is weak.
13
+
14
+ **Critical rule:** drydock IS the harness. Eval drives questions through
15
+ the real TUI. Never wrap the model directly. Every failure is a drydock-
16
+ or-leg bug to fix, not a harness limitation. See
17
+ `memory/feedback_drydock_is_the_harness.md`.
18
+
19
+ ## The three legs and their current strength
20
+
21
+ | Leg | What it owns | State | Evidence |
22
+ |-----|--------------|-------|----------|
23
+ | **drydock** | agent loop, tool use, prompts, harness fixes | **strongest** | 70% SWE-bench file match; 49/52 PRD functional tests; 16K+ harness queue actively drained |
24
+ | **GraphRAG** | factual recall over indexed code/text | **medium** | infra works (1842 symbols, 75 chunks); only cwd source ingested; **no general knowledge corpus** |
25
+ | **Deep Noir** | reasoning-mode steering | **weakest** | scaffolding shipped (`drydock/steering/`), `LogitBiasSteeringApplier` wired, hook in agent_loop; **zero vectors trained** — hook is a no-op |
26
+
27
+ ## Phase plan
28
+
29
+ ### Phase 1 — baseline (in flight)
30
+
31
+ Goal: bare drydock + bare GraphRAG (cwd only) + zero Deep Noir vs HLE.
32
+ This number is the floor.
33
+
34
+ - ✅ `scripts/hle_eval.py` — single-file orchestrator
35
+ - ✅ `scripts/hle_eval_seed.jsonl` — 7 undergrad questions for pipeline validation
36
+ - ✅ Pipeline validated: 7/7 = 100% on seed (commit 7c3a2d9 + earlier)
37
+ - ✅ HF token landed at `~/.config/drydock/hf_token` (chmod 600)
38
+ - ✅ HLE accessible: 2500 questions total, 2158 text-only, 342 multimodal (skipped)
39
+ - 🟡 **N=200 overnight baseline running** (PID in `/tmp/hle_overnight.pid`,
40
+ log `/tmp/hle_overnight.log`, results dir under `/data3/drydock/hle_results/`).
41
+ Started 2026-05-04 00:46 UTC (restarted with Telegram wiring).
42
+ Expected runtime ~10-16h based on q1's 6 min pace. Each question
43
+ writes a line to `results.jsonl` incrementally — partial progress
44
+ is always visible mid-run.
45
+ - 🟡 **Telegram pings configured** (commit ed7f6de, SOTA ref 45.9%):
46
+ start ping fired; milestone every 50 completions; final + breakdown
47
+ on completion; crash + resume command on error.
48
+ - ⏳ Phase 1 deliverable: a number — Gemma 4 + bare drydock baseline on HLE
49
+
50
+ Realistic baseline expectation per pre-run analysis:
51
+ - Bare 26B-A4B without retrieval/steering: ~5–10% on HLE
52
+ - Reaching ~22–25% would be defensible vs ~25–30% frontier scores
53
+
54
+ ### Phase 2 — GraphRAG with knowledge corpus
55
+
56
+ Goal: ingest enough general knowledge that retrieve answers fact-recall
57
+ questions. Re-run, measure delta.
58
+
59
+ - ⏳ Identify corpus (Wikipedia subset / arXiv abstracts / textbook chunks)
60
+ - ⏳ Extend `drydock/graphrag/code_indexer.py` ingest path for non-code text
61
+ (it already supports text via `text_indexer.py`; just needs corpus)
62
+ - ⏳ Bulk ingest into `~/.drydock/graphrag.sqlite`
63
+ - ⏳ Re-run HLE Phase 1 with corpus loaded; measure delta
64
+ - Expected delta: +3 to +7 points if corpus is good, +0 if not
65
+
66
+ ### Phase 3 — Deep Noir reasoning vectors
67
+
68
+ Goal: train activation-steering vectors on reasoning-failure pairs from
69
+ admiral_history; deposit into `~/.drydock/steering/vectors/`; the
70
+ existing hook applies them. This is the user's research domain.
71
+
72
+ - ⏳ Extract pairs from admiral_history (model-output / correct-intervention)
73
+ - ⏳ Train vectors per direction: "verify-before-answer", "show-work-explicitly",
74
+ "consider-units", "minimal-patch"
75
+ - ⏳ Deposit `.npy + .toml` per mode under `~/.drydock/steering/vectors/<mode>/`
76
+ - ⏳ Set `DRYDOCK_STEERING_MODES=<mode1>,<mode2>` env at TUI launch
77
+ - ⏳ Re-run HLE; measure delta vs Phase 2
78
+ - Expected delta: 0 to +3 points; high variance, open research
79
+
80
+ ## Currently running / in flight
81
+
82
+ | Thing | PID | Log | Notes |
83
+ |-------|-----|-----|-------|
84
+ | stress harness | `/tmp/stress_pid.txt` (was 2219727) | `/tmp/stress_*.log` | 1d 9h+ uptime, ~76% through 1658-prompt suite |
85
+ | llm_balancer | 2462362 (rotates) | `/data3/drydock/logs/balancer.log` | :8001, ~10h uptime |
86
+ | HLE N=200 overnight | `/tmp/hle_overnight.pid` (was 2567027) | `/tmp/hle_overnight.log` | output `/data3/drydock/hle_results/run_*/`; expected 10-16h |
87
+
88
+ ## Resume checklist (if connection dropped)
89
+
90
+ ```bash
91
+ # 1. Where are we?
92
+ date -u
93
+ git -C /data3/drydock log --oneline --since="6 hours ago"
94
+ git -C /data3/drydock describe --tags --abbrev=0 # current PyPI tag
95
+
96
+ # 2. HLE run status
97
+ ps -p $(cat /tmp/hle_overnight.pid 2>/dev/null) -o pid,etime,comm
98
+ ls /data3/drydock/hle_results/
99
+ tail -50 /tmp/hle_overnight.log
100
+ n_done=$(wc -l < /data3/drydock/hle_results/run_*/results.jsonl 2>/dev/null)
101
+ echo "completed: $n_done / 200"
102
+
103
+ # 3. If HLE crashed mid-flight, RESUME (skip already-done IDs)
104
+ RUN_DIR=$(ls -td /data3/drydock/hle_results/run_* | head -1)
105
+ nohup /home/bobef/miniconda3/bin/python3 /data3/drydock/scripts/hle_eval.py \
106
+ --source hle --limit 200 --shuffle --seed 42 --resume "$RUN_DIR" \
107
+ > /tmp/hle_resume.log 2>&1 &
108
+
109
+ # 4. If complete, see the score
110
+ cat /data3/drydock/hle_results/run_*/summary.json | python3 -m json.tool
111
+
112
+ # 5. Infra health
113
+ ps -p 2462362 -o pid,etime
114
+ curl -s --max-time 3 http://localhost:8001/v1/models | head -1
115
+ gh issue list --repo fbobe321/drydock --state open --limit 5
116
+ ```
117
+
118
+ ## Known issues + workarounds
119
+
120
+ 1. **`web_search` tool requires permission approval** by default
121
+ (`ToolPermission.ASK`). In batch eval the harness can't see/respond
122
+ to the prompt → session stalls. **Workaround:**
123
+ `--dangerously-skip-permissions` flag passed by `hle_eval.py`.
124
+ **Real fix:** auto-approve read-only tools when stdin is non-TTY
125
+ or `DRYDOCK_BATCH_MODE=1`. Memory:
126
+ `memory/project_hle_phase1_findings.md`.
127
+
128
+ 2. **TUI input handler corrupts rapid char-by-char multi-line pexpect
129
+ input.** Internal `\n` chars get partially eaten + spurious newlines
130
+ inserted on long prompts. **Workaround:** single-line prompts in
131
+ `hle_eval.py`. **Real fix:** debug `drydock/cli/textual_ui/` input
132
+ buffer.
133
+
134
+ 3. **Auto_release at 06:00/12:00/18:00/00:00 UTC overwrites site-packages.**
135
+ In-flight HLE runs survive (each new question is a fresh TUI spawn that
136
+ picks up the new binary), but if you direct-edit site-packages your
137
+ changes vanish. Always commit to source. Pause via:
138
+ `touch /data3/drydock/.pause_auto_release`.
139
+
140
+ 4. **PRD contamination: model edits `PRD.md` mid-session.** HLE doesn't
141
+ touch this — every HLE question gets a fresh empty cwd. Not a concern
142
+ for HLE; relevant for shakedown PRD runs.
143
+
144
+ 5. **Sessions take real time.** HLE questions involve web_search +
145
+ multi-step reasoning. Seed q's took 30-60s; HLE q's appear to take
146
+ 5+ min each (q1: 5 min in and still working). Expect N=20 to take
147
+ 1-2 hours, N=100 overnight.
148
+
149
+ ## Sentinels currently set
150
+
151
+ - `/data3/drydock_test_projects/.pause_watchdog` — watchdog cron paused
152
+ - `/data3/drydock/.pause_auto_release` — NOT set (auto_release is active)
153
+ - `/data3/drydock/research/STOP` — research loop sentinel (per gitignore)
154
+
155
+ ## Tomorrow morning's first action
156
+
157
+ If overnight run completed:
158
+ 1. `cat /data3/drydock/hle_results/run_*/summary.json` for the baseline number
159
+ 2. If <10%, the diagnosis is in the per-question `verdict` and `judge_reasoning`
160
+ fields. Sort by category to see if math/physics/CS dominate the failures.
161
+ 3. Commit the results JSON (with HLE content redacted to just IDs+verdicts —
162
+ never commit the question text per HLE license).
163
+ 4. Decide Phase 2 corpus based on category distribution of failures.
164
+
165
+ If overnight run crashed:
166
+ 1. `--resume` flag re-enters where it stopped (skip-by-id from results.jsonl).
167
+ 2. Likely failure modes: vLLM OOM on a long-thinking question, balancer
168
+ crash from a port conflict, drydock TUI hang on a tool error.
169
+ Investigate via the per-question `tui_logs/<id>.tui.log` files.
170
+
171
+ ## File map
172
+
173
+ ```
174
+ /data3/drydock/
175
+ ├── scripts/
176
+ │ ├── hle_eval.py # the orchestrator (this PRD's main artifact)
177
+ │ ├── hle_eval_seed.jsonl # 7 hand-crafted seed questions
178
+ │ └── consume_retrieval_queue.py # GraphRAG-leg autonomy (28× perf-fixed)
179
+ ├── hle_results/ # gitignored — per-run outputs
180
+ │ └── run_<ts>/
181
+ │ ├── config.json
182
+ │ ├── results.jsonl
183
+ │ ├── summary.json
184
+ │ ├── tui_logs/<id>.tui.log
185
+ │ └── work/<id>/ # per-question fresh cwd
186
+ ├── HLE_PRD.md # this file
187
+ └── ~/.config/drydock/hf_token # gated cais/hle access
188
+ ```
189
+
190
+ ## What "done" looks like for Phase 1
191
+
192
+ A number. With distribution. Per-category and overall. Writeup in this
193
+ PRD. Commit the writeup, not the questions. Decide Phase 2 from there.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.36
3
+ Version: 2.7.38
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
@@ -71,7 +71,7 @@ RULES: tuple[ClassificationRule, ...] = (
71
71
  ),
72
72
  ClassificationRule(
73
73
  pattern_id="harness:tool:hallucinated_name",
74
- regex=_r(r"(unknown\s+tool|empty_after_tool[:\s]*\w+|hallucinated.*tool)"),
74
+ regex=_r(r"(unknown\s+tool|hallucinated.*tool)"),
75
75
  bucket=Bucket.HARNESS,
76
76
  suggested_action="Add the hallucinated tool name to _IGNORE_TOOLS suppression list.",
77
77
  ),
@@ -84,7 +84,7 @@ RULES: tuple[ClassificationRule, ...] = (
84
84
  ),
85
85
  ClassificationRule(
86
86
  pattern_id="harness:thinking_stall",
87
- regex=_r(r"(empty[-\s]*response|thinking[-\s]*stall|empty\s+assistant\s+message)"),
87
+ regex=_r(r"(empty[-\s]*response|thinking[-\s]*stall|empty\s+assistant\s+message|empty_after_tool[:\s]*\w+)"),
88
88
  bucket=Bucket.HARNESS,
89
89
  suggested_action="Pop empty message and inject 'Continue working' nudge.",
90
90
  ),
@@ -550,6 +550,31 @@ class Bash(
550
550
 
551
551
  returncode = proc.returncode or 0
552
552
 
553
+ # Proactive heredoc-write confirmation. When `cat <<EOF > file`
554
+ # succeeds silently (empty stdout, rc=0), the model can't tell the
555
+ # file landed and re-runs the same heredoc. Check the file on disk
556
+ # and confirm immediately so the model moves on without a retry.
557
+ import re as _re_hd
558
+ import os as _os_hd
559
+ _hd_match = _re_hd.search(
560
+ r"cat\s+<<\s*['\"]?[A-Za-z_]*['\"]?\s+>+\s*(\S+)", args.command
561
+ )
562
+ if _hd_match and returncode == 0 and not stdout.strip():
563
+ _hd_path = _hd_match.group(1).strip().rstrip(";")
564
+ if _os_hd.path.exists(_hd_path):
565
+ _hd_size = _os_hd.path.getsize(_hd_path)
566
+ _hd_lines = 0
567
+ try:
568
+ with open(_hd_path, "r", errors="replace") as _hdf:
569
+ _hd_lines = sum(1 for _ in _hdf)
570
+ except Exception:
571
+ pass
572
+ stdout = (
573
+ f"[File written: {_hd_path} ({_hd_lines} lines, "
574
+ f"{_hd_size} bytes). "
575
+ f"The file is on disk — do not re-run this command.]"
576
+ )
577
+
553
578
  # Mechanical loop-breaker (ADVISORY ONLY — never raise
554
579
  # ToolError; see feedback_no_tool_errors_for_loop_detection.md).
555
580
  # Two complementary checks:
@@ -561,6 +586,15 @@ class Bash(
561
586
  state = self.state.__dict__.setdefault("_bash_history", {})
562
587
  # Track total error-exit calls per command (regardless of output).
563
588
  err_state = self.state.__dict__.setdefault("_bash_err_count", {})
589
+ # Track consecutive empty-stdout search commands (any command, not
590
+ # just identical ones). The model semantic-loops by trying different
591
+ # search terms for a non-existent target:
592
+ # ls | grep "test_cli" → empty → ls | grep "test_race" → empty → ...
593
+ # Each command is unique so the identical-hash check never fires.
594
+ # After 5 consecutive empty searches reset is_search → nudge.
595
+ _consec_empty_search_state = self.state.__dict__.setdefault(
596
+ "_consec_empty_searches", {"count": 0}
597
+ )
564
598
  if returncode != 0:
565
599
  err_count = err_state.get(args.command, 0) + 1
566
600
  err_state[args.command] = err_count
@@ -597,6 +631,22 @@ class Bash(
597
631
  _is_heredoc_write = bool(_re.search(
598
632
  r"cat\s+<<\s*['\"]?EOF['\"]?\s+>", args.command
599
633
  ))
634
+ # Detect ls/grep/find search that returned empty output.
635
+ # The model runs `ls -F | grep "test_cli"` repeatedly when
636
+ # the file doesn't exist — each run returns empty stdout.
637
+ # Generic "EDIT SOURCE CODE" is confusing; tell it to
638
+ # stop searching and create the file instead.
639
+ # grep/rg return rc=1 when no matches found; ls returns 0.
640
+ # Accept both as "empty search" since the key signal is
641
+ # empty stdout on a repeated search command.
642
+ _is_empty_search = (
643
+ not stdout.strip()
644
+ and returncode in (0, 1)
645
+ and bool(_re.search(
646
+ r'(?:^|\|)\s*(?:ls\b|grep\b|find\b|rg\b)',
647
+ args.command,
648
+ ))
649
+ )
600
650
  # Detect echo -e / printf with \n or \t escape sequences.
601
651
  # These loops when the shell doesn't interpret the escapes
602
652
  # (e.g. dash ignores echo -e; backslash doubling in quoting
@@ -606,7 +656,27 @@ class Bash(
606
656
  _is_echo_escape = bool(_re.search(
607
657
  r'(?:echo\s+.*-[eE]|printf)\b', args.command
608
658
  ) and _re.search(r'\\[nt]', args.command))
609
- if _is_heredoc_write:
659
+ # Detect sed -i with \n or \t in substitution patterns.
660
+ # GNU sed interprets \n in replacement strings but the shell
661
+ # may swallow the backslash before sed sees it (depends on
662
+ # quote style). The model loops retrying the same sed
663
+ # command when the substitution silently fails.
664
+ _is_sed_escape = bool(_re.search(
665
+ r"\bsed\b.*-i\b", args.command
666
+ ) and _re.search(r"\\[nt\\]", args.command))
667
+ if _is_empty_search:
668
+ notice = (
669
+ f"[NOTICE: this is the #{entry['count']}th identical "
670
+ f"run of `{cmd_preview}` — it returned empty output "
671
+ f"every time. The file, symbol, or pattern you are "
672
+ f"searching for does not exist yet. "
673
+ f"STOP searching — you will keep getting empty results. "
674
+ f"Either CREATE the missing file/function with "
675
+ f"write_file or search_replace, or ask the user what "
676
+ f"'{cmd_preview[:40]}' refers to. "
677
+ f"Do NOT re-run this search unchanged.]"
678
+ )
679
+ elif _is_heredoc_write:
610
680
  notice = (
611
681
  f"[NOTICE: this is the #{entry['count']}th identical "
612
682
  f"heredoc write of `{cmd_preview}`. "
@@ -630,6 +700,18 @@ class Bash(
630
700
  f"OR use write_file to create the test file directly. "
631
701
  f"Do NOT re-run this command unchanged.]"
632
702
  )
703
+ elif _is_sed_escape:
704
+ notice = (
705
+ f"[NOTICE: this is the #{entry['count']}th identical "
706
+ f"run of `{cmd_preview}` — the sed substitution with "
707
+ f"\\n / \\t escape sequences is a no-op. Shell quoting "
708
+ f"may have consumed the backslash before sed sees it, "
709
+ f"or the search pattern doesn't match any line. "
710
+ f"Use search_replace with a proper SEARCH/REPLACE block "
711
+ f"to make exact text edits, or use write_file to "
712
+ f"rewrite the file with the corrected content. "
713
+ f"Do NOT re-run this sed command unchanged.]"
714
+ )
633
715
  else:
634
716
  notice = (
635
717
  f"[NOTICE: this is the #{entry['count']} identical "
@@ -649,6 +731,33 @@ class Bash(
649
731
  else:
650
732
  state[args.command] = {"hash": out_hash, "count": 1}
651
733
 
734
+ # Consecutive-empty-search cross-command check (C). Tracks any
735
+ # ls/grep/find/rg that returned empty stdout, regardless of command
736
+ # text. Resets on any search with non-empty output. After 5
737
+ # consecutive empty searches, injects a clarification nudge.
738
+ import re as _re2
739
+ _is_any_search = bool(_re2.search(
740
+ r'(?:^|\|)\s*(?:ls\b|grep\b|find\b|rg\b)', args.command
741
+ ))
742
+ if _is_any_search:
743
+ if not stdout.strip() and returncode in (0, 1):
744
+ _consec_empty_search_state["count"] += 1
745
+ else:
746
+ _consec_empty_search_state["count"] = 0
747
+ _consec = _consec_empty_search_state["count"]
748
+ if _is_any_search and _consec >= 5 and not stdout.strip():
749
+ cmd_preview2 = args.command[:80]
750
+ stdout = (
751
+ f"[LOOP-BREAKER: {_consec} consecutive search commands have "
752
+ f"all returned empty results (most recent: `{cmd_preview2}`). "
753
+ f"The thing you are looking for does NOT exist in this project. "
754
+ f"STOP searching. Either (a) CREATE the missing file/function "
755
+ f"with write_file or search_replace, or (b) ask the user to "
756
+ f"clarify what they meant — e.g. 'I don't see any test for "
757
+ f"\"bug B\" — can you clarify what component you mean?'. "
758
+ f"Do NOT run another search command.]"
759
+ )
760
+
652
761
  yield self._build_result(
653
762
  command=args.command,
654
763
  stdout=stdout,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.36"
3
+ version = "2.7.38"
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"
@@ -12,6 +12,10 @@ without them.
12
12
  - Group by `pattern_id`, sort by recent `ts`. Pick the most-fired recent pattern that is NOT already addressed by a commit in the last 24h (`git log --since="24 hours ago" --oneline`).
13
13
  - The `suggested_action` is your starting hypothesis — verify against current source before implementing.
14
14
  - If you fix a queued pattern, mention `addresses pattern <pattern_id>` in the commit message so future ticks can dedup.
15
+ 2a. **Drain the RETRIEVAL bucket**: run `/home/bobef/miniconda3/bin/python3 /data3/drydock/scripts/consume_retrieval_queue.py --apply`
16
+ - This is non-source-fix work: it reads `~/.drydock/dispatch/retrieval.jsonl`, finds the affected project for each entry, and ingests it into GraphRAG so the retrieve tool can answer cross-package symbol queries on the next session.
17
+ - Idempotent + dedup'd via `~/.drydock/dispatch/.retrieval_consumed.json` (7-day re-ingest window). Cheap, ~20s per project.
18
+ - If it ingests anything, note it in the trip_log line as `retrieval-drain: N project(s) ingested`.
15
19
  3. Run the STATUS COMMANDS block from resume.md to check stress run health.
16
20
  4. Scan for new failure patterns NOT in the dispatch queue:
17
21
  - Has the stress harness died? (PID in `/tmp/stress_pid.txt`)
@@ -0,0 +1,214 @@
1
+ #!/usr/bin/env python3
2
+ """Consume the RETRIEVAL bucket from the classifier dispatch queue.
3
+
4
+ For each fresh entry in ~/.drydock/dispatch/retrieval.jsonl:
5
+ - parse the evidence-row timestamp
6
+ - find the session whose start_time is within +/-1h of it
7
+ - read the session's working_directory
8
+ - if that project hasn't been ingested into GraphRAG in the last 7 days,
9
+ run `python -m drydock.graphrag ingest <project>`
10
+
11
+ State is tracked in ~/.drydock/dispatch/.retrieval_consumed.json so reruns
12
+ are idempotent and cheap.
13
+
14
+ This is the closing-the-loop step the framework was missing: the classifier
15
+ flagged 12+ retrieval-pattern hits but no consumer was actually ingesting
16
+ the affected projects' source into GraphRAG.
17
+
18
+ Usage:
19
+ python3 scripts/consume_retrieval_queue.py # dry run
20
+ python3 scripts/consume_retrieval_queue.py --apply # do the ingest
21
+ """
22
+ from __future__ import annotations
23
+
24
+ import argparse
25
+ import json
26
+ import re
27
+ import subprocess
28
+ import sys
29
+ from datetime import datetime, timedelta, timezone
30
+ from pathlib import Path
31
+
32
+ DISPATCH_DIR = Path.home() / ".drydock" / "dispatch"
33
+ QUEUE = DISPATCH_DIR / "retrieval.jsonl"
34
+ STATE = DISPATCH_DIR / ".retrieval_consumed.json"
35
+ SESSION_ROOT = Path.home() / ".vibe" / "logs" / "session"
36
+
37
+ REINGEST_AFTER_DAYS = 7
38
+ SESSION_MATCH_WINDOW = timedelta(hours=1)
39
+ EVIDENCE_TS = re.compile(r"^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[+-]\d{2}:\d{2}|Z))")
40
+
41
+
42
+ def _parse_iso(s: str) -> datetime | None:
43
+ try:
44
+ return datetime.fromisoformat(s.replace("Z", "+00:00"))
45
+ except Exception:
46
+ return None
47
+
48
+
49
+ def _load_state() -> dict[str, str]:
50
+ if not STATE.exists():
51
+ return {}
52
+ try:
53
+ return json.loads(STATE.read_text())
54
+ except Exception:
55
+ return {}
56
+
57
+
58
+ def _save_state(state: dict[str, str]) -> None:
59
+ STATE.parent.mkdir(parents=True, exist_ok=True)
60
+ STATE.write_text(json.dumps(state, indent=2, sort_keys=True))
61
+
62
+
63
+ def _evidence_timestamp(evidence: str) -> datetime | None:
64
+ m = EVIDENCE_TS.match(evidence or "")
65
+ return _parse_iso(m.group(1)) if m else None
66
+
67
+
68
+ def _read_queue() -> list[dict]:
69
+ if not QUEUE.exists():
70
+ return []
71
+ out: list[dict] = []
72
+ for line in QUEUE.read_text().splitlines():
73
+ if not line.strip():
74
+ continue
75
+ try:
76
+ out.append(json.loads(line))
77
+ except Exception:
78
+ continue
79
+ return out
80
+
81
+
82
+ _DIRNAME_TS = re.compile(r"^session_(\d{8})_(\d{6})_")
83
+
84
+
85
+ def _dirname_to_dt(name: str) -> datetime | None:
86
+ """Parse a session directory name into a UTC datetime without reading
87
+ meta.json. Drydock encodes start time in the dir name as
88
+ `session_YYYYMMDD_HHMMSS_<id>`."""
89
+ m = _DIRNAME_TS.match(name)
90
+ if not m:
91
+ return None
92
+ try:
93
+ return datetime.strptime(m.group(1) + m.group(2),
94
+ "%Y%m%d%H%M%S").replace(tzinfo=timezone.utc)
95
+ except Exception:
96
+ return None
97
+
98
+
99
+ def _find_session_cwd(target: datetime) -> Path | None:
100
+ """Find the session whose start_time is closest to `target` and within
101
+ SESSION_MATCH_WINDOW.
102
+
103
+ Two-stage filter: we used to read every meta.json under SESSION_ROOT
104
+ (10K+ files, ~40s wall) which made autonomous_review's per-bash
105
+ timeout abandon this consumer every tick. Now we filter on the
106
+ directory-name timestamp first (zero I/O), then only read meta.json
107
+ for the handful of candidates within the time window.
108
+ """
109
+ if not SESSION_ROOT.exists():
110
+ return None
111
+ window_s = SESSION_MATCH_WINDOW.total_seconds()
112
+ candidates: list[tuple[float, Path]] = []
113
+ for entry in SESSION_ROOT.iterdir():
114
+ if not entry.is_dir():
115
+ continue
116
+ dt = _dirname_to_dt(entry.name)
117
+ if dt is None:
118
+ continue
119
+ if abs((dt - target).total_seconds()) > window_s:
120
+ continue
121
+ meta = entry / "meta.json"
122
+ try:
123
+ data = json.loads(meta.read_text())
124
+ except Exception:
125
+ continue
126
+ start = _parse_iso(data.get("start_time", "")) or dt
127
+ delta = abs((start - target).total_seconds())
128
+ if delta > window_s:
129
+ continue
130
+ cwd = (data.get("environment") or {}).get("working_directory")
131
+ if cwd:
132
+ candidates.append((delta, Path(cwd)))
133
+ if not candidates:
134
+ return None
135
+ candidates.sort()
136
+ return candidates[0][1]
137
+
138
+
139
+ def _stale(state: dict[str, str], project: Path) -> bool:
140
+ last = _parse_iso(state.get(str(project), ""))
141
+ if last is None:
142
+ return True
143
+ return datetime.now(timezone.utc) - last > timedelta(days=REINGEST_AFTER_DAYS)
144
+
145
+
146
+ def _ingest(project: Path) -> tuple[int, str]:
147
+ cmd = [sys.executable, "-m", "drydock.graphrag", "ingest", str(project)]
148
+ proc = subprocess.run(cmd, capture_output=True, text=True, timeout=180)
149
+ return proc.returncode, (proc.stdout + proc.stderr).strip()
150
+
151
+
152
+ def main() -> int:
153
+ ap = argparse.ArgumentParser()
154
+ ap.add_argument("--apply", action="store_true",
155
+ help="actually run graphrag ingest (default is dry-run)")
156
+ ap.add_argument("--limit", type=int, default=20,
157
+ help="max projects to ingest per run")
158
+ args = ap.parse_args()
159
+
160
+ entries = _read_queue()
161
+ if not entries:
162
+ print("[retrieval-consumer] queue empty, nothing to do")
163
+ return 0
164
+
165
+ state = _load_state()
166
+ targets: dict[str, datetime] = {}
167
+ skipped_no_session = 0
168
+ skipped_no_ts = 0
169
+
170
+ for e in entries:
171
+ ts = _evidence_timestamp(e.get("evidence", ""))
172
+ if ts is None:
173
+ skipped_no_ts += 1
174
+ continue
175
+ cwd = _find_session_cwd(ts)
176
+ if cwd is None:
177
+ skipped_no_session += 1
178
+ continue
179
+ if not cwd.exists():
180
+ continue
181
+ key = str(cwd)
182
+ if not _stale(state, cwd):
183
+ continue
184
+ prior = targets.get(key)
185
+ if prior is None or ts > prior:
186
+ targets[key] = ts
187
+
188
+ if not targets:
189
+ print(f"[retrieval-consumer] {len(entries)} queue entries, "
190
+ f"0 actionable (skipped: no_ts={skipped_no_ts}, "
191
+ f"no_session={skipped_no_session}, all already ingested recently)")
192
+ return 0
193
+
194
+ items = list(targets.items())[: args.limit]
195
+ print(f"[retrieval-consumer] {len(entries)} queue entries → "
196
+ f"{len(items)} project(s) to ingest"
197
+ f"{' (DRY RUN — pass --apply to execute)' if not args.apply else ''}")
198
+
199
+ for project, ts in items:
200
+ print(f" {project} (evidence ts {ts.isoformat()})")
201
+ if not args.apply:
202
+ continue
203
+ rc, out = _ingest(Path(project))
204
+ snippet = (out[-300:] if out else "").replace("\n", " | ")
205
+ print(f" rc={rc} {snippet}")
206
+ if rc == 0:
207
+ state[project] = datetime.now(timezone.utc).isoformat()
208
+ _save_state(state)
209
+
210
+ return 0
211
+
212
+
213
+ if __name__ == "__main__":
214
+ raise SystemExit(main())