drydock-cli 2.6.140__tar.gz → 2.6.142__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 (627) hide show
  1. drydock_cli-2.6.142/.auto_release.lock +1 -0
  2. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/Admiral.md +38 -14
  3. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/PKG-INFO +1 -1
  4. drydock_cli-2.6.142/drydock/admiral/metrics.py +92 -0
  5. drydock_cli-2.6.142/drydock/admiral/policy.py +134 -0
  6. drydock_cli-2.6.142/drydock/admiral/proposer.py +157 -0
  7. drydock_cli-2.6.142/drydock/admiral/stager.py +147 -0
  8. drydock_cli-2.6.142/drydock/admiral/task_classifier.py +73 -0
  9. drydock_cli-2.6.142/drydock/admiral/tuning.py +131 -0
  10. drydock_cli-2.6.142/drydock/admiral/validator.py +95 -0
  11. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/worker.py +54 -2
  12. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/commands.py +18 -0
  13. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/app.py +126 -0
  14. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agent_loop.py +34 -4
  15. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/pyproject.toml +1 -1
  16. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/publish_to_pypi.sh +1 -1
  17. drydock_cli-2.6.142/scripts/stress_watcher.py +187 -0
  18. drydock_cli-2.6.142/tests/test_admiral_phase3.py +171 -0
  19. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.claude/scheduled_tasks.lock +0 -0
  20. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/CODEOWNERS +0 -0
  21. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  22. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  23. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/build-and-upload.yml +0 -0
  25. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/ci.yml +0 -0
  26. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/issue-labeler.yml +0 -0
  27. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.github/workflows/release.yml +0 -0
  28. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.gitignore +0 -0
  29. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.pre-commit-config.yaml +0 -0
  30. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.python-version +0 -0
  31. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.typos.toml +0 -0
  32. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.vscode/extensions.json +0 -0
  33. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.vscode/launch.json +0 -0
  34. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/.vscode/settings.json +0 -0
  35. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/AGENTS.md +0 -0
  36. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/BASELINE_412.md +0 -0
  37. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/CHANGELOG.md +0 -0
  38. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/CLAUDE.md +0 -0
  39. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/CONTRIBUTING.md +0 -0
  40. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/Drydock_rebrand.md +0 -0
  41. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/LICENSE +0 -0
  42. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/MODEL_SHORTCOMINGS.md +0 -0
  43. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/NOTICE +0 -0
  44. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  45. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/PRD.md +0 -0
  46. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/README.md +0 -0
  47. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/action.yml +0 -0
  48. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/README.md +0 -0
  49. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results1.tsv +0 -0
  50. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results13.tsv +0 -0
  51. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results14.tsv +0 -0
  52. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results15.tsv +0 -0
  53. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results16.tsv +0 -0
  54. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results17.tsv +0 -0
  55. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results18.tsv +0 -0
  56. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results19.tsv +0 -0
  57. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results2.tsv +0 -0
  58. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results20.tsv +0 -0
  59. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results3.tsv +0 -0
  60. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results4.tsv +0 -0
  61. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results5.tsv +0 -0
  62. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results6.tsv +0 -0
  63. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results7.tsv +0 -0
  64. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results8.tsv +0 -0
  65. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results9.tsv +0 -0
  66. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/baseline_history/results_evolved_v1.tsv +0 -0
  67. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/distribution/zed/LICENSE +0 -0
  68. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/distribution/zed/extension.toml +0 -0
  69. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/distribution/zed/icons/mistral_vibe.svg +0 -0
  70. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/docs/README.md +0 -0
  71. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/docs/acp-setup.md +0 -0
  72. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/docs/proxy-setup.md +0 -0
  73. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/__init__.py +0 -0
  74. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/__init__.py +0 -0
  75. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/acp_agent_loop.py +0 -0
  76. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/acp_logger.py +0 -0
  77. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/entrypoint.py +0 -0
  78. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/__init__.py +0 -0
  79. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/base.py +0 -0
  80. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/bash.py +0 -0
  81. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/read_file.py +0 -0
  82. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/search_replace.py +0 -0
  83. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/todo.py +0 -0
  84. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/builtins/write_file.py +0 -0
  85. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/tools/session_update.py +0 -0
  86. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/acp/utils.py +0 -0
  87. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/__init__.py +0 -0
  88. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/detectors.py +0 -0
  89. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/history.py +0 -0
  90. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/interventions.py +0 -0
  91. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/llm_analyzer.py +0 -0
  92. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/opus_escalator.py +0 -0
  93. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/admiral/persistence.py +0 -0
  94. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/__init__.py +0 -0
  95. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/__init__.py +0 -0
  96. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/base.py +0 -0
  97. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/path_completion.py +0 -0
  98. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/autocompletion/slash_command.py +0 -0
  99. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/cli.py +0 -0
  100. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/clipboard.py +0 -0
  101. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/entrypoint.py +0 -0
  102. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/history_manager.py +0 -0
  103. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  104. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  105. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  106. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/terminal_setup.py +0 -0
  107. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/__init__.py +0 -0
  108. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  109. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/app.tcss +0 -0
  110. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/external_editor.py +0 -0
  111. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  112. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  113. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  114. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  115. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  116. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  117. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  118. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  119. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  120. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  121. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  122. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  123. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  124. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  125. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  126. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  127. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  128. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  129. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  130. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  131. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  132. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  133. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  134. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  135. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  136. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  137. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  138. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  139. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  140. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  141. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  142. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  143. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  144. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  145. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  146. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  147. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  148. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/history.py +0 -0
  149. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  150. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/textual_ui/windowing/state.py +0 -0
  151. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/__init__.py +0 -0
  152. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  153. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  154. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  155. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  156. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  157. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/update.py +0 -0
  158. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/cli/update_notifier/whats_new.py +0 -0
  159. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/__init__.py +0 -0
  160. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agents/__init__.py +0 -0
  161. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agents/manager.py +0 -0
  162. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/agents/models.py +0 -0
  163. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/auth/__init__.py +0 -0
  164. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/auth/crypto.py +0 -0
  165. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/auth/github.py +0 -0
  166. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/__init__.py +0 -0
  167. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/completers.py +0 -0
  168. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  169. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  170. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  171. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  172. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  173. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/fuzzy.py +0 -0
  174. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/path_prompt.py +0 -0
  175. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  176. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/build_orchestrator.py +0 -0
  177. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/checkpoint.py +0 -0
  178. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/__init__.py +0 -0
  179. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/_settings.py +0 -0
  180. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/doctor.py +0 -0
  181. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/harness_files/__init__.py +0 -0
  182. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  183. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/config/harness_files/_paths.py +0 -0
  184. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/consultant.py +0 -0
  185. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/drydock_states.py +0 -0
  186. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/hooks.py +0 -0
  187. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/__init__.py +0 -0
  188. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/anthropic.py +0 -0
  189. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/base.py +0 -0
  190. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/factory.py +0 -0
  191. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/generic.py +0 -0
  192. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/mistral.py +0 -0
  193. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  194. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/backend/vertex.py +0 -0
  195. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/exceptions.py +0 -0
  196. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/format.py +0 -0
  197. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/message_utils.py +0 -0
  198. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/llm/types.py +0 -0
  199. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/logger.py +0 -0
  200. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/middleware.py +0 -0
  201. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/output_formatters.py +0 -0
  202. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/__init__.py +0 -0
  203. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/_drydock_home.py +0 -0
  204. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/_local_config_walk.py +0 -0
  205. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/paths/conventions.py +0 -0
  206. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/plan_session.py +0 -0
  207. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/plugins.py +0 -0
  208. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/programmatic.py +0 -0
  209. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/__init__.py +0 -0
  210. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/builder.md +0 -0
  211. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/cli.md +0 -0
  212. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/compact.md +0 -0
  213. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/dangerous_directory.md +0 -0
  214. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/diagnostic.md +0 -0
  215. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/explore.md +0 -0
  216. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/gemma4.md +0 -0
  217. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/planner.md +0 -0
  218. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/project_context.md +0 -0
  219. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/prompts/tests.md +0 -0
  220. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/proxy_setup.py +0 -0
  221. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/agent_memory.py +0 -0
  222. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/checkpoints.py +0 -0
  223. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/session_loader.py +0 -0
  224. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/session_logger.py +0 -0
  225. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/session_migration.py +0 -0
  226. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session/state_file.py +0 -0
  227. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/session_checker.py +0 -0
  228. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/__init__.py +0 -0
  229. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/manager.py +0 -0
  230. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/models.py +0 -0
  231. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/skills/parser.py +0 -0
  232. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/slug.py +0 -0
  233. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/system_prompt.py +0 -0
  234. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/telemetry/__init__.py +0 -0
  235. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/telemetry/send.py +0 -0
  236. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/errors.py +0 -0
  237. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/git.py +0 -0
  238. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/nuage.py +0 -0
  239. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/teleport.py +0 -0
  240. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/teleport/types.py +0 -0
  241. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/base.py +0 -0
  242. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/_task_manager.py +0 -0
  243. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  244. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/bash.py +0 -0
  245. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/cron.py +0 -0
  246. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  247. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/glob_tool.py +0 -0
  248. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/grep.py +0 -0
  249. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  250. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/lsp.py +0 -0
  251. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  252. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  253. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/powershell.py +0 -0
  254. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  255. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  256. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  257. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  258. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  259. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  260. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  261. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  262. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  263. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  264. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  265. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  266. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  267. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  268. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/task.md +0 -0
  269. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  270. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  271. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  272. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  273. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  274. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  275. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  276. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/read_file.py +0 -0
  277. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/search_replace.py +0 -0
  278. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/task.py +0 -0
  279. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/todo.py +0 -0
  280. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/tool_search.py +0 -0
  281. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/webfetch.py +0 -0
  282. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/websearch.py +0 -0
  283. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/worktree.py +0 -0
  284. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/builtins/write_file.py +0 -0
  285. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/injection_guard.py +0 -0
  286. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/manager.py +0 -0
  287. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp/__init__.py +0 -0
  288. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp/registry.py +0 -0
  289. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp/tools.py +0 -0
  290. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/mcp_sampling.py +0 -0
  291. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/ui.py +0 -0
  292. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/tools/utils.py +0 -0
  293. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/trusted_folders.py +0 -0
  294. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/types.py +0 -0
  295. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/core/utils.py +0 -0
  296. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/__init__.py +0 -0
  297. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/base.py +0 -0
  298. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/onboarding.tcss +0 -0
  299. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/__init__.py +0 -0
  300. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/api_key.py +0 -0
  301. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/choice.py +0 -0
  302. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/local_model.py +0 -0
  303. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/onboarding/screens/welcome.py +0 -0
  304. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  305. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  306. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/__init__.py +0 -0
  307. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/api-design/SKILL.md +0 -0
  308. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/audit-tests/SKILL.md +0 -0
  309. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/batch/SKILL.md +0 -0
  310. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/commit-code/SKILL.md +0 -0
  311. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/context-summary/SKILL.md +0 -0
  312. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/create-presentation/SKILL.md +0 -0
  313. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/deep-research/SKILL.md +0 -0
  314. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/deploy/SKILL.md +0 -0
  315. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/diff-review/SKILL.md +0 -0
  316. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/doc-gen/SKILL.md +0 -0
  317. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/explain-code/SKILL.md +0 -0
  318. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/explore-code/SKILL.md +0 -0
  319. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/fix-issue/SKILL.md +0 -0
  320. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/git-ops/SKILL.md +0 -0
  321. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/init-project/SKILL.md +0 -0
  322. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/investigate/SKILL.md +0 -0
  323. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/loop/SKILL.md +0 -0
  324. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/migrate/SKILL.md +0 -0
  325. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/perf-analyze/SKILL.md +0 -0
  326. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/plan-impl/SKILL.md +0 -0
  327. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/pr-review/SKILL.md +0 -0
  328. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/refactor/SKILL.md +0 -0
  329. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/regex-help/SKILL.md +0 -0
  330. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/review/SKILL.md +0 -0
  331. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/security-review/SKILL.md +0 -0
  332. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/ship/SKILL.md +0 -0
  333. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/simplify/SKILL.md +0 -0
  334. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/strong-tests/SKILL.md +0 -0
  335. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/skills/test-verify/SKILL.md +0 -0
  336. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock/whats_new.md +0 -0
  337. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock-acp.spec +0 -0
  338. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/drydock_terms.md +0 -0
  339. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/flake.lock +0 -0
  340. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/flake.nix +0 -0
  341. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/README.md +0 -0
  342. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/admiral_probe.py +0 -0
  343. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/audit_sampler.py +0 -0
  344. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/auto_generate_tests.py +0 -0
  345. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/auto_release.sh +0 -0
  346. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/auto_test_loop.sh +0 -0
  347. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/backup.sh +0 -0
  348. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/bump_version.py +0 -0
  349. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/comprehensive_loop.py +0 -0
  350. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/deploy_to_github.sh +0 -0
  351. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/discover_cli_tools.sh +0 -0
  352. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/evolve_tests.py +0 -0
  353. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/gen_2000_prompts.py +0 -0
  354. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/install.sh +0 -0
  355. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/llm_balancer.py +0 -0
  356. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/mega_loop.py +0 -0
  357. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/meta_ralph_loop.py +0 -0
  358. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/monitor_swebench.sh +0 -0
  359. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/monitor_test_battery.sh +0 -0
  360. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/notify_release.py +0 -0
  361. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/oss_task_harness.py +0 -0
  362. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/overnight_agents_test.sh +0 -0
  363. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/poll_issues.sh +0 -0
  364. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/port_task.py +0 -0
  365. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/prepare_release.py +0 -0
  366. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/ralph_loop.py +0 -0
  367. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/session_loop_audit.py +0 -0
  368. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown.py +0 -0
  369. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_interactive.py +0 -0
  370. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_regression.sh +0 -0
  371. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_suite.sh +0 -0
  372. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/shakedown_variance.sh +0 -0
  373. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_prompts_50.txt +0 -0
  374. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_prompts_tool_agent.txt +0 -0
  375. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  376. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_shakedown.py +0 -0
  377. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/stress_telegram_status.py +0 -0
  378. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/telegram_bot.py +0 -0
  379. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_bank.sh +0 -0
  380. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_full.sh +0 -0
  381. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_smoke.sh +0 -0
  382. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/test_tui_path.py +0 -0
  383. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/tui_test.py +0 -0
  384. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/scripts/vllm_failover.sh +0 -0
  385. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/__init__.py +0 -0
  386. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/conftest.py +0 -0
  387. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_acp.py +0 -0
  388. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_agent_thought.py +0 -0
  389. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_bash.py +0 -0
  390. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_compact_session_updates.py +0 -0
  391. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_content.py +0 -0
  392. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_initialize.py +0 -0
  393. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_list_sessions.py +0 -0
  394. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_load_session.py +0 -0
  395. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_multi_session.py +0 -0
  396. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_new_session.py +0 -0
  397. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_proxy_setup_acp.py +0 -0
  398. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_read_file.py +0 -0
  399. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_search_replace.py +0 -0
  400. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_set_config_option.py +0 -0
  401. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_set_mode.py +0 -0
  402. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_set_model.py +0 -0
  403. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_tool_call_session_update.py +0 -0
  404. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_utils.py +0 -0
  405. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/acp/test_write_file.py +0 -0
  406. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_file_indexer.py +0 -0
  407. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_fuzzy.py +0 -0
  408. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  409. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  410. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_completion_controller.py +0 -0
  411. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  412. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_slash_command_controller.py +0 -0
  413. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  414. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/__init__.py +0 -0
  415. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/data/__init__.py +0 -0
  416. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/data/fireworks.py +0 -0
  417. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/data/mistral.py +0 -0
  418. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_anthropic_adapter.py +0 -0
  419. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_backend.py +0 -0
  420. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_reasoning_adapter.py +0 -0
  421. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  422. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  423. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  424. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  425. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_bell_notifications.py +0 -0
  426. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_braille_renderer.py +0 -0
  427. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_clipboard.py +0 -0
  428. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_commands.py +0 -0
  429. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_copy_shortcuts.py +0 -0
  430. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_external_editor.py +0 -0
  431. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_no_markup_static.py +0 -0
  432. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_question_app.py +0 -0
  433. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_spinner.py +0 -0
  434. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_switching_mode.py +0 -0
  435. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  436. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  437. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_session_resume.py +0 -0
  438. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/test_ui_skill_dispatch.py +0 -0
  439. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/textual_ui/__init__.py +0 -0
  440. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/cli/textual_ui/test_session_picker.py +0 -0
  441. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/conftest.py +0 -0
  442. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_agents.py +0 -0
  443. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_auth_crypto.py +0 -0
  444. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_auth_github.py +0 -0
  445. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_config_load_dotenv.py +0 -0
  446. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_config_paths.py +0 -0
  447. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_config_resolution.py +0 -0
  448. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_file_logging.py +0 -0
  449. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_plan_session.py +0 -0
  450. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_proxy_setup.py +0 -0
  451. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_slug.py +0 -0
  452. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_telemetry_send.py +0 -0
  453. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_teleport_git.py +0 -0
  454. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_teleport_nuage.py +0 -0
  455. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_teleport_service.py +0 -0
  456. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_trusted_folders.py +0 -0
  457. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/core/test_utils.py +0 -0
  458. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/common.py +0 -0
  459. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/conftest.py +0 -0
  460. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/mock_server.py +0 -0
  461. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  462. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/test_cli_tui_streaming.py +0 -0
  463. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  464. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/fixtures/doc_qa_system_prd.md +0 -0
  465. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/__init__.py +0 -0
  466. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/mock_backend_factory.py +0 -0
  467. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/mock_entrypoint.py +0 -0
  468. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/mock/utils.py +0 -0
  469. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/onboarding/test_run_onboarding.py +0 -0
  470. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/onboarding/test_ui_onboarding.py +0 -0
  471. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/session/test_session_loader.py +0 -0
  472. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/session/test_session_logger.py +0 -0
  473. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/session/test_session_migration.py +0 -0
  474. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/conftest.py +0 -0
  475. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/test_manager.py +0 -0
  476. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/test_models.py +0 -0
  477. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/skills/test_parser.py +0 -0
  478. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  479. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  480. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  481. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  482. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  483. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  484. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  485. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  486. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  487. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  488. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  489. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  490. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  491. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  492. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  493. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  494. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  495. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  496. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  497. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  498. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  499. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  500. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  501. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  502. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  503. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  504. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  505. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  506. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  507. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  508. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  509. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  510. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  511. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  512. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  513. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  514. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  515. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  516. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  517. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  518. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  519. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  520. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  521. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  522. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  523. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  524. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  525. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  526. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  527. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  528. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  529. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  530. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  531. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  532. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  533. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  534. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  535. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  536. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  537. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  538. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/base_snapshot_test_app.py +0 -0
  539. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/conftest.py +0 -0
  540. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/snap_compare.py +0 -0
  541. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  542. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  543. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  544. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  545. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  546. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  547. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  548. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  549. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  550. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  551. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  552. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  553. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  554. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  555. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/stubs/fake_backend.py +0 -0
  556. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/stubs/fake_client.py +0 -0
  557. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/stubs/fake_tool.py +0 -0
  558. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_admiral.py +0 -0
  559. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_auto_compact.py +0 -0
  560. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_backend.py +0 -0
  561. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_observer_streaming.py +0 -0
  562. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_stats.py +0 -0
  563. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_tasks.py +0 -0
  564. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agent_tool_call.py +0 -0
  565. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_agents.py +0 -0
  566. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_build.py +0 -0
  567. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_debug.py +0 -0
  568. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_multiagent.py +0 -0
  569. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_prd.py +0 -0
  570. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_prd_extended.py +0 -0
  571. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_tools.py +0 -0
  572. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_bank_update.py +0 -0
  573. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_build_projects.py +0 -0
  574. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_checkpoint.py +0 -0
  575. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_cli_programmatic_preload.py +0 -0
  576. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_current_bugs.py +0 -0
  577. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_drydock_regression.py +0 -0
  578. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_drydock_tasks.py +0 -0
  579. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_full_regression.py +0 -0
  580. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_history_manager.py +0 -0
  581. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_integration.py +0 -0
  582. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_issue_fixes.py +0 -0
  583. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_loop_detection.py +0 -0
  584. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_message_id.py +0 -0
  585. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_message_merging.py +0 -0
  586. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_middleware.py +0 -0
  587. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_multi_agent.py +0 -0
  588. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_real_failures.py +0 -0
  589. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_real_issues.py +0 -0
  590. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_real_workflow.py +0 -0
  591. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_reasoning_content.py +0 -0
  592. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_smoke.py +0 -0
  593. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_system_prompt.py +0 -0
  594. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_tagged_text.py +0 -0
  595. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_tool_args.py +0 -0
  596. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_ui_external_editor.py +0 -0
  597. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_ui_input_history.py +0 -0
  598. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_user_issues.py +0 -0
  599. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/test_workloads.py +0 -0
  600. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/testbank_helpers.py +0 -0
  601. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_ask_user_question.py +0 -0
  602. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_bash.py +0 -0
  603. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_exit_plan_mode.py +0 -0
  604. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_grep.py +0 -0
  605. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_invoke_context.py +0 -0
  606. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_manager_get_tool_config.py +0 -0
  607. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_mcp.py +0 -0
  608. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_mcp_sampling.py +0 -0
  609. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_task.py +0 -0
  610. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_ui_bash_execution.py +0 -0
  611. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_webfetch.py +0 -0
  612. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/tools/test_websearch.py +0 -0
  613. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  614. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  615. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_do_update.py +0 -0
  616. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  617. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_github_update_gateway.py +0 -0
  618. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  619. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_ui_update_notification.py +0 -0
  620. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_update_use_case.py +0 -0
  621. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/tests/update_notifier/test_whats_new.py +0 -0
  622. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/uv.lock +0 -0
  623. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/README.md +0 -0
  624. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/cli_subcommand_dispatch.py +0 -0
  625. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/lookup.json +0 -0
  626. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/sql_parser.py +0 -0
  627. {drydock_cli-2.6.140 → drydock_cli-2.6.142}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2066036
