drydock-cli 2.9.54__tar.gz → 2.9.57__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 (709) hide show
  1. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/PKG-INFO +1 -1
  2. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/llm_analyzer.py +7 -2
  3. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agent_loop.py +30 -4
  4. drydock_cli-2.9.57/drydock/curiosity/gap_detector.py +484 -0
  5. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/pyproject.toml +1 -1
  6. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_curiosity.py +34 -0
  7. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/uv.lock +1 -1
  8. drydock_cli-2.9.54/drydock/curiosity/gap_detector.py +0 -224
  9. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/.gitignore +0 -0
  10. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/LICENSE +0 -0
  11. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/NOTICE +0 -0
  12. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/README.md +0 -0
  13. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/distribution/zed/LICENSE +0 -0
  14. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/docs/README.md +0 -0
  15. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/__init__.py +0 -0
  16. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/__main__.py +0 -0
  17. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/__init__.py +0 -0
  18. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/acp_agent_loop.py +0 -0
  19. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/acp_logger.py +0 -0
  20. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/entrypoint.py +0 -0
  21. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/__init__.py +0 -0
  22. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/base.py +0 -0
  23. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/bash.py +0 -0
  24. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/read_file.py +0 -0
  25. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/search_replace.py +0 -0
  26. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/todo.py +0 -0
  27. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/builtins/write_file.py +0 -0
  28. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/tools/session_update.py +0 -0
  29. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/acp/utils.py +0 -0
  30. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/__init__.py +0 -0
  31. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/detectors.py +0 -0
  32. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/detectors_proposed.py +0 -0
  33. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/history.py +0 -0
  34. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/interventions.py +0 -0
  35. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/metrics.py +0 -0
  36. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/opus_escalator.py +0 -0
  37. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/persistence.py +0 -0
  38. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/policy.py +0 -0
  39. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/proposer.py +0 -0
  40. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/stager.py +0 -0
  41. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/task_classifier.py +0 -0
  42. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/tuning.py +0 -0
  43. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/validator.py +0 -0
  44. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/admiral/worker.py +0 -0
  45. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/__init__.py +0 -0
  46. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/__init__.py +0 -0
  47. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/base.py +0 -0
  48. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/path_completion.py +0 -0
  49. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/autocompletion/slash_command.py +0 -0
  50. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/cli.py +0 -0
  51. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/clipboard.py +0 -0
  52. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/commands.py +0 -0
  53. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/entrypoint.py +0 -0
  54. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/fix_windows_path.py +0 -0
  55. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/history_manager.py +0 -0
  56. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  57. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  58. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  59. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/terminal_setup.py +0 -0
  60. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/__init__.py +0 -0
  61. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  62. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/app.py +0 -0
  63. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/app.tcss +0 -0
  64. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/external_editor.py +0 -0
  65. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  66. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  67. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  68. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  69. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  70. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  71. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  72. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  73. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  74. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  75. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  76. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  77. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  78. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  79. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  80. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  81. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  82. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  83. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  84. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  85. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  86. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  87. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  88. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  89. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  90. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  91. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  92. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  93. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  94. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  95. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  96. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  97. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  98. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  99. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  100. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  101. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  102. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/history.py +0 -0
  103. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  104. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/textual_ui/windowing/state.py +0 -0
  105. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/__init__.py +0 -0
  106. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  107. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  108. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  109. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  110. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  111. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/update.py +0 -0
  112. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/cli/update_notifier/whats_new.py +0 -0
  113. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/__init__.py +0 -0
  114. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agents/__init__.py +0 -0
  115. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agents/manager.py +0 -0
  116. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/agents/models.py +0 -0
  117. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auth/__init__.py +0 -0
  118. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auth/crypto.py +0 -0
  119. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auth/github.py +0 -0
  120. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/auto_solve.py +0 -0
  121. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/__init__.py +0 -0
  122. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/completers.py +0 -0
  123. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  124. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  125. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  126. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  127. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  128. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/fuzzy.py +0 -0
  129. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/path_prompt.py +0 -0
  130. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  131. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/build_orchestrator.py +0 -0
  132. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/checkpoint.py +0 -0
  133. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/__init__.py +0 -0
  134. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/__main__.py +0 -0
  135. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/classifier.py +0 -0
  136. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/dispatcher.py +0 -0
  137. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/rules.py +0 -0
  138. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/classifier/signal.py +0 -0
  139. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/__init__.py +0 -0
  140. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/_dotenv.py +0 -0
  141. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/_settings.py +0 -0
  142. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/doctor.py +0 -0
  143. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/harness_files/__init__.py +0 -0
  144. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  145. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/harness_files/_paths.py +0 -0
  146. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/local_detect.py +0 -0
  147. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/config/migrate.py +0 -0
  148. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/constraint_extract.py +0 -0
  149. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/constraint_hint.py +0 -0
  150. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/consultant.py +0 -0
  151. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/context_recovery.py +0 -0
  152. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/drydock_states.py +0 -0
  153. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/goal.py +0 -0
  154. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/hooks.py +0 -0
  155. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/__init__.py +0 -0
  156. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/anthropic.py +0 -0
  157. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/base.py +0 -0
  158. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/factory.py +0 -0
  159. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/generic.py +0 -0
  160. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/mistral.py +0 -0
  161. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  162. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/backend/vertex.py +0 -0
  163. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/exceptions.py +0 -0
  164. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/format.py +0 -0
  165. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/message_utils.py +0 -0
  166. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/llm/types.py +0 -0
  167. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/logger.py +0 -0
  168. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/middleware.py +0 -0
  169. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/output_formatters.py +0 -0
  170. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/__init__.py +0 -0
  171. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/_drydock_home.py +0 -0
  172. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/_local_config_walk.py +0 -0
  173. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/paths/conventions.py +0 -0
  174. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/plan_session.py +0 -0
  175. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/plugins.py +0 -0
  176. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/programmatic.py +0 -0
  177. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/__init__.py +0 -0
  178. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/builder.md +0 -0
  179. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/cli.md +0 -0
  180. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/compact.md +0 -0
  181. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/dangerous_directory.md +0 -0
  182. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/diagnostic.md +0 -0
  183. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/explore.md +0 -0
  184. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/gemma4.md +0 -0
  185. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/gemma4_math.md +0 -0
  186. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/gemma4_slim.md +0 -0
  187. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/planner.md +0 -0
  188. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/project_context.md +0 -0
  189. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/prompts/tests.md +0 -0
  190. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/proxy_setup.py +0 -0
  191. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/agent_memory.py +0 -0
  192. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/checkpoints.py +0 -0
  193. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/session_loader.py +0 -0
  194. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/session_logger.py +0 -0
  195. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/session_migration.py +0 -0
  196. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session/state_file.py +0 -0
  197. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/session_checker.py +0 -0
  198. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/__init__.py +0 -0
  199. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/manager.py +0 -0
  200. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/models.py +0 -0
  201. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/skills/parser.py +0 -0
  202. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/slug.py +0 -0
  203. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/spec_check.py +0 -0
  204. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/steering_hook.py +0 -0
  205. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/system_prompt.py +0 -0
  206. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/telemetry/__init__.py +0 -0
  207. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/telemetry/send.py +0 -0
  208. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/errors.py +0 -0
  209. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/git.py +0 -0
  210. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/nuage.py +0 -0
  211. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/teleport.py +0 -0
  212. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/teleport/types.py +0 -0
  213. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/base.py +0 -0
  214. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/_task_manager.py +0 -0
  215. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  216. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  217. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/bash.py +0 -0
  218. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  219. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/count_tool.py +0 -0
  220. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/cron.py +0 -0
  221. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  222. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/glob_tool.py +0 -0
  223. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/grep.py +0 -0
  224. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  225. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  226. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/logic_tool.py +0 -0
  227. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/lsp.py +0 -0
  228. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/math_tool.py +0 -0
  229. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  230. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
  231. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/memory_tool.py +0 -0
  232. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  233. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  234. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/powershell.py +0 -0
  235. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prolog_tool.py +0 -0
  236. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  237. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  238. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  239. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  240. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  241. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  242. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  243. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  244. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  245. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  246. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  247. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  248. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  249. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  250. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  251. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/task.md +0 -0
  252. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  253. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  254. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  255. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  256. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  257. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  258. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  259. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/read_file.py +0 -0
  260. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/retrieve.py +0 -0
  261. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/search_replace.py +0 -0
  262. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/set_tool.py +0 -0
  263. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/solve_tool.py +0 -0
  264. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/stats_tool.py +0 -0
  265. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/task.py +0 -0
  266. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/todo.py +0 -0
  267. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/tool_search.py +0 -0
  268. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/units_tool.py +0 -0
  269. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/verify_tool.py +0 -0
  270. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/webfetch.py +0 -0
  271. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/websearch.py +0 -0
  272. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/worktree.py +0 -0
  273. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/builtins/write_file.py +0 -0
  274. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/injection_guard.py +0 -0
  275. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/manager.py +0 -0
  276. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp/__init__.py +0 -0
  277. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp/registry.py +0 -0
  278. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp/tools.py +0 -0
  279. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/mcp_sampling.py +0 -0
  280. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/ui.py +0 -0
  281. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/tools/utils.py +0 -0
  282. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/trusted_folders.py +0 -0
  283. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/types.py +0 -0
  284. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/core/utils.py +0 -0
  285. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/__init__.py +0 -0
  286. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/__main__.py +0 -0
  287. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/ingest.py +0 -0
  288. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/item.py +0 -0
  289. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/queue.py +0 -0
  290. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/curiosity/surprise.py +0 -0
  291. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/__init__.py +0 -0
  292. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/__main__.py +0 -0
  293. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/code_indexer.py +0 -0
  294. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/retriever.py +0 -0
  295. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/storage.py +0 -0
  296. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/graphrag/text_indexer.py +0 -0
  297. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/__init__.py +0 -0
  298. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/base.py +0 -0
  299. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/onboarding.tcss +0 -0
  300. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/__init__.py +0 -0
  301. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/api_key.py +0 -0
  302. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/choice.py +0 -0
  303. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/local_model.py +0 -0
  304. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/onboarding/screens/welcome.py +0 -0
  305. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  306. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  307. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/__init__.py +0 -0
  308. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/api-design/SKILL.md +0 -0
  309. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/audit-tests/SKILL.md +0 -0
  310. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/batch/SKILL.md +0 -0
  311. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/checklist/SKILL.md +0 -0
  312. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/commit-code/SKILL.md +0 -0
  313. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  314. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/context-summary/SKILL.md +0 -0
  315. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/create-presentation/SKILL.md +0 -0
  316. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/deep-research/SKILL.md +0 -0
  317. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/deploy/SKILL.md +0 -0
  318. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/diff-review/SKILL.md +0 -0
  319. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/doc-gen/SKILL.md +0 -0
  320. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/explain-code/SKILL.md +0 -0
  321. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/explore-code/SKILL.md +0 -0
  322. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/fix-issue/SKILL.md +0 -0
  323. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/git-ops/SKILL.md +0 -0
  324. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/init-project/SKILL.md +0 -0
  325. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/investigate/SKILL.md +0 -0
  326. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/logic/SKILL.md +0 -0
  327. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  328. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/loop/SKILL.md +0 -0
  329. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/migrate/SKILL.md +0 -0
  330. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/perf-analyze/SKILL.md +0 -0
  331. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/plan-impl/SKILL.md +0 -0
  332. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/pr-review/SKILL.md +0 -0
  333. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/prove/SKILL.md +0 -0
  334. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/refactor/SKILL.md +0 -0
  335. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/regex-help/SKILL.md +0 -0
  336. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/review/SKILL.md +0 -0
  337. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/security-review/SKILL.md +0 -0
  338. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/ship/SKILL.md +0 -0
  339. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/simplify/SKILL.md +0 -0
  340. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/strong-tests/SKILL.md +0 -0
  341. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/skills/test-verify/SKILL.md +0 -0
  342. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/__init__.py +0 -0
  343. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/__main__.py +0 -0
  344. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/applier.py +0 -0
  345. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/config.py +0 -0
  346. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/registry.py +0 -0
  347. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sandbox.py +0 -0
  348. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/__init__.py +0 -0
  349. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/header_parser.py +0 -0
  350. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/hooks.py +0 -0
  351. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/loader.py +0 -0
  352. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/sidecar/server.py +0 -0
  353. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/__init__.py +0 -0
  354. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/capture.py +0 -0
  355. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/compute_vector.py +0 -0
  356. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/extract_pairs.py +0 -0
  357. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/train/scan_sessions.py +0 -0
  358. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/steering/vectors.py +0 -0
  359. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/drydock/whats_new.md +0 -0
  360. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/install_tests/README.md +0 -0
  361. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/install_tests/publish/README.md +0 -0
  362. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/install_tests/windows/README.md +0 -0
  363. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/scripts/README.md +0 -0
  364. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/scripts/_archived_eval_harness/README.md +0 -0
  365. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/scripts/llm/README.md +0 -0
  366. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/__init__.py +0 -0
  367. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/conftest.py +0 -0
  368. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_acp.py +0 -0
  369. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_agent_thought.py +0 -0
  370. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_bash.py +0 -0
  371. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_compact_session_updates.py +0 -0
  372. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_content.py +0 -0
  373. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_initialize.py +0 -0
  374. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_list_sessions.py +0 -0
  375. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_load_session.py +0 -0
  376. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_multi_session.py +0 -0
  377. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_new_session.py +0 -0
  378. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_proxy_setup_acp.py +0 -0
  379. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_read_file.py +0 -0
  380. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_search_replace.py +0 -0
  381. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_set_config_option.py +0 -0
  382. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_set_mode.py +0 -0
  383. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_set_model.py +0 -0
  384. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_tool_call_session_update.py +0 -0
  385. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_utils.py +0 -0
  386. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/acp/test_write_file.py +0 -0
  387. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/conftest.py +0 -0
  388. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_file_indexer.py +0 -0
  389. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_fuzzy.py +0 -0
  390. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  391. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  392. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_completion_controller.py +0 -0
  393. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  394. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_slash_command_controller.py +0 -0
  395. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  396. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/__init__.py +0 -0
  397. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/data/__init__.py +0 -0
  398. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/data/fireworks.py +0 -0
  399. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/data/mistral.py +0 -0
  400. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_anthropic_adapter.py +0 -0
  401. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_backend.py +0 -0
  402. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  403. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_reasoning_adapter.py +0 -0
  404. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  405. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  406. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  407. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  408. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_bell_notifications.py +0 -0
  409. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_braille_renderer.py +0 -0
  410. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_clipboard.py +0 -0
  411. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_commands.py +0 -0
  412. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_copy_shortcuts.py +0 -0
  413. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_external_editor.py +0 -0
  414. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_no_markup_static.py +0 -0
  415. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_question_app.py +0 -0
  416. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_spinner.py +0 -0
  417. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_switching_mode.py +0 -0
  418. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  419. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  420. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_session_resume.py +0 -0
  421. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/test_ui_skill_dispatch.py +0 -0
  422. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/textual_ui/__init__.py +0 -0
  423. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/cli/textual_ui/test_session_picker.py +0 -0
  424. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/conftest.py +0 -0
  425. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_agents.py +0 -0
  426. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_auth_crypto.py +0 -0
  427. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_auth_github.py +0 -0
  428. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  429. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  430. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_config_load_dotenv.py +0 -0
  431. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_config_paths.py +0 -0
  432. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_config_resolution.py +0 -0
  433. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_file_logging.py +0 -0
  434. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_plan_session.py +0 -0
  435. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_proxy_setup.py +0 -0
  436. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_slug.py +0 -0
  437. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_telemetry_send.py +0 -0
  438. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_teleport_git.py +0 -0
  439. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_teleport_nuage.py +0 -0
  440. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_teleport_service.py +0 -0
  441. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_trusted_folders.py +0 -0
  442. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/core/test_utils.py +0 -0
  443. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/common.py +0 -0
  444. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/conftest.py +0 -0
  445. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/mock_server.py +0 -0
  446. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  447. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/test_cli_tui_streaming.py +0 -0
  448. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  449. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/fixtures/doc_qa_system_prd.md +0 -0
  450. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/__init__.py +0 -0
  451. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/mock_backend_factory.py +0 -0
  452. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/mock_entrypoint.py +0 -0
  453. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/mock/utils.py +0 -0
  454. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/onboarding/test_run_onboarding.py +0 -0
  455. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/onboarding/test_ui_onboarding.py +0 -0
  456. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/session/test_session_loader.py +0 -0
  457. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/session/test_session_logger.py +0 -0
  458. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/session/test_session_migration.py +0 -0
  459. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/conftest.py +0 -0
  460. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/test_manager.py +0 -0
  461. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/test_models.py +0 -0
  462. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/skills/test_parser.py +0 -0
  463. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  464. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  465. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  466. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  467. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  468. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  469. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  470. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  471. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  472. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  473. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  474. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  475. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  476. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  477. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  478. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  479. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  480. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  481. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  482. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  483. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  484. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  485. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  486. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  487. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  488. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  489. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  490. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  491. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  492. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  493. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  494. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  495. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  496. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  497. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  498. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  499. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  500. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  501. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  502. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  503. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  504. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  505. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  506. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  507. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  508. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  509. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  510. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  511. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  512. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  513. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  514. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  515. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  516. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  517. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  518. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  519. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  520. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  521. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  522. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  523. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/base_snapshot_test_app.py +0 -0
  524. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/conftest.py +0 -0
  525. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/snap_compare.py +0 -0
  526. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  527. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  528. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  529. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  530. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  531. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  532. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  533. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  534. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  535. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  536. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  537. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  538. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  539. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  540. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/stubs/fake_backend.py +0 -0
  541. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/stubs/fake_client.py +0 -0
  542. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/stubs/fake_tool.py +0 -0
  543. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral.py +0 -0
  544. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  545. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_intervention_outcome.py +0 -0
  546. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_phase3.py +0 -0
  547. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_proposed.py +0 -0
  548. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_session_id.py +0 -0
  549. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_admiral_struggle_dedup.py +0 -0
  550. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_auto_compact.py +0 -0
  551. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_backend.py +0 -0
  552. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_observer_streaming.py +0 -0
  553. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_stats.py +0 -0
  554. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_tasks.py +0 -0
  555. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agent_tool_call.py +0 -0
  556. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_agents.py +0 -0
  557. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_algebra_tool.py +0 -0
  558. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_api_error_recovery.py +0 -0
  559. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_approval_modal_stray_keys.py +0 -0
  560. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  561. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_auto_solve.py +0 -0
  562. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_build.py +0 -0
  563. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_debug.py +0 -0
  564. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_multiagent.py +0 -0
  565. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_prd.py +0 -0
  566. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_prd_extended.py +0 -0
  567. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_tools.py +0 -0
  568. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_bank_update.py +0 -0
  569. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_build_projects.py +0 -0
  570. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_checkpoint.py +0 -0
  571. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_chemistry_tool.py +0 -0
  572. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_classifier.py +0 -0
  573. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_cli_programmatic_preload.py +0 -0
  574. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_config_migration.py +0 -0
  575. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_constraint_extract.py +0 -0
  576. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_constraint_hint.py +0 -0
  577. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_context_recovery.py +0 -0
  578. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_count_tool.py +0 -0
  579. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_current_bugs.py +0 -0
  580. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_dispatch_report.py +0 -0
  581. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_dispatcher.py +0 -0
  582. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_drydock_regression.py +0 -0
  583. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_drydock_tasks.py +0 -0
  584. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  585. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_full_regression.py +0 -0
  586. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_gemma4_anti_loop_migration.py +0 -0
  587. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_goal.py +0 -0
  588. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_graphrag.py +0 -0
  589. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_graphrag_worked_examples.py +0 -0
  590. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_hallucinated_tool_suppression.py +0 -0
  591. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_history_manager.py +0 -0
  592. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_hle_aggregate.py +0 -0
  593. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_integration.py +0 -0
  594. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_issue_fixes.py +0 -0
  595. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_linear_algebra_tool.py +0 -0
  596. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_local_detect.py +0 -0
  597. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_logic_tool.py +0 -0
  598. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_loop_detection.py +0 -0
  599. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_math_docs_lazy_injection.py +0 -0
  600. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_math_tool.py +0 -0
  601. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_mcp_settings.py +0 -0
  602. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_mcp_stdio_command_normalization.py +0 -0
  603. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_memory_tool.py +0 -0
  604. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_message_id.py +0 -0
  605. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_message_merging.py +0 -0
  606. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_middleware.py +0 -0
  607. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_multi_agent.py +0 -0
  608. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_number_theory_tool.py +0 -0
  609. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_prolog_tool.py +0 -0
  610. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_read_file_not_found_listing.py +0 -0
  611. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_read_file_notebook_slim.py +0 -0
  612. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_real_failures.py +0 -0
  613. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_real_issues.py +0 -0
  614. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_real_workflow.py +0 -0
  615. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_reasoning_content.py +0 -0
  616. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_rejudge_hle.py +0 -0
  617. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_retrieval_consumer.py +0 -0
  618. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_retrieve_project_detection.py +0 -0
  619. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_retrieve_tool.py +0 -0
  620. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_safe_parse_tool_args.py +0 -0
  621. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_search_replace_args_not_truncated.py +0 -0
  622. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_search_replace_syntax_rollback.py +0 -0
  623. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_session_log_event.py +0 -0
  624. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_session_publish_on_resume.py +0 -0
  625. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_set_tool.py +0 -0
  626. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_smoke.py +0 -0
  627. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_solve_tool.py +0 -0
  628. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_specialist_math_tools_hidden.py +0 -0
  629. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_stats_tool.py +0 -0
  630. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering.py +0 -0
  631. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_capture.py +0 -0
  632. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_compute_vector.py +0 -0
  633. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_extract_pairs.py +0 -0
  634. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_hook.py +0 -0
  635. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  636. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_steering_sidecar_hooks.py +0 -0
  637. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_system_prompt.py +0 -0
  638. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tagged_text.py +0 -0
  639. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_task_complete_nudge.py +0 -0
  640. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tool_args.py +0 -0
  641. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tool_call_loops_regression_suite.py +0 -0
  642. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_tool_stop_injected_scope.py +0 -0
  643. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncate_args_valid_json.py +0 -0
  644. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncated_arg_path_hint.py +0 -0
  645. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncated_search_replace_escalation.py +0 -0
  646. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_truncated_write_escalation.py +0 -0
  647. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_ui_external_editor.py +0 -0
  648. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_ui_input_history.py +0 -0
  649. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_units_tool.py +0 -0
  650. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_user_issues.py +0 -0
  651. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_validation_error_scrub.py +0 -0
  652. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_verify_tool.py +0 -0
  653. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_wall_of_text_rescue.py +0 -0
  654. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_workloads.py +0 -0
  655. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/test_write_file_missing_path.py +0 -0
  656. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/testbank_helpers.py +0 -0
  657. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_ask_user_question.py +0 -0
  658. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash.py +0 -0
  659. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  660. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_consec_empty_search.py +0 -0
  661. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  662. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  663. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  664. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  665. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  666. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  667. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  668. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_exit_plan_mode.py +0 -0
  669. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_grep.py +0 -0
  670. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  671. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_invoke_context.py +0 -0
  672. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  673. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_manager_get_tool_config.py +0 -0
  674. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_mcp.py +0 -0
  675. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_mcp_sampling.py +0 -0
  676. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_pre_rename_hook.py +0 -0
  677. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  678. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  679. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_directory.py +0 -0
  680. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_read_file_limit_truncation.py +0 -0
  681. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_append_fallback.py +0 -0
  682. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_dir_path.py +0 -0
  683. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_empty_content.py +0 -0
  684. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_file_not_found.py +0 -0
  685. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  686. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_hard_stop.py +0 -0
  687. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_malformed_block.py +0 -0
  688. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  689. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_placeholder.py +0 -0
  690. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  691. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_task.py +0 -0
  692. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_ui_bash_execution.py +0 -0
  693. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_webfetch.py +0 -0
  694. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_websearch.py +0 -0
  695. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  696. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_missing_main_module.py +0 -0
  697. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  698. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/tools/test_write_file_multifile_rename.py +0 -0
  699. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  700. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  701. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_do_update.py +0 -0
  702. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  703. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_github_update_gateway.py +0 -0
  704. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  705. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_ui_update_notification.py +0 -0
  706. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_update_use_case.py +0 -0
  707. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/tests/update_notifier/test_whats_new.py +0 -0
  708. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/web/README.md +0 -0
  709. {drydock_cli-2.9.54 → drydock_cli-2.9.57}/worked_examples/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.9.54
