drydock-cli 2.8.25__tar.gz → 2.8.27__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 (772) hide show
  1. drydock_cli-2.8.27/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/HLE_PRD.md +38 -1
  3. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/PKG-INFO +1 -1
  4. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/agent_loop.py +20 -0
  5. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/gemma4.md +15 -1
  6. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/sidecar/server.py +66 -27
  7. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/pyproject.toml +1 -1
  8. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/hle_eval.py +50 -7
  9. drydock_cli-2.8.27/tests/test_auto_retrieve_soft_nudge.py +167 -0
  10. drydock_cli-2.8.27/tests/test_steering_sidecar_chat_inputs.py +147 -0
  11. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/trip_log.md +216 -0
  12. drydock_cli-2.8.25/.auto_release.lock +0 -1
  13. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/CODEOWNERS +0 -0
  14. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  15. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  16. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/workflows/build-and-upload.yml +0 -0
  18. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/workflows/ci.yml +0 -0
  19. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/workflows/issue-labeler.yml +0 -0
  20. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.github/workflows/release.yml +0 -0
  21. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.gitignore +0 -0
  22. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.pre-commit-config.yaml +0 -0
  23. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.python-version +0 -0
  24. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.typos.toml +0 -0
  25. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.vscode/extensions.json +0 -0
  26. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.vscode/launch.json +0 -0
  27. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/.vscode/settings.json +0 -0
  28. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/AGENTS.md +0 -0
  29. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/Admiral.md +0 -0
  30. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/CHANGELOG.md +0 -0
  31. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/CLAUDE.md +0 -0
  32. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/CONTRIBUTING.md +0 -0
  33. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/DEEP_NOIR_PRD.md +0 -0
  34. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/DEPLOYMENT.md +0 -0
  35. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/DRYDOCK.md +0 -0
  36. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/JETSON_BENCH.md +0 -0
  37. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/LICENSE +0 -0
  38. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/MODEL_SHORTCOMINGS.md +0 -0
  39. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/NOTICE +0 -0
  40. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/README.md +0 -0
  41. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/SOVEREIGN_PRD.md +0 -0
  42. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/TRIAGE_v1.md +0 -0
  43. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/action.yml +0 -0
  44. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/README.md +0 -0
  45. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results1.tsv +0 -0
  46. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results13.tsv +0 -0
  47. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results14.tsv +0 -0
  48. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results15.tsv +0 -0
  49. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results16.tsv +0 -0
  50. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results17.tsv +0 -0
  51. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results18.tsv +0 -0
  52. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results19.tsv +0 -0
  53. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results2.tsv +0 -0
  54. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results20.tsv +0 -0
  55. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results3.tsv +0 -0
  56. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results4.tsv +0 -0
  57. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results5.tsv +0 -0
  58. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results6.tsv +0 -0
  59. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results7.tsv +0 -0
  60. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results8.tsv +0 -0
  61. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results9.tsv +0 -0
  62. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/baseline_history/results_evolved_v1.tsv +0 -0
  63. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/distribution/zed/LICENSE +0 -0
  64. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/distribution/zed/extension.toml +0 -0
  65. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/distribution/zed/icons/mistral_vibe.svg +0 -0
  66. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/README.md +0 -0
  67. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/acp-setup.md +0 -0
  68. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/BASELINE_412.md +0 -0
  69. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/Drydock_rebrand.md +0 -0
  70. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  71. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  72. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  73. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/PRD.md +0 -0
  74. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/drydock_terms.md +0 -0
  75. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/archive/resume.md +0 -0
  76. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/docs/proxy-setup.md +0 -0
  77. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/__init__.py +0 -0
  78. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/__main__.py +0 -0
  79. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/__init__.py +0 -0
  80. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/acp_agent_loop.py +0 -0
  81. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/acp_logger.py +0 -0
  82. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/entrypoint.py +0 -0
  83. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/__init__.py +0 -0
  84. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/base.py +0 -0
  85. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/builtins/bash.py +0 -0
  86. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/builtins/read_file.py +0 -0
  87. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/builtins/search_replace.py +0 -0
  88. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/builtins/todo.py +0 -0
  89. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/builtins/write_file.py +0 -0
  90. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/tools/session_update.py +0 -0
  91. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/acp/utils.py +0 -0
  92. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/__init__.py +0 -0
  93. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/detectors.py +0 -0
  94. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/detectors_proposed.py +0 -0
  95. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/history.py +0 -0
  96. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/interventions.py +0 -0
  97. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/llm_analyzer.py +0 -0
  98. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/metrics.py +0 -0
  99. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/opus_escalator.py +0 -0
  100. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/persistence.py +0 -0
  101. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/policy.py +0 -0
  102. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/proposer.py +0 -0
  103. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/stager.py +0 -0
  104. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/task_classifier.py +0 -0
  105. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/tuning.py +0 -0
  106. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/validator.py +0 -0
  107. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/admiral/worker.py +0 -0
  108. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/__init__.py +0 -0
  109. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/autocompletion/__init__.py +0 -0
  110. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/autocompletion/base.py +0 -0
  111. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/autocompletion/path_completion.py +0 -0
  112. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/autocompletion/slash_command.py +0 -0
  113. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/cli.py +0 -0
  114. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/clipboard.py +0 -0
  115. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/commands.py +0 -0
  116. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/entrypoint.py +0 -0
  117. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/fix_windows_path.py +0 -0
  118. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/history_manager.py +0 -0
  119. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  120. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  121. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  122. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/terminal_setup.py +0 -0
  123. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/__init__.py +0 -0
  124. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  125. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/app.py +0 -0
  126. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/app.tcss +0 -0
  127. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/external_editor.py +0 -0
  128. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  129. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  130. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  131. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  132. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  133. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  134. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  135. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  136. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  137. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  138. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  139. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  140. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  141. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  142. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  143. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  144. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  145. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  146. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  147. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  148. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  149. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  150. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  151. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  152. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  153. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  154. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  155. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  156. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  157. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  158. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  159. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  160. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  161. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  162. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  163. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  164. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  165. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/windowing/history.py +0 -0
  166. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  167. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/textual_ui/windowing/state.py +0 -0
  168. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/__init__.py +0 -0
  169. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  170. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  171. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  172. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  173. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  174. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/update.py +0 -0
  175. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/cli/update_notifier/whats_new.py +0 -0
  176. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/__init__.py +0 -0
  177. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/agents/__init__.py +0 -0
  178. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/agents/manager.py +0 -0
  179. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/agents/models.py +0 -0
  180. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/auth/__init__.py +0 -0
  181. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/auth/crypto.py +0 -0
  182. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/auth/github.py +0 -0
  183. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/__init__.py +0 -0
  184. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/completers.py +0 -0
  185. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  186. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  187. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  188. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  189. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  190. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/fuzzy.py +0 -0
  191. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/path_prompt.py +0 -0
  192. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  193. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/build_orchestrator.py +0 -0
  194. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/checkpoint.py +0 -0
  195. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/classifier/__init__.py +0 -0
  196. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/classifier/__main__.py +0 -0
  197. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/classifier/classifier.py +0 -0
  198. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/classifier/dispatcher.py +0 -0
  199. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/classifier/rules.py +0 -0
  200. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/classifier/signal.py +0 -0
  201. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/__init__.py +0 -0
  202. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/_dotenv.py +0 -0
  203. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/_settings.py +0 -0
  204. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/doctor.py +0 -0
  205. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/harness_files/__init__.py +0 -0
  206. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  207. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/harness_files/_paths.py +0 -0
  208. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/local_detect.py +0 -0
  209. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/config/migrate.py +0 -0
  210. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/consultant.py +0 -0
  211. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/context_recovery.py +0 -0
  212. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/drydock_states.py +0 -0
  213. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/hooks.py +0 -0
  214. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/__init__.py +0 -0
  215. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/anthropic.py +0 -0
  216. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/base.py +0 -0
  217. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/factory.py +0 -0
  218. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/generic.py +0 -0
  219. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/mistral.py +0 -0
  220. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  221. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/backend/vertex.py +0 -0
  222. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/exceptions.py +0 -0
  223. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/format.py +0 -0
  224. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/message_utils.py +0 -0
  225. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/llm/types.py +0 -0
  226. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/logger.py +0 -0
  227. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/middleware.py +0 -0
  228. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/output_formatters.py +0 -0
  229. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/paths/__init__.py +0 -0
  230. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/paths/_drydock_home.py +0 -0
  231. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/paths/_local_config_walk.py +0 -0
  232. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/paths/conventions.py +0 -0
  233. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/plan_session.py +0 -0
  234. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/plugins.py +0 -0
  235. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/programmatic.py +0 -0
  236. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/__init__.py +0 -0
  237. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/builder.md +0 -0
  238. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/cli.md +0 -0
  239. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/compact.md +0 -0
  240. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/dangerous_directory.md +0 -0
  241. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/diagnostic.md +0 -0
  242. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/explore.md +0 -0
  243. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/planner.md +0 -0
  244. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/project_context.md +0 -0
  245. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/prompts/tests.md +0 -0
  246. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/proxy_setup.py +0 -0
  247. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session/agent_memory.py +0 -0
  248. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session/checkpoints.py +0 -0
  249. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session/session_loader.py +0 -0
  250. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session/session_logger.py +0 -0
  251. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session/session_migration.py +0 -0
  252. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session/state_file.py +0 -0
  253. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/session_checker.py +0 -0
  254. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/skills/__init__.py +0 -0
  255. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/skills/manager.py +0 -0
  256. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/skills/models.py +0 -0
  257. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/skills/parser.py +0 -0
  258. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/slug.py +0 -0
  259. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/steering_hook.py +0 -0
  260. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/system_prompt.py +0 -0
  261. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/telemetry/__init__.py +0 -0
  262. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/telemetry/send.py +0 -0
  263. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/teleport/errors.py +0 -0
  264. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/teleport/git.py +0 -0
  265. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/teleport/nuage.py +0 -0
  266. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/teleport/teleport.py +0 -0
  267. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/teleport/types.py +0 -0
  268. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/base.py +0 -0
  269. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/_task_manager.py +0 -0
  270. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  271. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/bash.py +0 -0
  272. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/count_tool.py +0 -0
  273. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/cron.py +0 -0
  274. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  275. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/glob_tool.py +0 -0
  276. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/grep.py +0 -0
  277. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  278. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/lsp.py +0 -0
  279. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/math_tool.py +0 -0
  280. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  281. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/memory_tool.py +0 -0
  282. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  283. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/powershell.py +0 -0
  284. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  285. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  286. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  287. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  288. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  289. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  290. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  291. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  292. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  293. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  294. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  295. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  296. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  297. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  298. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  299. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/task.md +0 -0
  300. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  301. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  302. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  303. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  304. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  305. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  306. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  307. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/read_file.py +0 -0
  308. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/retrieve.py +0 -0
  309. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/search_replace.py +0 -0
  310. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/task.py +0 -0
  311. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/todo.py +0 -0
  312. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/tool_search.py +0 -0
  313. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/verify_tool.py +0 -0
  314. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/webfetch.py +0 -0
  315. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/websearch.py +0 -0
  316. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/worktree.py +0 -0
  317. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/builtins/write_file.py +0 -0
  318. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/injection_guard.py +0 -0
  319. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/manager.py +0 -0
  320. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/mcp/__init__.py +0 -0
  321. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/mcp/registry.py +0 -0
  322. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/mcp/tools.py +0 -0
  323. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/mcp_sampling.py +0 -0
  324. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/ui.py +0 -0
  325. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/tools/utils.py +0 -0
  326. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/trusted_folders.py +0 -0
  327. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/types.py +0 -0
  328. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/core/utils.py +0 -0
  329. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/curiosity/__init__.py +0 -0
  330. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/curiosity/__main__.py +0 -0
  331. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/curiosity/gap_detector.py +0 -0
  332. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/curiosity/item.py +0 -0
  333. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/curiosity/queue.py +0 -0
  334. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/curiosity/surprise.py +0 -0
  335. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/graphrag/__init__.py +0 -0
  336. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/graphrag/__main__.py +0 -0
  337. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/graphrag/code_indexer.py +0 -0
  338. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/graphrag/retriever.py +0 -0
  339. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/graphrag/storage.py +0 -0
  340. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/graphrag/text_indexer.py +0 -0
  341. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/__init__.py +0 -0
  342. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/base.py +0 -0
  343. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/onboarding.tcss +0 -0
  344. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/screens/__init__.py +0 -0
  345. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/screens/api_key.py +0 -0
  346. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/screens/choice.py +0 -0
  347. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/screens/local_model.py +0 -0
  348. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/onboarding/screens/welcome.py +0 -0
  349. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  350. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  351. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/__init__.py +0 -0
  352. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/api-design/SKILL.md +0 -0
  353. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/audit-tests/SKILL.md +0 -0
  354. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/batch/SKILL.md +0 -0
  355. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/commit-code/SKILL.md +0 -0
  356. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/context-summary/SKILL.md +0 -0
  357. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/create-presentation/SKILL.md +0 -0
  358. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/deep-research/SKILL.md +0 -0
  359. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/deploy/SKILL.md +0 -0
  360. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/diff-review/SKILL.md +0 -0
  361. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/doc-gen/SKILL.md +0 -0
  362. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/explain-code/SKILL.md +0 -0
  363. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/explore-code/SKILL.md +0 -0
  364. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/fix-issue/SKILL.md +0 -0
  365. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/git-ops/SKILL.md +0 -0
  366. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/init-project/SKILL.md +0 -0
  367. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/investigate/SKILL.md +0 -0
  368. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/loop/SKILL.md +0 -0
  369. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/migrate/SKILL.md +0 -0
  370. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/perf-analyze/SKILL.md +0 -0
  371. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/plan-impl/SKILL.md +0 -0
  372. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/pr-review/SKILL.md +0 -0
  373. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/refactor/SKILL.md +0 -0
  374. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/regex-help/SKILL.md +0 -0
  375. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/review/SKILL.md +0 -0
  376. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/security-review/SKILL.md +0 -0
  377. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/ship/SKILL.md +0 -0
  378. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/simplify/SKILL.md +0 -0
  379. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/strong-tests/SKILL.md +0 -0
  380. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/skills/test-verify/SKILL.md +0 -0
  381. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/__init__.py +0 -0
  382. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/__main__.py +0 -0
  383. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/applier.py +0 -0
  384. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/config.py +0 -0
  385. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/registry.py +0 -0
  386. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/sandbox.py +0 -0
  387. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/sidecar/__init__.py +0 -0
  388. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/sidecar/header_parser.py +0 -0
  389. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/sidecar/hooks.py +0 -0
  390. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/sidecar/loader.py +0 -0
  391. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/train/__init__.py +0 -0
  392. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/train/capture.py +0 -0
  393. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/train/compute_vector.py +0 -0
  394. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/train/extract_pairs.py +0 -0
  395. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/steering/vectors.py +0 -0
  396. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock/whats_new.md +0 -0
  397. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/drydock-acp.spec +0 -0
  398. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/flake.lock +0 -0
  399. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/flake.nix +0 -0
  400. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/outlook_draft_assistant.tar.gz +0 -0
  401. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/README.md +0 -0
  402. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/config_base.toml +0 -0
  403. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/config_best.toml +0 -0
  404. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/domain_spec.md +0 -0
  405. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/experimenter.py +0 -0
  406. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/kernel.py +0 -0
  407. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/mini_prd.md +0 -0
  408. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/mini_prompts.txt +0 -0
  409. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/proposer.py +0 -0
  410. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/research/results.tsv +0 -0
  411. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/README.md +0 -0
  412. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/admiral_probe.py +0 -0
  413. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/auto_test_loop.sh +0 -0
  414. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/monitor_test_battery.sh +0 -0
  415. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/overnight_agents_test.sh +0 -0
  416. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/test_bank.sh +0 -0
  417. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/test_full.sh +0 -0
  418. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/test_smoke.sh +0 -0
  419. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/archive/tui_test.py +0 -0
  420. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/audit_sampler.py +0 -0
  421. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/auto_generate_tests.py +0 -0
  422. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/auto_release.sh +0 -0
  423. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/autonomous_review.sh +0 -0
  424. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/autonomous_review_prompt.md +0 -0
  425. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/backfill_hle_curiosity.py +0 -0
  426. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/backup.sh +0 -0
  427. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/bench_inference.py +0 -0
  428. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/bump_version.py +0 -0
  429. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/classify_pulse.sh +0 -0
  430. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/consume_retrieval_queue.py +0 -0
  431. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/curiosity_idle_cycle.sh +0 -0
  432. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/deploy_to_github.sh +0 -0
  433. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/fetch_arxiv_abstracts.py +0 -0
  434. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/gen_2000_prompts.py +0 -0
  435. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/hle_eval_seed.jsonl +0 -0
  436. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/llm_balancer.py +0 -0
  437. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/notify_release.py +0 -0
  438. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/perf_baseline_when_idle.sh +0 -0
  439. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/perf_sweep.py +0 -0
  440. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/poll_issues.sh +0 -0
  441. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/publish_to_pypi.sh +0 -0
  442. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/queue_top.py +0 -0
  443. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/ralph_loop.py +0 -0
  444. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/research_babysitter.sh +0 -0
  445. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/shakedown.py +0 -0
  446. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/shakedown_interactive.py +0 -0
  447. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/shakedown_suite.sh +0 -0
  448. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/shakedown_variance.sh +0 -0
  449. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/start_steering_sidecar.sh +0 -0
  450. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_babysitter.sh +0 -0
  451. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_prompts_50.txt +0 -0
  452. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_prompts_realuser.txt +0 -0
  453. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_prompts_tool_agent.txt +0 -0
  454. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  455. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_shakedown.py +0 -0
  456. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_telegram_status.py +0 -0
  457. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/stress_watcher.py +0 -0
  458. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/telegram_bot.py +0 -0
  459. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/tool_usage_report.py +0 -0
  460. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/scripts/vllm_failover.sh +0 -0
  461. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/__init__.py +0 -0
  462. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/conftest.py +0 -0
  463. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_acp.py +0 -0
  464. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_agent_thought.py +0 -0
  465. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_bash.py +0 -0
  466. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_compact_session_updates.py +0 -0
  467. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_content.py +0 -0
  468. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_initialize.py +0 -0
  469. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_list_sessions.py +0 -0
  470. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_load_session.py +0 -0
  471. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_multi_session.py +0 -0
  472. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_new_session.py +0 -0
  473. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_proxy_setup_acp.py +0 -0
  474. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_read_file.py +0 -0
  475. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_search_replace.py +0 -0
  476. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_set_config_option.py +0 -0
  477. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_set_mode.py +0 -0
  478. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_set_model.py +0 -0
  479. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_tool_call_session_update.py +0 -0
  480. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_utils.py +0 -0
  481. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/acp/test_write_file.py +0 -0
  482. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_file_indexer.py +0 -0
  483. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_fuzzy.py +0 -0
  484. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  485. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  486. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_path_completion_controller.py +0 -0
  487. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  488. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_slash_command_controller.py +0 -0
  489. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  490. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/__init__.py +0 -0
  491. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/data/__init__.py +0 -0
  492. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/data/fireworks.py +0 -0
  493. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/data/mistral.py +0 -0
  494. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/test_anthropic_adapter.py +0 -0
  495. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/test_backend.py +0 -0
  496. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  497. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/test_reasoning_adapter.py +0 -0
  498. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  499. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  500. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  501. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  502. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_bell_notifications.py +0 -0
  503. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_braille_renderer.py +0 -0
  504. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_clipboard.py +0 -0
  505. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_commands.py +0 -0
  506. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_copy_shortcuts.py +0 -0
  507. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_external_editor.py +0 -0
  508. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_no_markup_static.py +0 -0
  509. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_question_app.py +0 -0
  510. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_spinner.py +0 -0
  511. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_switching_mode.py +0 -0
  512. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  513. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  514. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_ui_session_resume.py +0 -0
  515. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/test_ui_skill_dispatch.py +0 -0
  516. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/textual_ui/__init__.py +0 -0
  517. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/cli/textual_ui/test_session_picker.py +0 -0
  518. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/conftest.py +0 -0
  519. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_agents.py +0 -0
  520. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_auth_crypto.py +0 -0
  521. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_auth_github.py +0 -0
  522. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  523. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  524. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_config_load_dotenv.py +0 -0
  525. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_config_paths.py +0 -0
  526. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_config_resolution.py +0 -0
  527. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_file_logging.py +0 -0
  528. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_plan_session.py +0 -0
  529. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_proxy_setup.py +0 -0
  530. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_slug.py +0 -0
  531. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_telemetry_send.py +0 -0
  532. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_teleport_git.py +0 -0
  533. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_teleport_nuage.py +0 -0
  534. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_teleport_service.py +0 -0
  535. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_trusted_folders.py +0 -0
  536. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/core/test_utils.py +0 -0
  537. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/e2e/common.py +0 -0
  538. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/e2e/conftest.py +0 -0
  539. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/e2e/mock_server.py +0 -0
  540. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  541. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/e2e/test_cli_tui_streaming.py +0 -0
  542. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  543. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/fixtures/doc_qa_system_prd.md +0 -0
  544. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/mock/__init__.py +0 -0
  545. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/mock/mock_backend_factory.py +0 -0
  546. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/mock/mock_entrypoint.py +0 -0
  547. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/mock/utils.py +0 -0
  548. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/onboarding/test_run_onboarding.py +0 -0
  549. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/onboarding/test_ui_onboarding.py +0 -0
  550. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/session/test_session_loader.py +0 -0
  551. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/session/test_session_logger.py +0 -0
  552. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/session/test_session_migration.py +0 -0
  553. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/skills/conftest.py +0 -0
  554. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/skills/test_manager.py +0 -0
  555. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/skills/test_models.py +0 -0
  556. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/skills/test_parser.py +0 -0
  557. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  558. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  559. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  560. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  561. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  562. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  563. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  564. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  565. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  566. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  567. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  568. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  569. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  570. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  571. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  572. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  573. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  574. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  575. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  576. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  577. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  578. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  579. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  580. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  581. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  582. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  583. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  584. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  585. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  586. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  587. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  588. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  589. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  590. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  591. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  592. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  593. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  594. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  595. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  596. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  597. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  598. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  599. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  600. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  601. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  602. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  603. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  604. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  605. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  606. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  607. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  608. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  609. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  610. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  611. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  612. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  613. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  614. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  615. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  616. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  617. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/base_snapshot_test_app.py +0 -0
  618. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/conftest.py +0 -0
  619. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/snap_compare.py +0 -0
  620. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  621. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  622. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  623. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  624. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  625. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  626. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  627. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  628. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  629. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  630. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  631. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  632. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  633. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  634. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/stubs/fake_backend.py +0 -0
  635. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/stubs/fake_client.py +0 -0
  636. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/stubs/fake_tool.py +0 -0
  637. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral.py +0 -0
  638. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  639. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral_intervention_outcome.py +0 -0
  640. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral_phase3.py +0 -0
  641. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral_proposed.py +0 -0
  642. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral_session_id.py +0 -0
  643. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_admiral_struggle_dedup.py +0 -0
  644. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agent_auto_compact.py +0 -0
  645. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agent_backend.py +0 -0
  646. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agent_observer_streaming.py +0 -0
  647. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agent_stats.py +0 -0
  648. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agent_tasks.py +0 -0
  649. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agent_tool_call.py +0 -0
  650. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_agents.py +0 -0
  651. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_build.py +0 -0
  652. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_debug.py +0 -0
  653. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_multiagent.py +0 -0
  654. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_prd.py +0 -0
  655. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_prd_extended.py +0 -0
  656. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_tools.py +0 -0
  657. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_bank_update.py +0 -0
  658. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_build_projects.py +0 -0
  659. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_checkpoint.py +0 -0
  660. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_classifier.py +0 -0
  661. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_cli_programmatic_preload.py +0 -0
  662. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_config_migration.py +0 -0
  663. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_context_recovery.py +0 -0
  664. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_count_tool.py +0 -0
  665. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_curiosity.py +0 -0
  666. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_current_bugs.py +0 -0
  667. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_dispatcher.py +0 -0
  668. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_drydock_regression.py +0 -0
  669. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_drydock_tasks.py +0 -0
  670. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  671. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_full_regression.py +0 -0
  672. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_graphrag.py +0 -0
  673. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_graphrag_worked_examples.py +0 -0
  674. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_hallucinated_tool_suppression.py +0 -0
  675. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_history_manager.py +0 -0
  676. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_hle_typing.py +0 -0
  677. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_integration.py +0 -0
  678. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_issue_fixes.py +0 -0
  679. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_local_detect.py +0 -0
  680. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_loop_detection.py +0 -0
  681. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_math_tool.py +0 -0
  682. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_mcp_settings.py +0 -0
  683. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_memory_tool.py +0 -0
  684. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_message_id.py +0 -0
  685. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_message_merging.py +0 -0
  686. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_middleware.py +0 -0
  687. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_multi_agent.py +0 -0
  688. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_read_file_not_found_listing.py +0 -0
  689. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_real_failures.py +0 -0
  690. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_real_issues.py +0 -0
  691. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_real_workflow.py +0 -0
  692. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_reasoning_content.py +0 -0
  693. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_retrieval_consumer.py +0 -0
  694. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_retrieve_tool.py +0 -0
  695. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_search_replace_args_not_truncated.py +0 -0
  696. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_smoke.py +0 -0
  697. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_steering.py +0 -0
  698. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_steering_capture.py +0 -0
  699. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_steering_compute_vector.py +0 -0
  700. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_steering_extract_pairs.py +0 -0
  701. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_steering_hook.py +0 -0
  702. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_steering_sidecar_hooks.py +0 -0
  703. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_system_prompt.py +0 -0
  704. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_tagged_text.py +0 -0
  705. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_task_complete_nudge.py +0 -0
  706. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_tool_args.py +0 -0
  707. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_truncate_args_valid_json.py +0 -0
  708. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_truncated_arg_path_hint.py +0 -0
  709. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_truncated_search_replace_escalation.py +0 -0
  710. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_truncated_write_escalation.py +0 -0
  711. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_ui_external_editor.py +0 -0
  712. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_ui_input_history.py +0 -0
  713. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_user_issues.py +0 -0
  714. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_verify_tool.py +0 -0
  715. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_wall_of_text_rescue.py +0 -0
  716. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_workloads.py +0 -0
  717. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/test_write_file_missing_path.py +0 -0
  718. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/testbank_helpers.py +0 -0
  719. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_ask_user_question.py +0 -0
  720. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash.py +0 -0
  721. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  722. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_consec_empty_search.py +0 -0
  723. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  724. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  725. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  726. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  727. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  728. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  729. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  730. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_exit_plan_mode.py +0 -0
  731. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_grep.py +0 -0
  732. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  733. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_invoke_context.py +0 -0
  734. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  735. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_manager_get_tool_config.py +0 -0
  736. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_mcp.py +0 -0
  737. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_mcp_sampling.py +0 -0
  738. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  739. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  740. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_read_file_directory.py +0 -0
  741. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_read_file_limit_truncation.py +0 -0
  742. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_append_fallback.py +0 -0
  743. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_dir_path.py +0 -0
  744. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_empty_content.py +0 -0
  745. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_file_not_found.py +0 -0
  746. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  747. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_hard_stop.py +0 -0
  748. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_malformed_block.py +0 -0
  749. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  750. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_placeholder.py +0 -0
  751. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  752. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_task.py +0 -0
  753. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_ui_bash_execution.py +0 -0
  754. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_webfetch.py +0 -0
  755. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_websearch.py +0 -0
  756. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  757. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  758. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  759. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  760. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_do_update.py +0 -0
  761. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  762. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_github_update_gateway.py +0 -0
  763. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  764. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_ui_update_notification.py +0 -0
  765. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_update_use_case.py +0 -0
  766. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/tests/update_notifier/test_whats_new.py +0 -0
  767. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/uv.lock +0 -0
  768. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/worked_examples/README.md +0 -0
  769. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/worked_examples/cli_subcommand_dispatch.py +0 -0
  770. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/worked_examples/lookup.json +0 -0
  771. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/worked_examples/sql_parser.py +0 -0
  772. {drydock_cli-2.8.25 → drydock_cli-2.8.27}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 1240825