@@ -285,7 +285,7 @@ Open design questions for Phase 2:
285
285
  * Rate-limiting: prevent Opus blast during a bad run. Max 3 escalations
286
286
  per session by default. Override via env var.
287
287
 
288
- ### Phase 3a — DESIGNED (not started): Hyperparameter adaptation per (model, task)
288
+ ### Phase 3a — SHIPPED (v2.6.141): Hyperparameter adaptation per (model, task)
289
289
 
290
290
  **Goal.** Admiral learns the strengths and weaknesses of the current
291
291
  model + tool set and tunes the harness hyperparameters accordingly,
@@ -388,7 +388,7 @@ then Admiral re-evaluates once and possibly re-tunes.
388
388
 
389
389
  ---
390
390
 
391
- ### Phase 3b — DESIGNED (not started): Self-improving drydock via gated code proposals
391
+ ### Phase 3b — SHIPPED (v2.6.141, default-OFF via DRYDOCK_ADMIRAL_PROPOSER=1)
392
392
 
393
393
  **Goal.** Close the loop from detection → proposed fix → validated
394
394
  branch, without ever writing to `main` or PyPI automatically. The
@@ -558,8 +558,8 @@ having to tail a log file.
558
558
 
559
559
  ## 9. Continuity Notes (if this session is lost)
