drydock-cli 2.8.29__tar.gz → 2.8.31__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 (810) hide show
  1. drydock_cli-2.8.31/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/CLAUDE.md +1 -1
  3. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/HLE_PRD.md +34 -0
  4. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/PKG-INFO +2 -1
  5. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/agent_loop.py +63 -1
  6. drydock_cli-2.8.31/drydock/core/constraint_hint.py +181 -0
  7. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/generic.py +9 -0
  8. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/gemma4.md +144 -1
  9. drydock_cli-2.8.31/drydock/core/tools/builtins/algebra_tool.py +406 -0
  10. drydock_cli-2.8.31/drydock/core/tools/builtins/chemistry_tool.py +537 -0
  11. drydock_cli-2.8.31/drydock/core/tools/builtins/linear_algebra_tool.py +430 -0
  12. drydock_cli-2.8.31/drydock/core/tools/builtins/logic_tool.py +488 -0
  13. drydock_cli-2.8.31/drydock/core/tools/builtins/number_theory_tool.py +431 -0
  14. drydock_cli-2.8.31/drydock/core/tools/builtins/set_tool.py +343 -0
  15. drydock_cli-2.8.31/drydock/core/tools/builtins/solve_tool.py +446 -0
  16. drydock_cli-2.8.31/drydock/core/tools/builtins/stats_tool.py +488 -0
  17. drydock_cli-2.8.31/drydock/core/tools/builtins/units_tool.py +340 -0
  18. drydock_cli-2.8.31/drydock/skills/constraint-reasoning/SKILL.md +202 -0
  19. drydock_cli-2.8.31/drydock/skills/logic/SKILL.md +139 -0
  20. drydock_cli-2.8.31/drydock/skills/logic/assets/cheat_sheet_full.txt +833 -0
  21. drydock_cli-2.8.31/drydock/skills/prove/SKILL.md +148 -0
  22. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/pyproject.toml +2 -1
  23. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/resume.md +24 -0
  24. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/autonomous_review_prompt.md +1 -1
  25. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/consume_retrieval_queue.py +36 -22
  26. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/hle_babysitter.sh +4 -0
  27. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/hle_eval.py +18 -13
  28. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/shakedown_interactive.py +7 -10
  29. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/tool_usage_report.py +49 -7
  30. drydock_cli-2.8.31/tests/test_algebra_tool.py +195 -0
  31. drydock_cli-2.8.31/tests/test_chemistry_tool.py +193 -0
  32. drydock_cli-2.8.31/tests/test_constraint_hint.py +134 -0
  33. drydock_cli-2.8.31/tests/test_linear_algebra_tool.py +238 -0
  34. drydock_cli-2.8.31/tests/test_logic_tool.py +250 -0
  35. drydock_cli-2.8.31/tests/test_number_theory_tool.py +229 -0
  36. drydock_cli-2.8.31/tests/test_set_tool.py +167 -0
  37. drydock_cli-2.8.31/tests/test_solve_tool.py +338 -0
  38. drydock_cli-2.8.31/tests/test_stats_tool.py +210 -0
  39. drydock_cli-2.8.31/tests/test_units_tool.py +181 -0
  40. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/trip_log.md +226 -0
  41. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/uv.lock +3 -7
  42. drydock_cli-2.8.29/.auto_release.lock +0 -1
  43. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/CODEOWNERS +0 -0
  44. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  45. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  46. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  47. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/workflows/build-and-upload.yml +0 -0
  48. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/workflows/ci.yml +0 -0
  49. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/workflows/issue-labeler.yml +0 -0
  50. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.github/workflows/release.yml +0 -0
  51. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.gitignore +0 -0
  52. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.pre-commit-config.yaml +0 -0
  53. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.python-version +0 -0
  54. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.typos.toml +0 -0
  55. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.vscode/extensions.json +0 -0
  56. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.vscode/launch.json +0 -0
  57. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/.vscode/settings.json +0 -0
  58. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/AGENTS.md +0 -0
  59. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/Admiral.md +0 -0
  60. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/CHANGELOG.md +0 -0
  61. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/CONTRIBUTING.md +0 -0
  62. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/DEEP_NOIR_PRD.md +0 -0
  63. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/DEPLOYMENT.md +0 -0
  64. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/DRYDOCK.md +0 -0
  65. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/JETSON_BENCH.md +0 -0
  66. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/LICENSE +0 -0
  67. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/MODEL_SHORTCOMINGS.md +0 -0
  68. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/NOTICE +0 -0
  69. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/README.md +0 -0
  70. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/SOVEREIGN_PRD.md +0 -0
  71. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/TRIAGE_v1.md +0 -0
  72. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/action.yml +0 -0
  73. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/README.md +0 -0
  74. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results1.tsv +0 -0
  75. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results13.tsv +0 -0
  76. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results14.tsv +0 -0
  77. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results15.tsv +0 -0
  78. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results16.tsv +0 -0
  79. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results17.tsv +0 -0
  80. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results18.tsv +0 -0
  81. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results19.tsv +0 -0
  82. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results2.tsv +0 -0
  83. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results20.tsv +0 -0
  84. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results3.tsv +0 -0
  85. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results4.tsv +0 -0
  86. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results5.tsv +0 -0
  87. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results6.tsv +0 -0
  88. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results7.tsv +0 -0
  89. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results8.tsv +0 -0
  90. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results9.tsv +0 -0
  91. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/baseline_history/results_evolved_v1.tsv +0 -0
  92. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/distribution/zed/LICENSE +0 -0
  93. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/distribution/zed/extension.toml +0 -0
  94. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/distribution/zed/icons/mistral_vibe.svg +0 -0
  95. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/README.md +0 -0
  96. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/acp-setup.md +0 -0
  97. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/BASELINE_412.md +0 -0
  98. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/Drydock_rebrand.md +0 -0
  99. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  100. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  101. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  102. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/PRD.md +0 -0
  103. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/drydock_terms.md +0 -0
  104. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/archive/resume.md +0 -0
  105. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/docs/proxy-setup.md +0 -0
  106. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/__init__.py +0 -0
  107. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/__main__.py +0 -0
  108. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/__init__.py +0 -0
  109. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/acp_agent_loop.py +0 -0
  110. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/acp_logger.py +0 -0
  111. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/entrypoint.py +0 -0
  112. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/__init__.py +0 -0
  113. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/base.py +0 -0
  114. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/builtins/bash.py +0 -0
  115. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/builtins/read_file.py +0 -0
  116. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/builtins/search_replace.py +0 -0
  117. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/builtins/todo.py +0 -0
  118. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/builtins/write_file.py +0 -0
  119. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/tools/session_update.py +0 -0
  120. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/acp/utils.py +0 -0
  121. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/__init__.py +0 -0
  122. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/detectors.py +0 -0
  123. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/detectors_proposed.py +0 -0
  124. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/history.py +0 -0
  125. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/interventions.py +0 -0
  126. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/llm_analyzer.py +0 -0
  127. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/metrics.py +0 -0
  128. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/opus_escalator.py +0 -0
  129. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/persistence.py +0 -0
  130. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/policy.py +0 -0
  131. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/proposer.py +0 -0
  132. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/stager.py +0 -0
  133. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/task_classifier.py +0 -0
  134. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/tuning.py +0 -0
  135. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/validator.py +0 -0
  136. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/admiral/worker.py +0 -0
  137. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/__init__.py +0 -0
  138. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/autocompletion/__init__.py +0 -0
  139. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/autocompletion/base.py +0 -0
  140. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/autocompletion/path_completion.py +0 -0
  141. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/autocompletion/slash_command.py +0 -0
  142. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/cli.py +0 -0
  143. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/clipboard.py +0 -0
  144. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/commands.py +0 -0
  145. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/entrypoint.py +0 -0
  146. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/fix_windows_path.py +0 -0
  147. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/history_manager.py +0 -0
  148. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  149. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  150. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  151. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/terminal_setup.py +0 -0
  152. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/__init__.py +0 -0
  153. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  154. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/app.py +0 -0
  155. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/app.tcss +0 -0
  156. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/external_editor.py +0 -0
  157. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  158. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  159. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  160. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  161. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  162. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  163. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  164. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  165. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  166. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  167. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  168. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  169. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  170. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  171. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  172. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  173. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  174. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  175. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  176. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  177. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  178. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  179. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  180. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  181. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  182. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  183. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  184. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  185. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  186. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  187. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  188. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  189. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  190. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  191. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  192. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  193. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  194. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/windowing/history.py +0 -0
  195. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  196. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/textual_ui/windowing/state.py +0 -0
  197. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/__init__.py +0 -0
  198. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  199. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  200. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  201. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  202. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  203. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/update.py +0 -0
  204. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/cli/update_notifier/whats_new.py +0 -0
  205. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/__init__.py +0 -0
  206. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/agents/__init__.py +0 -0
  207. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/agents/manager.py +0 -0
  208. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/agents/models.py +0 -0
  209. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/auth/__init__.py +0 -0
  210. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/auth/crypto.py +0 -0
  211. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/auth/github.py +0 -0
  212. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/__init__.py +0 -0
  213. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/completers.py +0 -0
  214. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  215. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  216. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  217. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  218. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  219. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/fuzzy.py +0 -0
  220. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/path_prompt.py +0 -0
  221. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  222. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/build_orchestrator.py +0 -0
  223. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/checkpoint.py +0 -0
  224. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/classifier/__init__.py +0 -0
  225. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/classifier/__main__.py +0 -0
  226. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/classifier/classifier.py +0 -0
  227. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/classifier/dispatcher.py +0 -0
  228. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/classifier/rules.py +0 -0
  229. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/classifier/signal.py +0 -0
  230. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/__init__.py +0 -0
  231. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/_dotenv.py +0 -0
  232. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/_settings.py +0 -0
  233. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/doctor.py +0 -0
  234. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/harness_files/__init__.py +0 -0
  235. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  236. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/harness_files/_paths.py +0 -0
  237. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/local_detect.py +0 -0
  238. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/config/migrate.py +0 -0
  239. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/consultant.py +0 -0
  240. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/context_recovery.py +0 -0
  241. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/drydock_states.py +0 -0
  242. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/hooks.py +0 -0
  243. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/__init__.py +0 -0
  244. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/anthropic.py +0 -0
  245. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/base.py +0 -0
  246. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/factory.py +0 -0
  247. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/mistral.py +0 -0
  248. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  249. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/backend/vertex.py +0 -0
  250. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/exceptions.py +0 -0
  251. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/format.py +0 -0
  252. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/message_utils.py +0 -0
  253. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/llm/types.py +0 -0
  254. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/logger.py +0 -0
  255. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/middleware.py +0 -0
  256. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/output_formatters.py +0 -0
  257. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/paths/__init__.py +0 -0
  258. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/paths/_drydock_home.py +0 -0
  259. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/paths/_local_config_walk.py +0 -0
  260. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/paths/conventions.py +0 -0
  261. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/plan_session.py +0 -0
  262. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/plugins.py +0 -0
  263. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/programmatic.py +0 -0
  264. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/__init__.py +0 -0
  265. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/builder.md +0 -0
  266. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/cli.md +0 -0
  267. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/compact.md +0 -0
  268. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/dangerous_directory.md +0 -0
  269. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/diagnostic.md +0 -0
  270. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/explore.md +0 -0
  271. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/planner.md +0 -0
  272. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/project_context.md +0 -0
  273. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/prompts/tests.md +0 -0
  274. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/proxy_setup.py +0 -0
  275. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session/agent_memory.py +0 -0
  276. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session/checkpoints.py +0 -0
  277. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session/session_loader.py +0 -0
  278. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session/session_logger.py +0 -0
  279. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session/session_migration.py +0 -0
  280. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session/state_file.py +0 -0
  281. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/session_checker.py +0 -0
  282. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/skills/__init__.py +0 -0
  283. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/skills/manager.py +0 -0
  284. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/skills/models.py +0 -0
  285. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/skills/parser.py +0 -0
  286. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/slug.py +0 -0
  287. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/steering_hook.py +0 -0
  288. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/system_prompt.py +0 -0
  289. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/telemetry/__init__.py +0 -0
  290. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/telemetry/send.py +0 -0
  291. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/teleport/errors.py +0 -0
  292. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/teleport/git.py +0 -0
  293. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/teleport/nuage.py +0 -0
  294. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/teleport/teleport.py +0 -0
  295. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/teleport/types.py +0 -0
  296. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/base.py +0 -0
  297. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/_task_manager.py +0 -0
  298. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  299. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/bash.py +0 -0
  300. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/count_tool.py +0 -0
  301. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/cron.py +0 -0
  302. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  303. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/glob_tool.py +0 -0
  304. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/grep.py +0 -0
  305. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  306. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/lsp.py +0 -0
  307. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/math_tool.py +0 -0
  308. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  309. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/memory_tool.py +0 -0
  310. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  311. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/powershell.py +0 -0
  312. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  313. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  314. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  315. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  316. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  317. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  318. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  319. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  320. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  321. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  322. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  323. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  324. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  325. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  326. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  327. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/task.md +0 -0
  328. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  329. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  330. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  331. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  332. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  333. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  334. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  335. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/read_file.py +0 -0
  336. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/retrieve.py +0 -0
  337. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/search_replace.py +0 -0
  338. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/task.py +0 -0
  339. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/todo.py +0 -0
  340. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/tool_search.py +0 -0
  341. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/verify_tool.py +0 -0
  342. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/webfetch.py +0 -0
  343. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/websearch.py +0 -0
  344. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/worktree.py +0 -0
  345. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/builtins/write_file.py +0 -0
  346. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/injection_guard.py +0 -0
  347. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/manager.py +0 -0
  348. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/mcp/__init__.py +0 -0
  349. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/mcp/registry.py +0 -0
  350. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/mcp/tools.py +0 -0
  351. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/mcp_sampling.py +0 -0
  352. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/ui.py +0 -0
  353. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/tools/utils.py +0 -0
  354. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/trusted_folders.py +0 -0
  355. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/types.py +0 -0
  356. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/core/utils.py +0 -0
  357. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/curiosity/__init__.py +0 -0
  358. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/curiosity/__main__.py +0 -0
  359. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/curiosity/gap_detector.py +0 -0
  360. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/curiosity/item.py +0 -0
  361. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/curiosity/queue.py +0 -0
  362. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/curiosity/surprise.py +0 -0
  363. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/graphrag/__init__.py +0 -0
  364. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/graphrag/__main__.py +0 -0
  365. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/graphrag/code_indexer.py +0 -0
  366. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/graphrag/retriever.py +0 -0
  367. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/graphrag/storage.py +0 -0
  368. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/graphrag/text_indexer.py +0 -0
  369. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/__init__.py +0 -0
  370. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/base.py +0 -0
  371. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/onboarding.tcss +0 -0
  372. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/screens/__init__.py +0 -0
  373. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/screens/api_key.py +0 -0
  374. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/screens/choice.py +0 -0
  375. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/screens/local_model.py +0 -0
  376. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/onboarding/screens/welcome.py +0 -0
  377. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  378. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  379. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/__init__.py +0 -0
  380. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/api-design/SKILL.md +0 -0
  381. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/audit-tests/SKILL.md +0 -0
  382. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/batch/SKILL.md +0 -0
  383. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/commit-code/SKILL.md +0 -0
  384. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/context-summary/SKILL.md +0 -0
  385. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/create-presentation/SKILL.md +0 -0
  386. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/deep-research/SKILL.md +0 -0
  387. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/deploy/SKILL.md +0 -0
  388. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/diff-review/SKILL.md +0 -0
  389. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/doc-gen/SKILL.md +0 -0
  390. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/explain-code/SKILL.md +0 -0
  391. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/explore-code/SKILL.md +0 -0
  392. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/fix-issue/SKILL.md +0 -0
  393. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/git-ops/SKILL.md +0 -0
  394. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/init-project/SKILL.md +0 -0
  395. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/investigate/SKILL.md +0 -0
  396. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/loop/SKILL.md +0 -0
  397. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/migrate/SKILL.md +0 -0
  398. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/perf-analyze/SKILL.md +0 -0
  399. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/plan-impl/SKILL.md +0 -0
  400. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/pr-review/SKILL.md +0 -0
  401. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/refactor/SKILL.md +0 -0
  402. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/regex-help/SKILL.md +0 -0
  403. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/review/SKILL.md +0 -0
  404. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/security-review/SKILL.md +0 -0
  405. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/ship/SKILL.md +0 -0
  406. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/simplify/SKILL.md +0 -0
  407. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/strong-tests/SKILL.md +0 -0
  408. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/skills/test-verify/SKILL.md +0 -0
  409. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/__init__.py +0 -0
  410. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/__main__.py +0 -0
  411. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/applier.py +0 -0
  412. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/config.py +0 -0
  413. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/registry.py +0 -0
  414. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/sandbox.py +0 -0
  415. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/sidecar/__init__.py +0 -0
  416. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/sidecar/header_parser.py +0 -0
  417. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/sidecar/hooks.py +0 -0
  418. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/sidecar/loader.py +0 -0
  419. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/sidecar/server.py +0 -0
  420. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/train/__init__.py +0 -0
  421. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/train/capture.py +0 -0
  422. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/train/compute_vector.py +0 -0
  423. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/train/extract_pairs.py +0 -0
  424. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/train/scan_sessions.py +1 -1
  425. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/steering/vectors.py +0 -0
  426. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock/whats_new.md +0 -0
  427. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/drydock-acp.spec +0 -0
  428. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/flake.lock +0 -0
  429. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/flake.nix +0 -0
  430. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/outlook_draft_assistant.tar.gz +0 -0
  431. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/README.md +0 -0
  432. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/config_base.toml +0 -0
  433. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/config_best.toml +0 -0
  434. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
  435. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
  436. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/domain_spec.md +0 -0
  437. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/experimenter.py +0 -0
  438. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/kernel.py +0 -0
  439. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/mini_prd.md +0 -0
  440. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/mini_prompts.txt +0 -0
  441. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/proposer.py +0 -0
  442. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/research/results.tsv +0 -0
  443. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/README.md +0 -0
  444. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/admiral_probe.py +0 -0
  445. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/auto_test_loop.sh +0 -0
  446. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/monitor_test_battery.sh +0 -0
  447. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/overnight_agents_test.sh +0 -0
  448. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/test_bank.sh +0 -0
  449. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/test_full.sh +0 -0
  450. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/test_smoke.sh +0 -0
  451. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/archive/tui_test.py +0 -0
  452. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/audit_sampler.py +0 -0
  453. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/auto_generate_tests.py +0 -0
  454. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/auto_release.sh +0 -0
  455. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/autonomous_review.sh +0 -0
  456. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/backfill_hle_curiosity.py +0 -0
  457. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/backup.sh +0 -0
  458. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/bench_inference.py +0 -0
  459. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/bump_version.py +0 -0
  460. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/classify_pulse.sh +0 -0
  461. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/curiosity_idle_cycle.sh +0 -0
  462. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/dedupe_dispatch_queues.py +0 -0
  463. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/deploy_to_github.sh +0 -0
  464. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/dispatch_report.py +0 -0
  465. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/drydock_status.sh +0 -0
  466. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/fetch_arxiv_abstracts.py +0 -0
  467. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/gen_2000_prompts.py +0 -0
  468. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/hle_aggregate.py +0 -0
  469. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/hle_eval_seed.jsonl +0 -0
  470. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/llm_balancer.py +0 -0
  471. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/notify_release.py +0 -0
  472. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/perf_baseline_when_idle.sh +0 -0
  473. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/perf_sweep.py +0 -0
  474. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/poll_issues.sh +0 -0
  475. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/publish_to_pypi.sh +0 -0
  476. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/queue_top.py +0 -0
  477. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/ralph_loop.py +0 -0
  478. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/rejudge_hle.py +0 -0
  479. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/research_babysitter.sh +0 -0
  480. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/shakedown.py +0 -0
  481. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/shakedown_suite.sh +0 -0
  482. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/shakedown_variance.sh +0 -0
  483. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/start_steering_sidecar.sh +0 -0
  484. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_babysitter.sh +0 -0
  485. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_prompts_50.txt +0 -0
  486. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_prompts_realuser.txt +0 -0
  487. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_prompts_tool_agent.txt +0 -0
  488. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  489. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_shakedown.py +0 -0
  490. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_telegram_status.py +0 -0
  491. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/stress_watcher.py +0 -0
  492. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/telegram_bot.py +0 -0
  493. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/scripts/vllm_failover.sh +0 -0
  494. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/__init__.py +0 -0
  495. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/conftest.py +0 -0
  496. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_acp.py +0 -0
  497. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_agent_thought.py +0 -0
  498. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_bash.py +0 -0
  499. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_compact_session_updates.py +0 -0
  500. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_content.py +0 -0
  501. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_initialize.py +0 -0
  502. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_list_sessions.py +0 -0
  503. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_load_session.py +0 -0
  504. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_multi_session.py +0 -0
  505. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_new_session.py +0 -0
  506. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_proxy_setup_acp.py +0 -0
  507. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_read_file.py +0 -0
  508. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_search_replace.py +0 -0
  509. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_set_config_option.py +0 -0
  510. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_set_mode.py +0 -0
  511. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_set_model.py +0 -0
  512. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_tool_call_session_update.py +0 -0
  513. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_utils.py +0 -0
  514. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/acp/test_write_file.py +0 -0
  515. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_file_indexer.py +0 -0
  516. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_fuzzy.py +0 -0
  517. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  518. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  519. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_path_completion_controller.py +0 -0
  520. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  521. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_slash_command_controller.py +0 -0
  522. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  523. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/__init__.py +0 -0
  524. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/data/__init__.py +0 -0
  525. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/data/fireworks.py +0 -0
  526. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/data/mistral.py +0 -0
  527. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/test_anthropic_adapter.py +0 -0
  528. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/test_backend.py +0 -0
  529. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  530. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/test_reasoning_adapter.py +0 -0
  531. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  532. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  533. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  534. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  535. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_bell_notifications.py +0 -0
  536. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_braille_renderer.py +0 -0
  537. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_clipboard.py +0 -0
  538. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_commands.py +0 -0
  539. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_copy_shortcuts.py +0 -0
  540. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_external_editor.py +0 -0
  541. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_no_markup_static.py +0 -0
  542. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_question_app.py +0 -0
  543. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_spinner.py +0 -0
  544. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_switching_mode.py +0 -0
  545. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  546. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  547. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_ui_session_resume.py +0 -0
  548. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/test_ui_skill_dispatch.py +0 -0
  549. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/textual_ui/__init__.py +0 -0
  550. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/cli/textual_ui/test_session_picker.py +0 -0
  551. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/conftest.py +0 -0
  552. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_agents.py +0 -0
  553. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_auth_crypto.py +0 -0
  554. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_auth_github.py +0 -0
  555. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  556. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  557. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_config_load_dotenv.py +0 -0
  558. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_config_paths.py +0 -0
  559. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_config_resolution.py +0 -0
  560. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_file_logging.py +0 -0
  561. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_plan_session.py +0 -0
  562. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_proxy_setup.py +0 -0
  563. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_slug.py +0 -0
  564. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_telemetry_send.py +0 -0
  565. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_teleport_git.py +0 -0
  566. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_teleport_nuage.py +0 -0
  567. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_teleport_service.py +0 -0
  568. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_trusted_folders.py +0 -0
  569. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/core/test_utils.py +0 -0
  570. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/e2e/common.py +0 -0
  571. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/e2e/conftest.py +0 -0
  572. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/e2e/mock_server.py +0 -0
  573. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  574. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/e2e/test_cli_tui_streaming.py +0 -0
  575. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  576. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/fixtures/doc_qa_system_prd.md +0 -0
  577. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/mock/__init__.py +0 -0
  578. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/mock/mock_backend_factory.py +0 -0
  579. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/mock/mock_entrypoint.py +0 -0
  580. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/mock/utils.py +0 -0
  581. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/onboarding/test_run_onboarding.py +0 -0
  582. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/onboarding/test_ui_onboarding.py +0 -0
  583. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/session/test_session_loader.py +0 -0
  584. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/session/test_session_logger.py +0 -0
  585. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/session/test_session_migration.py +0 -0
  586. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/skills/conftest.py +0 -0
  587. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/skills/test_manager.py +0 -0
  588. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/skills/test_models.py +0 -0
  589. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/skills/test_parser.py +0 -0
  590. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  591. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  592. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  593. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  594. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  595. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  596. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  597. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  598. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  599. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  600. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  601. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  602. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  603. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  604. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  605. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  606. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  607. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  608. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  609. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  610. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  611. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  612. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  613. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  614. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  615. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  616. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  617. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  618. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  619. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  620. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  621. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  622. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  623. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  624. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  625. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  626. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  627. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  628. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  629. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  630. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  631. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  632. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  633. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  634. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  635. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  636. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  637. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  638. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  639. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  640. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  641. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  642. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  643. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  644. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  645. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  646. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  647. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  648. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  649. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  650. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/base_snapshot_test_app.py +0 -0
  651. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/conftest.py +0 -0
  652. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/snap_compare.py +0 -0
  653. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  654. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  655. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  656. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  657. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  658. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  659. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  660. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  661. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  662. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  663. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  664. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  665. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  666. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  667. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/stubs/fake_backend.py +0 -0
  668. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/stubs/fake_client.py +0 -0
  669. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/stubs/fake_tool.py +0 -0
  670. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral.py +0 -0
  671. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  672. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral_intervention_outcome.py +0 -0
  673. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral_phase3.py +0 -0
  674. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral_proposed.py +0 -0
  675. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral_session_id.py +0 -0
  676. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_admiral_struggle_dedup.py +0 -0
  677. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agent_auto_compact.py +0 -0
  678. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agent_backend.py +0 -0
  679. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agent_observer_streaming.py +0 -0
  680. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agent_stats.py +0 -0
  681. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agent_tasks.py +0 -0
  682. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agent_tool_call.py +0 -0
  683. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_agents.py +0 -0
  684. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  685. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_build.py +0 -0
  686. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_debug.py +0 -0
  687. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_multiagent.py +0 -0
  688. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_prd.py +0 -0
  689. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_prd_extended.py +0 -0
  690. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_tools.py +0 -0
  691. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_bank_update.py +0 -0
  692. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_build_projects.py +0 -0
  693. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_checkpoint.py +0 -0
  694. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_classifier.py +0 -0
  695. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_cli_programmatic_preload.py +0 -0
  696. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_config_migration.py +0 -0
  697. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_context_recovery.py +0 -0
  698. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_count_tool.py +0 -0
  699. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_curiosity.py +0 -0
  700. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_current_bugs.py +0 -0
  701. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_dispatch_report.py +0 -0
  702. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_dispatcher.py +0 -0
  703. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_drydock_regression.py +0 -0
  704. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_drydock_tasks.py +0 -0
  705. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  706. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_full_regression.py +0 -0
  707. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_graphrag.py +0 -0
  708. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_graphrag_worked_examples.py +0 -0
  709. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_hallucinated_tool_suppression.py +0 -0
  710. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_history_manager.py +0 -0
  711. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_hle_aggregate.py +0 -0
  712. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_hle_score_method_split.py +0 -0
  713. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_hle_typing.py +0 -0
  714. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_integration.py +0 -0
  715. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_issue_fixes.py +0 -0
  716. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_local_detect.py +0 -0
  717. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_loop_detection.py +0 -0
  718. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_math_tool.py +0 -0
  719. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_mcp_settings.py +0 -0
  720. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_memory_tool.py +0 -0
  721. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_message_id.py +0 -0
  722. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_message_merging.py +0 -0
  723. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_middleware.py +0 -0
  724. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_multi_agent.py +0 -0
  725. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_read_file_not_found_listing.py +0 -0
  726. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_real_failures.py +0 -0
  727. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_real_issues.py +0 -0
  728. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_real_workflow.py +0 -0
  729. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_reasoning_content.py +0 -0
  730. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_rejudge_hle.py +0 -0
  731. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_retrieval_consumer.py +0 -0
  732. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_retrieve_tool.py +0 -0
  733. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_search_replace_args_not_truncated.py +0 -0
  734. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_smoke.py +0 -0
  735. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering.py +0 -0
  736. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering_capture.py +0 -0
  737. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering_compute_vector.py +0 -0
  738. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering_extract_pairs.py +0 -0
  739. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering_hook.py +0 -0
  740. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  741. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_steering_sidecar_hooks.py +0 -0
  742. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_system_prompt.py +0 -0
  743. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_tagged_text.py +0 -0
  744. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_task_complete_nudge.py +0 -0
  745. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_tool_args.py +0 -0
  746. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_truncate_args_valid_json.py +0 -0
  747. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_truncated_arg_path_hint.py +0 -0
  748. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_truncated_search_replace_escalation.py +0 -0
  749. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_truncated_write_escalation.py +0 -0
  750. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_ui_external_editor.py +0 -0
  751. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_ui_input_history.py +0 -0
  752. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_user_issues.py +0 -0
  753. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_verify_tool.py +0 -0
  754. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_wall_of_text_rescue.py +0 -0
  755. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_workloads.py +0 -0
  756. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/test_write_file_missing_path.py +0 -0
  757. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/testbank_helpers.py +0 -0
  758. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_ask_user_question.py +0 -0
  759. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash.py +0 -0
  760. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  761. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_consec_empty_search.py +0 -0
  762. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  763. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  764. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  765. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  766. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  767. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  768. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  769. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_exit_plan_mode.py +0 -0
  770. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_grep.py +0 -0
  771. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  772. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_invoke_context.py +0 -0
  773. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  774. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_manager_get_tool_config.py +0 -0
  775. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_mcp.py +0 -0
  776. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_mcp_sampling.py +0 -0
  777. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  778. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  779. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_read_file_directory.py +0 -0
  780. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_read_file_limit_truncation.py +0 -0
  781. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_append_fallback.py +0 -0
  782. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_dir_path.py +0 -0
  783. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_empty_content.py +0 -0
  784. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_file_not_found.py +0 -0
  785. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  786. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_hard_stop.py +0 -0
  787. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_malformed_block.py +0 -0
  788. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  789. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_placeholder.py +0 -0
  790. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  791. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_task.py +0 -0
  792. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_ui_bash_execution.py +0 -0
  793. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_webfetch.py +0 -0
  794. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_websearch.py +0 -0
  795. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  796. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  797. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  798. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  799. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_do_update.py +0 -0
  800. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  801. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_github_update_gateway.py +0 -0
  802. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  803. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_ui_update_notification.py +0 -0
  804. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_update_use_case.py +0 -0
  805. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/tests/update_notifier/test_whats_new.py +0 -0
  806. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/worked_examples/README.md +0 -0
  807. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/worked_examples/cli_subcommand_dispatch.py +0 -0
  808. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/worked_examples/lookup.json +0 -0
  809. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/worked_examples/sql_parser.py +0 -0
  810. {drydock_cli-2.8.29 → drydock_cli-2.8.31}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 1740481