@@ -1,6 +1,43 @@
1
1
  # HLE PRD — drydock + GraphRAG + Deep Noir vs Humanity's Last Exam
2
2
 
3
- **Status as of 2026-05-07 22:00 UTC.** Phase 2.5 ablation COMPLETE.
3
+ **Status as of 2026-05-13 12:15 UTC.** Q4_K_M validated and held. AR-OFF
4
+ disambiguation says auto-retrieve is NET POSITIVE on correctness and NOT
5
+ the dominant cause of thinking-stalls. Deep Noir sidecar wiring (M1-M4)
6
+ is in tree; M1 end-to-end GPU smoke pending after the transformers 5.x
7
+ apply_chat_template fix (f02aa4b).
8
+
9
+ ## Q4 vs AR-OFF disambiguation (2026-05-13)
10
+
11
+ Two variables shifted simultaneously when the v1 baseline ran (Q3+AR-off
12
+ pre-curiosity-layer) → Q4 30-Q overnight (Q4+AR-on, v2.8.20-24):
13
+
14
+ | Run | Model | AR | Result |
15
+ |-----|-------|----|--------|
16
+ | v1 baseline (Q3, AR-off, pre-curiosity) | Q3_K_M | off | 10/200 = 5.0% raw; 42% thinking-stalls |
17
+ | Q4 30-Q math overnight (2026-05-13 04:27) | Q4_K_M | on | 2/30 = 6.7%; 26/30 (87%) end-on-tool |
18
+ | Q4 5-Q math AR-off smoke (2026-05-13 12:13) | Q4_K_M | off | 0/5 = 0%; 2/5 msg<=1, 3/5 engaged-then-empty |
19
+
20
+ **Conclusions:**
21
+
22
+ - Auto-retrieve is **NET POSITIVE for correctness** (6.7% with AR vs 0%
23
+ without on Math) — the rare YES answers come from curated chunks that
24
+ retrieve surfaces.
25
+ - Auto-retrieve is **NOT the cause of stalls** — every Q4 attempt
26
+ stalled regardless of AR state. Stalls are about model reasoning
27
+ budget, not scaffolding.
28
+ - The `method='empty'` bucket masks two distinct failure shapes (now
29
+ split in `scripts/hle_eval.py` per commit d022572):
30
+ - `empty:no_response` (msg_count <= 1) — model never started, pure
31
+ thinking-stall. 2/5 in AR-off Q4 smoke. Harness/quant/timeout
32
+ problem.
33
+ - `empty:no_final_answer` (msg_count > 1) — model engaged with
34
+ tools but never emitted `FINAL ANSWER:`. 3/5 in AR-off Q4 smoke.
35
+ Retrieval / prompt-rule problem.
36
+ - **Open question**: Q4 quant vs Q3 quant impact on stall rate. Not
37
+ disambiguated yet — needs a 5-Q math smoke after swapping back to
38
+ Q3 with current curiosity defaults.
39
+
40
+ ## Phase 2.5 ablation — FINAL RESULTS
4
41
 