560
560
 
561
- **Latest shipped:** v2.6.139 (Phase 1 + Phase 2 module, Opus escalation,
562
- Directives rubric wired into prompts).
561
+ **Latest shipped:** v2.6.141 Phase 3a (hyperparameter adaptation)
562
+ and Phase 3b (gated code proposals, default-OFF) both in PyPI.
563
563
 
564
564
  **Shipped this session (2026-04-17):**
565
565
  * v2.6.134 — wall-of-text inline-marker breaker (issue #8).
@@ -571,6 +571,11 @@ Directives rubric wired into prompts).
571
571
  * v2.6.138 — Admiral Phase 1 module + TUI integration.
572
572
  * v2.6.139 — Admiral Phase 2 (local-LLM analyzer, Opus escalator,
573
573
  Directives rubric in prompts).
574
+ * v2.6.140 — full `.vibe → .drydock` rename (zero vibe refs left).
575
+ * v2.6.141 — Phase 3a (task_classifier, metrics, tuning, policy +
576
+ AgentLoop integration) + Phase 3b (proposer, validator, stager +
577
+ /admiral-apply, /admiral-reject, /admiral-status slash commands)
578
+ + scripts/stress_watcher.py harness-level babysitter.
574
579
 
575
580
  **Files (check `git log --oneline -30`):**