@@ -719,7 +719,7 @@ while real users see loops and hangs.
719
719
  **How it works:**
720
720
  - Drives the real `drydock` TUI via pexpect (no headless mode)
721
721
  - Sends a vague user-style prompt ("review the PRD and build the package")
722
- - Polls the live `~/.vibe/logs/session/session_<id>/messages.jsonl` in parallel
722
+ - Polls the live `~/.drydock/logs/session/session_<id>/messages.jsonl` in parallel (legacy sessions at `~/.vibe/logs/session/` are still read for back-compat)
723
723
  - Watches for write loops, search_replace cascades, hallucinated-tool hangs
724
724
  - Types simulated `STOP` interrupts when loops are detected, then tracks
725
725
  whether the model OBEYS them
@@ -6,6 +6,40 @@ the dominant cause of thinking-stalls. Deep Noir sidecar wiring (M1-M4)
6
6
  is in tree; M1 end-to-end GPU smoke pending after the transformers 5.x
7
7
  apply_chat_template fix (f02aa4b).
8
8
 
9
+ ## Symbolic-math tool stack shipped (2026-05-14)
10
+
11
+ Major shipping push 2026-05-14: built four new sympy-backed built-in
12
+ tools to give the model offload paths for the symbolic work it
13
+ systematically gets wrong from prior. Pattern: same as `math` for
14
+ arithmetic — wrap a reliable library, sandbox the inputs, expose the
15
+ ops the model would otherwise have to "reason about." 52 new
16
+ operations total.
17
+
18
+ | Tool | Ops | Use case |
19
+ |------|-----|----------|
20
+ | `logic` | 12 | propositional logic — contrapositive, De Morgan, equivalence, truth tables, Modus Ponens, satisfiability, CNF/DNF |
21
+ | `algebra` | 13 | symbolic math — solve / simplify / expand / factor / diff / integrate / limit / series / evaluate / trigsimp |
22
+ | `number_theory` | 16 | primes / divisors / gcd / totient / Möbius / modular inverse / mod_pow / CRT |
23
+ | `set` | 11 | discrete math — union / intersection / power set / Cartesian product / cardinality / subset |
24
+
25
+ Each tool sandboxed with AST-level validation (no imports, no
26
+ attribute access, no dunder, no eval/exec), max-expression-length
27
+ caps, and per-tool result caps (e.g. power_set refuses |A|>10,
28
+ product refuses |A|·|B|>1000).
29
+
30
+ All four wired into `gemma4.md` system prompt with HLE-shape →
31
+ op mapping. The first hourly babysitter tick after these land
32
+ (02:45+ UTC) is the first batch where the model can use them; the
33
+ 22h trailing tool_usage_report will measure whether the lift is real.
34
+
35
+ Why this matters for HLE: Math sits at 3/102 = 2.9% lifetime, the
36
+ worst category. The dominant failure mode (per the day's session
37
+ traces) is `empty:no_final_answer` — the model engages, calls
38
+ retrieve, then web_searches, then runs out of 481s without producing
39
+ a FINAL ANSWER. Offloading the actual symbolic work to sympy lets
40
+ the model spend its turn budget on planning + extraction instead of
41
+ re-deriving algebra in plain English (which it gets wrong).
42
+
9
43
  ## HLE was retrieving against the WRONG corpus (fixed edb61c9)