3
+ Version: 2.9.57
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -143,8 +143,13 @@ async def analyze(agent_loop: AgentLoop, finding: Finding) -> str | None:
143
143
  # Strip reasoning tokens that some models leak.
144
144
  if text.startswith("STUMPED"):
145
145
  return None
146
- if "DIRECTIVE:" in text:
147
- proposal = text.split("DIRECTIVE:", 1)[1].strip()
146
+ # The expected format is `DIRECTIVE [Bx,Cy]: <text>` — the colon comes
147
+ # after the bracket group, not immediately after "DIRECTIVE". A plain
148
+ # `"DIRECTIVE:" in text` check fails for this format, so use a regex.
149
+ import re as _re
150
+ m = _re.search(r"DIRECTIVE(?:\s*\[[^\]]*\])?\s*:(.*)", text, _re.DOTALL)
151
+ if m:
152
+ proposal = m.group(1).strip()
148
153
  # Take only the first line/paragraph — discard chain-of-thought.
149
154
  proposal = proposal.split("\n\n")[0].strip()
150
155
  return proposal or None
@@ -1690,16 +1690,24 @@ class AgentLoop:
1690
1690
  # The verifier never ran for any of them. Nudging late
1691
1691
  # forces them to run the verifier and iterate.
1692
1692
  #