576
581
  * `drydock/admiral/{__init__,detectors,interventions,history,worker,
@@ -611,19 +616,38 @@ applied, including the `directive-source` (local-llm / opus / canned).
611
616
  started ~Apr-16, currently at ~826/1658 (approaching 50%).
612
617
  DO NOT interrupt.
613
618
 
614
- **Open follow-ups:**
615
- * **Phase 3a (designed, not started):** hyperparameter adaptation.
616
- `drydock/admiral/{task_classifier,metrics,tuning,policy}.py` to
617
- be created. See §8 Phase 3a spec.
618
- * **Phase 3b (designed, not started):** code proposals. Proposer →
619
- validator → staged local branch; never auto-commits. User
620
- approves via `/admiral-apply <branch>`. See §8 Phase 3b.
621
- * systemd the admiral_probe.
619
+ **Open follow-ups (post-observation period):**
620
+ * systemd the admiral_probe (currently `nohup &`, dies on logout).
622
621
  * TUI widget showing recent Admiral findings (in-app audit view).
622
+ * More detectors driven by observed data: hallucinated tool names,
623
+ edit-undo-edit ping-pong, PRD/spec drift.
623
624
  * Learning-rate scheduler (Phase 4).
624
625
  * Session vs Global memory split (PRD §6).
625
- * More detectors: hallucinated tool names, PRD/spec drift,
626
- edit-undo-edit ping-pong.
626
+ * Tune Phase 3a knob bounds + Phase 3b promotion criteria from real
627
+ finding-rate data after the 24h observation window.
628
+
629
+ ## 10. Observation mode (active 2026-04-17 → 2026-04-18)
630
+
631
+ Per user directive ("let's slow down, and watch for now"). All
632
+ Admiral feature work is paused. What's still running automatically:
633
+
634
+ * **Stress-test status check** every 30 min (Telegram).
635
+ * **GitHub issue check** every hour for fbobe321 issues.
636
+ * **stress_watcher.py** on the live stress run (PID 1860693) —
637
+ detects stalls/timeout-spikes/completion, emits Telegram + audit log.
638
+ * **admiral_probe.py** on `192.168.50.22:8878` — dashboard tab
639
+ consuming it.
640
+ * **Admiral itself** is live in every drydock TUI session — Phase 1
641
+ + Phase 2 fully active, Phase 3a tuning enabled (no-op until
642
+ `admiral_tuning.json` gets written), Phase 3a policy gated behind
643
+ `DRYDOCK_ADMIRAL_POLICY=1`, Phase 3b proposer gated behind
644
+ `DRYDOCK_ADMIRAL_PROPOSER=1` (both default OFF).
645
+
646
+ **Cron `7a2a593c` fires Sat 2026-04-18 18:13 CDT** — at that point I
647
+ will read `~/.drydock/logs/admiral_history.log` event counts, scan
648
+ `~/.drydock/logs/admiral_metrics.jsonl`, check the dashboard, and
649
+ propose 1–2 next features grounded in what actually fired in the
650
+ past 24h. **No new code without observed evidence it's needed.**
627
651
 
628
652
  ***
629
653
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.6.140
3
+ Version: 2.6.142
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
@@ -0,0 +1,92 @@
1
+ """Session-end metrics for Admiral.
2
+
3
+ Collects a small set of numbers about how a session went, keyed by
4
+ `(model, task_type)`, and appends one JSONL line at the end. The
5
+ Phase 3a policy loop reads these to decide whether to adjust a
6
+ hyperparameter knob for that tuple.
7
+
8
+ The collection hook fires from AgentLoop on shutdown, best-effort
9
+ only — a failure to write a metric must never propagate.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import logging
14
+ from collections.abc import Sequence
15
+ from dataclasses import asdict, dataclass, field
16
+ from datetime import datetime, timezone
17
+ from typing import TYPE_CHECKING
18
+
19
+ from drydock.admiral import persistence, task_classifier
20
+ from drydock.core.types import LLMMessage, Role
21
+
22
+ if TYPE_CHECKING:
23
+ from drydock.core.agent_loop import AgentLoop
24
+
25
+ logger = logging.getLogger(__name__)
26
+
27
+ _WRITE_TOOLS = frozenset({"write_file", "search_replace", "edit_file"})
28
+
29
+
30
+ @dataclass
31
+ class SessionMetrics:
32
+ ts: str
33
+ model: str
34
+ task_type: str
35
+ session_id: str
36
+ outcome: str = "unknown" # success | failure | unknown
37
+ total_tool_calls: int = 0
38
+ tool_calls_per_write: float = 0.0
39
+ time_to_first_write_s: float | None = None
40
+ loop_fires: int = 0
41
+ struggle_fires: int = 0
42
+ opus_escalations: int = 0
43
+ user_interrupts: int = 0
44
+ per_prompt_budget_hits: int = 0
45
+ elapsed_s: float | None = None
46
+ notes: list[str] = field(default_factory=list)
47
+
48
+
49
+ def _count_tool_calls(messages: Sequence[LLMMessage]) -> tuple[int, int]:
50
+ total = writes = 0
51
+ for m in messages:
52
+ if m.role != Role.assistant or not m.tool_calls:
53
+ continue
54
+ for tc in m.tool_calls:
55
+ total += 1
56
+ if tc.function.name in _WRITE_TOOLS:
57
+ writes += 1
58
+ return total, writes
59
+
60
+
61
+ def collect(agent_loop: AgentLoop, session_id: str, outcome: str = "unknown") -> SessionMetrics:
62
+ """Build a SessionMetrics record from the live AgentLoop state.
63
+
64
+ Safe to call during shutdown — wraps message access in a try/except
65
+ so partial state never breaks the collection.
66
+ """
67
+ try:
68
+ msgs = list(agent_loop.messages)
69
+ except Exception:
70
+ msgs = []
71
+ try:
72
+ model_name = agent_loop.config.get_active_model().name
73
+ except Exception:
74
+ model_name = "unknown"
75
+ total, writes = _count_tool_calls(msgs)
76
+ tcpw = (total / writes) if writes else float(total)
77
+ return SessionMetrics(
78
+ ts=datetime.now(timezone.utc).isoformat(timespec="seconds"),
79
+ model=model_name,
80
+ task_type=task_classifier.classify(msgs),
81
+ session_id=session_id,
82
+ outcome=outcome,
83
+ total_tool_calls=total,
84
+ tool_calls_per_write=round(tcpw, 2),
85
+ )
86
+
87
+
88
+ def record(metrics: SessionMetrics) -> None:
89
+ try:
90
+ persistence.append_jsonl(persistence.METRICS_PATH, asdict(metrics))
91
+ except Exception as e:
92
+ logger.warning("Admiral metrics write failed: %s", e)
@@ -0,0 +1,134 @@
1
+ """Phase 3a adaptation policy.
2
+
3
+ Simple bounded rule engine — no ML. Runs over the session metrics
4
+ log and decides whether to adjust ONE knob for a `(model, task_type)`
5
+ tuple. Keeps changes slow on purpose: Admiral nudges one step per
6
+ re-evaluation window; if recovery doesn't happen, reverts.
7
+
8
+ Invariants:
9
+ * Never adjusts more than ONE knob per tuple per pass.
10
+ * Never adjusts before N sessions are observed for the tuple.
11
+ * Always records rationale in the tuning file.
12
+ * Reads are lock-free: if two loops race, the JSON write is atomic
13
+ via persistence.save_json_atomic.
14
+
15
+ Disabled by default (reads `DRYDOCK_ADMIRAL_POLICY` env var; set to
16
+ `1` to enable). Users opt in when ready.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ import logging
22
+ import os
23
+ from collections import defaultdict
24
+ from statistics import mean
25
+ from typing import Any
26
+
27
+ from drydock.admiral import persistence, tuning
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+ MIN_SESSIONS_TO_TUNE = 5
32
+ SUCCESS_REGRESSION_THRESHOLD = 0.2 # 20% drop in success rate
33
+ RECOVERY_WINDOW = 3 # sessions to evaluate after a tweak
34
+
35
+
36
+ def _load_recent_metrics(limit: int = 100) -> list[dict]:
37
+ path = persistence.METRICS_PATH
38
+ if not path.exists():
39
+ return []
40
+ out: list[dict] = []
41
+ try:
42
+ with path.open() as f:
43
+ for line in f.readlines()[-limit:]:
44
+ try:
45
+ out.append(json.loads(line))
46
+ except Exception:
47
+ continue
48
+ except Exception:
49
+ return []
50
+ return out
51
+
52
+
53
+ def _group_by_tuple(metrics: list[dict]) -> dict[tuple[str, str], list[dict]]:
54
+ groups: dict[tuple[str, str], list[dict]] = defaultdict(list)
55
+ for m in metrics:
56
+ key = (m.get("model", "unknown"), m.get("task_type", "unknown"))
57
+ groups[key].append(m)
58
+ return groups
59
+
60
+
61
+ def _success_rate(records: list[dict]) -> float:
62
+ if not records:
63
+ return 0.0
64
+ return sum(1 for r in records if r.get("outcome") == "success") / len(records)
65
+
66
+
67
+ def _pick_knob_to_tune(records: list[dict]) -> tuple[str, float, str] | None:
68
+ """Very simple heuristic: correlate the top failure pattern with
69
+ one knob. Returns (knob, new_value, rationale) or None.
70
+ """
71
+ if not records:
72
+ return None
73
+ # Many budget hits → raise per_prompt_budget_sec.
74
+ if mean(r.get("per_prompt_budget_hits", 0) for r in records) >= 0.4:
75
+ return (
76
+ "per_prompt_budget_sec",
77
+ 1800.0 * 1.25, # +25% from 30min baseline, clipped to bound
78
+ "per_prompt_budget_hits ≥0.4 per session — raise budget.",
79
+ )
80
+ # Many struggle fires → raise struggle_threshold (reads needed).
81
+ if mean(r.get("struggle_fires", 0) for r in records) >= 1.0:
82
+ return (
83
+ "struggle_threshold",
84
+ 30.0,
85
+ "struggle_fires ≥1/session — give explore turns more budget.",
86
+ )
87
+ # Many loop fires → tighten loop_detector_window (catch loops earlier).
88
+ if mean(r.get("loop_fires", 0) for r in records) >= 1.0:
89
+ return (
90
+ "loop_detector_window",
91
+ 2.0,
92
+ "loop_fires ≥1/session — trip loop detector earlier.",
93
+ )
94
+ return None
95
+
96
+
97
+ def evaluate() -> list[dict[str, Any]]:
98
+ """Run one policy pass. Returns list of changes applied (possibly empty)."""
99
+ if os.getenv("DRYDOCK_ADMIRAL_POLICY", "0") != "1":
100
+ return []
101
+
102
+ metrics = _load_recent_metrics()
103
+ groups = _group_by_tuple(metrics)
104
+ changes: list[dict[str, Any]] = []
105
+ for (model, task), records in groups.items():
106
+ if len(records) < MIN_SESSIONS_TO_TUNE:
107
+ continue
108
+ recent = records[-MIN_SESSIONS_TO_TUNE:]
109
+ rate = _success_rate(recent)
110
+ # Baseline = across ALL records for this tuple.
111
+ baseline = _success_rate(records)
112
+ if baseline == 0 or rate >= baseline - SUCCESS_REGRESSION_THRESHOLD:
113
+ # Performing fine — don't tune.
114
+ continue
115
+ pick = _pick_knob_to_tune(recent)
116
+ if not pick:
117
+ continue
118
+ knob, value, rationale = pick
119
+ # Idempotency: if the same knob is already set, skip.
120
+ current = tuning.get_for(model, task)
121
+ if knob in current:
122
+ # Already tuning this knob; give it RECOVERY_WINDOW sessions
123
+ # to show improvement before we touch it again.
124
+ if len(recent) < RECOVERY_WINDOW + MIN_SESSIONS_TO_TUNE:
125
+ continue
126
+ tuning.set_knob(model, task, knob, value, rationale=rationale)
127
+ changes.append({
128
+ "model": model,
129
+ "task": task,
130
+ "knob": knob,
131
+ "value": value,
132
+ "rationale": rationale,
133
+ })
134
+ return changes
@@ -0,0 +1,157 @@
1
+ """Phase 3b: draft a unified-diff proposal for a recurring finding.
2
+
3
+ Only called for findings that survived prompt-only interventions
4
+ (see `persistence.finding_qualifies_for_code_change`). Uses the
5
+ same escalation ladder as Phase 2 (local LLM → Opus).
6
+
7
+ Returns a `Proposal` or `None`. Caller (worker) passes the proposal
8
+ to validator.validate(), and if that returns green, to stager.stage().
9
+
10
+ Default DISABLED — reads `DRYDOCK_ADMIRAL_PROPOSER=1` env var.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import hashlib
15
+ import logging
16
+ import os
17
+ import re
18
+ from dataclasses import dataclass
19
+ from typing import TYPE_CHECKING
20
+
21
+ from drydock.admiral import persistence
22
+ from drydock.admiral.llm_analyzer import _DIRECTIVES_RUBRIC, _render_turns
23
+ from drydock.admiral.opus_escalator import _try_anthropic_sdk, _try_claude_cli
24
+ from drydock.core.types import LLMMessage, Role
25
+
26
+ if TYPE_CHECKING:
27
+ from drydock.admiral.detectors import Finding
28
+ from drydock.core.agent_loop import AgentLoop
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+ _PROPOSER_PROMPT = """You are Admiral's code proposer. A recurring finding has \
33
+ survived prompt-only interventions and should be fixed at the source. Draft a \
34
+ MINIMAL unified diff that addresses the root cause.
35
+
36
+ {rubric}
37
+
38
+ Recurring finding: {code}
39
+ Total fires across sessions: {n_fires}
40
+ Sessions involved: {n_sessions}
41
+ Failed prompt-only interventions: {n_failed}
42
+
43
+ Repro context (last turns):
44
+ <conversation>
45
+ {context}
46
+ </conversation>
47
+
48
+ Output in EXACTLY this format (no extra text):
49
+
50
+ DIRECTIVES VIOLATED: [code1,code2,...]
51
+ RATIONALE: <one paragraph grounded in the cited directives>
52
+ DIFF:
53
+ ```diff
54
+ <unified diff — narrow scope, touches only the files needed>
55
+ ```
56
+ """
57
+
58
+
59
+ @dataclass
60
+ class Proposal:
61
+ code: str
62
+ directives_violated: list[str]
63
+ rationale: str
64
+ diff: str
65
+ source: str # "local-llm" | "opus"
66
+ fingerprint: str # sha256 of the diff — used for reject tracking
67
+
68
+
69
+ _DIFF_RE = re.compile(r"```(?:diff)?\n([\s\S]*?)```", re.MULTILINE)
70
+ _DIR_RE = re.compile(r"DIRECTIVES VIOLATED:\s*\[([^\]]*)\]")
71
+ _RAT_RE = re.compile(r"RATIONALE:\s*(.+?)(?:\nDIFF:|\Z)", re.DOTALL)
72
+
73
+
74
+ def _parse(text: str) -> tuple[list[str], str, str] | None:
75
+ m_diff = _DIFF_RE.search(text)
76
+ m_rat = _RAT_RE.search(text)
77
+ m_dir = _DIR_RE.search(text)
78
+ if not m_diff:
79
+ return None
80
+ diff = m_diff.group(1).strip()
81
+ if not diff:
82
+ return None
83
+ rationale = (m_rat.group(1).strip() if m_rat else "")[:2000]
84
+ dirs = []
85
+ if m_dir:
86
+ dirs = [s.strip() for s in m_dir.group(1).split(",") if s.strip()]
87
+ return dirs, rationale, diff
88
+
89
+
90
+ def _fingerprint(diff: str) -> str:
91
+ return hashlib.sha256(diff.strip().encode()).hexdigest()[:16]
92
+
93
+
94
+ async def _ask_local(agent_loop: AgentLoop, prompt: str) -> str | None:
95
+ try:
96
+ chunk = await agent_loop.backend.complete(
97
+ model=agent_loop.config.get_active_model(),
98
+ messages=[LLMMessage(role=Role.user, content=prompt)],
99
+ temperature=0.1,
100
+ max_tokens=2000,
101
+ )
102
+ return (chunk.message.content or "").strip() or None
103
+ except Exception as e:
104
+ logger.warning("Admiral proposer local call failed: %s", e)
105
+ return None
106
+
107
+
108
+ async def _ask_opus(prompt: str) -> str | None:
109
+ out = await _try_anthropic_sdk(prompt)
110
+ if out:
111
+ return out
112
+ return await _try_claude_cli(prompt)
113
+
114
+
115
+ async def propose(agent_loop: AgentLoop, finding: Finding) -> Proposal | None:
116
+ if os.getenv("DRYDOCK_ADMIRAL_PROPOSER", "0") != "1":
117
+ return None
118
+
119
+ state = persistence.load_state()
120
+ entry = state.get("findings", {}).get(finding.code) or {}
121
+ n_fires = int(entry.get("total_fires", 0))
122
+ n_sessions = len(entry.get("sessions", []))
123
+ n_failed = int(entry.get("prompt_failed", 0))
124
+
125
+ prompt = _PROPOSER_PROMPT.format(
126
+ rubric=_DIRECTIVES_RUBRIC,
127
+ code=finding.code,
128
+ n_fires=n_fires,
129
+ n_sessions=n_sessions,
130
+ n_failed=n_failed,
131
+ context=_render_turns(list(agent_loop.messages), n_turns=12),
132
+ )
133
+
134
+ # 1) local LLM
135
+ text = await _ask_local(agent_loop, prompt)
136
+ source = "local-llm"
137
+ parsed = _parse(text or "")
138
+ # 2) Opus fallback
139
+ if not parsed:
140
+ text = await _ask_opus(prompt)
141
+ source = "opus"
142
+ parsed = _parse(text or "")
143
+ if not parsed:
144
+ return None
145
+ dirs, rationale, diff = parsed
146
+ fp = _fingerprint(diff)
147
+ if persistence.is_fingerprint_rejected(finding.code, fp):
148
+ logger.info("Admiral proposer: skipping previously-rejected patch %s", fp)
149
+ return None
150
+ return Proposal(
151
+ code=finding.code,
152
+ directives_violated=dirs,
153
+ rationale=rationale,
154
+ diff=diff,
155
+ source=source,
156
+ fingerprint=fp,
157
+ )
@@ -0,0 +1,147 @@
1
+ """Phase 3b: stage a validated proposal as a local branch + proposal markdown.
2
+
3
+ NEVER pushes, NEVER merges to main, NEVER publishes. Writes a summary
4
+ file in `~/.drydock/admiral_proposals/<ts>.md` describing the diff,
5
+ rationale, validator output, branch name, and explicit rollback
6
+ command. The human then runs `/admiral-apply <branch>` to merge.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ import subprocess
12
+ from dataclasses import dataclass
13
+ from datetime import datetime, timezone
14
+ from pathlib import Path
15
+
16
+ from drydock.admiral import history, persistence
17
+ from drydock.admiral.proposer import Proposal
18
+ from drydock.admiral.validator import REPO_ROOT, ValidationResult
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ @dataclass
24
+ class StagedProposal:
25
+ branch: str
26
+ proposal_path: Path
27
+ commit_sha: str
28
+
29
+
30
+ def _run(cmd: list[str], cwd: Path = REPO_ROOT, timeout: int = 60) -> tuple[int, str, str]:
31
+ p = subprocess.run(
32
+ cmd, cwd=cwd, timeout=timeout,
33
+ capture_output=True, text=True, check=False,
34
+ )
35
+ return p.returncode, p.stdout, p.stderr
36
+
37
+
38
+ def _safe_code(code: str) -> str:
39
+ # Branch name can't have weird chars — keep letters, digits, hyphens.
40
+ out = []
41
+ for ch in code:
42
+ if ch.isalnum() or ch in "-_":
43
+ out.append(ch)
44
+ else:
45
+ out.append("-")
46
+ return "".join(out)[:40]
47
+
48
+
49
+ def stage(proposal: Proposal, validation: ValidationResult) -> StagedProposal | None:
50
+ if not validation.ok:
51
+ raise ValueError("refusing to stage a proposal that didn't pass validation")
52
+
53
+ ts = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
54
+ branch = f"admiral/{ts}-{_safe_code(proposal.code)}"
55
+
56
+ # Invariant: we ALWAYS branch from main.
57
+ rc, out, err = _run(["git", "rev-parse", "main"])
58
+ if rc != 0:
59
+ logger.error("Admiral stager: cannot resolve 'main' ref: %s", err)
60
+ return None
61
+ main_sha = out.strip()
62
+
63
+ # Create branch pointing at main (no checkout of main working tree).
64
+ rc, out, err = _run(["git", "branch", branch, main_sha])
65
+ if rc != 0:
66
+ logger.error("Admiral stager: branch create failed: %s", err)
67
+ return None
68
+
69
+ # Use a short-lived worktree to apply+commit, then drop the worktree.
70
+ import tempfile
71
+ tmp_wt = Path(tempfile.mkdtemp(prefix="admiral_stage_")) / "wt"
72
+ diff_path = tmp_wt.parent / "proposal.diff"
73
+ diff_path.write_text(proposal.diff if proposal.diff.endswith("\n")
74
+ else proposal.diff + "\n")
75
+
76
+ commit_sha: str | None = None
77
+ try:
78
+ rc, out, err = _run(
79
+ ["git", "worktree", "add", str(tmp_wt), branch], cwd=REPO_ROOT,
80
+ )
81
+ if rc != 0:
82
+ logger.error("Admiral stager: worktree add failed: %s", err)
83
+ _run(["git", "branch", "-D", branch])
84
+ return None
85
+ rc, out, err = _run(["git", "apply", str(diff_path)], cwd=tmp_wt)
86
+ if rc != 0:
87
+ logger.error("Admiral stager: diff apply failed: %s", err)
88
+ return None
89
+ rc, out, err = _run(["git", "add", "-A"], cwd=tmp_wt)
90
+ if rc != 0:
91
+ return None
92
+ commit_msg = (
93
+ f"admiral-proposed: {proposal.code}\n\n"
94
+ f"Rationale: {proposal.rationale}\n\n"
95
+ f"Directives violated: {', '.join(proposal.directives_violated) or '—'}\n"
96
+ f"Source: {proposal.source}\n"
97
+ f"Fingerprint: {proposal.fingerprint}\n"
98
+ )
99
+ rc, out, err = _run(
100
+ ["git", "commit", "-m", commit_msg], cwd=tmp_wt,
101
+ )
102
+ if rc != 0:
103
+ logger.error("Admiral stager: commit failed: %s", err)
104
+ return None
105
+ rc, out, err = _run(["git", "rev-parse", "HEAD"], cwd=tmp_wt)
106
+ if rc == 0:
107
+ commit_sha = out.strip()
108
+ finally:
109
+ try:
110
+ _run(["git", "worktree", "remove", "--force", str(tmp_wt)], cwd=REPO_ROOT)
111
+ except Exception:
112
+ pass
113
+ try:
114
+ import shutil
115
+ shutil.rmtree(tmp_wt.parent, ignore_errors=True)
116
+ except Exception:
117
+ pass
118
+
119
+ if not commit_sha:
120
+ logger.error("Admiral stager: no commit sha")
121
+ _run(["git", "branch", "-D", branch])
122
+ return None
123
+
124
+ # Write the proposal summary markdown.
125
+ persistence.PROPOSALS_DIR.mkdir(parents=True, exist_ok=True)
126
+ prop_path = persistence.PROPOSALS_DIR / f"{ts}-{_safe_code(proposal.code)}.md"
127
+ prop_path.write_text(
128
+ f"# Admiral proposal: {proposal.code}\n\n"
129
+ f"**Branch:** `{branch}` \n"
130
+ f"**Commit:** `{commit_sha}` \n"
131
+ f"**Source:** {proposal.source} \n"
132
+ f"**Fingerprint:** `{proposal.fingerprint}` \n"
133
+ f"**Directives violated:** {', '.join(proposal.directives_violated) or '—'}\n\n"
134
+ f"## Rationale\n\n{proposal.rationale}\n\n"
135
+ f"## Diff\n\n```diff\n{proposal.diff}\n```\n\n"
136
+ f"## Validator output (tail)\n\n"
137
+ f"```\n{validation.stdout[-2000:]}\n```\n\n"
138
+ f"## Next actions\n\n"
139
+ f"- Merge: `/admiral-apply {branch}` (or `git merge --no-ff {branch}`)\n"
140
+ f"- Reject: `/admiral-reject {branch}` (deletes branch + records fingerprint)\n"
141
+ f"- Rollback: `git branch -D {branch}`\n"
142
+ )
143
+ history.append(
144
+ "proposal-staged",
145
+ f"{proposal.code} :: branch={branch} :: fp={proposal.fingerprint}",
146
+ )
147
+ return StagedProposal(branch=branch, proposal_path=prop_path, commit_sha=commit_sha)