10
44
 
11
45
  Trace from a Q3 session 2026-05-14: a local-field-theory HLE Math
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.29
3
+ Version: 2.8.31
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -48,6 +48,7 @@ Requires-Dist: tomli-w>=1.2.0
48
48
  Requires-Dist: tree-sitter-bash>=0.25.1
49
49
  Requires-Dist: tree-sitter>=0.25.2
50
50
  Requires-Dist: watchfiles>=1.1.1
51
+ Requires-Dist: z3-solver>=4.16.0
51
52
  Requires-Dist: zstandard>=0.25.0
52
53
  Description-Content-Type: text/markdown
53
54
 
@@ -787,6 +787,34 @@ class AgentLoop:
787
787
  except Exception as _e:
788
788
  logger.warning("curiosity gap logging failed (skipped): %s", _e)
789
789
 
790
+ # === CONSTRAINT-SHAPE DETECTOR ===
791
+ # The solve tool (Z3-backed) is the right answer for "find x such
792
+ # that ...", optimization, prove-from-premises, mod-arithmetic, and
793
+ # logic-puzzle questions. Gemma 4 doesn't reach for it on its own —
794
+ # this hook recognises the shape and injects a worked-example
795
+ # template the model can specialize. Off under pytest, on by default
796
+ # in production. Opt out via DRYDOCK_CONSTRAINT_HINT=0.
797
+ _constraint_hint_default = "0" if _under_pytest else "1"
798
+ if os.environ.get(
799
+ "DRYDOCK_CONSTRAINT_HINT", _constraint_hint_default
800
+ ).strip().lower() not in ("0", "false", "no"):
801
+ try:
802
+ from drydock.core.constraint_hint import (
803
+ detect_constraint_shape, build_hint,
804
+ )
805
+ hit = detect_constraint_shape(user_msg or "")
806
+ if hit is not None:
807
+ label, example = hit
808
+ logger.warning(
809
+ "[CONSTRAINT-HINT] matched %s; injecting template",
810
+ label,
811
+ )
812
+ self._inject_system_note(build_hint(label, example))
813
+ except Exception as _e:
814
+ logger.warning(
815
+ "constraint hint failed (skipped): %s", _e, exc_info=True
816
+ )
817
+
790
818
  try:
791
819
  should_break_loop = False
792
820
  tool_turns = 0
@@ -812,6 +840,7 @@ class AgentLoop:
812
840
  STOP_NOW_TIME_SEC = int(os.environ.get("DRYDOCK_STOP_NOW_TIME_SEC", "0"))
813
841
  _prompt_start = time.perf_counter()
814
842
  _time_stop_injected = False
843
+ _time_stop_escalated = False
815
844
  logger.warning("[TIMING] entering conversation while loop")
816
845
  while not should_break_loop:
817
846
  # Drain any user messages typed while the agent was working.
@@ -852,7 +881,39 @@ class AgentLoop:
852
881
  # DRYDOCK_STOP_NOW_TIME_SEC regardless of turn count.
853
882
  # Helps HLE batches where per-turn latency is 60-160s
854
883
  # and the turn-based STOP_NOW fires too late or not at all.
884
+ #
885
+ # IMPORTANT: check most-extreme condition FIRST. If a single
886
+ # LLM generation spans all three thresholds (e.g. starts at
887
+ # 200s, returns at 480s), the loop only gets one check at
888
+ # 480s. The old if/elif order would fire the *first* injection
889
+ # at 480s instead of the hard-stop. Reversed order ensures the
890
+ # hard-stop always wins when we're past all thresholds.
855
891
  if (STOP_NOW_TIME_SEC > 0
892
+ and _elapsed > STOP_NOW_TIME_SEC + 120):
893
+ # Past all injection thresholds — hard-stop unconditionally.
894
+ yield AssistantEvent(
895
+ content=(
896
+ f"\n\n[Drydock: hard time limit ({int(_elapsed)}s) reached. "
897
+ "No final answer was provided before the deadline.]\n"
898
+ ),
899
+ stopped_by_middleware=True,
900
+ )
901
+ return
902
+ elif (STOP_NOW_TIME_SEC > 0
903
+ and not _time_stop_escalated
904
+ and _elapsed > STOP_NOW_TIME_SEC + 60):
905
+ # Model made another tool call after the first STOP_NOW
906
+ # (or missed it entirely). Escalate with a forceful injection.
907
+ _time_stop_injected = True
908
+ _time_stop_escalated = True
909
+ _stop_suffix = os.environ.get("DRYDOCK_STOP_NOW_SUFFIX", "")
910
+ self._inject_system_note(
911
+ f"URGENT: {int(_elapsed)}s elapsed. Do NOT call any more tools. "
912
+ "Emit a plain text response RIGHT NOW with your best answer. "
913
+ "If uncertain, still write an answer."
914
+ + (f" {_stop_suffix}" if _stop_suffix else "")
915
+ )
916
+ elif (STOP_NOW_TIME_SEC > 0
856
917
  and not _time_stop_injected
857
918
  and _elapsed > STOP_NOW_TIME_SEC):