5
42
  ## Phase 2.5 ablation — FINAL RESULTS
6
43
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.25
3
+ Version: 2.8.27
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
@@ -3520,6 +3520,26 @@ class AgentLoop:
3520
3520
  "curator. Respond with text only, no further tool calls."
3521
3521
  )
3522
3522
  self._inject_system_note(note)
3523
+ elif chunks:
3524
+ # Quality hits but no curated ANSWER marker — common case
3525
+ # for arXiv-corpus retrievals. Without a nudge, Gemma 4
3526
+ # defaults to chaining web_search calls and burns the
3527
+ # session timeout before producing any content (HLE Q4
3528
+ # overnight 2026-05-13: 26/30 sessions ended at 481s with
3529
+ # last role=tool, no assistant content). The nudge here is
3530
+ # advisory — model can still web_search if needed, but it
3531
+ # gets told to prefer the retrieval first.
3532
+ soft_note = (
3533
+ "The retrieve tool result above contains "
3534
+ f"{len(chunks)} chunk(s) drawn from the local corpus "
3535
+ f"(top score {top_score:.1f}). Read these carefully "
3536
+ "and answer from them. Only use web_search if the "
3537
+ "retrieved context is clearly insufficient — do not "
3538
+ "duplicate the same query you already have evidence "
3539
+ "for. When you have enough to answer, respond with "
3540
+ "text (no further tool calls)."
3541
+ )
3542
+ self._inject_system_note(soft_note)
3523
3543
 
