drydock-cli 2.8.27__tar.gz → 2.8.28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. drydock_cli-2.8.28/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/CLAUDE.md +59 -3
  3. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/DEEP_NOIR_PRD.md +33 -1
  4. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/HLE_PRD.md +83 -0
  5. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/PKG-INFO +1 -1
  6. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agent_loop.py +66 -21
  7. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/dispatcher.py +63 -2
  8. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/rules.py +19 -1
  9. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/gemma4.md +5 -1
  10. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/retrieve.py +45 -3
  11. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/__main__.py +86 -7
  12. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/gap_detector.py +39 -1
  13. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/extract_pairs.py +83 -12
  14. drydock_cli-2.8.28/drydock/steering/train/scan_sessions.py +310 -0
  15. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/pyproject.toml +1 -1
  16. drydock_cli-2.8.28/research/deep_noir/pairs/empty_after_bash.jsonl +82 -0
  17. drydock_cli-2.8.28/research/deep_noir/pairs/scan_empty_after_bash.jsonl +203 -0
  18. drydock_cli-2.8.28/resume.md +132 -0
  19. drydock_cli-2.8.28/scripts/dedupe_dispatch_queues.py +155 -0
  20. drydock_cli-2.8.28/scripts/dispatch_report.py +153 -0
  21. drydock_cli-2.8.28/scripts/drydock_status.sh +129 -0
  22. drydock_cli-2.8.28/scripts/hle_aggregate.py +181 -0
  23. drydock_cli-2.8.28/scripts/hle_babysitter.sh +171 -0
  24. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/hle_eval.py +172 -36
  25. drydock_cli-2.8.28/scripts/rejudge_hle.py +194 -0
  26. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_auto_retrieve_soft_nudge.py +128 -0
  27. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_classifier.py +37 -0
  28. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_curiosity.py +33 -0
  29. drydock_cli-2.8.28/tests/test_dispatch_report.py +141 -0
  30. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_dispatcher.py +43 -0
  31. drydock_cli-2.8.28/tests/test_hle_aggregate.py +123 -0
  32. drydock_cli-2.8.28/tests/test_hle_score_method_split.py +152 -0
  33. drydock_cli-2.8.28/tests/test_rejudge_hle.py +184 -0
  34. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_retrieve_tool.py +59 -0
  35. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/trip_log.md +126 -0
  36. drydock_cli-2.8.27/.auto_release.lock +0 -1
  37. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/CODEOWNERS +0 -0
  38. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  39. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  40. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  41. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/build-and-upload.yml +0 -0
  42. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/ci.yml +0 -0
  43. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/issue-labeler.yml +0 -0
  44. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.github/workflows/release.yml +0 -0
  45. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.gitignore +0 -0
  46. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.pre-commit-config.yaml +0 -0
  47. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.python-version +0 -0
  48. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.typos.toml +0 -0
  49. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.vscode/extensions.json +0 -0
  50. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.vscode/launch.json +0 -0
  51. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/.vscode/settings.json +0 -0
  52. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/AGENTS.md +0 -0
  53. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/Admiral.md +0 -0
  54. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/CHANGELOG.md +0 -0
  55. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/CONTRIBUTING.md +0 -0
  56. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/DEPLOYMENT.md +0 -0
  57. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/DRYDOCK.md +0 -0
  58. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/JETSON_BENCH.md +0 -0
  59. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/LICENSE +0 -0
  60. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/MODEL_SHORTCOMINGS.md +0 -0
  61. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/NOTICE +0 -0
  62. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/README.md +0 -0
  63. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/SOVEREIGN_PRD.md +0 -0
  64. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/TRIAGE_v1.md +0 -0
  65. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/action.yml +0 -0
  66. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/README.md +0 -0
  67. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results1.tsv +0 -0
  68. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results13.tsv +0 -0
  69. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results14.tsv +0 -0
  70. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results15.tsv +0 -0
  71. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results16.tsv +0 -0
  72. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results17.tsv +0 -0
  73. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results18.tsv +0 -0
  74. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results19.tsv +0 -0
  75. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results2.tsv +0 -0
  76. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results20.tsv +0 -0
  77. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results3.tsv +0 -0
  78. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results4.tsv +0 -0
  79. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results5.tsv +0 -0
  80. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results6.tsv +0 -0
  81. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results7.tsv +0 -0
  82. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results8.tsv +0 -0
  83. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results9.tsv +0 -0
  84. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/baseline_history/results_evolved_v1.tsv +0 -0
  85. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/distribution/zed/LICENSE +0 -0
  86. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/distribution/zed/extension.toml +0 -0
  87. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/distribution/zed/icons/mistral_vibe.svg +0 -0
  88. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/README.md +0 -0
  89. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/acp-setup.md +0 -0
  90. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/BASELINE_412.md +0 -0
  91. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/Drydock_rebrand.md +0 -0
  92. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  93. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  94. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  95. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/PRD.md +0 -0
  96. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/drydock_terms.md +0 -0
  97. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/archive/resume.md +0 -0
  98. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/docs/proxy-setup.md +0 -0
  99. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/__init__.py +0 -0
  100. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/__main__.py +0 -0
  101. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/__init__.py +0 -0
  102. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/acp_agent_loop.py +0 -0
  103. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/acp_logger.py +0 -0
  104. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/entrypoint.py +0 -0
  105. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/__init__.py +0 -0
  106. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/base.py +0 -0
  107. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/bash.py +0 -0
  108. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/read_file.py +0 -0
  109. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/search_replace.py +0 -0
  110. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/todo.py +0 -0
  111. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/builtins/write_file.py +0 -0
  112. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/tools/session_update.py +0 -0
  113. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/acp/utils.py +0 -0
  114. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/__init__.py +0 -0
  115. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/detectors.py +0 -0
  116. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/detectors_proposed.py +0 -0
  117. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/history.py +0 -0
  118. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/interventions.py +0 -0
  119. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/llm_analyzer.py +0 -0
  120. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/metrics.py +0 -0
  121. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/opus_escalator.py +0 -0
  122. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/persistence.py +0 -0
  123. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/policy.py +0 -0
  124. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/proposer.py +0 -0
  125. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/stager.py +0 -0
  126. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/task_classifier.py +0 -0
  127. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/tuning.py +0 -0
  128. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/validator.py +0 -0
  129. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/admiral/worker.py +0 -0
  130. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/__init__.py +0 -0
  131. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/__init__.py +0 -0
  132. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/base.py +0 -0
  133. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/path_completion.py +0 -0
  134. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/autocompletion/slash_command.py +0 -0
  135. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/cli.py +0 -0
  136. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/clipboard.py +0 -0
  137. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/commands.py +0 -0
  138. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/entrypoint.py +0 -0
  139. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/fix_windows_path.py +0 -0
  140. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/history_manager.py +0 -0
  141. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  142. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  143. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  144. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/terminal_setup.py +0 -0
  145. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/__init__.py +0 -0
  146. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  147. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/app.py +0 -0
  148. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/app.tcss +0 -0
  149. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/external_editor.py +0 -0
  150. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  151. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  152. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  153. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  154. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  155. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  156. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  157. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  158. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  159. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  160. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  161. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  162. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  163. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  164. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  165. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  166. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  167. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  168. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  169. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  170. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  171. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  172. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  173. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  174. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  175. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  176. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  177. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  178. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  179. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  180. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  181. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  182. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  183. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  184. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  185. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  186. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  187. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/history.py +0 -0
  188. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  189. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/textual_ui/windowing/state.py +0 -0
  190. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/__init__.py +0 -0
  191. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  192. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  193. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  194. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  195. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  196. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/update.py +0 -0
  197. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/cli/update_notifier/whats_new.py +0 -0
  198. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/__init__.py +0 -0
  199. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agents/__init__.py +0 -0
  200. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agents/manager.py +0 -0
  201. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/agents/models.py +0 -0
  202. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/auth/__init__.py +0 -0
  203. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/auth/crypto.py +0 -0
  204. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/auth/github.py +0 -0
  205. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/__init__.py +0 -0
  206. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/completers.py +0 -0
  207. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  208. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  209. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  210. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  211. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  212. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/fuzzy.py +0 -0
  213. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/path_prompt.py +0 -0
  214. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  215. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/build_orchestrator.py +0 -0
  216. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/checkpoint.py +0 -0
  217. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/__init__.py +0 -0
  218. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/__main__.py +0 -0
  219. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/classifier.py +0 -0
  220. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/classifier/signal.py +0 -0
  221. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/__init__.py +0 -0
  222. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/_dotenv.py +0 -0
  223. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/_settings.py +0 -0
  224. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/doctor.py +0 -0
  225. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/harness_files/__init__.py +0 -0
  226. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  227. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/harness_files/_paths.py +0 -0
  228. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/local_detect.py +0 -0
  229. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/config/migrate.py +0 -0
  230. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/consultant.py +0 -0
  231. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/context_recovery.py +0 -0
  232. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/drydock_states.py +0 -0
  233. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/hooks.py +0 -0
  234. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/__init__.py +0 -0
  235. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/anthropic.py +0 -0
  236. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/base.py +0 -0
  237. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/factory.py +0 -0
  238. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/generic.py +0 -0
  239. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/mistral.py +0 -0
  240. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  241. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/backend/vertex.py +0 -0
  242. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/exceptions.py +0 -0
  243. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/format.py +0 -0
  244. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/message_utils.py +0 -0
  245. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/llm/types.py +0 -0
  246. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/logger.py +0 -0
  247. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/middleware.py +0 -0
  248. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/output_formatters.py +0 -0
  249. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/__init__.py +0 -0
  250. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/_drydock_home.py +0 -0
  251. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/_local_config_walk.py +0 -0
  252. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/paths/conventions.py +0 -0
  253. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/plan_session.py +0 -0
  254. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/plugins.py +0 -0
  255. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/programmatic.py +0 -0
  256. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/__init__.py +0 -0
  257. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/builder.md +0 -0
  258. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/cli.md +0 -0
  259. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/compact.md +0 -0
  260. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/dangerous_directory.md +0 -0
  261. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/diagnostic.md +0 -0
  262. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/explore.md +0 -0
  263. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/planner.md +0 -0
  264. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/project_context.md +0 -0
  265. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/prompts/tests.md +0 -0
  266. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/proxy_setup.py +0 -0
  267. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/agent_memory.py +0 -0
  268. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/checkpoints.py +0 -0
  269. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/session_loader.py +0 -0
  270. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/session_logger.py +0 -0
  271. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/session_migration.py +0 -0
  272. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session/state_file.py +0 -0
  273. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/session_checker.py +0 -0
  274. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/__init__.py +0 -0
  275. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/manager.py +0 -0
  276. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/models.py +0 -0
  277. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/skills/parser.py +0 -0
  278. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/slug.py +0 -0
  279. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/steering_hook.py +0 -0
  280. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/system_prompt.py +0 -0
  281. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/telemetry/__init__.py +0 -0
  282. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/telemetry/send.py +0 -0
  283. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/errors.py +0 -0
  284. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/git.py +0 -0
  285. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/nuage.py +0 -0
  286. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/teleport.py +0 -0
  287. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/teleport/types.py +0 -0
  288. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/base.py +0 -0
  289. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/_task_manager.py +0 -0
  290. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  291. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/bash.py +0 -0
  292. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/count_tool.py +0 -0
  293. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/cron.py +0 -0
  294. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  295. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/glob_tool.py +0 -0
  296. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/grep.py +0 -0
  297. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  298. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/lsp.py +0 -0
  299. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/math_tool.py +0 -0
  300. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  301. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/memory_tool.py +0 -0
  302. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  303. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/powershell.py +0 -0
  304. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  305. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  306. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  307. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  308. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  309. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  310. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  311. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  312. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  313. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  314. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  315. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  316. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  317. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  318. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  319. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/task.md +0 -0
  320. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  321. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  322. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  323. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  324. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  325. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  326. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  327. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/read_file.py +0 -0
  328. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/search_replace.py +0 -0
  329. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/task.py +0 -0
  330. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/todo.py +0 -0
  331. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/tool_search.py +0 -0
  332. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/verify_tool.py +0 -0
  333. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/webfetch.py +0 -0
  334. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/websearch.py +0 -0
  335. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/worktree.py +0 -0
  336. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/builtins/write_file.py +0 -0
  337. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/injection_guard.py +0 -0
  338. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/manager.py +0 -0
  339. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp/__init__.py +0 -0
  340. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp/registry.py +0 -0
  341. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp/tools.py +0 -0
  342. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/mcp_sampling.py +0 -0
  343. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/ui.py +0 -0
  344. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/tools/utils.py +0 -0
  345. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/trusted_folders.py +0 -0
  346. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/types.py +0 -0
  347. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/core/utils.py +0 -0
  348. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/__init__.py +0 -0
  349. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/item.py +0 -0
  350. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/queue.py +0 -0
  351. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/curiosity/surprise.py +0 -0
  352. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/__init__.py +0 -0
  353. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/__main__.py +0 -0
  354. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/code_indexer.py +0 -0
  355. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/retriever.py +0 -0
  356. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/storage.py +0 -0
  357. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/graphrag/text_indexer.py +0 -0
  358. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/__init__.py +0 -0
  359. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/base.py +0 -0
  360. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/onboarding.tcss +0 -0
  361. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/__init__.py +0 -0
  362. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/api_key.py +0 -0
  363. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/choice.py +0 -0
  364. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/local_model.py +0 -0
  365. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/onboarding/screens/welcome.py +0 -0
  366. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  367. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  368. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/__init__.py +0 -0
  369. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/api-design/SKILL.md +0 -0
  370. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/audit-tests/SKILL.md +0 -0
  371. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/batch/SKILL.md +0 -0
  372. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/commit-code/SKILL.md +0 -0
  373. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/context-summary/SKILL.md +0 -0
  374. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/create-presentation/SKILL.md +0 -0
  375. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/deep-research/SKILL.md +0 -0
  376. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/deploy/SKILL.md +0 -0
  377. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/diff-review/SKILL.md +0 -0
  378. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/doc-gen/SKILL.md +0 -0
  379. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/explain-code/SKILL.md +0 -0
  380. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/explore-code/SKILL.md +0 -0
  381. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/fix-issue/SKILL.md +0 -0
  382. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/git-ops/SKILL.md +0 -0
  383. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/init-project/SKILL.md +0 -0
  384. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/investigate/SKILL.md +0 -0
  385. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/loop/SKILL.md +0 -0
  386. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/migrate/SKILL.md +0 -0
  387. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/perf-analyze/SKILL.md +0 -0
  388. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/plan-impl/SKILL.md +0 -0
  389. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/pr-review/SKILL.md +0 -0
  390. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/refactor/SKILL.md +0 -0
  391. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/regex-help/SKILL.md +0 -0
  392. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/review/SKILL.md +0 -0
  393. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/security-review/SKILL.md +0 -0
  394. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/ship/SKILL.md +0 -0
  395. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/simplify/SKILL.md +0 -0
  396. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/strong-tests/SKILL.md +0 -0
  397. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/skills/test-verify/SKILL.md +0 -0
  398. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/__init__.py +0 -0
  399. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/__main__.py +0 -0
  400. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/applier.py +0 -0
  401. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/config.py +0 -0
  402. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/registry.py +0 -0
  403. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sandbox.py +0 -0
  404. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/__init__.py +0 -0
  405. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/header_parser.py +0 -0
  406. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/hooks.py +0 -0
  407. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/loader.py +0 -0
  408. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/sidecar/server.py +0 -0
  409. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/__init__.py +0 -0
  410. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/capture.py +0 -0
  411. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/train/compute_vector.py +0 -0
  412. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/steering/vectors.py +0 -0
  413. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock/whats_new.md +0 -0
  414. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/drydock-acp.spec +0 -0
  415. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/flake.lock +0 -0
  416. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/flake.nix +0 -0
  417. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/outlook_draft_assistant.tar.gz +0 -0
  418. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/README.md +0 -0
  419. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/config_base.toml +0 -0
  420. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/config_best.toml +0 -0
  421. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/domain_spec.md +0 -0
  422. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/experimenter.py +0 -0
  423. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/kernel.py +0 -0
  424. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/mini_prd.md +0 -0
  425. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/mini_prompts.txt +0 -0
  426. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/proposer.py +0 -0
  427. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/research/results.tsv +0 -0
  428. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/README.md +0 -0
  429. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/admiral_probe.py +0 -0
  430. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/auto_test_loop.sh +0 -0
  431. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/monitor_test_battery.sh +0 -0
  432. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/overnight_agents_test.sh +0 -0
  433. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/test_bank.sh +0 -0
  434. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/test_full.sh +0 -0
  435. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/test_smoke.sh +0 -0
  436. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/archive/tui_test.py +0 -0
  437. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/audit_sampler.py +0 -0
  438. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/auto_generate_tests.py +0 -0
  439. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/auto_release.sh +0 -0
  440. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/autonomous_review.sh +0 -0
  441. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/autonomous_review_prompt.md +0 -0
  442. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/backfill_hle_curiosity.py +0 -0
  443. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/backup.sh +0 -0
  444. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/bench_inference.py +0 -0
  445. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/bump_version.py +0 -0
  446. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/classify_pulse.sh +0 -0
  447. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/consume_retrieval_queue.py +0 -0
  448. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/curiosity_idle_cycle.sh +0 -0
  449. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/deploy_to_github.sh +0 -0
  450. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/fetch_arxiv_abstracts.py +0 -0
  451. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/gen_2000_prompts.py +0 -0
  452. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/hle_eval_seed.jsonl +0 -0
  453. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/llm_balancer.py +0 -0
  454. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/notify_release.py +0 -0
  455. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/perf_baseline_when_idle.sh +0 -0
  456. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/perf_sweep.py +0 -0
  457. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/poll_issues.sh +0 -0
  458. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/publish_to_pypi.sh +0 -0
  459. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/queue_top.py +0 -0
  460. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/ralph_loop.py +0 -0
  461. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/research_babysitter.sh +0 -0
  462. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown.py +0 -0
  463. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown_interactive.py +0 -0
  464. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown_suite.sh +0 -0
  465. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/shakedown_variance.sh +0 -0
  466. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/start_steering_sidecar.sh +0 -0
  467. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_babysitter.sh +0 -0
  468. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_50.txt +0 -0
  469. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_realuser.txt +0 -0
  470. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_tool_agent.txt +0 -0
  471. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  472. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_shakedown.py +0 -0
  473. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_telegram_status.py +0 -0
  474. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/stress_watcher.py +0 -0
  475. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/telegram_bot.py +0 -0
  476. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/tool_usage_report.py +0 -0
  477. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/scripts/vllm_failover.sh +0 -0
  478. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/__init__.py +0 -0
  479. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/conftest.py +0 -0
  480. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_acp.py +0 -0
  481. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_agent_thought.py +0 -0
  482. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_bash.py +0 -0
  483. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_compact_session_updates.py +0 -0
  484. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_content.py +0 -0
  485. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_initialize.py +0 -0
  486. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_list_sessions.py +0 -0
  487. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_load_session.py +0 -0
  488. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_multi_session.py +0 -0
  489. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_new_session.py +0 -0
  490. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_proxy_setup_acp.py +0 -0
  491. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_read_file.py +0 -0
  492. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_search_replace.py +0 -0
  493. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_set_config_option.py +0 -0
  494. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_set_mode.py +0 -0
  495. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_set_model.py +0 -0
  496. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_tool_call_session_update.py +0 -0
  497. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_utils.py +0 -0
  498. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/acp/test_write_file.py +0 -0
  499. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_file_indexer.py +0 -0
  500. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_fuzzy.py +0 -0
  501. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  502. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  503. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_completion_controller.py +0 -0
  504. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  505. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_slash_command_controller.py +0 -0
  506. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  507. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/__init__.py +0 -0
  508. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/data/__init__.py +0 -0
  509. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/data/fireworks.py +0 -0
  510. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/data/mistral.py +0 -0
  511. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_anthropic_adapter.py +0 -0
  512. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_backend.py +0 -0
  513. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  514. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_reasoning_adapter.py +0 -0
  515. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  516. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  517. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  518. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  519. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_bell_notifications.py +0 -0
  520. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_braille_renderer.py +0 -0
  521. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_clipboard.py +0 -0
  522. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_commands.py +0 -0
  523. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_copy_shortcuts.py +0 -0
  524. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_external_editor.py +0 -0
  525. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_no_markup_static.py +0 -0
  526. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_question_app.py +0 -0
  527. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_spinner.py +0 -0
  528. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_switching_mode.py +0 -0
  529. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  530. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  531. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_session_resume.py +0 -0
  532. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/test_ui_skill_dispatch.py +0 -0
  533. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/textual_ui/__init__.py +0 -0
  534. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/cli/textual_ui/test_session_picker.py +0 -0
  535. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/conftest.py +0 -0
  536. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_agents.py +0 -0
  537. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_auth_crypto.py +0 -0
  538. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_auth_github.py +0 -0
  539. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  540. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  541. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_config_load_dotenv.py +0 -0
  542. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_config_paths.py +0 -0
  543. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_config_resolution.py +0 -0
  544. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_file_logging.py +0 -0
  545. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_plan_session.py +0 -0
  546. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_proxy_setup.py +0 -0
  547. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_slug.py +0 -0
  548. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_telemetry_send.py +0 -0
  549. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_teleport_git.py +0 -0
  550. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_teleport_nuage.py +0 -0
  551. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_teleport_service.py +0 -0
  552. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_trusted_folders.py +0 -0
  553. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/core/test_utils.py +0 -0
  554. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/common.py +0 -0
  555. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/conftest.py +0 -0
  556. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/mock_server.py +0 -0
  557. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  558. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/test_cli_tui_streaming.py +0 -0
  559. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  560. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/fixtures/doc_qa_system_prd.md +0 -0
  561. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/__init__.py +0 -0
  562. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/mock_backend_factory.py +0 -0
  563. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/mock_entrypoint.py +0 -0
  564. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/mock/utils.py +0 -0
  565. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/onboarding/test_run_onboarding.py +0 -0
  566. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/onboarding/test_ui_onboarding.py +0 -0
  567. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/session/test_session_loader.py +0 -0
  568. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/session/test_session_logger.py +0 -0
  569. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/session/test_session_migration.py +0 -0
  570. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/conftest.py +0 -0
  571. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/test_manager.py +0 -0
  572. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/test_models.py +0 -0
  573. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/skills/test_parser.py +0 -0
  574. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  575. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  576. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  577. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  578. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  579. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  580. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  581. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  582. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  583. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  584. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  585. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  586. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  587. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  588. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  589. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  590. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  591. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  592. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  593. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  594. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  595. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  596. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  597. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  598. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  599. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  600. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  601. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  602. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  603. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  604. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  605. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  606. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  607. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  608. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  609. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  610. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  611. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  612. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  613. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  614. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  615. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  616. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  617. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  618. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  619. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  620. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  621. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  622. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  623. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  624. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  625. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  626. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  627. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  628. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  629. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  630. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  631. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  632. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  633. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  634. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/base_snapshot_test_app.py +0 -0
  635. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/conftest.py +0 -0
  636. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/snap_compare.py +0 -0
  637. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  638. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  639. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  640. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  641. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  642. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  643. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  644. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  645. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  646. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  647. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  648. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  649. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  650. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  651. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/stubs/fake_backend.py +0 -0
  652. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/stubs/fake_client.py +0 -0
  653. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/stubs/fake_tool.py +0 -0
  654. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral.py +0 -0
  655. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  656. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_intervention_outcome.py +0 -0
  657. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_phase3.py +0 -0
  658. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_proposed.py +0 -0
  659. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_session_id.py +0 -0
  660. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_admiral_struggle_dedup.py +0 -0
  661. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_auto_compact.py +0 -0
  662. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_backend.py +0 -0
  663. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_observer_streaming.py +0 -0
  664. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_stats.py +0 -0
  665. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_tasks.py +0 -0
  666. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agent_tool_call.py +0 -0
  667. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_agents.py +0 -0
  668. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_build.py +0 -0
  669. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_debug.py +0 -0
  670. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_multiagent.py +0 -0
  671. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_prd.py +0 -0
  672. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_prd_extended.py +0 -0
  673. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_tools.py +0 -0
  674. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_bank_update.py +0 -0
  675. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_build_projects.py +0 -0
  676. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_checkpoint.py +0 -0
  677. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_cli_programmatic_preload.py +0 -0
  678. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_config_migration.py +0 -0
  679. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_context_recovery.py +0 -0
  680. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_count_tool.py +0 -0
  681. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_current_bugs.py +0 -0
  682. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_drydock_regression.py +0 -0
  683. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_drydock_tasks.py +0 -0
  684. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  685. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_full_regression.py +0 -0
  686. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_graphrag.py +0 -0
  687. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_graphrag_worked_examples.py +0 -0
  688. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_hallucinated_tool_suppression.py +0 -0
  689. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_history_manager.py +0 -0
  690. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_hle_typing.py +0 -0
  691. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_integration.py +0 -0
  692. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_issue_fixes.py +0 -0
  693. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_local_detect.py +0 -0
  694. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_loop_detection.py +0 -0
  695. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_math_tool.py +0 -0
  696. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_mcp_settings.py +0 -0
  697. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_memory_tool.py +0 -0
  698. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_message_id.py +0 -0
  699. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_message_merging.py +0 -0
  700. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_middleware.py +0 -0
  701. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_multi_agent.py +0 -0
  702. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_read_file_not_found_listing.py +0 -0
  703. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_real_failures.py +0 -0
  704. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_real_issues.py +0 -0
  705. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_real_workflow.py +0 -0
  706. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_reasoning_content.py +0 -0
  707. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_retrieval_consumer.py +0 -0
  708. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_search_replace_args_not_truncated.py +0 -0
  709. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_smoke.py +0 -0
  710. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering.py +0 -0
  711. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_capture.py +0 -0
  712. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_compute_vector.py +0 -0
  713. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_extract_pairs.py +0 -0
  714. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_hook.py +0 -0
  715. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  716. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_steering_sidecar_hooks.py +0 -0
  717. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_system_prompt.py +0 -0
  718. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_tagged_text.py +0 -0
  719. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_task_complete_nudge.py +0 -0
  720. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_tool_args.py +0 -0
  721. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncate_args_valid_json.py +0 -0
  722. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncated_arg_path_hint.py +0 -0
  723. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncated_search_replace_escalation.py +0 -0
  724. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_truncated_write_escalation.py +0 -0
  725. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_ui_external_editor.py +0 -0
  726. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_ui_input_history.py +0 -0
  727. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_user_issues.py +0 -0
  728. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_verify_tool.py +0 -0
  729. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_wall_of_text_rescue.py +0 -0
  730. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_workloads.py +0 -0
  731. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/test_write_file_missing_path.py +0 -0
  732. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/testbank_helpers.py +0 -0
  733. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_ask_user_question.py +0 -0
  734. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash.py +0 -0
  735. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  736. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_consec_empty_search.py +0 -0
  737. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  738. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  739. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  740. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  741. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  742. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  743. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  744. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_exit_plan_mode.py +0 -0
  745. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_grep.py +0 -0
  746. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  747. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_invoke_context.py +0 -0
  748. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  749. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_manager_get_tool_config.py +0 -0
  750. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_mcp.py +0 -0
  751. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_mcp_sampling.py +0 -0
  752. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  753. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  754. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_directory.py +0 -0
  755. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_read_file_limit_truncation.py +0 -0
  756. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_append_fallback.py +0 -0
  757. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_dir_path.py +0 -0
  758. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_empty_content.py +0 -0
  759. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_file_not_found.py +0 -0
  760. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  761. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_hard_stop.py +0 -0
  762. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_malformed_block.py +0 -0
  763. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  764. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_placeholder.py +0 -0
  765. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  766. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_task.py +0 -0
  767. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_ui_bash_execution.py +0 -0
  768. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_webfetch.py +0 -0
  769. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_websearch.py +0 -0
  770. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  771. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  772. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  773. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  774. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_do_update.py +0 -0
  775. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  776. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_github_update_gateway.py +0 -0
  777. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  778. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_ui_update_notification.py +0 -0
  779. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_update_use_case.py +0 -0
  780. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/tests/update_notifier/test_whats_new.py +0 -0
  781. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/uv.lock +0 -0
  782. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/README.md +0 -0
  783. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/cli_subcommand_dispatch.py +0 -0
  784. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/lookup.json +0 -0
  785. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/sql_parser.py +0 -0
  786. {drydock_cli-2.8.27 → drydock_cli-2.8.28}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 1359290