858
919
  _time_stop_injected = True
@@ -3122,7 +3183,8 @@ class AgentLoop:
3122
3183
  for p in ('"total_count": 0', '"total_count":0',
3123
3184
  'total_count: 0', 'retrieved 0 todos',
3124
3185
  'no todos', '0 tasks', 'no tasks',
3125
- 'no results', 'no matches', '0 matches'):
3186
+ 'no results', 'no matches', '0 matches',
3187
+ 'no relevant information found'):
3126
3188
  if p in s:
3127
3189
  return True
3128
3190
  return False
@@ -0,0 +1,181 @@
1
+ """Constraint-question detector — nudges Gemma 4 toward the `solve` tool.
2
+
3
+ The model has the `solve` tool available, but it doesn't reliably reach
4
+ for it. Two observed failure modes:
5
+ 1. It answers from prior — guesses a value that "looks right."
6
+ 2. It tries to enumerate by hand and miscounts.
7
+
8
+ This hook pattern-matches the user message against the canonical
9
+ shapes of constraint problems (find-x-such-that, prove, optimization,
10
+ mod arithmetic, logic puzzle vocabulary). On a match, it picks the
11
+ worked example closest to the question shape and injects it as a
12
+ system note. That gives the model a concrete template to specialize
13
+ rather than abstract advice.
14
+
15
+ Same shape as the GraphRAG auto-prefetch and the curiosity-gap
16
+ logger: env-gated, log-only on miss, idempotent within a single
17
+ user-prompt turn.
18
+
19
+ Disabled via DRYDOCK_CONSTRAINT_HINT=0.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ import logging
24
+ import os
25
+ import re
26
+
27
+ logger = logging.getLogger("drydock.constraint_hint")
28
+
29
+
30
+ # Pattern → (label, worked-example string). Patterns are evaluated in
31
+ # order; the first matching pattern wins. Each example shows the
32
+ # variables/constraints encoding for that question shape, so the model
33
+ # can specialize rather than invent the encoding from scratch.
34
+ _PATTERN_HINTS: list[tuple[re.Pattern[str], str, str]] = [
35
+ (
36
+ re.compile(
37
+ r"\b(einstein|zebra)\s+puzzle\b"
38
+ r"|\blogic\s+puzzle\b"
39
+ r"|\bwho\s+(lives|owns|drinks|smokes)\b"
40
+ r"|\b(?:n|\d+)[\s\-]?queens\b"
41
+ r"|\bsudoku\b",
42
+ re.IGNORECASE,
43
+ ),
44
+ "logic-puzzle",
45
+ 'solve(op="solve", variables="a:Int, b:Int, c:Int",\n'
46
+ ' constraints=[\n'
47
+ ' "a >= 1", "a <= 3", "b >= 1", "b <= 3", "c >= 1", "c <= 3",\n'
48
+ ' "Distinct(a, b, c)", # all-different\n'
49
+ ' "a == 1", # \\"X is in position 1\\"\n'
50
+ ' "Abs(b - a) == 1", # \\"Y is next to X\\"\n'
51
+ ' "c != 2", # \\"Z is not in position 2\\"\n'
52
+ ' ])\n'
53
+ '→ sat: a=1, b=2, c=3',
54
+ ),
55
+ (
56
+ re.compile(
57
+ r"\bmod(?:ulo|ular)?\b"
58
+ r"|\bmod\s*\d"
59
+ r"|\(mod\s+\w+\)"
60
+ r"|\b\d+\s*[≡=]\s*\d+\s*\(?mod"
61
+ r"|[a-zA-Z]\s*%\s*\d+" # `n % 7`, `x%5`
62
+ r"|\bdivisible\s+by\b"
63
+ r"|\bremainder\b",
64
+ re.IGNORECASE,
65
+ ),
66
+ "modular-arithmetic",
67
+ 'solve(op="solve", variables="x:Int",\n'
68
+ ' constraints=["x >= 0", "x < 7", "3*x % 7 == 5"])\n'
69
+ '→ sat: x=4 (smallest non-negative x with 3x ≡ 5 mod 7)\n'
70
+ '\n'
71
+ 'For \\"find all solutions in the range\\", use op="find_all".\n'
72
+ 'For \\"smallest x with property P\\", use op="optimize", direction="min".',
73
+ ),
74
+ (
75
+ re.compile(
76
+ r"\bmaxim(?:ize|um)\b|\bminim(?:ize|um)\b"
77
+ r"|\bsmallest\s+(?:value|integer|number|x|n)\b"
78
+ r"|\blargest\s+(?:value|integer|number|x|n)\b"
79
+ r"|\bsubject\s+to\b"
80
+ r"|\boptimize\b",
81
+ re.IGNORECASE,
82
+ ),
83
+ "optimization",
84
+ 'solve(op="optimize", variables="x:Int, y:Int",\n'
85
+ ' constraints=["x + y == 10", "x >= 0", "y >= 0"],\n'
86
+ ' objective="x * y", direction="max")\n'
87
+ '→ optimal: x=5, y=5, objective=25',
88
+ ),
89
+ (
90
+ re.compile(
91
+ r"\b(prove|show\s+that|demonstrate|verify\s+that)\b"
92
+ r"|\bif\s+and\s+only\s+if\b"
93
+ r"|\biff\b"
94
+ r"|\bnecessary\s+and\s+sufficient\b",
95
+ re.IGNORECASE,
96
+ ),
97
+ "prove",
98
+ 'solve(op="prove", variables="x:Int",\n'
99
+ ' constraints=["x > 0"],\n'
100
+ ' conclusion="x + 1 > 1")\n'
101
+ '→ valid (constraints entail the conclusion)\n'
102
+ '\n'
103
+ 'When `prove` returns `countered`, the `model` field is the\n'
104
+ 'counterexample — that IS the answer for \\"is this true\\" questions.',
105
+ ),
106
+ (
107
+ re.compile(
108
+ r"\bfind\s+(?:all\s+)?(?:x|y|n|the\s+(?:value|values|number|integer|integers))\s+such\s+that\b"
109
+ r"|\bfor\s+what\s+(?:value|values|x|y|n)\s+(?:does|is|of)\b"
110
+ r"|\bexists\s+(?:a|an)\s+\w+\s+such\s+that\b"
111
+ r"|\bthere\s+(?:is|exists)\s+(?:a|an|some)\s+\w+\s+(?:such\s+that|with)\b",
112
+ re.IGNORECASE,
113
+ ),
114
+ "find-such-that",
115
+ 'solve(op="solve", variables="x:Int, y:Int",\n'
116
+ ' constraints=["x + y == 10", "x - y == 4"])\n'
117
+ '→ sat: x=7, y=3\n'
118
+ '\n'
119
+ 'Variable types: Int | Real | Bool | BitVec<N>. Operators: ==, !=,\n'
120
+ '<, <=, >, >=, +, -, *, /, %. Functions: And, Or, Not, Implies,\n'
121
+ 'If, Distinct, Abs, Sum.',
122
+ ),
123
+ ]
124
+
125
+
126
+ def _strip_boilerplate(text: str) -> str:
127
+ """Pull the actual question out of HLE / shakedown wrappers.
128
+
129
+ Same surgery as the GraphRAG auto-prefetch — \"QUESTION:\" prefix and
130
+ \"FINAL ANSWER:\" / \"Format your\" suffix get stripped so patterns
131
+ don't false-match on scaffolding.
132
+ """
133
+ s = text or ""
134
+ marker = s.find("QUESTION:")
135
+ if marker >= 0:
136
+ s = s[marker + len("QUESTION:"):]
137
+ for stopper in ("FINAL ANSWER:", "Format your", "End your response",
138
+ "Your answer"):
139
+ idx = s.find(stopper)
140
+ # Strip iff there's at least a real question in front (>=20 chars).
141
+ # The original auto-prefetch used 50; we use a smaller threshold
142
+ # here so short questions like "Solve x+1=5.\nFINAL ANSWER:" still
143
+ # match.
144
+ if idx >= 20:
145
+ s = s[:idx]
146
+ return s.strip()
147
+
148
+
149
+ def detect_constraint_shape(user_msg: str) -> tuple[str, str] | None:
150
+ """Return (label, worked_example) when the message has a
151
+ constraint-problem shape, or None otherwise.
152
+
153
+ Patterns are checked in priority order: logic-puzzle first (most
154
+ specific), then modular arithmetic, optimization, prove, and finally
155
+ the broad \"find x such that\" catchall. The first match wins.
156
+ """
157
+ cleaned = _strip_boilerplate(user_msg)
158
+ if len(cleaned) < 10:
159
+ return None
160
+ for pat, label, example in _PATTERN_HINTS:
161
+ if pat.search(cleaned):
162
+ return (label, example)
163
+ return None
164
+
165
+
166
+ def build_hint(label: str, example: str) -> str:
167
+ """Format a system note around the worked example.
168
+
169
+ Kept compact (≈350 chars) so it doesn't dominate the context.
170
+ Frames the example as \"specialize THIS template,\" not \"here's an
171
+ abstract guideline\" — the project memory says Gemma 4 trusts
172
+ concrete shapes and ignores prose advice.
173
+ """
174
+ return (
175
+ f"[constraint-hint] This question has a {label} shape. "
176
+ f"Encode as a `solve` call rather than reasoning step-by-step. "
177
+ f"Z3 is sound and complete on integer/real/boolean constraints. "
178
+ f"Template to specialize:\n\n{example}\n\n"
179
+ f"See the `constraint-reasoning` skill for the full encoding "
180
+ f"reference (Int/Real/Bool/BitVec, Distinct, If, Sum, Implies)."
181
+ )
@@ -193,6 +193,15 @@ class OpenAIAdapter(APIAdapter):
193
193
  # Enable thinking for models that support it (Gemma 4)
194
194
  if thinking and thinking not in ("off", ""):
195
195
  payload["chat_template_kwargs"] = {"enable_thinking": True}
196
+ # Cap thinking length (llama.cpp). Prevents runaway thinking stalls
197
+ # on hard HLE questions (model can think >480s without this).
198
+ # Set DRYDOCK_THINKING_BUDGET_TOKENS=8000 in HLE batch launches.
199
+ _budget = os.environ.get("DRYDOCK_THINKING_BUDGET_TOKENS")
200
+ if _budget:
201
+ try:
202
+ payload["thinking_budget_tokens"] = int(_budget)
203
+ except ValueError:
204
+ pass
196
205
 
197
206
  if enable_streaming:
198
207
  payload["stream"] = True
@@ -4,7 +4,7 @@ ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT ex
4
4
 
5
5
  When answering a direct factual or math question (not writing code), you MUST write visible text — never produce a response with only thinking tokens and no visible content. End your response with "FINAL ANSWER: <your answer>" on its own line so the judge can extract it. Even if you are uncertain, always attempt an answer and write "FINAL ANSWER: <best guess>" — an empty response scores 0 regardless of how good your reasoning was.
6
6
 
7
- Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify.
7
+ Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify, logic, algebra, number_theory, set, linear_algebra, stats, units, chemistry, solve.
8
8
 
9
9
  CURIOSITY — default posture is "investigate, then assert" (SOVEREIGN_PRD §5.7):
10
10
  - If the user message names a thing you don't have context for (paper title,
@@ -109,6 +109,149 @@ check and returns pass/fail. `verify(criterion="tests pass",
109
109
  command="pytest -q", expect="passed", expect_mode="contains")` instead
110
110
  of inspecting the bash output yourself.
111
111
 
112
+ USE THE logic TOOL when you need to apply propositional logic — checking
113
+ equivalences, contrapositives, De Morgan, truth tables, Modus Ponens.
114
+ Small models get implication direction wrong and miss negations under
115
+ nested AND/OR. Examples:
116
+ logic(op="contrapositive", expression="p >> q") → ¬q → ¬p
117
+ logic(op="equivalent", expression="p >> q", expression2="~q >> ~p")
118
+ logic(op="negate", expression="p & q & r") → De Morgan'd negation
119
+ logic(op="truth_table", expression="(p | q) & ~p")
120
+ logic(op="modus_ponens", expression="p", expression2="p >> q") → q
121
+ Use INSTEAD of reasoning about logic in your head when answering HLE-style
122
+ prove/show-that/iff questions or when refactoring boolean conditions.
123
+ Syntax: `&` AND, `|` OR, `~` NOT, `>>` IMPLIES, `Equivalent(p, q)` IFF.
124
+
125
+ When the question contains these shapes, reach for these ops:
126
+ - "show that A iff B" / "A is necessary and sufficient for B"
127
+ → logic(op="equivalent", expression="<A>", expression2="<B>")
128
+ - "prove A → B by contrapositive"
129
+ → logic(op="contrapositive", expression="<A> >> <B>") then prove the result
130
+ - "show A → B is always true" / "is this a tautology?"
131
+ → logic(op="tautology", expression="<A> >> <B>")
132
+ - "is there any case where <expr> holds?"
133
+ → logic(op="satisfiable", expression="<expr>") (returns a witness)
134
+ - "simplify ~(A & B & C)" or "what's NOT (A or B)?"
135
+ → logic(op="negate", expression="<expr>") (auto-applies De Morgan)
136
+ - "given premises P and (P → Q), what follows?"
137
+ → logic(op="modus_ponens", expression="<P>", expression2="<P> >> <Q>")
138
+
139
+ USE THE algebra TOOL for symbolic math — solve equations, differentiate,
140
+ integrate, take limits, simplify, expand, factor, Taylor series. Small
141
+ models get sign errors, drop terms in expansions, and integrate by parts
142
+ incorrectly. Sympy doesn't. Examples:
143
+ algebra(op="solve", expression="x**2 - 4", variable="x") → [-2, 2]
144
+ algebra(op="diff", expression="sin(x)*cos(x)", variable="x")
145
+ algebra(op="integrate", expression="x**2", variable="x", a="0", b="1")
146
+ algebra(op="limit", expression="sin(x)/x", variable="x", value="0") → 1
147
+ algebra(op="series", expression="exp(x)", variable="x", value="0", order=4)
148
+ algebra(op="evaluate", expression="x**2 + 1", variable="x", value="3") → 10
149
+ algebra(op="trigsimp", expression="sin(x)**2 + cos(x)**2") → 1
150
+ Use INSTEAD of doing CAS work in your head. Free variables auto-bind to
151
+ symbols. Constants: pi, E, oo (infinity), I. Functions: sin/cos/tan,
152
+ log/exp/sqrt, factorial, binomial, gamma, Rational(p,q).
153
+
154
+ USE THE number_theory TOOL for primes/divisors/gcd/modular arithmetic.
155
+ Don't guess whether 1000003 is prime — call it. Examples:
156
+ number_theory(op="is_prime", n="2**31 - 1") → True
157
+ number_theory(op="factor", n="360") → {2:3, 3:2, 5:1}
158
+ number_theory(op="totient", n="12") → 4
159
+ number_theory(op="gcd", a="48", b="18") → 6
160
+ number_theory(op="mod_pow", b="2", e="100", m="7") → 2 (2^100 mod 7)
161
+ number_theory(op="mod_inverse", a="3", m="7") → 5 (3^-1 mod 7)
162
+ number_theory(op="crt", remainders="2,3,2", moduli="3,5,7") → x ≡ 23 (mod 105)
163
+ Integer args parse expressions — n="factorial(20)" works. Use INSTEAD
164
+ of doing factorial/Fermat-test/Euclidean-algorithm by hand.
165
+
166
+ USE THE set TOOL for discrete-math set questions. Inputs are
167
+ comma-separated literals (ints, 'quoted strings', or barewords as
168
+ strings). Examples:
169
+ set(op="union", a="1,2,3", b="3,4,5") → {1,2,3,4,5}
170
+ set(op="intersection", a="1,2,3,4", b="3,4,5,6") → {3,4}
171
+ set(op="is_subset", a="1,2", b="1,2,3") → True
172
+ set(op="cardinality", a="1,2,2,3") → 3 (dedupes)
173
+ set(op="power_set", a="1,2,3") → 8 subsets
174
+ set(op="size_of_product", a="1,2,3", b="x,y,z,w") → 12
175
+ Use INSTEAD of manually enumerating subsets or checking containment.
176
+
177
+ USE THE linear_algebra TOOL for matrix problems. Syntax: rows separated
178
+ by ';', entries by ','. Max 8×8. Symbolic entries OK.
179
+ linear_algebra(op="determinant", matrix="1,2;3,4") → -2
180
+ linear_algebra(op="inverse", matrix="1,2;3,4") → [[-2,1],[3/2,-1/2]]
181
+ linear_algebra(op="eigenvals", matrix="2,1;0,3") → {2:1, 3:1}
182
+ linear_algebra(op="multiply", matrix="1,2;3,4", matrix2="5,6;7,8")
183
+ linear_algebra(op="solve_linear", matrix="1,1;1,-1", vector="5;1") → x=3, y=2
184
+ linear_algebra(op="power", matrix="1,1;0,1", n="5") → [[1,5],[0,1]]
185
+ Use INSTEAD of doing matrix multiplication / Cramer's rule by hand.
186
+
187
+ USE THE stats TOOL for distributions, hypothesis tests, descriptive
188
+ stats. Backed by scipy.stats. Supported dists: normal, t, chi2, f,
189
+ binomial, poisson, exponential, uniform, beta, gamma.
190
+ stats(op="describe", data="1,2,3,4,5") → n=5 mean=3 stdev=1.58 ...
191
+ stats(op="cdf", dist="normal", params="0,1", x="1.96") → 0.975 (Φ(1.96))
192
+ stats(op="ppf", dist="normal", params="0,1", q="0.975") → 1.96 (inverse)
193
+ stats(op="binomial", n="10", k="3", p="0.5") → P(X=3) for Bin(10, 0.5)
194
+ stats(op="poisson", k="2", lam="3") → P(X=2) for Poisson(3)
195
+ stats(op="z_test", x_bar="105", mu0="100", sigma="15", n="30")
196
+ stats(op="t_test", data="4.8,5.1,4.9,5.0", mu0="5")
197
+ stats(op="correlation", data="1,2,3,4", data2="2,4,6,8") → r, p
198
+ stats(op="ci_mean", data="10,11,12,13,14") → 95% CI
199
+ Use INSTEAD of looking up z-table values or computing pmf by hand.
200
+
201
+ USE THE units TOOL for physics unit conversion and dimensional analysis.
202
+ Unit names work as identifiers: m, km, mile, ft, s, hour, kg, g, N,
203
+ J, W, V, A, Pa, atm, mol, K, etc.
204
+ units(op="convert", expression="60*mile/hour", to_unit="meter/second")
205
+ units(op="evaluate", expression="Rational(1,2)*kg*(3*m/s)**2") → KE
206
+ units(op="consistent", expression="joule", expression2="newton*meter") → True
207
+ units(op="dimension", expression="watt") → power (= energy/time)
208
+ units(op="to_si", expression="1*atmosphere") → 101325 Pa as base SI
209
+ Use INSTEAD of remembering conversion factors / doing dimensional
210
+ algebra in your head. The `consistent` op is great for sanity-checking
211
+ a physics formula (does your derived expression have the right
212
+ dimensions?).
213
+
214
+ USE THE chemistry TOOL for periodic-table lookups, molar mass, mole
215
+ conversions, percent composition, empirical formulas. Formula syntax
216
+ is standard chemistry notation with nested parens (H2O, Ca(OH)2,
217
+ Fe2(SO4)3, C6H12O6). Examples:
218
+ chemistry(op="element", name="Na") → Na (Z=11, 22.99 g/mol)
219
+ chemistry(op="molar_mass", formula="C6H12O6") → 180.156 g/mol
220
+ chemistry(op="moles_from_grams", formula="H2O", grams="18") → 0.999 mol
221
+ chemistry(op="percent_composition", formula="H2O") → H=11.19% O=88.81%
222
+ chemistry(op="empirical_formula", percents="C=40, H=6.7, O=53.3") → CH2O
223
+ Use INSTEAD of looking up atomic weights / doing stoichiometry by hand.
224
+
225
+ USE THE solve TOOL when the question is a CONSTRAINT problem — "find x
226
+ such that ...", "find all values where ...", "what's the smallest /
227
+ largest x with ...", logic puzzles (Einstein-style), Sudoku-shape
228
+ problems, modular arithmetic ranges, or any "prove this follows from
229
+ those premises." Backed by Z3 (SMT solver). It is COMPLETE and SOUND
230
+ for integer/real arithmetic + boolean logic. Don't enumerate by hand.
231
+ solve(op="solve", variables="x:Int, y:Int", constraints=["x + y == 10", "x - y == 4"])
232
+ → sat: x=7, y=3
233
+ solve(op="solve", variables="x:Int", constraints=["x >= 0", "x < 7", "3*x % 7 == 5"])
234
+ → sat: x=4 (smallest x with 3x ≡ 5 mod 7)
235
+ solve(op="find_all", variables="x:Int", constraints=["x >= 1", "x <= 5"], limit=10)
236
+ → all 5 solutions
237
+ solve(op="prove", variables="x:Int", constraints=["x > 0"], conclusion="x + 1 > 1")
238
+ → valid
239
+ solve(op="optimize", variables="x:Int, y:Int", constraints=["x + y == 10", "x >= 0", "y >= 0"],
240
+ objective="x * y", direction="max") → optimal: x=5, y=5 (objective=25)
241
+ Variable types: Int, Real, Bool, BitVec<N>. Constraint operators: ==,
242
+ !=, <, <=, >, >=, +, -, *, /, %, And, Or, Not, Implies, If, Distinct,
243
+ Abs, Sum. When `prove` returns `countered`, the `model` field is the
244
+ counterexample — use it as the answer.
245
+
246
+ Reach for solve when the question has the shape:
247
+ - "find <values> such that ..." / "for what x does ..."
248
+ - "is there an x such that ..." (sat) or "for all x, ..." (prove)
249
+ - a list of 3+ conditions over the same variable(s)
250
+ - "Einstein puzzle", "Sudoku", "N-queens", "logic puzzle"
251
+ - "modular arithmetic", "x mod N", "≡ ... (mod ...)"
252
+ - "smallest / largest / maximize / minimize ... subject to ..."
253
+ - "prove X from Y, Z" with constraints over integers/reals/booleans
254
+
112
255
  Rules:
113
256
  - Create files immediately. Do not plan or discuss — write code.
114
257
  - Use absolute imports for Python packages