3524
3544
  logger.warning(
3525
3545
  "[AUTO-RETRIEVE] synthesized retrieve tool result: %d chunks "
@@ -4,7 +4,7 @@ ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT ex
4
4
 
5
5
  When answering a direct factual or math question (not writing code), you MUST write visible text — never produce a response with only thinking tokens and no visible content. End your response with "FINAL ANSWER: <your answer>" on its own line so the judge can extract it.
6
6
 
7
- Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve.
7
+ Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify.
8
8
 
9
9
  CURIOSITY — default posture is "investigate, then assert" (SOVEREIGN_PRD §5.7):
10
10
  - If the user message names a thing you don't have context for (paper title,
@@ -91,6 +91,20 @@ prior alone. The math tool is sandboxed Python (`math.factorial(20)`,
91
91
  `math.comb(50,5)`, `Fraction(1,3)+Fraction(1,6)`, `statistics.mean([...])`)
92
92
  and returns exact results. Use it. Don't compute in your head.
93
93
 
94
+ USE THE count TOOL for "how many X" questions over text or files —
95
+ substring, regex, lines, words, chars, bytes. Eyeballing miscounts;
96
+ `count(pattern="def ", path="src/foo.py")` doesn't.
97
+
98
+ USE THE memory TOOL to persist facts across sessions. `memory(op="save",
99
+ key="<name>", value="<value>")` writes to ~/.drydock/agent_memory; later
100
+ sessions can `memory(op="recall", key="<name>")`. Use for user
101
+ preferences, project conventions, or anything you'll need next time.
102
+
103
+ USE THE verify TOOL to operationalize "loop until verified" — runs a
104
+ check and returns pass/fail. `verify(criterion="tests pass",
105
+ command="pytest -q", expect="passed", expect_mode="contains")` instead
106
+ of inspecting the bash output yourself.
107
+
94
108
  Rules:
95
109
  - Create files immediately. Do not plan or discuss — write code.
96
110
  - Use absolute imports for Python packages
@@ -176,6 +176,55 @@ def _now() -> int:
176
176
  return int(time.time())
177
177
 
178
178
 
179
+ def prepare_chat_inputs(
180
+ tokenizer: Any, messages: list[dict[str, Any]], *, device: Any = None
181
+ ) -> dict[str, Any]:
182
+ """Apply the tokenizer's chat template and return a dict that
183
+ `model.generate(**inputs, ...)` can consume.
184
+
185
+ transformers >=5 returns a BatchEncoding (dict-like) from
186
+ `apply_chat_template`; older versions returned a bare Tensor. This
187
+ helper normalizes both shapes to `{"input_ids": Tensor, ...}` and
188
+ optionally moves the tensors onto `device`.
189
+
190
+ Falls back to tokenize-then-encode when the template path doesn't
191
+ accept `return_dict=True` or fails.
192
+ """
193
+ import torch
194
+
195
+ try:
196
+ inputs = tokenizer.apply_chat_template(
197
+ messages,
198
+ add_generation_prompt=True,
199
+ return_tensors="pt",
200
+ return_dict=True,
201
+ )
202
+ except TypeError:
203
+ prompt_text = tokenizer.apply_chat_template(
204
+ messages, add_generation_prompt=True, tokenize=False
205
+ )
206
+ inputs = tokenizer(prompt_text, return_tensors="pt")
207
+
208
+ if isinstance(inputs, torch.Tensor):
209
+ inputs = {"input_ids": inputs}
210
+ else:
211
+ inputs = dict(inputs)
212
+
213
+ if device is not None:
214
+ inputs = {
215
+ k: (v.to(device) if isinstance(v, torch.Tensor) else v)
216
+ for k, v in inputs.items()
217
+ }
218
+
219
+ if "input_ids" not in inputs:
220
+ raise RuntimeError(
221
+ f"prepare_chat_inputs: tokenizer returned {list(inputs.keys())!r} "
222
+ "with no input_ids — chat template likely misconfigured"
223
+ )
224
+
225
+ return inputs
226
+
227
+
179
228
  def build_app() -> FastAPI:
180
229
  app = FastAPI(
181
230
  title="Drydock Deep Noir Steering Sidecar",
@@ -236,21 +285,19 @@ def build_app() -> FastAPI:
236
285
  content={"error": {"message": str(e), "type": "model_load_failed"}},
237
286
  )
238
287
 
239
- # Apply the chat template — Gemma 4 has its own.
288
+ # Apply the chat template — see prepare_chat_inputs for the API
289
+ # drift across transformers versions.
290
+ import torch
291
+
240
292
  try:
241
- prompt_ids = tokenizer.apply_chat_template(
242
- messages,
243
- add_generation_prompt=True,
244
- return_tensors="pt",
293
+ inputs = prepare_chat_inputs(
294
+ tokenizer, messages, device=model.device
245
295
  )
246
296
  except Exception as e:
247
297
  raise HTTPException(
248
298
  status_code=400, detail=f"chat template failed: {e}"
249
299
  )
250
-
251
- import torch
252
-
253
- prompt_ids = prompt_ids.to(model.device)
300
+ prompt_ids = inputs["input_ids"]
254
301
  max_new_tokens = int(payload.get("max_tokens") or 512)
255
302
  # Gemma 4 anti-loop sampling defaults — match what we ship in
256
303
  # DEFAULT_MODELS for the local model. Caller can override via
@@ -267,29 +314,21 @@ def build_app() -> FastAPI:
267
314
  active_layers: list[int] = []
268
315
  t0 = time.perf_counter()
269
316
  with torch.no_grad():
317
+ gen_kwargs = dict(
318
+ max_new_tokens=max_new_tokens,
319
+ do_sample=do_sample,
320
+ temperature=temperature if do_sample else 1.0,
321
+ top_p=top_p if do_sample else 1.0,
322
+ top_k=top_k if do_sample else 0,
323
+ pad_token_id=tokenizer.eos_token_id,
324
+ )
270
325
  if _HOOK_MANAGER is not None and directives:
271
326
  with _HOOK_MANAGER.activate(directives) as active:
272
327
  if active is not None:
273
328
  active_layers = active.fired_layers()
274
- output = model.generate(
275
- prompt_ids,
276
- max_new_tokens=max_new_tokens,
277
- do_sample=do_sample,
278
- temperature=temperature if do_sample else 1.0,
279
- top_p=top_p if do_sample else 1.0,
280
- top_k=top_k if do_sample else 0,
281
- pad_token_id=tokenizer.eos_token_id,
282
- )
329
+ output = model.generate(**inputs, **gen_kwargs)
283
330
  else:
284
- output = model.generate(
285
- prompt_ids,
286
- max_new_tokens=max_new_tokens,
287
- do_sample=do_sample,
288
- temperature=temperature if do_sample else 1.0,
289
- top_p=top_p if do_sample else 1.0,
290
- top_k=top_k if do_sample else 0,
291
- pad_token_id=tokenizer.eos_token_id,
292
- )
331
+ output = model.generate(**inputs, **gen_kwargs)
293
332
  gen_time = time.perf_counter() - t0
294
333
 
295
334
  # Decode only the newly-generated portion.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.25"
3
+ version = "2.8.27"
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"
@@ -184,11 +184,33 @@ def judge_with_gemma(question: str, gold: str, pred: str) -> tuple[str, str]:
184
184
  return "ERROR", f"judge failed: {e!r}"
185
185
 
186
186
 
187
- def score_answer(q: dict, pred: str) -> dict:
187
+ def score_answer(q: dict, pred: str, outcome: dict | None = None) -> dict:
188
+ """Score the model's predicted answer against the ground truth.
189
+
190
+ `outcome` is the dict returned by `run_one` (optional). When passed
191
+ and `pred` is empty, we sub-classify the empty failure using
192
+ `msg_count` so the diagnostic distinguishes 'model never started'
193
+ (msg_count<=1) from 'model talked but did not emit FINAL ANSWER:'
194
+ (msg_count>1). This dropped out of the Q4 30-Q overnight diagnosis
195
+ on 2026-05-13 — 26/30 empties shared `method='empty'` but the
196
+ sessions had very different shapes underneath.
197
+ """
188
198
  gold = q["answer"]
189
199
  answer_type = q.get("answer_type", "text") or "text"
190
200
  if not pred.strip():
191
- return {"correct": False, "method": "empty", "verdict": "NO",
201
+ method = "empty"
202
+ if outcome is not None:
203
+ msg_count = int(outcome.get("msg_count") or 0)
204
+ if msg_count <= 1:
205
+ # Only the user message landed — the model never even
206
+ # produced a tool call or content token before the
207
+ # harness killed the session.
208
+ method = "empty:no_response"
209
+ else:
210
+ # Assistant did produce messages (tool calls / thinking
211
+ # turns) but extraction found no FINAL ANSWER: line.
212
+ method = "empty:no_final_answer"
213
+ return {"correct": False, "method": method, "verdict": "NO",
192
214
  "judge_reasoning": "no answer extracted"}
193
215
  if answer_type in ("multipleChoice", "exactMatch", "numeric"):
194
216
  if exact_score(pred, gold):
@@ -494,7 +516,7 @@ def main() -> int:
494
516
  "predicted": "", "ground_truth": q["answer"],
495
517
  "session_dir": "", "runner_error": repr(e),
496
518
  }
497
- score = score_answer(q, outcome["predicted"])
519
+ score = score_answer(q, outcome["predicted"], outcome)
498
520
  outcome.update(score)
499
521
  print(f" pred: {outcome['predicted'][:120]}")
500
522
  print(f" gold: {q['answer'][:120]}")
@@ -530,15 +552,36 @@ def main() -> int:
530
552
  ),
531
553
  source=f"hle:{qid}",
532
554
  suggested_action=(
533
- "Investigate retrieval coverage for this topic; "
534
- "consider GraphRAG ingest of relevant corpus or "
535
- "a prompt rule to force retrieve before answering."
555
+ # Refined per Q4 30-Q diagnosis (2026-05-13):
556
+ # `empty:no_response` (msg_count<=1) is a
557
+ # thinking-stall model never started, so
558
+ # the action is harness-side (timeout,
559
+ # forcing function, quant). `empty:no_final_answer`
560
+ # (msg_count>1) means the model engaged but
561
+ # didn't produce a FINAL ANSWER: line — that's
562
+ # a retrieval / prompt-rule gap.
563
+ "Model never produced a response within the "
564
+ "session timeout. Action: investigate thinking-"
565
+ "budget exhaustion (raise timeout, force tool-"
566
+ "call cap, consider Q3 vs Q4 quant)."
567
+ if method == "empty:no_response"
568
+ else "Model engaged with tools but never emitted "
569
+ "FINAL ANSWER: — investigate retrieval "
570
+ "coverage / prompt rule to force "
571
+ "answer-after-N-turns."
572
+ if method == "empty:no_final_answer"
573
+ else "Investigate retrieval coverage for this "
574
+ "topic; consider GraphRAG ingest of relevant "
575
+ "corpus or a prompt rule to force retrieve "
576
+ "before answering."
536
577
  if method == "empty"
537
578
  else "Compare predicted vs gold; surface to "
538
579
  "autonomous_review as a prompt/AGENTS.md "
539
580
  "candidate."
540
581
  ),
541
- confidence=0.9 if method == "empty" else 0.6,
582
+ confidence=(
583
+ 0.9 if method.startswith("empty") else 0.6
584
+ ),
542
585
  extra={"category": q.get("category", ""),
543
586
  "method": method},
544
587
  ))
@@ -0,0 +1,167 @@
1
+ """Tests for the soft-nudge branch of `_auto_prefetch_retrieve`.
2
+
3
+ When auto-retrieve fires and the corpus returns quality hits (above
4
+ the QUALITY_THRESHOLD), but no chunk has the curated `ANSWER:` marker
5
+ that triggers the authoritative-answer path, the loop must still
6
+ inject a soft system note telling the model to read the retrieved
7
+ context before web_searching.
8
+
9
+ Without this nudge, Gemma 4 routinely:
10
+ user → synth retrieve → tool result → web_search ×0-8 → 481s timeout
11
+ (no content emitted)
12
+
13
+ The Q4 30-Q math HLE overnight (2026-05-13) caught this: 26/30 sessions
14
+ ended at 481s with last role=tool. The soft nudge biases the model
15
+ toward producing content from the retrieved chunks instead.
16
+
17
+ These tests drive the relevant code paths via a mocked GraphRAG Index
18
+ and assert that:
19
+ - authoritative case injects the strict "use ANSWER: verbatim" note
20
+ - non-authoritative quality hits inject the soft "read these first" note
21
+ - empty / below-threshold retrieval injects NEITHER (no note at all)
22
+ """
23
+ from __future__ import annotations
24
+
25
+ import sys
26
+ from dataclasses import dataclass
27
+ from typing import Any
28
+
29
+ import pytest
30
+
31
+
32
+ @dataclass
33
+ class _Hit:
34
+ score: float
35
+ content: str
36
+ file: str = "test.md"
37
+ start_line: int = 1
38
+ end_line: int = 10
39
+
40
+
41
+ class _FakeResult:
42
+ def __init__(self, hits):
43
+ self.text = hits
44
+
45
+
46
+ class _FakeIndex:
47
+ def __init__(self, hits):
48
+ self._hits = hits
49
+
50
+ def retrieve(self, query, *, symbol_limit=0, text_limit=4):
51
+ return _FakeResult(self._hits)
52
+
53
+
54
+ class _FakeMessages:
55
+ def __init__(self):
56
+ self._items: list[Any] = []
57
+
58
+ def append(self, m):
59
+ self._items.append(m)
60
+
61
+ def __len__(self):
62
+ return len(self._items)
63
+
64
+
65
+ def _make_agent(monkeypatch, hits, tmp_path):
66
+ """Build a minimal object that quacks like AgentLoop for the
67
+ sole purpose of running `_auto_prefetch_retrieve.__func__`."""
68
+ # Fake graphrag db file path so the existence check passes.
69
+ db_file = tmp_path / "graphrag.sqlite"
70
+ db_file.write_text("") # exists check only
71
+
72
+ # Patch the Index constructor so the function doesn't open a real db.
73
+ import drydock.graphrag as graphrag_pkg
74
+
75
+ monkeypatch.setattr(
76
+ graphrag_pkg, "Index", lambda _db_path: _FakeIndex(hits)
77
+ )
78
+ monkeypatch.setenv("DRYDOCK_GRAPHRAG_DB", str(db_file))
79
+
80
+ notes: list[str] = []
81
+
82
+ class _FakeAgent:
83
+ messages = _FakeMessages()
84
+
85
+ def _inject_system_note(self, note):
86
+ notes.append(note)
87
+
88
+ return _FakeAgent(), notes
89
+
90
+
91
+ def test_authoritative_chunk_injects_strict_note(monkeypatch, tmp_path):
92
+ """A chunk with ANSWER: marker at a high BM25 score must trigger
93
+ the strict 'emit verbatim' note."""
94
+ from drydock.core.agent_loop import AgentLoop
95
+
96
+ hits = [
97
+ _Hit(
98
+ score=150.0, # above AUTHORITATIVE_SCORE=100
99
+ content="===hle:abc===\nQUESTION: What is 2+2?\nANSWER: 4",
100
+ )
101
+ ]
102
+ agent, notes = _make_agent(monkeypatch, hits, tmp_path)
103
+ AgentLoop._auto_prefetch_retrieve(agent, "QUESTION: What is 2+2?")
104
+ assert len(notes) == 1, notes
105
+ assert "FINAL ANSWER" in notes[0]
106
+ assert "verbatim" in notes[0]
107
+
108
+
109
+ def test_quality_hits_without_marker_inject_soft_note(monkeypatch, tmp_path):
110
+ """Quality hits (score >= 8.0) but no ANSWER: marker should
111
+ trigger the soft nudge — the fix for the Q4 thinking-stall."""
112
+ from drydock.core.agent_loop import AgentLoop
113
+
114
+ hits = [
115
+ _Hit(
116
+ score=20.0,
117
+ content="Stochastic gradient descent updates parameters by "
118
+ "moving against the gradient of a randomly sampled loss term.",
119
+ ),
120
+ _Hit(
121
+ score=15.0,
122
+ content="Convergence rate depends on the learning-rate "
123
+ "schedule and the variance of the noisy gradient.",
124
+ ),
125
+ ]
126
+ agent, notes = _make_agent(monkeypatch, hits, tmp_path)
127
+ AgentLoop._auto_prefetch_retrieve(agent, "What is stochastic gradient descent?")
128
+ assert len(notes) == 1, notes
129
+ note = notes[0]
130
+ # Soft characteristics: mentions the chunk count, instructs to
131
+ # read first and discourages duplicate web_search.
132
+ assert "chunk" in note.lower()
133
+ assert "web_search" in note
134
+ assert "do not duplicate" in note.lower() or "do not" in note.lower()
135
+ # Must NOT be the authoritative note (those phrases live there).
136
+ assert "FINAL ANSWER" not in note
137
+ assert "verbatim" not in note
138
+
139
+
140
+ def test_no_quality_hits_injects_nothing(monkeypatch, tmp_path):
141
+ """Below the QUALITY_THRESHOLD = 8.0 floor, the function returns
142
+ before any note can fire — confirms we didn't add a spurious branch."""
143
+ from drydock.core.agent_loop import AgentLoop
144
+
145
+ hits = [
146
+ _Hit(score=2.0, content="weak match 1"),
147
+ _Hit(score=1.5, content="weak match 2"),
148
+ ]
149
+ agent, notes = _make_agent(monkeypatch, hits, tmp_path)
150
+ AgentLoop._auto_prefetch_retrieve(agent, "an arbitrary question phrase")
151
+ assert notes == []
152
+
153
+
154
+ def test_authoritative_and_soft_are_mutually_exclusive(monkeypatch, tmp_path):
155
+ """When the authoritative path fires, the soft note must NOT also
156
+ fire (one note per retrieval, never both)."""
157
+ from drydock.core.agent_loop import AgentLoop
158
+
159
+ hits = [
160
+ _Hit(
161
+ score=150.0,
162
+ content="===hle:abc===\nQUESTION: What is X?\nANSWER: Y",
163
+ )
164
+ ]
165
+ agent, notes = _make_agent(monkeypatch, hits, tmp_path)
166
+ AgentLoop._auto_prefetch_retrieve(agent, "QUESTION: What is X?")
167
+ assert len(notes) == 1 # not 2
@@ -0,0 +1,147 @@
1
+ """Unit tests for `prepare_chat_inputs` — the chat-template conversion
2
+ that broke under transformers 5.x because `apply_chat_template` returns
3
+ a BatchEncoding by default (whereas older code expected a bare Tensor).
4
+
5
+ These tests cover the three shapes the helper must accept:
6
+
7
+ 1. Modern transformers: `return_dict=True` honoured → BatchEncoding /
8
+ dict-like with `input_ids` + `attention_mask`.
9
+ 2. Older transformers: `return_dict` raises TypeError → helper falls
10
+ back to tokenize=False then `tokenizer(text, return_tensors='pt')`.
11
+ 3. Edge: some tokenizers ignore `return_dict` and still hand back a
12
+ bare Tensor → helper wraps it as `{'input_ids': tensor}`.
13
+
14
+ We use a hand-rolled fake tokenizer rather than HF-hub-downloading
15
+ because the test must run offline and not pay model-fetch cost on every
16
+ pytest invocation.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import pytest
21
+
22
+
23
+ @pytest.fixture
24
+ def torch_mod():
25
+ """Skip the whole file if torch isn't installed (CI minimal envs)."""
26
+ torch = pytest.importorskip("torch")
27
+ return torch
28
+
29
+
30
+ def _seq_to_tensor(torch, ids):
31
+ return torch.tensor([ids], dtype=torch.long)
32
+
33
+
34
+ class _FakeModernTokenizer:
35
+ """Mimics transformers >=5 — return_dict=True returns dict with
36
+ input_ids + attention_mask. Without return_dict, returns Tensor."""
37
+
38
+ def __init__(self, torch):
39
+ self._torch = torch
40
+
41
+ def apply_chat_template(
42
+ self, messages, *, add_generation_prompt=False,
43
+ return_tensors=None, return_dict=False, tokenize=True,
44
+ ):
45
+ if not tokenize:
46
+ return "USER: " + messages[-1]["content"]
47
+ ids = [10, 11, 12, 13]
48
+ if return_dict:
49
+ return {
50
+ "input_ids": _seq_to_tensor(self._torch, ids),
51
+ "attention_mask": _seq_to_tensor(self._torch, [1] * len(ids)),
52
+ }
53
+ return _seq_to_tensor(self._torch, ids)
54
+
55
+ def __call__(self, text, *, return_tensors=None):
56
+ # Used by the fallback path.
57
+ return {
58
+ "input_ids": _seq_to_tensor(self._torch, [20, 21, 22]),
59
+ "attention_mask": _seq_to_tensor(self._torch, [1, 1, 1]),
60
+ }
61
+
62
+
63
+ class _FakeLegacyTokenizer:
64
+ """Mimics older transformers that don't accept return_dict."""
65
+
66
+ def __init__(self, torch):
67
+ self._torch = torch
68
+
69
+ def apply_chat_template(
70
+ self, messages, *, add_generation_prompt=False,
71
+ return_tensors=None, tokenize=True,
72
+ ):
73
+ # Note: no return_dict kwarg. Passing return_dict trips TypeError.
74
+ if not tokenize:
75
+ return "USER: " + messages[-1]["content"]
76
+ return _seq_to_tensor(self._torch, [30, 31, 32])
77
+
78
+ def __call__(self, text, *, return_tensors=None):
79
+ return {"input_ids": _seq_to_tensor(self._torch, [40, 41, 42, 43])}
80
+
81
+
82
+ class _FakeTensorOnlyTokenizer:
83
+ """Mimics tokenizers that ignore return_dict and still hand back a Tensor."""
84
+
85
+ def __init__(self, torch):
86
+ self._torch = torch
87
+
88
+ def apply_chat_template(
89
+ self, messages, *, add_generation_prompt=False,
90
+ return_tensors=None, return_dict=False, tokenize=True,
91
+ ):
92
+ return _seq_to_tensor(self._torch, [50, 51])
93
+
94
+
95
+ def test_modern_tokenizer_returns_dict_with_attention_mask(torch_mod):
96
+ from drydock.steering.sidecar.server import prepare_chat_inputs
97
+
98
+ tok = _FakeModernTokenizer(torch_mod)
99
+ out = prepare_chat_inputs(tok, [{"role": "user", "content": "hi"}])
100
+ assert "input_ids" in out
101
+ assert "attention_mask" in out
102
+ assert out["input_ids"].shape == (1, 4)
103
+ assert out["attention_mask"].shape == (1, 4)
104
+
105
+
106
+ def test_modern_tokenizer_moves_to_device(torch_mod):
107
+ from drydock.steering.sidecar.server import prepare_chat_inputs
108
+
109
+ tok = _FakeModernTokenizer(torch_mod)
110
+ out = prepare_chat_inputs(
111
+ tok, [{"role": "user", "content": "hi"}], device=torch_mod.device("cpu")
112
+ )
113
+ assert out["input_ids"].device.type == "cpu"
114
+ assert out["attention_mask"].device.type == "cpu"
115
+
116
+
117
+ def test_legacy_tokenizer_falls_back_to_two_step(torch_mod):
118
+ from drydock.steering.sidecar.server import prepare_chat_inputs
119
+
120
+ tok = _FakeLegacyTokenizer(torch_mod)
121
+ out = prepare_chat_inputs(tok, [{"role": "user", "content": "hi"}])
122
+ # Fallback path uses tokenizer(text) which returns [40,41,42,43]
123
+ assert out["input_ids"].tolist() == [[40, 41, 42, 43]]
124
+
125
+
126
+ def test_tensor_only_tokenizer_is_wrapped(torch_mod):
127
+ from drydock.steering.sidecar.server import prepare_chat_inputs
128
+
129
+ tok = _FakeTensorOnlyTokenizer(torch_mod)
130
+ out = prepare_chat_inputs(tok, [{"role": "user", "content": "hi"}])
131
+ assert "input_ids" in out
132
+ assert out["input_ids"].tolist() == [[50, 51]]
133
+
134
+
135
+ def test_helper_raises_when_no_input_ids(torch_mod):
136
+ """A misconfigured tokenizer that returns a dict without input_ids
137
+ must surface a clear error, not a downstream KeyError."""
138
+ from drydock.steering.sidecar.server import prepare_chat_inputs
139
+
140
+ class _Bad:
141
+ def apply_chat_template(self, messages, **kw):
142
+ if kw.get("return_dict"):
143
+ return {"pixel_values": _seq_to_tensor(torch_mod, [0])}
144
+ return _seq_to_tensor(torch_mod, [0])
145
+
146
+ with pytest.raises(RuntimeError, match="no input_ids"):
147
+ prepare_chat_inputs(_Bad(), [{"role": "user", "content": "hi"}])