@@ -6,9 +6,18 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
6
6
  - **Repo:** https://github.com/fbobe321/drydock
7
7
  - **PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.32)
8
8
  - **Goal:** Reliable TUI coding agent with local LLMs. PRD-driven project building.
9
- - **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B) via vLLM Docker at localhost:8000
9
+ - **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B)
10
10
  - **Server:** remus (Ubuntu 22.04, user: bobef)
11
- - **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (only 4B active params, ~70 tok/s)
11
+ - **Active model (2026-05-14):** **Gemma-4-26B-A4B-it-UD-Q3_K_M.gguf** via
12
+ llama.cpp Docker (`ghcr.io/ggml-org/llama.cpp:server-cuda`) on :8000.
13
+ Q4_K_M was trialed 2026-05-12→14 but rolled back because the
14
+ quant shift produced no measurable HLE-correctness lift and added
15
+ ~9% per-token latency. Re-swap to Q4 via
16
+ `docker stop llamacpp-gemma4 && docker rm llamacpp-gemma4`
17
+ and a `docker run` with `-m /models/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf`.
18
+ AWQ-4bit on vLLM is the historical alternate path and stays available
19
+ via `/data3/Models/start_gemma4.sh` (the vLLM script — NOT the
20
+ llama.cpp one). Speed: ~64 tok/s e2e on Q3.
12
21
  - **The honest test:** `scripts/shakedown_interactive.py` — drives the real TUI