1693
- # Also count `verify` tool calls. If the model emitted a
1694
- # `verify` call recently AND it returned passed=True, do
1695
- # NOT nudge the model genuinely passed its check.
1693
+ # Count `verify` tool calls for the nudge text. Note:
1694
+ # `last_verify_passed` is NOT used as a gate anymore.
1695
+ # 2026-06-04 v2.9.55 batch: the model's `verify` tool
1696
+ # checks MODEL-CHOSEN criteria, not the external tbench
1697
+ # verifier. Self-pass happens easily (chess-best-move had
1698
+ # 4 verify calls, last passed=True, model's answer was
1699
+ # wrong, external tbench verifier rejected). Using
1700
+ # last_verify_passed as a gate silenced the nudge across
1701
+ # 37/37 fails in that batch. The nudge cap (10) is
1702
+ # already a sufficient bound; let it fire so Fix A
1703
+ # (path-aware nudge) actually runs.
1696
1704
  verify_count = 0
1697
1705
  last_verify_passed = False
1698
1706
  for msg in self.messages:
1699
1707
  if msg.role == Role.tool and (msg.name == "verify"):
1700
1708
  verify_count += 1
1701
1709
  last_verify_passed = "passed: True" in (msg.content or "")
1702
- if is_programmatic and nudges < 10 and not last_verify_passed:
1710
+ if is_programmatic and nudges < 10:
1703
1711
  self._premature_exit_nudges = nudges + 1