13
22
  via pexpect with a multi-step user conversation (24 steps per PRD: plan,
14
23
  build, test, add features, debug, review code, edge cases, README).
@@ -23,7 +32,54 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
23
32
  testing.
24
33
  - **Priority:** TUI experience first. Fix drydock bugs, don't simplify PRDs.
25
34
  - **370 PRDs** at /data3/drydock_test_projects/ — the benchmark suite
26
- - **Current version:** v2.6.32 on PyPI
35
+ - **Current version:** v2.8.27 on PyPI (auto-released every 6h from `main`)
36
+ - **Active continuous loops:** stress harness (hourly), autonomous_review
37
+ (30-min), classify_pulse (10-min), telegram_bot keepalive (2-min),
38
+ hle_babysitter (hourly @ :45 — 10-Q math HLE batch per tick, see
39
+ HLE_PRD §"Continuous HLE evaluation"). Anything new the operator
40
+ adds should not run at :00 or :30 (autonomous_review owns those).
41
+
42
+ ## Current plan (2026-05-14)
43
+
44
+ Three vectors moving in parallel. Each has a queue of concrete fixes
45
+ tracked as TaskCreate items; the high-level shape is:
46
+
47
+ 1. **HLE** — keep pushing the floor up from 6.7% on Math. The
48
+ `scripts/hle_babysitter.sh` cron runs 10-Q Math batches every hour.
49
+ Open work: rotate categories beyond Math; build a multi-batch
50
+ aggregator (`scripts/hle_aggregate.py`); produce a clean Q3 vs Q4
51
+ stall-rate comparison once 30+ Q3 Math attempts have accumulated;
52
+ verify the gemma4.md tool-inventory change (e47cc4e) actually
53
+ lifted math/count/memory/verify call rates.
54
+
55
+ 2. **GraphRAG** — the auto-prefetch hook is shipping good chunks on
56
+ trivia but not on hard symbolic Math. Two concrete moves: lower
57
+ `QUALITY_THRESHOLD` (currently 8.0 in `agent_loop.py:3391`) once
58
+ we know the real score distribution, and add an arxiv-corpus
59
+ fallback (`/data3/arxiv_corpus/graphrag.sqlite`) when the primary
60
+ index returns nothing above threshold.
61
+
62
+ 3. **Deep Noir** — sidecar/hooks/capture/train all coded; the
63
+ `apply_chat_template` API-drift fix shipped 2026-05-14 (f02aa4b).
64
+ Real blocker for v1 vectors: contrastive-pair extraction is
65
+ currently broken — admiral records full UUIDs (e.g.
66
+ `5b55aacd-3606-4656-ad4b-eacf86506eda`) but session dirs are named
67
+ `session_<date>_<time>_<short_uuid>` where the `short_uuid` is the
68
+ first 8 chars of the SESSION's own UUID, not admiral's recorded
69
+ one. `extract_pairs._find_session_dir` matches on session_dir name
70
+ endswith(admiral_short) which only succeeds for the rare case
71
+ where both happen to match. Yield on `empty_after_tool:bash`:
72
+ 2 / 88 derailed sessions found. Needs a real mapping layer
73
+ (meta.json → admiral) or admiral has to be fixed to record the
74
+ short hash used by session dirs.
75
+
76
+ Operator controls for the continuous loops:
77
+
78
+ ```bash
79
+ touch /data3/drydock/.pause_hle_babysitter # pause continuous HLE
80
+ touch /data3/drydock_test_projects/.pause_watchdog
81
+ touch /data3/drydock/.pause_auto_release # pause 6h PyPI publish
82
+ ```
27
83
 
28
84
  ## Build & Test
29
85
 
@@ -1,6 +1,38 @@
1
1
  # Deep Noir activation-patching PRD — reasoning steering, transformers-backed sidecar
2
2
 
3
- **Status:** Draft, 2026-05-09. Phase 3 of HLE_PRD.
3
+ **Status:** Draft, last updated 2026-05-14. Phase 3 of HLE_PRD.
4
+
5
+ ## 2026-05-14 progress update
6
+
7
+ - ✅ Milestones 1-4 are coded and unit-test green (91/91 in
8
+ `tests/test_steering*`).
9
+ - ✅ Sidecar `apply_chat_template` API-drift bug fixed (f02aa4b) +
10
+ 5 dedicated tests against fake tokenizers.
11
+ - ⚠ **Live-GPU smoke deferred.** First attempt 2026-05-13 11:21 UTC
12
+ loaded the AWQ weights but crashed in `model.generate()` (the bug
13
+ fixed above). The crashed Python kept ~29 GB of VRAM until manually
14
+ killed; production Q4 then refused to restart for ~30 seconds. With
15
+ the fix shipped, the next attempt is expected clean — but needs an
16
+ operator-approved Q3-stop window.
17
+ - 🚨 **Pair extraction is broken.** `extract_pairs.py` resolves admiral
18
+ session UUIDs against `~/.vibe/logs/session/session_<date>_<short>`
19
+ via name-suffix match on the first 8 hex chars of the admiral UUID.
20
+ This only succeeds when the admiral UUID and the session's own UUID
21
+ happen to share those 8 chars — they don't, because admiral and
22
+ session generate UUIDs independently. Yield on
23
+ `empty_after_tool:bash`: **2 / 88 derailed pairs** found
24
+ (`/data3/drydock/research/deep_noir/pairs/empty_after_bash.jsonl`,
25
+ 82 total = 2 derailed + 80 good). That's not enough to train a
26
+ vector. Fix candidates:
27
+ 1. Crawl every session dir's `meta.json`, build a `{full_uuid →
28
+ dir}` map, look up admiral UUIDs against that map. Highest
29
+ fidelity. The crawl is one-shot and cacheable.
30
+ 2. Change admiral to record the same short-hash that session dirs
31
+ use (would require coordinating with `drydock.admiral`).
32
+ Path 1 is unblocked and surgical; path 2 is bigger surgery for
33
+ marginal benefit. Default to path 1.
34
+
35
+ ## Next concrete steps
4
36
 
5
37
  The v0 token-bias path (`LogitBiasSteeringApplier`) hit its expected ceiling: phase1_steered scored 1/20 = 5% on the worked-example seed, identical to the unsteered baseline. This PRD scopes the next-tier applier — real activation patching at a configurable decoder layer — using a `transformers`-backed sidecar process so we can validate the architecture before the bigger vLLM forward-hook port. Goal: get one steering vector to lift Phase 1 above 5/20 on the existing 20-question seed, proving reasoning steering works at all on quantized Gemma 4. Then port to vLLM for production speed.
6
38
 
@@ -6,6 +6,89 @@ 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
+ ## HLE was retrieving against the WRONG corpus (fixed edb61c9)
10
+
11
+ Trace from a Q3 session 2026-05-14: a local-field-theory HLE Math
12
+ question pulled `/data3/drydock_test_projects/403_tool_agent/help_output.txt`
13
+ (score 38.7) as the top retrieve hit. hle_eval.py spawns drydock
14
+ subprocesses that, until now, defaulted to
15
+ `~/.drydock/graphrag.sqlite` — the project corpus full of test
16
+ artifacts — not the arXiv corpus (1.18M chunks, math/physics/CS).
17
+ The Q3-with-AR run effectively had the model answering math
18
+ questions with a tool_agent CLI help page as "evidence."
19
+
20
+ Fixed in `scripts/hle_babysitter.sh`: every per-batch invocation
21
+ now sets `DRYDOCK_GRAPHRAG_DB=/data3/arxiv_corpus/graphrag.sqlite`
22
+ for the subprocess only. User TUI / stress / other drydock sessions
23
+ still see the project corpus.
24
+
25
+ Takes effect on the next cron tick after this commit lands —
26
+ shell scripts run from the source tree, not site-packages, so this
27
+ fix is live without waiting for v2.8.28.
28
+
29
+ ## Judge was broken for the entire history (fixed bc12eee)
30
+
31
+ Audit 2026-05-14: across all 165 HLE results on disk, the judge was
32
+ invoked 22 times and returned **ERROR every single time (100%)**.
33
+ Zero YES verdicts, zero NO verdicts — every judged answer dropped
34
+ to ERROR because `text.splitlines()[0]` raised IndexError on empty
35
+ content (Gemma 4 thinking-budget exhaustion on the judge call,
36
+ emitting only `reasoning_content` with no `content`).
37
+
38
+ The 5/163 = 3.1% lifetime score came entirely from `exact` (5) and
39
+ `fuzzy` (0) matches — judge YES count was zero. **The real correctness
40
+ rate is unknown until the fix ships.** Q3 Math Q1 today produced
41
+ `e^{-\gamma} \frac{q-1}{h} q^{g-1} \log q` against gold
42
+ `\frac{q^{g-1}(q-1)\log q}{e^\gamma h}` (mathematically identical)
43
+ and got marked ERROR. That alone changes the 0/N batch verdict for
44
+ that session.
45
+
46
+ Fix in commit `bc12eee` (will ship in v2.8.28):
47
+ - Read `reasoning_content` when `content` is empty
48
+ - Scan the whole response for YES/NO/PARTIAL with word-boundary
49
+ - max_tokens 80 → 200, plus a tighter "one word only" retry
50
+ - ERROR reason now echoes the raw text so failures are diagnosable
51
+
52
+ **Backfill applied 2026-05-14 01:48 UTC.** Ran
53
+ `scripts/rejudge_hle.py --apply --apply-to-summary` across all 22
54
+ historical ERROR rows. Outcome:
55
+ - 4 new YES (judged correct)
56
+ - 13 new NO (judged wrong but valid)
57
+ - 2 new PARTIAL
58
+ - 3 still ERROR (genuinely undecidable / model returned nothing)
59
+
60
+ Lifetime aggregate jumped **5/171 = 2.9% → 9/171 = 5.3%**. Per-category
61
+ deltas: Math +1, Bio/Med +1, Humanities/Social Science +2. Aggregator
62
+ now prefers `rejudged.jsonl` over `results.jsonl` when present
63
+ (commit c1981fe).
64
+
65
+ ## Q4 → Q3 rollback (2026-05-14 00:26 UTC)
66
+
67
+ User decision after the Q4 30-Q math overnight (2/30 = 6.7%, 87%
68
+ stall rate) and the AR-OFF disambiguation: **no measurable Q4
69
+ benefit**, swap back to Q3_K_M. Container now serves
70
+ `/models/gemma-4-26B-A4B-it-UD-Q3_K_M.gguf` via
71
+ `/data3/Models/start_gemma4_llamacpp.sh`. Swap took 18s. Frees ~4 GB
72
+ VRAM (12.1 GB vs Q4's 16.2 GB). The Q3 vs Q4 stall-rate comparison
73
+ will fall out naturally as the hourly babysitter accumulates 30+ Q3
74
+ attempts (~3 cron ticks at 10-Q each).
75
+
76
+ ## Continuous HLE evaluation (2026-05-14)
77
+
78
+ `scripts/hle_babysitter.sh` (cron line `45 * * * * ...`) keeps a 10-Q
79
+ math HLE batch running every hour. Skips on its own if (a) a prior
80
+ batch is still alive, (b) stress is mid-run, (c) autonomous_review
81
+ is firing, or (d) the balancer at :8001 isn't healthy. Operator
82
+ controls:
83
+
84
+ - `touch /data3/drydock/.pause_hle_babysitter` — pause future batches
85
+ - `rm /data3/drydock/.pause_hle_babysitter` — resume
86
+ - `kill $(cat /tmp/hle_continuous.pid)` — stop current batch
87
+ - `tail -f /tmp/hle_babysitter.log` — cron-tick history
88
+
89
+ Each batch lands in `hle_results/run_<ts>/` with results.jsonl +
90
+ summary.json. Multi-batch aggregation is a separate (future) job.
91
+
9
92
  ## Q4 vs AR-OFF disambiguation (2026-05-13)
10
93
 
11
94
  Two variables shifted simultaneously when the v1 baseline ran (Q3+AR-off
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.27
3
+ Version: 2.8.28
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -805,8 +805,10 @@ class AgentLoop:
805
805
  HARD_STOP_CALLS = int(
806
806
  getattr(self, "_admiral_hard_stop_tool_calls", 100)
807
807
  )
808
- WRAP_UP_WARN_AT = int(getattr(self, "_admiral_wrap_up_warn_at", 30))
809
- STOP_NOW_WARN_AT = int(getattr(self, "_admiral_stop_now_warn_at", 60))
808
+ WRAP_UP_WARN_AT = int(getattr(self, "_admiral_wrap_up_warn_at",
809
+ int(os.environ.get("DRYDOCK_WRAP_UP_WARN_AT", 30))))
810
+ STOP_NOW_WARN_AT = int(getattr(self, "_admiral_stop_now_warn_at",
811
+ int(os.environ.get("DRYDOCK_STOP_NOW_WARN_AT", 60))))
810
812
  _prompt_start = time.perf_counter()
811
813
  logger.warning("[TIMING] entering conversation while loop")
812
814
  while not should_break_loop:
@@ -852,11 +854,13 @@ class AgentLoop:
852
854
  "summary so the user can review."
853
855
  )
854
856
  elif tool_turns == STOP_NOW_WARN_AT:
857
+ _stop_suffix = os.environ.get("DRYDOCK_STOP_NOW_SUFFIX", "")
855
858
  self._inject_system_note(
856
859
  f"You have used {tool_turns} tool calls on this "
857
860
  "single request. STOP NOW. Emit a final text "
858
861
  "response summarizing what you did (or what is "
859
- "blocked) so the user can take the next step."
862
+ f"blocked) so the user can take the next step."
863
+ + (f" {_stop_suffix}" if _stop_suffix else "")
860
864
  )
861
865
  elif tool_turns >= HARD_STOP_CALLS:
862
866
  # Hard end-of-turn: synthesize a user-facing message
@@ -3350,13 +3354,6 @@ class AgentLoop:
3350
3354
  """
3351
3355
  try:
3352
3356
  from drydock.graphrag import Index
3353
- db = os.environ.get("DRYDOCK_GRAPHRAG_DB") or str(
3354
- Path.home() / ".drydock" / "graphrag.sqlite"
3355
- )
3356
- if not Path(db).is_file():
3357
- logger.warning("[AUTO-RETRIEVE] db missing: %s", db)
3358
- return
3359
- idx = Index(db)
3360
3357
  except Exception as e:
3361
3358
  logger.warning("[AUTO-RETRIEVE] setup failed: %s", e, exc_info=True)
3362
3359
  return
@@ -3381,19 +3378,62 @@ class AgentLoop:
3381
3378
  return
3382
3379
  logger.warning("[AUTO-RETRIEVE] extracted query: %r", query[:120])
3383
3380
 
3384
- try:
3385
- result = idx.retrieve(query, symbol_limit=0, text_limit=4)
3386
- except Exception as e:
3387
- logger.warning("[AUTO-RETRIEVE] query failed: %s", e, exc_info=True)
3388
- return
3389
-
3390
- text_hits = getattr(result, "text", None) or getattr(result, "text_hits", []) or []
3391
3381
  QUALITY_THRESHOLD = 8.0
3392
- good_hits = [h for h in text_hits if getattr(h, "score", 0) >= QUALITY_THRESHOLD]
3393
- logger.warning("[AUTO-RETRIEVE] %d total hits, %d above threshold %.1f",
3394
- len(text_hits), len(good_hits), QUALITY_THRESHOLD)
3382
+
3383
+ # DB chain: try the primary index first, then fall back to the
3384
+ # arXiv corpus (if present) on miss. As of 2026-05-14, 77% of
3385
+ # HLE-eval sessions had retrieve return zero above-threshold hits
3386
+ # from the primary corpus — for generic STEM questions the arXiv
3387
+ # corpus at /data3/arxiv_corpus/graphrag.sqlite (1.18M chunks)
3388
+ # has much better recall. The fallback path is operator-tunable
3389
+ # via DRYDOCK_GRAPHRAG_FALLBACK_DB; set to empty to disable.
3390
+ primary_db = os.environ.get("DRYDOCK_GRAPHRAG_DB") or str(
3391
+ Path.home() / ".drydock" / "graphrag.sqlite"
3392
+ )
3393
+ fallback_default = "/data3/arxiv_corpus/graphrag.sqlite"
3394
+ fallback_db_raw = os.environ.get(
3395
+ "DRYDOCK_GRAPHRAG_FALLBACK_DB", fallback_default
3396
+ )
3397
+ fallback_db = fallback_db_raw if fallback_db_raw else None
3398
+ # Don't double-search the same db.
3399
+ db_chain: list[str] = [primary_db]
3400
+ if fallback_db and Path(fallback_db).resolve() != Path(primary_db).resolve():
3401
+ db_chain.append(fallback_db)
3402
+
3403
+ good_hits: list = []
3404
+ text_hits: list = []
3405
+ used_db: str | None = None
3406
+ for db in db_chain:
3407
+ if not Path(db).is_file():
3408
+ logger.warning("[AUTO-RETRIEVE] db missing: %s", db)
3409
+ continue
3410
+ try:
3411
+ idx = Index(db)
3412
+ result = idx.retrieve(query, symbol_limit=0, text_limit=4)
3413
+ except Exception as e:
3414
+ logger.warning(
3415
+ "[AUTO-RETRIEVE] retrieve failed on %s: %s", db, e
3416
+ )
3417
+ continue
3418
+ hits = getattr(result, "text", None) or getattr(result, "text_hits", []) or []
3419
+ gh = [h for h in hits if getattr(h, "score", 0) >= QUALITY_THRESHOLD]
3420
+ logger.warning(
3421
+ "[AUTO-RETRIEVE] %s: %d total hits, %d above threshold %.1f",
3422
+ db, len(hits), len(gh), QUALITY_THRESHOLD,
3423
+ )
3424
+ if gh:
3425
+ text_hits = hits
3426
+ good_hits = gh
3427
+ used_db = db
3428
+ break
3429
+
3395
3430
  if not good_hits:
3396
3431
  return
3432
+ if used_db != primary_db:
3433
+ logger.warning(
3434
+ "[AUTO-RETRIEVE] primary corpus returned 0 above-threshold "
3435
+ "hits; using fallback %s", used_db,
3436
+ )
3397
3437
 
3398
3438
  # Build the system note. Cap at ~2000 chars total.
3399
3439
  chunks = []
@@ -3426,7 +3466,12 @@ class AgentLoop:
3426
3466
  import uuid
3427
3467
 
3428
3468
  tool_call_id = f"auto-retrieve-{uuid.uuid4().hex[:16]}"
3429
- tool_args = json.dumps({"query": (user_msg or "")[:200]})
3469
+ # Reflect the CLEANED query (with QUESTION:/FINAL ANSWER: boilerplate
3470
+ # stripped) in the synthesized tool_call arguments — not the raw
3471
+ # user_msg. Operators reading messages.jsonl could otherwise mistake
3472
+ # the noisy full prompt for what BM25 actually scored against, and
3473
+ # the model itself sees the same arguments echoed back in compaction.
3474
+ tool_args = json.dumps({"query": query[:200]})
3430
3475
  synth_assistant = LLMMessage(
3431
3476
  role=Role.assistant,
3432
3477
  content="",
@@ -56,17 +56,78 @@ def _queue_path_for(bucket: Bucket, root: Path | None = None) -> Path:
56
56
  return (root or _default_queue_root()) / f"{bucket}.jsonl"
57
57
 
58
58
 
59
- def make_jsonl_handler(bucket: Bucket, root: Path | None = None) -> DispatchHandler:
59
+ _FINGERPRINT_CAP = 20_000 # keep at most this many fingerprints per bucket
60
+
61
+
62
+ def _fingerprint_path(bucket: Bucket, root: Path | None = None) -> Path:
63
+ return (root or _default_queue_root()) / f".fp_{bucket}"
64
+
65
+
66
+ def _signal_fingerprint(signal: FailureSignal) -> str:
67
+ """Stable hash of (pattern_id, evidence). Used to dedupe a signal
68
+ that fires repeatedly across cron ticks — without this, a single
69
+ admiral_history line getting re-classified produces a queue entry
70
+ per re-classification (observed 2026-05-14: thinking_stall queue
71
+ had 73.6× amplification, 14213 entries / 193 unique strings)."""
72
+ import hashlib
73
+ src = f"{signal.pattern_id}\0{signal.evidence or ''}"
74
+ return hashlib.sha1(src.encode("utf-8", errors="replace")).hexdigest()
75
+
76
+
77
+ def _load_fingerprints(path: Path) -> set[str]:
78
+ if not path.is_file():
79
+ return set()
80
+ try:
81
+ return set(path.read_text().splitlines())
82
+ except OSError:
83
+ return set()
84
+
85
+
86
+ def _append_fingerprint(path: Path, fp: str, cap: int = _FINGERPRINT_CAP) -> None:
87
+ """Append a fingerprint to disk; truncate the file when it exceeds
88
+ the cap to bound storage."""
89
+ try:
90
+ with path.open("a", encoding="utf-8") as f:
91
+ f.write(fp + "\n")
92
+ except OSError:
93
+ return
94
+ try:
95
+ if path.stat().st_size > cap * 64: # rough size guard
96
+ lines = path.read_text().splitlines()
97
+ if len(lines) > cap:
98
+ path.write_text("\n".join(lines[-cap:]) + "\n")
99
+ except OSError:
100
+ pass
101
+
102
+
103
+ def make_jsonl_handler(
104
+ bucket: Bucket, root: Path | None = None, *, dedup: bool = True
105
+ ) -> DispatchHandler:
60
106
  """Build a handler that appends each signal as one JSON line under
61
107
  ~/.drydock/dispatch/<bucket>.jsonl (or `root`/<bucket>.jsonl).
62
108
 
63
109
  Atomicity: each write is one line per signal, with a timestamp.
64
110
  The append is open-write-flush-close so concurrent runs don't
65
- interleave half-lines."""
111
+ interleave half-lines.
112
+
113
+ Cross-run dedup (`dedup=True`, default): a sidecar file
114
+ `.fp_<bucket>` holds sha1 fingerprints of `(pattern_id, evidence)`
115
+ tuples seen in this queue. A signal whose fingerprint is already
116
+ present is dropped at write time. Bounded to ~20k fingerprints
117
+ via rolling truncation. The amplification factor observed on
118
+ 2026-05-14 (thinking_stall 73.6×) drops to ~1× with this enabled."""
66
119
  path = _queue_path_for(bucket, root)
67
120
  path.parent.mkdir(parents=True, exist_ok=True)
121
+ fp_path = _fingerprint_path(bucket, root)
122
+ fingerprints: set[str] = _load_fingerprints(fp_path) if dedup else set()
68
123
 
69
124
  def handler(signal: FailureSignal) -> None:
125
+ if dedup:
126
+ fp = _signal_fingerprint(signal)
127
+ if fp in fingerprints:
128
+ return
129
+ fingerprints.add(fp)
130
+ _append_fingerprint(fp_path, fp)
70
131
  record = signal.to_jsonable()
71
132
  record["ts"] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
72
133
  with path.open("a", encoding="utf-8") as f:
@@ -91,7 +91,25 @@ RULES: tuple[ClassificationRule, ...] = (
91
91
  ),
92
92
  ClassificationRule(
93
93
  pattern_id="harness:tool:hallucinated_name",
94
- regex=_r(r"(unknown\s+tool|hallucinated.*tool)"),
94
+ # Require the line to either name a specific hallucinated tool or
95
+ # quote the format.py suppression-redirect message. The old regex
96
+ # `(unknown\s+tool|hallucinated.*tool)` matched any narrative
97
+ # mention of "hallucinated tools" — autonomous_review.log summary
98
+ # entries like "addressed thinking_stall, bash loops, hallucinated
99
+ # tools" fired this 48× during the 2026-05-11→14 window with no
100
+ # real hallucinated call behind them.
101
+ regex=_r(
102
+ # 'unknown tool: <name>' — require colon then an identifier
103
+ r"(unknown\s+tool:\s*[\w_.-]{3,}"
104
+ # 'hallucinated tool '<name>'' — require QUOTED name. Excludes
105
+ # narrative phrases like "hallucinated tool name to ..." that
106
+ # leaked through the prior regex.
107
+ r"|hallucinated\s+tool\s+['\"][\w_.-]+['\"]"
108
+ # format.py redirect-message signature (verbatim) — em-dash + tail
109
+ r"|'[^']{2,40}'\s+does\s+not\s+exist\s+—\s+do\s+not\s+call"
110
+ # admiral / detectors narrative phrasing
111
+ r"|model\s+invented\s+(?:a\s+)?tool\s+['\"][\w_.-]+['\"])"
112
+ ),
95
113
  bucket=Bucket.HARNESS,
96
114
  suggested_action="Add the hallucinated tool name to _IGNORE_TOOLS suppression list.",
97
115
  ),
@@ -2,7 +2,7 @@ You are DryDock, a CLI coding agent. You write code, fix bugs, and build project
2
2
 
3
3
  ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
4
4
 
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.
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
7
  Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify.
8
8
 
@@ -91,6 +91,10 @@ prior alone. The math tool is sandboxed Python (`math.factorial(20)`,
91
91
  `math.comb(50,5)`, `Fraction(1,3)+Fraction(1,6)`, `statistics.mean([...])`)
92
92
  and returns exact results. Use it. Don't compute in your head.
93
93
 
94
+ For "maximize revenue/profit" or "how many X fit in Y" combinatorial problems,
95
+ enumerate ALL feasible combinations with a Python loop in the math tool rather
96
+ than computing by hand — brute-force is exact; manual decomposition is not.
97
+
94
98
  USE THE count TOOL for "how many X" questions over text or files —
95
99
  substring, regex, lines, words, chars, bytes. Eyeballing miscounts;
96
100
  `count(pattern="def ", path="src/foo.py")` doesn't.
@@ -199,10 +199,11 @@ class Retrieve(
199
199
  )
200
200
  return
201
201
 
202
+ text_limit = args.text_limit or self.config.default_text_limit
203
+ symbol_limit = args.symbol_limit or self.config.default_symbol_limit
204
+
202
205
  try:
203
206
  idx = Index(db_path)
204
- text_limit = args.text_limit or self.config.default_text_limit
205
- symbol_limit = args.symbol_limit or self.config.default_symbol_limit
206
207
  result = idx.retrieve(
207
208
  args.query,
208
209
  text_limit=text_limit,
@@ -211,7 +212,48 @@ class Retrieve(
211
212
  except Exception as e:
212
213
  raise ToolError(f"retrieve failed: {e}") from e
213
214
 
214
- formatted = ingest_note + result.format() if ingest_note else result.format()
215
+ # Fallback chain same shape as the auto-prefetch hook in
216
+ # agent_loop._auto_prefetch_retrieve. When the primary DB returns
217
+ # nothing useful, fall through to the arXiv corpus (1.18M chunks
218
+ # of STEM coverage) before giving up. The 2026-05-14 HLE audit
219
+ # found 77% of sessions hit empty primary — the model-invoked
220
+ # retrieve path was carrying the same gap.
221
+ #
222
+ # Skip fallback when the operator overrode args.db explicitly
223
+ # (they pointed us at a specific DB on purpose).
224
+ fallback_note = ""
225
+ if result.is_empty() and not args.db:
226
+ fallback_default = "/data3/arxiv_corpus/graphrag.sqlite"
227
+ fallback_db_raw = os.environ.get(
228
+ "DRYDOCK_GRAPHRAG_FALLBACK_DB", fallback_default
229
+ )
230
+ if fallback_db_raw:
231
+ fb_path = Path(fallback_db_raw).expanduser()
232
+ if (fb_path.is_file()
233
+ and fb_path.resolve() != db_path.resolve()):
234
+ try:
235
+ fb_idx = Index(fb_path)
236
+ fb_result = fb_idx.retrieve(
237
+ args.query,
238
+ text_limit=text_limit,
239
+ symbol_limit=symbol_limit,
240
+ )
241
+ if not fb_result.is_empty():
242
+ result = fb_result
243
+ db_path = fb_path
244
+ fallback_note = (
245
+ f"[primary index empty; using fallback {fb_path}]\n"
246
+ )
247
+ except Exception:
248
+ # Fallback failure is non-fatal — just emit the
249
+ # primary's empty result.
250
+ pass
251
+
252
+ formatted = (
253
+ fallback_note + ingest_note + result.format()
254
+ if (fallback_note or ingest_note)
255
+ else result.format()
256
+ )
215
257
  yield RetrieveResult(
216
258
  found=not result.is_empty(),
217
259
  db_path=str(db_path),
@@ -146,12 +146,75 @@ def cmd_consume(args: argparse.Namespace) -> int:
146
146
  return 0
147
147
 
148
148
 
149
- def cmd_reset(_args: argparse.Namespace) -> int:
150
- if CONSUMED_STATE.is_file():
151
- CONSUMED_STATE.unlink()
152
- print(f"Cleared {CONSUMED_STATE}")
153
- else:
154
- print("No consumed-state file to clear.")
149
+ def cmd_reset(args: argparse.Namespace) -> int:
150
+ """Two modes:
151
+ - default: clear the entire consumed-state file (legacy)
152
+ - --since DATE / --kind NAME / --term-pattern REGEX: bulk-MARK
153
+ matching items consumed without losing the rest. Useful when
154
+ a batch of noise (e.g. pre-2026-05-14 FINAL/ANSWER/QUESTION
155
+ false positives) needs draining without resetting the whole
156
+ queue.
157
+ """
158
+ if not (args.since or args.kind or args.term_pattern):
159
+ if CONSUMED_STATE.is_file():
160
+ CONSUMED_STATE.unlink()
161
+ print(f"Cleared {CONSUMED_STATE}")
162
+ else:
163
+ print("No consumed-state file to clear.")
164
+ return 0
165
+
166
+ # Bulk-mark mode.
167
+ import re
168
+ from datetime import datetime, timezone
169
+ cutoff: datetime | None = None
170
+ if args.since:
171
+ try:
172
+ cutoff = datetime.strptime(args.since, "%Y-%m-%d").replace(
173
+ tzinfo=timezone.utc
174
+ )
175
+ except ValueError:
176
+ print(f"bad --since: {args.since!r} (expect YYYY-MM-DD)")
177
+ return 2
178
+ term_re = re.compile(args.term_pattern) if args.term_pattern else None
179
+
180
+ consumed = _load_consumed()
181
+ matched = 0
182
+ skipped = 0
183
+ qpath = queue_path()
184
+ if not qpath.is_file():
185
+ print(f"No queue at {qpath}")
186
+ return 0
187
+ for line in qpath.read_text(errors="replace").splitlines():
188
+ line = line.strip()
189
+ if not line:
190
+ continue
191
+ try:
192
+ item = json.loads(line)
193
+ except json.JSONDecodeError:
194
+ continue
195
+ # Date filter
196
+ if cutoff is not None:
197
+ ts = item.get("ts") or item.get("created_at") or ""
198
+ try:
199
+ ts_dt = datetime.fromisoformat((ts or "").replace("Z", "+00:00"))
200
+ except (TypeError, ValueError):
201
+ skipped += 1
202
+ continue
203
+ if ts_dt >= cutoff:
204
+ continue
205
+ # Kind filter
206
+ if args.kind and item.get("kind") != args.kind:
207
+ continue
208
+ # Term pattern filter
209
+ if term_re is not None and not term_re.search(item.get("term") or ""):
210
+ continue
211
+ iid = item.get("id")
212
+ if iid and iid not in consumed:
213
+ consumed.add(iid)
214
+ matched += 1
215
+ _save_consumed(consumed)
216
+ print(f"Marked {matched} items consumed (skipped {skipped} undated).")
217
+ print(f"Total consumed now: {len(consumed)}")
155
218
  return 0
156
219
 
157
220
 
@@ -172,7 +235,23 @@ def main(argv: list[str] | None = None) -> int:
172
235
  ap_consume.add_argument("id")
173
236
  ap_consume.set_defaults(func=cmd_consume)
174
237
 
175
- ap_reset = sub.add_parser("reset", help="clear consumed state")
238
+ ap_reset = sub.add_parser(
239
+ "reset",
240
+ help=("clear consumed state, OR bulk-mark items matching "
241
+ "--since / --kind / --term-pattern"),
242
+ )
243
+ ap_reset.add_argument(
244
+ "--since", default="",
245
+ help="YYYY-MM-DD UTC. Marks items older than this consumed.",
246
+ )
247
+ ap_reset.add_argument(
248
+ "--kind", default="",
249
+ help="Only items with this kind (e.g. unknown_term).",
250
+ )
251
+ ap_reset.add_argument(
252
+ "--term-pattern", default="",
253
+ help="Regex matched against the term field.",
254
+ )
176
255
  ap_reset.set_defaults(func=cmd_reset)
177
256
 
178
257
  args = ap.parse_args(argv)