1704
1712
  if zero_writes:
1705
1713
  paths_hint = ""
@@ -1740,6 +1748,24 @@ class AgentLoop:
1740
1748
  f"no file, and partial-credit verifiers reward "
1741
1749
  f"format correctness even when content is off."
1742
1750
  )
1751
+ elif last_verify_passed:
1752
+ # 2026-06-04: model self-verified with its OWN
1753
+ # criterion. Real tbench/pytest verifier runs
1754
+ # later and is stricter. Warn explicitly.
1755
+ note = (
1756
+ f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
1757
+ f"Your `verify` call passed, but that checks "
1758
+ f"the criterion YOU wrote — not the external "
1759
+ f"pytest the harness will run after you exit. "
1760
+ f"Common gap: your verify checks 'file exists' "
1761
+ f"or 'output contains X', but the verifier "
1762
+ f"checks EXACT format / EXACT path / specific "
1763
+ f"line content. Re-read the task literally: "
1764
+ f"the path it names, the format it specifies, "
1765
+ f"the example outputs it shows. Run a stricter "
1766
+ f"check (cat the file, run pytest if installed, "
1767
+ f"diff against the example) BEFORE exiting."
1768
+ )
1743
1769
  else:
1744
1770
  note = (
1745
1771
  f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
@@ -0,0 +1,484 @@
1
+ """Gap detector — find unfamiliar terms in user input.
2
+
3
+ A "gap" is a token in a user message that looks like a named entity or
4
+ identifier the agent probably has no context for: paper titles, library
5
+ names, API identifiers, file paths, multi-word Title Case phrases,
6
+ ALL-CAPS acronyms, version-like tokens.
7
+
8
+ The detector is HEURISTIC, not exhaustive. False positives are cheap
9
+ (an extra retrieve call) and false negatives are the failure mode the
10
+ PRD §5.7 calls out (Gemma 4 answers from prior on a general-knowledge
11
+ HLE question because it never noticed there was something to look up).
12
+ Bias the heuristics toward firing.
13
+
14
+ Public surface:
15
+
16
+ gaps: list[str] = detect_gaps(user_text)
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import re
21
+ from typing import Iterable
22
+
23
+ # Common English words that look like Title Case but aren't entities.
24
+ # Keep small — the goal is "minimize false positives on conversational
25
+ # openers", not exhaustive linguistic filtering.
26
+ _STOPWORDS: frozenset[str] = frozenset({
27
+ # Sentence-start common Title-Case words.
28
+ "The", "A", "An", "I", "We", "You", "It", "He", "She", "They",
29
+ "This", "That", "These", "Those", "What", "When", "Where", "Why",
30
+ "How", "Who", "Which", "If", "But", "And", "Or", "So", "Yes", "No",
31
+ "Please", "Can", "Could", "Would", "Should", "Will", "Let", "Do",
32
+ "Does", "Did", "Is", "Are", "Was", "Were", "Be", "Been", "Being",
33
+ "Have", "Has", "Had", "Get", "Got", "Make", "Made", "Take", "Took",
34
+ # Common imperative openers for drydock tasks.
35
+ "Build", "Fix", "Add", "Remove", "Update", "Refactor", "Test",
36
+ "Run", "Check", "Review", "Show", "List", "Explain", "Find", "Look",
37
+ # Sentence-starting verbs that appear after periods in numbered lists
38
+ # ("scratch.Step 1", "fail.Step 2") — dotted-identifier regex treats
39
+ # these as module.attr but they're sentence boundaries.
40
+ "Step", "Stop", "Start", "Read", "Write", "Open", "Use", "See",
41
+ "Try", "Note", "Save", "Load", "Copy", "Move", "Call", "Pass",
42
+ # HLE/exam prose openers — flagged in 2026-05-14 queue audit
43
+ # because they always lead a Title-Case phrase ("Consider the X").
44
+ "Consider", "Suppose", "Given", "Let", "Define", "Compute",
45
+ "Determine", "Evaluate", "Prove", "Recall", "Note", "Assume",
46
+ "Render", "Parse", "Scan", "Detect", "Match", "Merge",
47
+ "Insert", "Delete", "Select", "Update", "Create", "Drop",
48
+ })
49
+
50
+ # HLE / harness prompt-template tokens that the detector kept flagging
51
+ # as "unknown terms" — 2026-05-14 queue audit found FINAL (45×),
52
+ # ANSWER (44×), QUESTION (44×), FINAL ANSWER: (47×) all in the curiosity
53
+ # queue as false positives. Compared case-insensitively. Any candidate
54
+ # whose stripped form (case-folded, trailing colon stripped) is in this
55
+ # set is dropped before enqueue.
56
+ _TEMPLATE_NOISE: frozenset[str] = frozenset(
57
+ s.lower() for s in {
58
+ "FINAL", "ANSWER", "QUESTION", "FINAL ANSWER",
59
+ "GROUND TRUTH", "PREDICTED ANSWER", "VERDICT",
60
+ # autonomous_review / admiral output tokens
61
+ "CONSIDER", "RESPONSE", "RESULT", "VERIFIED",
62
+ # Common prose openers that pass acronym + title-case regexes
63
+ "CHAPTER", "SECTION", "PART", "INTRODUCTION", "CONCLUSION",
64
+ # HLE multiple-choice format boilerplate — 2026-05-16 queue audit
65
+ # found "Answer Choices" (95×), "None of the" (13×), etc. leaking
66
+ # through because they match the title-case phrase regex.
67
+ "ANSWER CHOICES", "ANSWER CHOICE",
68
+ "NONE OF THE", "NONE OF THE ABOVE", "NONE OF THESE",
69
+ "ALL OF THE", "ALL OF THE ABOVE", "ALL OF THESE",
70
+ "ALL OF ABOVE", "NONE OF ABOVE",
71
+ "CHOOSE ONE", "SELECT ONE", "WHICH OF THE",
72
+ "WHICH OF THE FOLLOWING",
73
+ # Python keywords — match _RE_ACRONYM (≥3 uppercase) but are never
74
+ # unknown to a coding assistant. 2026-05-22 queue audit: CLI (300×),
75
+ # NOT (200×), README (102×) in top false positives.
76
+ "NOT", "AND", "OR", "FOR", "DEF", "CLASS", "PASS", "RETURN",
77
+ "IMPORT", "FROM", "WITH", "TRY", "EXCEPT", "RAISE", "YIELD",
78
+ "ASYNC", "AWAIT", "TRUE", "FALSE", "NONE",
79
+ # Common coding / CLI abbreviations always known in coding context
80
+ "CLI", "GUI", "TUI", "URL", "HTTP", "HTTPS", "TCP", "UDP",
81
+ "README", "CHANGELOG", "LICENSE", "TODO", "FIXME", "HACK",
82
+ "ENV", "DIR", "STR", "INT", "BOOL", "DICT", "LIST", "SET",
83
+ "OBJ", "ERR", "MSG", "NUM", "VAR", "FMT", "RES", "REQ",
84
+ "LOG", "PID", "CWD", "SRC", "LIB", "BIN", "TMP",
85
+ # File formats and data interchange standards — always known
86
+ "JSON", "CSV", "TSV", "XML", "HTML", "YAML", "YML", "TOML",
87
+ "SQL", "SQLITE", "POSTGRESQL", "MYSQL", "REDIS",
88
+ "PDF", "SVG", "PNG", "JPG", "JPEG", "GIF", "ICO", "WEBP",
89
+ "ISO", "ASCII", "UTF", "UTF8", "UTF16", "BASE64",
90
+ "API", "SDK", "REST", "SOAP", "RPC", "GRPC", "CRUD",
91
+ "ORM", "MVC", "MVP", "MVVM", "OOP", "FP",
92
+ "CI", "CD", "PR", "MR", "WIP",
93
+ "SSH", "SSL", "TLS", "JWT", "OAUTH", "SAML",
94
+ "CPU", "GPU", "RAM", "SSD", "HDD", "NFS",
95
+ # Date/time format placeholders — appear in PRD prompts as template
96
+ # strings, never a meaningful GraphRAG ingest target.
97
+ "YYYY", "YY", "MM", "DD", "HH", "SS", "UTC", "GMT",
98
+ # Open-source license / protocol names — always known in coding context
99
+ "APACHE", "APACHE2", "MIT", "BSD", "GPL", "LGPL", "MPL", "ISC",
100
+ # Generic status/signal words that match _RE_ACRONYM but carry no
101
+ # knowledge gap — 2026-06-04 queue audit top false positives.
102
+ "ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL", "FATAL",
103
+ "TRACE", "VERBOSE", "NOTICE",
104
+ # HTTP methods — always known in coding context.
105
+ "GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT",
106
+ # HTTP/web protocol abbreviations.
107
+ "SSE", "WS", "WSS", "RPC", "JSONRPC",
108
+ # Web/style formats.
109
+ "CSS", "SASS", "SCSS", "LESS",
110
+ # Common programming concepts always known in coding context.
111
+ "AST", "CFG", "DAG", "FSM", "DSL", "BNF", "EBNF", "REPL",
112
+ # Caching strategies.
113
+ "LRU", "LFU", "FIFO", "LIFO", "MRU",
114
+ # Encoding names with hyphen variants.
115
+ "UTF-8", "UTF-16", "UTF-32",
116
+ # Common placeholder / schema column-type words.
117
+ "VALUE", "DATE", "TIME", "SIZE", "HASH", "RANK",
118
+ # Project doc file names always known to a coding assistant.
119
+ "FAQ", "CONTRIBUTING", "AUTHORS", "CODEOWNERS", "SECURITY",
120
+ "MAINTAINERS", "NOTICE",
121
+ # Connector prepositions that match short-string regexes but are prose.
122
+ "IN", "OF", "AT", "ON", "BY", "AS",
123
+ # PRD section headers — always prose in template specs, not entities.
124
+ "OPEN QUESTIONS", "USE CASES", "NON-GOALS", "NON GOALS",
125
+ "EDGE CASES", "GETTING STARTED", "QUICK START", "OVERVIEW",
126
+ "BACKGROUND", "MOTIVATION", "RATIONALE", "OBJECTIVES", "SCOPE",
127
+ # Pytest / CI test-status words — appear as "pytest is RED / GREEN"
128
+ # in task prompts but are never GraphRAG-retrievable knowledge.
129
+ "RED", "GREEN", "PASS", "FAIL", "SKIP", "XFAIL",
130
+ "PASSED", "FAILED", "SKIPPED", "BROKEN", "XPASS",
131
+ "STATUS", "STATE", "MODE", "TYPE", "KIND", "FLAG", "OPTION",
132
+ "FINDINGS", "PATTERNS", "REGEXES", "FIELDS", "METHODS",
133
+ "VERSION", "NAME", "PATH", "DATA", "OUTPUT", "INPUT",
134
+ "CONFIG", "SCHEMA", "FORMAT", "TEMPLATE", "LAYOUT",
135
+ # SQL DDL keywords — written in ALL-CAPS in schema code but never
136
+ # a GraphRAG knowledge gap for a coding assistant.
137
+ "TEXT", "INTEGER", "REAL", "BLOB", "BOOLEAN", "NUMERIC",
138
+ "PRIMARY", "KEY", "UNIQUE", "INDEX", "FOREIGN", "REFERENCES",
139
+ "CONSTRAINT", "DEFAULT", "NOT NULL", "NULL", "AUTO INCREMENT",
140
+ "CREATE", "TABLE", "SELECT", "INSERT", "UPDATE", "DELETE",
141
+ "FROM", "WHERE", "JOIN", "LEFT", "RIGHT", "INNER", "OUTER",
142
+ "GROUP BY", "ORDER BY", "HAVING", "LIMIT", "OFFSET",
143
+ "BEGIN", "COMMIT", "ROLLBACK", "TRANSACTION",
144
+ # Common English words used in ALL-CAPS for emphasis in user specs —
145
+ # they match _RE_ACRONYM (≥3 uppercase) but carry no knowledge gap.
146
+ "OFFLINE", "ONLINE", "LOCAL", "REMOTE", "ALWAYS", "NEVER",
147
+ "ONLY", "ALSO", "MUST", "SHOULD", "WILL", "FULL", "EMPTY",
148
+ "DONE", "NEXT", "LAST", "FIRST", "EACH", "BOTH", "SAME",
149
+ "EVERY", "KEEP", "NEED", "ABLE", "MAKE", "WRITE", "READ",
150
+ "STORE", "CACHE", "DISK", "FILE", "PARSE", "LOAD", "CALL",
151
+ "SEND", "RECV", "OPEN", "CLOSE", "INIT", "STOP", "WAIT",
152
+ "SYNC", "ASYNC", "COPY", "MOVE", "PUSH", "PULL", "FETCH",
153
+ # Temporal conjunctions/prepositions used for emphasis in specs
154
+ "BEFORE", "AFTER", "DURING", "WHILE", "SINCE", "UNTIL",
155
+ "WHEN", "THEN", "ONCE", "ALREADY", "STILL", "AGAIN",
156
+ "ACROSS", "BETWEEN", "WITHIN", "WITHOUT", "THROUGH",
157
+ "ABOVE", "BELOW", "UNDER", "OVER", "INTO", "ONTO", "FROM",
158
+ "AGAINST", "BEYOND", "DESPITE", "EXCEPT", "INSTEAD",
159
+ "CLARIFICATION", "IMPLEMENTATION", "REQUIREMENT", "SPECIFICATION",
160
+ "DEFINITION", "DESCRIPTION", "DOCUMENTATION", "EXAMPLE",
161
+ "FEATURE", "FUNCTION", "INTERFACE", "PROPERTY", "ATTRIBUTE",
162
+ "INSTANCE", "OBJECT", "CLASS", "MODULE", "PACKAGE", "LIBRARY",
163
+ "MILK", # from "buy milk" test prompt — common English word
164
+ # Single-word emphasis — match _RE_ACRONYM (≥3 uppercase) but are
165
+ # common English words used for stress in PRD specs, not identifiers.
166
+ "ONE", "OLD", "END", "POST", "MOSTLY", "QUITE", "VERY",
167
+ # Networking / infra abbreviations always known in coding context.
168
+ "TTL", "ACL", "NAT", "DNS", "VPN", "LAN", "WAN",
169
+ # Product / project management abbreviations used in PRD prompts.
170
+ "PRD", "RFC", "ADR", "SLA", "SLO", "SLI", "KPI", "OKR",
171
+ # iCalendar (RFC 5545) protocol keywords — appear in iCal-format PRDs.
172
+ "VCALENDAR", "VEVENT", "VTODO", "VJOURNAL", "VALARM",
173
+ "DTSTART", "DTEND", "DTSTAMP", "DURATION", "RRULE",
174
+ # Common English nouns used as PRD field / attribute names — never a
175
+ # GraphRAG knowledge gap. 2026-06-04 queue audit: recency (215×),
176
+ # tasks (188×), untitled (67×), username (65×).
177
+ "recency", "tasks", "untitled", "username", "summary",
178
+ "legacy", "snapshot", "artifact", "payload", "metadata",
179
+ "endpoint", "workflow", "pipeline", "plugin", "widget",
180
+ "sidebar", "toolbar", "viewport", "canvas", "panel",
181
+ "dialog", "modal", "popup", "tooltip", "banner", "badge",
182
+ # Well-known infrastructure / framework names always known to a coding
183
+ # assistant — appear as lowercase terms in stress-run sessions where
184
+ # the model is asked to add support for common servers/tools.
185
+ "nginx", "gunicorn", "uwsgi", "celery", "supervisor",
186
+ "flask", "django", "fastapi", "tornado", "aiohttp", "bottle",
187
+ "pytest", "unittest", "nose", "tox",
188
+ "pandas", "numpy", "scipy", "matplotlib", "seaborn", "sklearn",
189
+ "docker", "kubernetes", "helm", "terraform", "ansible",
190
+ "webpack", "vite", "rollup", "esbuild", "babel",
191
+ # Generic technical snake_case nouns that are code-artifact names,
192
+ # not external library knowledge gaps.
193
+ "stack_trace", "word_count", "line_count", "byte_count", "char_count",
194
+ "legacy_modules", "legacy_module", "legacy_code",
195
+ "drydock_lifecycle", "drydock_test",
196
+ }
197
+ )
198
+
199
+ # Words that are only ever connectors — a Title-Case phrase composed
200
+ # entirely of these (after stripping the leading word) is prose filler.
201
+ _CONNECTOR_WORDS: frozenset[str] = frozenset({
202
+ "of", "the", "and", "for", "in", "de", "von", "a", "an",
203
+ })
204
+
205
+ # Snake-case identifiers that start with a common action verb are generated
206
+ # code artifacts (CRUD methods, helpers), not external knowledge gaps.
207
+ _VERB_PREFIXES: frozenset[str] = frozenset({
208
+ "get_", "set_", "add_", "put_", "has_", "is_",
209
+ "list_", "count_", "delete_", "remove_", "create_", "make_",
210
+ "build_", "update_", "edit_", "save_", "load_", "read_", "write_",
211
+ "parse_", "format_", "render_", "handle_", "process_", "compute_",
212
+ "calc_", "check_", "validate_", "fetch_", "send_", "recv_",
213
+ "run_", "exec_", "init_", "reset_", "clear_", "close_", "open_",
214
+ "find_", "search_", "query_", "filter_", "sort_", "group_",
215
+ "encode_", "decode_", "serialize_", "deserialize_", "convert_",
216
+ "show_", "hide_", "display_", "print_", "log_", "report_",
217
+ "sample_", "generate_", "emit_", "merge_", "patch_", "register_",
218
+ "unregister_", "subscribe_", "publish_", "notify_", "watch_",
219
+ "require_", "resolve_", "dispatch_", "route_", "map_", "reduce_",
220
+ "collect_", "gather_", "aggregate_", "transform_", "extract_",
221
+ "inject_", "wrap_", "unwrap_", "clone_", "copy_", "move_",
222
+ "import_", "export_", "upload_", "download_", "stream_",
223
+ "test_", "assert_", "expect_", "mock_", "stub_", "spy_",
224
+ # Architecture-layer prefixes — snake_case with these prefixes are
225
+ # internal variables/types, not external library knowledge gaps.
226
+ "backend_", "frontend_", "status_", "top_", "base_", "main_",
227
+ "core_", "util_", "helper_", "common_", "shared_", "default_",
228
+ "current_", "prev_", "next_", "max_", "min_", "total_", "avg_",
229
+ "num_", "idx_", "pos_", "key_", "val_", "src_", "dst_", "tmp_",
230
+ "raw_", "cached_", "parsed_", "formatted_", "rendered_", "computed_",
231
+ # Format-sniffing / detection / request-field prefixes — code artifacts
232
+ # generated by the agent, not external library knowledge gaps.
233
+ "sniff_", "detect_", "infer_", "guess_",
234
+ "req_", "resp_", "res_", "body_", "header_", "param_",
235
+ "source_", "target_", "dest_", "output_", "input_",
236
+ })
237
+
238
+
239
+ def _is_template_noise(candidate: str) -> bool:
240
+ """True if the candidate is HLE/admiral boilerplate, not a real term."""
241
+ norm = candidate.strip(" :.,;").lower()
242
+ if not norm:
243
+ return True
244
+ if norm in _TEMPLATE_NOISE:
245
+ return True
246
+ # Drop bare English stopword tokens too (the user prompt sometimes
247
+ # gets fragmented and "the" / "is" leak through the quoted-string
248
+ # path with 3-char minimum length).
249
+ if norm in {sw.lower() for sw in _STOPWORDS}:
250
+ return True
251
+ # A multi-word phrase whose non-first words are all connectors is
252
+ # prose filler, not an entity ("None of the", "All of the", etc.).
253
+ words = norm.split()
254
+ if len(words) >= 2 and all(w in _CONNECTOR_WORDS for w in words[1:]):
255
+ return True
256
+ # Python source filenames (cli.py, __init__.py, main.py, etc.) are
257
+ # never unknown to a coding assistant — they're being written. Matched
258
+ # by _RE_DOTTED_IDENT because "name.py" has a dot. 2026-05-22 audit:
259
+ # __init__.py (100×), cli.py (80×), renderer.py (69×) top false
260
+ # positives.
261
+ # Bare filenames (no directory separator) with common extensions are
262
+ # always known in a coding context — filter them to prevent spam.
263
+ # Full paths ("/data3/foo/bar.csv") are kept as they reference specific
264
+ # resources worth looking up.
265
+ _CODE_EXTS = (
266
+ ".py", ".md", ".txt", ".csv", ".json", ".yaml", ".yml",
267
+ ".toml", ".log", ".html", ".xml", ".sql", ".sh", ".rs",
268
+ ".go", ".ts", ".js", ".jsx", ".tsx", ".css", ".scss",
269
+ ".bak", ".tmp", ".lock", ".pid", ".gz", ".zip", ".tar",
270
+ ".db", ".sqlite3", ".cache", ".dat", ".bin",
271
+ )
272
+ if "/" not in norm and any(norm.endswith(ext) for ext in _CODE_EXTS):
273
+ return True
274
+ # Dotted identifier where the post-dot component is a common English
275
+ # word OR starts with a verb-prefix → sentence boundary artifact or
276
+ # code artifact ("scratch.Step", "fail.Stop", "parser.sniff_format").
277
+ if "." in norm:
278
+ parts = norm.split(".")
279
+ _sw_lower = {w.lower() for w in _STOPWORDS}
280
+ if any(p in _sw_lower for p in parts[1:]):
281
+ return True
282
+ if any(any(p.startswith(vp) for vp in _VERB_PREFIXES) for p in parts[1:]):
283
+ return True
284
+ # Python stdlib module dotted names (json.loads, http.server, os.path)
285
+ # are always known to a coding assistant.
286
+ _STDLIB_MODULES: frozenset[str] = frozenset({
287
+ "os", "sys", "re", "io", "json", "csv", "xml", "html", "http",
288
+ "urllib", "email", "logging", "threading", "multiprocessing",
289
+ "subprocess", "socket", "ssl", "hashlib", "hmac", "uuid",
290
+ "datetime", "time", "calendar", "random", "math", "statistics",
291
+ "collections", "itertools", "functools", "operator", "copy",
292
+ "abc", "typing", "dataclasses", "enum", "pathlib", "shutil",
293
+ "tempfile", "glob", "fnmatch", "pickle", "shelve", "sqlite3",
294
+ "struct", "array", "queue", "heapq", "bisect", "weakref",
295
+ "contextlib", "inspect", "ast", "dis", "gc", "traceback",
296
+ "warnings", "unittest", "doctest", "pprint", "textwrap",
297
+ "string", "difflib", "argparse", "configparser", "platform",
298
+ "signal", "asyncio", "base64", "binascii", "codecs",
299
+ })
300
+ if parts[0] in _STDLIB_MODULES:
301
+ return True
302
+ # LaTeX math expressions — false positives from HLE/academic prompts.
303
+ # A term starting with $ or a LaTeX command backslash is math notation,
304
+ # not a GraphRAG-retrievable identifier.
305
+ if norm.startswith("$") or norm.startswith("\\"):
306
+ return True
307
+ # Pure numeric/punctuation strings — quoted answer-choice values like
308
+ # "33,1" or "0.5" from HLE prompts; never a meaningful ingest target.
309
+ if re.match(r"^[\d\s,./\-+%()]+$", norm):
310
+ return True
311
+ # Python dunder attributes (__all__, __init__.__all__, etc.) are always
312
+ # known in a coding context — never a GraphRAG gap.
313
+ if "__" in norm:
314
+ return True
315
+ # Test file / function names (test_cli, test_routes) are project artifacts
316
+ # produced by the agent, not external knowledge worth retrieving.
317
+ if norm.startswith("test_") or norm.startswith("tests_"):
318
+ return True
319
+ # Type-conversion function names (to_int, to_roman, to_snake_case) —
320
+ # generic utility patterns, not external library gaps.
321
+ if norm.startswith("to_"):
322
+ return True
323
+ # Snake_case names ending in common implementation-pattern suffixes are
324
+ # code artifacts generated by the agent, not external knowledge gaps.
325
+ # E.g. stack_trace, error_handler, config_manager, log_formatter.
326
+ _NOUN_SUFFIXES: frozenset[str] = frozenset({
327
+ "_trace", "_count", "_handler", "_manager", "_parser",
328
+ "_formatter", "_reader", "_writer", "_builder", "_factory",
329
+ "_registry", "_provider", "_consumer", "_producer",
330
+ "_iterator", "_generator", "_validator", "_serializer",
331
+ "_deserializer", "_encoder", "_decoder", "_processor",
332
+ "_executor", "_scheduler", "_dispatcher", "_router",
333
+ "_resolver", "_collector", "_aggregator", "_transformer",
334
+ "_extractor", "_injector", "_wrapper", "_observer",
335
+ "_listener", "_emitter", "_subscriber", "_publisher",
336
+ "_module", "_modules", "_helper", "_util", "_utils",
337
+ "_config", "_settings", "_options", "_params",
338
+ "_result", "_results", "_response", "_request",
339
+ "_context", "_session", "_client", "_server",
340
+ "_queue", "_stack", "_buffer", "_cache", "_store",
341
+ "_pool", "_cluster", "_node", "_worker", "_runner",
342
+ "_loop", "_cycle", "_tick", "_batch", "_chunk",
343
+ })
344
+ if "_" in norm and any(norm.endswith(s) for s in _NOUN_SUFFIXES):
345
+ return True
346
+ # Common action-verb prefixed snake_case names are code artifacts.
347
+ if any(norm.startswith(p) for p in _VERB_PREFIXES):
348
+ return True
349
+ # Roman numerals (MCMXCIV, XIV, etc.) — matched by _RE_ACRONYM but
350
+ # carry no knowledge gap for a coding assistant.
351
+ if len(norm) > 2 and re.match(
352
+ r'^m{0,4}(?:cm|cd|d?c{0,3})(?:xc|xl|l?x{0,3})(?:ix|iv|v?i{0,3})$',
353
+ norm
354
+ ) and norm:
355
+ return True
356
+ # Sentence fragments starting with a single lowercase letter then a space
357
+ # are contraction tails ("Don't" → "t ...", "Let's" → "s ..."). These
358
+ # are never retrievable identifiers.
359
+ if re.match(r"^[a-z] ", norm):
360
+ return True
361
+ # All-lowercase multi-word phrases (e.g. "buy milk", "sample logs") —
362
+ # quoted prose from task prompts, not identifiers worth retrieving.
363
+ # Only filter if the *original* candidate is already lowercase — Title Case
364
+ # phrases like "Attention Is All You Need" must still be detected.
365
+ # Strip punctuation before the regex so commas/periods don't block matches.
366
+ orig = candidate.strip(" :.,;")
367
+ norm_alphanum = re.sub(r"[^a-z0-9 _-]", "", norm)
368
+ if " " in norm and orig == orig.lower() and re.match(r"^[a-z][a-z0-9 _-]+$", norm_alphanum) and len(norm_alphanum) > 3:
369
+ return True
370
+ # Date format strings like "YYYY-MM", "YYYY-MM-DD", "/DD/YYYY" — these
371
+ # are template tokens that contain YYYY/MM/DD components (now in
372
+ # TEMPLATE_NOISE) separated by punctuation but the combined string isn't.
373
+ if re.match(r"^[/\-]?(?:yyyy|mm|dd|hh|ss)(?:[/\-](?:yyyy|mm|dd|hh|ss))+$", norm):
374
+ return True
375
+ # Hyphenated lowercase adjective phrases from PRD prose
376
+ # ("tab-separated", "human-readable", "newline-delimited") — these are
377
+ # format descriptors, not library identifiers worth retrieving.
378
+ if re.match(r"^[a-z][a-z0-9]+-[a-z][a-z0-9]+(?:-[a-z][a-z0-9]+)*$", norm):
379
+ return True
380
+ # Paths that contain known test-run or lifecycle directories — these are
381
+ # ephemeral artifacts from stress/lifecycle sessions, not real projects.
382
+ if re.search(r"(/drydock_lifecycle/|/pytest-of-|/pytest-\d|/tmp/drydock_|/swe_bench_|/test_harness_)", norm):
383
+ return True
384
+ # Latin abbreviations used as prose connectors ("i.e", "e.g", "etc").
385
+ if norm in ("i.e", "e.g", "etc", "i.e.", "e.g.", "etc.", "cf.", "cf", "vs", "vs."):
386
+ return True
387
+ # Snake_case identifiers containing _to_ in the middle are converter helpers
388
+ # (csv_to_json, rgb_to_hex) — project-generated code artifacts, not gaps.
389
+ if re.match(r"^[a-z][a-z0-9]*_to_[a-z][a-z0-9_]*$", norm):
390
+ return True
391
+ return False
392
+
393
+ # Acronyms shorter than this are too noisy to chase ("ID", "OK", "OS").
394
+ _MIN_ACRONYM_LEN = 3
395
+
396
+ # Maximum gaps to return per call. The retrieve consumer can only act
397
+ # on so many before context bloats; truncate at the source.
398
+ _MAX_GAPS = 8
399
+
400
+ _RE_ACRONYM = re.compile(r"\b[A-Z]{%d,}(?:-?[A-Z0-9]+)?\b" % _MIN_ACRONYM_LEN)
401
+ _RE_TITLE_CASE_PHRASE = re.compile(
402
+ r"\b(?:[A-Z][a-z]+(?:[-'][A-Z][a-z]+)?)(?:\s+(?:[A-Z][a-z]+(?:[-'][A-Z][a-z]+)?|of|the|and|for|in|de|von)){1,4}"
403
+ )
404
+ _RE_DOTTED_IDENT = re.compile(r"\b[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*){1,}\b")
405
+ _RE_SNAKE_IDENT = re.compile(r"\b[a-z][a-z0-9_]*_[a-z0-9_]+\b")
406
+ _RE_VERSIONED = re.compile(r"\b[a-zA-Z][a-zA-Z0-9_-]*-\d+(?:\.\d+)+\b")
407
+ _RE_QUOTED = re.compile(r'"([^"\n]{3,80})"|\'([^\'\n]{3,80})\'')
408
+ _RE_PATH = re.compile(r"\b(?:/[A-Za-z0-9_.-]+){2,}\b")
409
+
410
+
411
+ def _strip_punct(s: str) -> str:
412
+ return s.strip(" \t\n.,;:!?\"'()[]{}<>")
413
+
414
+
415
+ def _dedup_preserve_order(items: Iterable[str]) -> list[str]:
416
+ seen: set[str] = set()
417
+ out: list[str] = []
418
+ for it in items:
419
+ k = it.lower()
420
+ if k in seen:
421
+ continue
422
+ seen.add(k)
423
+ out.append(it)
424
+ return out
425
+
426
+
427
+ def detect_gaps(text: str, max_gaps: int = _MAX_GAPS) -> list[str]:
428
+ """Extract candidate unfamiliar terms from `text`.
429
+
430
+ The agent_loop's curiosity hook calls this on every new user
431
+ message. Anything returned becomes a retrieve target before the
432
+ first LLM turn.
433
+ """
434
+ if not text or not text.strip():
435
+ return []
436
+
437
+ candidates: list[str] = []
438
+
439
+ # Quoted strings of meaningful length — strongest signal (user
440
+ # explicitly delimited a name).
441
+ for m in _RE_QUOTED.finditer(text):
442
+ val = m.group(1) or m.group(2) or ""
443
+ val = val.strip()
444
+ if val:
445
+ candidates.append(val)
446
+
447
+ # Filesystem paths — almost always worth knowing about.
448
+ for m in _RE_PATH.finditer(text):
449
+ candidates.append(m.group(0))
450
+
451
+ # Versioned package-like tokens ("django-4.2", "torch-2.0.1").
452
+ for m in _RE_VERSIONED.finditer(text):
453
+ candidates.append(m.group(0))
454
+
455
+ # Dotted identifiers (module.path or Type.method).
456
+ for m in _RE_DOTTED_IDENT.finditer(text):
457
+ candidates.append(m.group(0))
458
+
459
+ # Snake-case identifiers (likely function or symbol names).
460
+ for m in _RE_SNAKE_IDENT.finditer(text):
461
+ candidates.append(m.group(0))
462
+
463
+ # ALL-CAPS acronyms (RAG, MCP, GraphRAG-style).
464
+ for m in _RE_ACRONYM.finditer(text):
465
+ tok = m.group(0)
466
+ if tok not in _STOPWORDS:
467
+ candidates.append(tok)
468
+
469
+ # Title-Case multi-word phrases (paper titles, product names).
470
+ for m in _RE_TITLE_CASE_PHRASE.finditer(text):
471
+ phrase = _strip_punct(m.group(0))
472
+ if not phrase:
473
+ continue
474
+ first = phrase.split()[0]
475
+ if first in _STOPWORDS:
476
+ # Drop the leading stopword — "The Curiosity Layer" → "Curiosity Layer"
477
+ phrase = " ".join(phrase.split()[1:])
478
+ if not phrase:
479
+ continue
480
+ candidates.append(phrase)
481
+
482
+ return _dedup_preserve_order(
483
+ c for c in candidates if c and not _is_template_noise(c)
484
+ )[:max_gaps]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.9.54"
3
+ version = "2.9.57"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -112,6 +112,40 @@ class TestGapDetector:
112
112
  for noise in ("Consider", "Suppose", "Consider the"):
113
113
  assert noise not in gaps, f"detected noise: {noise!r} in {gaps}"
114
114
 
115
+ def test_drops_sentence_boundary_dotted_idents(self):
116
+ """Numbered-step prompts produce 'scratch.Step', 'fail.Step', etc.
117
+ when the gap-detector sees period+uppercase-word at a sentence
118
+ boundary. These must not be queued as unknown terms (2026-06-04
119
+ curiosity queue filled with 9988 junk entries from one session)."""
120
+ text = (
121
+ "DO NOT scaffold from scratch.Step 1: cd here and run pytest -q."
122
+ " You'll see 24 tests pass and 3 fail.Step 2: Read the output."
123
+ )
124
+ gaps = detect_gaps(text)
125
+ for noise in ("scratch.Step", "fail.Step", "green.Stop"):
126
+ assert noise not in gaps, f"detected noise: {noise!r} in {gaps}"
127
+ # Real dotted identifiers (module.attr) must still be detected.
128
+ real = detect_gaps("Use sklearn.metrics.f1_score here.")
129
+ assert any("sklearn" in g for g in real), real
130
+
131
+ def test_drops_to_x_converter_names(self):
132
+ """to_int, to_roman, to_snake_case etc. are project-defined converters,
133
+ not external library gaps. The to_ prefix alone is sufficient."""
134
+ for term in ("to_int", "to_roman", "to_str", "to_bool", "to_snake_case"):
135
+ gaps = detect_gaps(f"Implement `{term}` function.")
136
+ assert term not in gaps, f"to_X converter leaked into gaps: {term!r} in {gaps}"
137
+
138
+ def test_drops_lowercase_prose_phrases(self):
139
+ """Quoted lowercase multi-word phrases like 'buy milk' or 'sample logs'
140
+ are prose noise from task prompts, not retrievable identifiers."""
141
+ for phrase in ("buy milk", "sample logs", "backend disk"):
142
+ gaps = detect_gaps(f'Remember to "{phrase}" today.')
143
+ assert phrase not in gaps, f"prose phrase leaked into gaps: {phrase!r} in {gaps}"
144
+ # Real snake_case identifiers with spaces should still be detected
145
+ # via the snake_case pattern (no space version).
146
+ real = detect_gaps("Call backend_memory.flush() to clear.")
147
+ assert any("backend_memory" in g for g in real), real
148
+
115
149
  def test_keeps_real_terms_amid_hle_noise(self):
116
150
  """Validates the fix isn't over-broad: real entity names must
117
151
  survive alongside the boilerplate."""
@@ -326,7 +326,7 @@ wheels = [
326
326
 
327
327
  [[package]]
328
328
  name = "drydock-cli"
329
- version = "2.9.49"
329
+ version = "2.9.55"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },