drydock-cli 2.7.28__tar.gz → 2.7.29__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 (686) hide show
  1. drydock_cli-2.7.29/.auto_release.lock +1 -0
  2. drydock_cli-2.7.29/PERF_SWEEP_PLAN.md +109 -0
  3. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/PKG-INFO +1 -1
  4. drydock_cli-2.7.29/SOVEREIGN_PRD.md +520 -0
  5. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/agent_loop.py +11 -6
  6. drydock_cli-2.7.29/perf_results/baseline_1777672181.json +76 -0
  7. drydock_cli-2.7.29/perf_results/baseline_1777672218.json +96 -0
  8. drydock_cli-2.7.29/perf_results/baseline_1777672322.json +112 -0
  9. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/pyproject.toml +1 -1
  10. drydock_cli-2.7.29/scripts/perf_baseline_when_idle.sh +92 -0
  11. drydock_cli-2.7.29/scripts/perf_sweep.py +332 -0
  12. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_babysitter.sh +13 -0
  13. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/trip_log.md +100 -0
  14. drydock_cli-2.7.28/.auto_release.lock +0 -1
  15. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.claude/scheduled_tasks.lock +0 -0
  16. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/CODEOWNERS +0 -0
  17. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  18. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  19. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/workflows/build-and-upload.yml +0 -0
  21. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/workflows/ci.yml +0 -0
  22. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/workflows/issue-labeler.yml +0 -0
  23. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.github/workflows/release.yml +0 -0
  24. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.gitignore +0 -0
  25. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.pre-commit-config.yaml +0 -0
  26. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.python-version +0 -0
  27. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.typos.toml +0 -0
  28. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.vscode/extensions.json +0 -0
  29. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.vscode/launch.json +0 -0
  30. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/.vscode/settings.json +0 -0
  31. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/AGENTS.md +0 -0
  32. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/Admiral.md +0 -0
  33. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/BASELINE_412.md +0 -0
  34. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/CHANGELOG.md +0 -0
  35. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/CLAUDE.md +0 -0
  36. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/CONTRIBUTING.md +0 -0
  37. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/DEPLOYMENT.md +0 -0
  38. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/Drydock_rebrand.md +0 -0
  39. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/LICENSE +0 -0
  40. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/MODEL_SHORTCOMINGS.md +0 -0
  41. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/NOTICE +0 -0
  42. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/OVERNIGHT_PROGRESS.md +0 -0
  43. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  44. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/PRD.md +0 -0
  45. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/README.md +0 -0
  46. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/action.yml +0 -0
  47. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/README.md +0 -0
  48. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results1.tsv +0 -0
  49. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results13.tsv +0 -0
  50. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results14.tsv +0 -0
  51. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results15.tsv +0 -0
  52. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results16.tsv +0 -0
  53. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results17.tsv +0 -0
  54. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results18.tsv +0 -0
  55. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results19.tsv +0 -0
  56. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results2.tsv +0 -0
  57. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results20.tsv +0 -0
  58. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results3.tsv +0 -0
  59. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results4.tsv +0 -0
  60. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results5.tsv +0 -0
  61. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results6.tsv +0 -0
  62. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results7.tsv +0 -0
  63. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results8.tsv +0 -0
  64. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results9.tsv +0 -0
  65. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/baseline_history/results_evolved_v1.tsv +0 -0
  66. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/distribution/zed/LICENSE +0 -0
  67. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/distribution/zed/extension.toml +0 -0
  68. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/distribution/zed/icons/mistral_vibe.svg +0 -0
  69. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/docs/README.md +0 -0
  70. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/docs/acp-setup.md +0 -0
  71. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/docs/proxy-setup.md +0 -0
  72. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/__init__.py +0 -0
  73. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/__init__.py +0 -0
  74. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/acp_agent_loop.py +0 -0
  75. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/acp_logger.py +0 -0
  76. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/entrypoint.py +0 -0
  77. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/__init__.py +0 -0
  78. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/base.py +0 -0
  79. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/bash.py +0 -0
  80. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/read_file.py +0 -0
  81. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/search_replace.py +0 -0
  82. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/todo.py +0 -0
  83. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/builtins/write_file.py +0 -0
  84. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/tools/session_update.py +0 -0
  85. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/acp/utils.py +0 -0
  86. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/__init__.py +0 -0
  87. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/detectors.py +0 -0
  88. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/detectors_proposed.py +0 -0
  89. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/history.py +0 -0
  90. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/interventions.py +0 -0
  91. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/llm_analyzer.py +0 -0
  92. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/metrics.py +0 -0
  93. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/opus_escalator.py +0 -0
  94. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/persistence.py +0 -0
  95. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/policy.py +0 -0
  96. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/proposer.py +0 -0
  97. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/stager.py +0 -0
  98. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/task_classifier.py +0 -0
  99. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/tuning.py +0 -0
  100. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/validator.py +0 -0
  101. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/admiral/worker.py +0 -0
  102. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/__init__.py +0 -0
  103. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/autocompletion/__init__.py +0 -0
  104. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/autocompletion/base.py +0 -0
  105. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/autocompletion/path_completion.py +0 -0
  106. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/autocompletion/slash_command.py +0 -0
  107. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/cli.py +0 -0
  108. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/clipboard.py +0 -0
  109. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/commands.py +0 -0
  110. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/entrypoint.py +0 -0
  111. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/history_manager.py +0 -0
  112. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  113. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  114. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  115. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/terminal_setup.py +0 -0
  116. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/__init__.py +0 -0
  117. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  118. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/app.py +0 -0
  119. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/app.tcss +0 -0
  120. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/external_editor.py +0 -0
  121. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  122. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  123. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  124. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  125. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  126. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  127. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  128. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  129. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  130. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  131. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  132. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  133. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  134. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  135. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  136. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  137. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  138. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  139. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  140. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  141. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  142. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  143. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  144. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  145. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  146. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  147. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  148. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  149. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  150. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  151. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  152. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  153. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  154. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  155. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  156. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  157. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  158. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/history.py +0 -0
  159. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  160. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/textual_ui/windowing/state.py +0 -0
  161. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/__init__.py +0 -0
  162. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  163. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  164. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  165. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  166. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  167. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/update.py +0 -0
  168. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/cli/update_notifier/whats_new.py +0 -0
  169. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/__init__.py +0 -0
  170. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/agents/__init__.py +0 -0
  171. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/agents/manager.py +0 -0
  172. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/agents/models.py +0 -0
  173. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/auth/__init__.py +0 -0
  174. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/auth/crypto.py +0 -0
  175. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/auth/github.py +0 -0
  176. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/__init__.py +0 -0
  177. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/completers.py +0 -0
  178. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  179. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  180. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  181. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  182. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  183. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/fuzzy.py +0 -0
  184. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/path_prompt.py +0 -0
  185. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  186. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/build_orchestrator.py +0 -0
  187. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/checkpoint.py +0 -0
  188. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/config/__init__.py +0 -0
  189. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/config/_settings.py +0 -0
  190. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/config/doctor.py +0 -0
  191. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/config/harness_files/__init__.py +0 -0
  192. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  193. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/config/harness_files/_paths.py +0 -0
  194. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/consultant.py +0 -0
  195. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/drydock_states.py +0 -0
  196. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/hooks.py +0 -0
  197. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/__init__.py +0 -0
  198. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/anthropic.py +0 -0
  199. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/base.py +0 -0
  200. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/factory.py +0 -0
  201. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/generic.py +0 -0
  202. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/mistral.py +0 -0
  203. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  204. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/backend/vertex.py +0 -0
  205. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/exceptions.py +0 -0
  206. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/format.py +0 -0
  207. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/message_utils.py +0 -0
  208. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/llm/types.py +0 -0
  209. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/logger.py +0 -0
  210. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/middleware.py +0 -0
  211. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/output_formatters.py +0 -0
  212. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/paths/__init__.py +0 -0
  213. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/paths/_drydock_home.py +0 -0
  214. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/paths/_local_config_walk.py +0 -0
  215. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/paths/conventions.py +0 -0
  216. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/plan_session.py +0 -0
  217. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/plugins.py +0 -0
  218. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/programmatic.py +0 -0
  219. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/__init__.py +0 -0
  220. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/builder.md +0 -0
  221. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/cli.md +0 -0
  222. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/compact.md +0 -0
  223. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/dangerous_directory.md +0 -0
  224. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/diagnostic.md +0 -0
  225. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/explore.md +0 -0
  226. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/gemma4.md +0 -0
  227. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/planner.md +0 -0
  228. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/project_context.md +0 -0
  229. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/prompts/tests.md +0 -0
  230. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/proxy_setup.py +0 -0
  231. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session/agent_memory.py +0 -0
  232. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session/checkpoints.py +0 -0
  233. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session/session_loader.py +0 -0
  234. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session/session_logger.py +0 -0
  235. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session/session_migration.py +0 -0
  236. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session/state_file.py +0 -0
  237. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/session_checker.py +0 -0
  238. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/skills/__init__.py +0 -0
  239. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/skills/manager.py +0 -0
  240. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/skills/models.py +0 -0
  241. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/skills/parser.py +0 -0
  242. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/slug.py +0 -0
  243. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/system_prompt.py +0 -0
  244. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/telemetry/__init__.py +0 -0
  245. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/telemetry/send.py +0 -0
  246. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/teleport/errors.py +0 -0
  247. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/teleport/git.py +0 -0
  248. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/teleport/nuage.py +0 -0
  249. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/teleport/teleport.py +0 -0
  250. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/teleport/types.py +0 -0
  251. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/base.py +0 -0
  252. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/_task_manager.py +0 -0
  253. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  254. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/bash.py +0 -0
  255. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/cron.py +0 -0
  256. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  257. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/glob_tool.py +0 -0
  258. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/grep.py +0 -0
  259. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  260. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/lsp.py +0 -0
  261. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  262. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  263. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/powershell.py +0 -0
  264. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  265. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  266. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  267. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  268. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  269. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  270. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  271. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  272. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  273. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  274. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  275. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  276. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  277. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  278. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/task.md +0 -0
  279. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  280. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  281. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  282. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  283. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  284. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  285. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  286. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/read_file.py +0 -0
  287. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/search_replace.py +0 -0
  288. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/task.py +0 -0
  289. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/todo.py +0 -0
  290. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/tool_search.py +0 -0
  291. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/webfetch.py +0 -0
  292. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/websearch.py +0 -0
  293. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/worktree.py +0 -0
  294. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/builtins/write_file.py +0 -0
  295. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/injection_guard.py +0 -0
  296. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/manager.py +0 -0
  297. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/mcp/__init__.py +0 -0
  298. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/mcp/registry.py +0 -0
  299. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/mcp/tools.py +0 -0
  300. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/mcp_sampling.py +0 -0
  301. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/ui.py +0 -0
  302. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/tools/utils.py +0 -0
  303. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/trusted_folders.py +0 -0
  304. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/types.py +0 -0
  305. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/core/utils.py +0 -0
  306. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/__init__.py +0 -0
  307. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/base.py +0 -0
  308. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/onboarding.tcss +0 -0
  309. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/__init__.py +0 -0
  310. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/api_key.py +0 -0
  311. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/choice.py +0 -0
  312. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/local_model.py +0 -0
  313. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/onboarding/screens/welcome.py +0 -0
  314. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  315. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  316. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/__init__.py +0 -0
  317. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/api-design/SKILL.md +0 -0
  318. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/audit-tests/SKILL.md +0 -0
  319. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/batch/SKILL.md +0 -0
  320. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/commit-code/SKILL.md +0 -0
  321. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/context-summary/SKILL.md +0 -0
  322. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/create-presentation/SKILL.md +0 -0
  323. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/deep-research/SKILL.md +0 -0
  324. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/deploy/SKILL.md +0 -0
  325. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/diff-review/SKILL.md +0 -0
  326. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/doc-gen/SKILL.md +0 -0
  327. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/explain-code/SKILL.md +0 -0
  328. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/explore-code/SKILL.md +0 -0
  329. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/fix-issue/SKILL.md +0 -0
  330. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/git-ops/SKILL.md +0 -0
  331. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/init-project/SKILL.md +0 -0
  332. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/investigate/SKILL.md +0 -0
  333. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/loop/SKILL.md +0 -0
  334. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/migrate/SKILL.md +0 -0
  335. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/perf-analyze/SKILL.md +0 -0
  336. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/plan-impl/SKILL.md +0 -0
  337. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/pr-review/SKILL.md +0 -0
  338. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/refactor/SKILL.md +0 -0
  339. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/regex-help/SKILL.md +0 -0
  340. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/review/SKILL.md +0 -0
  341. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/security-review/SKILL.md +0 -0
  342. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/ship/SKILL.md +0 -0
  343. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/simplify/SKILL.md +0 -0
  344. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/strong-tests/SKILL.md +0 -0
  345. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/skills/test-verify/SKILL.md +0 -0
  346. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock/whats_new.md +0 -0
  347. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock-acp.spec +0 -0
  348. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/drydock_terms.md +0 -0
  349. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/flake.lock +0 -0
  350. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/flake.nix +0 -0
  351. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/nohup.out +0 -0
  352. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/README.md +0 -0
  353. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/config_base.toml +0 -0
  354. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/config_best.toml +0 -0
  355. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/domain_spec.md +0 -0
  356. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/experimenter.py +0 -0
  357. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/kernel.py +0 -0
  358. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/mini_prd.md +0 -0
  359. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/mini_prompts.txt +0 -0
  360. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/proposer.py +0 -0
  361. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/research/results.tsv +0 -0
  362. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/resume.md +0 -0
  363. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/README.md +0 -0
  364. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/admiral_probe.py +0 -0
  365. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/audit_sampler.py +0 -0
  366. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/auto_generate_tests.py +0 -0
  367. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/auto_release.sh +0 -0
  368. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/auto_test_loop.sh +0 -0
  369. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/autonomous_review.sh +0 -0
  370. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/autonomous_review_prompt.md +0 -0
  371. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/backup.sh +0 -0
  372. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/bump_version.py +0 -0
  373. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/comprehensive_loop.py +0 -0
  374. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/deploy_to_github.sh +0 -0
  375. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/discover_cli_tools.sh +0 -0
  376. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/evolve_tests.py +0 -0
  377. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/gen_2000_prompts.py +0 -0
  378. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/install.sh +0 -0
  379. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/llm_balancer.py +0 -0
  380. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/mega_loop.py +0 -0
  381. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/meta_ralph_loop.py +0 -0
  382. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/monitor_swebench.sh +0 -0
  383. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/monitor_test_battery.sh +0 -0
  384. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/notify_release.py +0 -0
  385. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/oss_task_harness.py +0 -0
  386. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/overnight_agents_test.sh +0 -0
  387. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/poll_issues.sh +0 -0
  388. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/port_task.py +0 -0
  389. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/prepare_release.py +0 -0
  390. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/publish_to_pypi.sh +0 -0
  391. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/ralph_loop.py +0 -0
  392. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/research_babysitter.sh +0 -0
  393. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/session_loop_audit.py +0 -0
  394. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/shakedown.py +0 -0
  395. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/shakedown_interactive.py +0 -0
  396. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/shakedown_regression.sh +0 -0
  397. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/shakedown_suite.sh +0 -0
  398. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/shakedown_variance.sh +0 -0
  399. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_prompts_50.txt +0 -0
  400. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_prompts_realuser.txt +0 -0
  401. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_prompts_tool_agent.txt +0 -0
  402. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  403. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_shakedown.py +0 -0
  404. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_telegram_status.py +0 -0
  405. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/stress_watcher.py +0 -0
  406. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/telegram_bot.py +0 -0
  407. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/test_bank.sh +0 -0
  408. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/test_full.sh +0 -0
  409. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/test_smoke.sh +0 -0
  410. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/test_tui_path.py +0 -0
  411. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/tui_test.py +0 -0
  412. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/scripts/vllm_failover.sh +0 -0
  413. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/test/project/dummy +0 -0
  414. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/__init__.py +0 -0
  415. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/conftest.py +0 -0
  416. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_acp.py +0 -0
  417. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_agent_thought.py +0 -0
  418. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_bash.py +0 -0
  419. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_compact_session_updates.py +0 -0
  420. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_content.py +0 -0
  421. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_initialize.py +0 -0
  422. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_list_sessions.py +0 -0
  423. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_load_session.py +0 -0
  424. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_multi_session.py +0 -0
  425. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_new_session.py +0 -0
  426. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_proxy_setup_acp.py +0 -0
  427. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_read_file.py +0 -0
  428. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_search_replace.py +0 -0
  429. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_set_config_option.py +0 -0
  430. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_set_mode.py +0 -0
  431. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_set_model.py +0 -0
  432. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_tool_call_session_update.py +0 -0
  433. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_utils.py +0 -0
  434. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/acp/test_write_file.py +0 -0
  435. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_file_indexer.py +0 -0
  436. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_fuzzy.py +0 -0
  437. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  438. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  439. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_path_completion_controller.py +0 -0
  440. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  441. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_slash_command_controller.py +0 -0
  442. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  443. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/__init__.py +0 -0
  444. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/data/__init__.py +0 -0
  445. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/data/fireworks.py +0 -0
  446. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/data/mistral.py +0 -0
  447. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/test_anthropic_adapter.py +0 -0
  448. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/test_backend.py +0 -0
  449. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  450. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/test_reasoning_adapter.py +0 -0
  451. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  452. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  453. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  454. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  455. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_bell_notifications.py +0 -0
  456. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_braille_renderer.py +0 -0
  457. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_clipboard.py +0 -0
  458. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_commands.py +0 -0
  459. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_copy_shortcuts.py +0 -0
  460. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_external_editor.py +0 -0
  461. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_no_markup_static.py +0 -0
  462. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_question_app.py +0 -0
  463. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_spinner.py +0 -0
  464. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_switching_mode.py +0 -0
  465. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  466. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  467. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_ui_session_resume.py +0 -0
  468. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/test_ui_skill_dispatch.py +0 -0
  469. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/textual_ui/__init__.py +0 -0
  470. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/cli/textual_ui/test_session_picker.py +0 -0
  471. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/conftest.py +0 -0
  472. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_agents.py +0 -0
  473. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_auth_crypto.py +0 -0
  474. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_auth_github.py +0 -0
  475. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  476. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  477. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_config_load_dotenv.py +0 -0
  478. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_config_paths.py +0 -0
  479. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_config_resolution.py +0 -0
  480. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_file_logging.py +0 -0
  481. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_plan_session.py +0 -0
  482. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_proxy_setup.py +0 -0
  483. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_slug.py +0 -0
  484. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_telemetry_send.py +0 -0
  485. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_teleport_git.py +0 -0
  486. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_teleport_nuage.py +0 -0
  487. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_teleport_service.py +0 -0
  488. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_trusted_folders.py +0 -0
  489. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/core/test_utils.py +0 -0
  490. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/e2e/common.py +0 -0
  491. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/e2e/conftest.py +0 -0
  492. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/e2e/mock_server.py +0 -0
  493. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  494. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/e2e/test_cli_tui_streaming.py +0 -0
  495. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  496. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/fixtures/doc_qa_system_prd.md +0 -0
  497. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/mock/__init__.py +0 -0
  498. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/mock/mock_backend_factory.py +0 -0
  499. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/mock/mock_entrypoint.py +0 -0
  500. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/mock/utils.py +0 -0
  501. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/onboarding/test_run_onboarding.py +0 -0
  502. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/onboarding/test_ui_onboarding.py +0 -0
  503. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/session/test_session_loader.py +0 -0
  504. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/session/test_session_logger.py +0 -0
  505. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/session/test_session_migration.py +0 -0
  506. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/skills/conftest.py +0 -0
  507. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/skills/test_manager.py +0 -0
  508. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/skills/test_models.py +0 -0
  509. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/skills/test_parser.py +0 -0
  510. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  511. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  512. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  513. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  514. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  515. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  516. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  517. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  518. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  519. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  520. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  521. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  522. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  523. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  524. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  525. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  526. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  527. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  528. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  529. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  530. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  531. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  532. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  533. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  534. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  535. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  536. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  537. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  538. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  539. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  540. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  541. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  542. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  543. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  544. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  545. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  546. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  547. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  548. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  549. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  550. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  551. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  552. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  553. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  554. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  555. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  556. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  557. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  558. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  559. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  560. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  561. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  562. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  563. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  564. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  565. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  566. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  567. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  568. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  569. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  570. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/base_snapshot_test_app.py +0 -0
  571. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/conftest.py +0 -0
  572. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/snap_compare.py +0 -0
  573. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  574. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  575. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  576. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  577. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  578. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  579. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  580. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  581. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  582. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  583. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  584. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  585. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  586. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  587. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/stubs/fake_backend.py +0 -0
  588. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/stubs/fake_client.py +0 -0
  589. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/stubs/fake_tool.py +0 -0
  590. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_admiral.py +0 -0
  591. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_admiral_phase3.py +0 -0
  592. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_admiral_proposed.py +0 -0
  593. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_admiral_struggle_dedup.py +0 -0
  594. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agent_auto_compact.py +0 -0
  595. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agent_backend.py +0 -0
  596. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agent_observer_streaming.py +0 -0
  597. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agent_stats.py +0 -0
  598. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agent_tasks.py +0 -0
  599. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agent_tool_call.py +0 -0
  600. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_agents.py +0 -0
  601. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_build.py +0 -0
  602. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_debug.py +0 -0
  603. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_multiagent.py +0 -0
  604. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_prd.py +0 -0
  605. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_prd_extended.py +0 -0
  606. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_tools.py +0 -0
  607. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_bank_update.py +0 -0
  608. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_build_projects.py +0 -0
  609. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_checkpoint.py +0 -0
  610. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_cli_programmatic_preload.py +0 -0
  611. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_current_bugs.py +0 -0
  612. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_drydock_regression.py +0 -0
  613. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_drydock_tasks.py +0 -0
  614. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  615. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_full_regression.py +0 -0
  616. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_hallucinated_tool_suppression.py +0 -0
  617. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_history_manager.py +0 -0
  618. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_integration.py +0 -0
  619. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_issue_fixes.py +0 -0
  620. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_loop_detection.py +0 -0
  621. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_message_id.py +0 -0
  622. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_message_merging.py +0 -0
  623. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_middleware.py +0 -0
  624. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_multi_agent.py +0 -0
  625. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_read_file_not_found_listing.py +0 -0
  626. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_real_failures.py +0 -0
  627. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_real_issues.py +0 -0
  628. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_real_workflow.py +0 -0
  629. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_reasoning_content.py +0 -0
  630. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_search_replace_args_not_truncated.py +0 -0
  631. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_smoke.py +0 -0
  632. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_system_prompt.py +0 -0
  633. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_tagged_text.py +0 -0
  634. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_task_complete_nudge.py +0 -0
  635. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_tool_args.py +0 -0
  636. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_truncate_args_valid_json.py +0 -0
  637. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_truncated_arg_path_hint.py +0 -0
  638. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_truncated_search_replace_escalation.py +0 -0
  639. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_truncated_write_escalation.py +0 -0
  640. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_ui_external_editor.py +0 -0
  641. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_ui_input_history.py +0 -0
  642. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_user_issues.py +0 -0
  643. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_wall_of_text_rescue.py +0 -0
  644. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_workloads.py +0 -0
  645. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/test_write_file_missing_path.py +0 -0
  646. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/testbank_helpers.py +0 -0
  647. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_ask_user_question.py +0 -0
  648. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_bash.py +0 -0
  649. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_exit_plan_mode.py +0 -0
  650. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_grep.py +0 -0
  651. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_invoke_context.py +0 -0
  652. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  653. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_manager_get_tool_config.py +0 -0
  654. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_mcp.py +0 -0
  655. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_mcp_sampling.py +0 -0
  656. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  657. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_read_file_directory.py +0 -0
  658. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_read_file_limit_truncation.py +0 -0
  659. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_append_fallback.py +0 -0
  660. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_dir_path.py +0 -0
  661. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_empty_content.py +0 -0
  662. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_hard_stop.py +0 -0
  663. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_malformed_block.py +0 -0
  664. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  665. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  666. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_task.py +0 -0
  667. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_ui_bash_execution.py +0 -0
  668. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_webfetch.py +0 -0
  669. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_websearch.py +0 -0
  670. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  671. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  672. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  673. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  674. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_do_update.py +0 -0
  675. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  676. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_github_update_gateway.py +0 -0
  677. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  678. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_ui_update_notification.py +0 -0
  679. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_update_use_case.py +0 -0
  680. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/tests/update_notifier/test_whats_new.py +0 -0
  681. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/uv.lock +0 -0
  682. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/worked_examples/README.md +0 -0
  683. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/worked_examples/cli_subcommand_dispatch.py +0 -0
  684. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/worked_examples/lookup.json +0 -0
  685. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/worked_examples/sql_parser.py +0 -0
  686. {drydock_cli-2.7.28 → drydock_cli-2.7.29}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2064199
@@ -0,0 +1,109 @@
1
+ # vLLM / Gemma 4 Hosting Performance Sweep — Plan & Baseline
2
+
3
+ **Status:** harness built, baseline collected (noisy), full sweep deferred until stress run completes.
4
+
5
+ **Owner artifact:** `scripts/perf_sweep.py`
6
+ **Results:** `/data3/drydock/perf_results/*.json`
7
+
8
+ ---
9
+
10
+ ## Why this exists
11
+
12
+ Step 1 of the Sovereign v2 framework: lock the inference performance floor before building the failure-classification loop. If the floor is wobbly, the classifier can't tell "config bug" from "real failure class."
13
+
14
+ Article-driven hypotheses to test:
15
+
16
+ | Article claim | Currently we use | Test |
17
+ | ------------------------------ | --------------------- | ------------------------------------- |
18
+ | Flash attention enabled | `TRITON_ATTN` | swap to `--attention-backend FLASH_ATTN` |
19
+ | KV cache quant `q8_0` | `--kv-cache-dtype fp8`| swap to `auto` (fp16) — does fp8 cost quality? |
20
+ | `temperature: 1.0` | 0.0–0.2 | **Skipped — known bad for coding agents** |
21
+ | `top_k: 40` | unset | **Skipped — same reason** |
22
+ | Q3\_K\_M quantization | AWQ-4bit | **N/A — different ecosystem (vLLM not llama.cpp)** |
23
+ | (vLLM-native, not in article) | | `--enable-prefix-caching` on/off |
24
+ | (vLLM-native, not in article) | `--max-num-seqs 2` | sweep 2 / 4 / 8 |
25
+
26
+ ---
27
+
28
+ ## Harness design
29
+
30
+ `scripts/perf_sweep.py baseline` runs four workloads sized to mirror real Drydock turns:
31
+
32
+ | Workload | Input tokens | Description | Max output |
33
+ | -------- | ------------ | ------------------------------------------------- | ---------- |
34
+ | short | ~50 | chat-style | 64 |
35
+ | medium | ~2 000 | typical drydock turn (system + few tool results) | 256 |
36
+ | long | ~16 000 | drydock with substantial tool history | 256 |
37
+ | xlong | ~64 000 | heavy context, near-half max | 256 |
38
+
39
+ Metrics reported per workload (median + p95 across iters):
40
+
41
+ - **TTFT** — time to first content delta (prefill cost)
42
+ - **e2e tok/s** — `output_tokens / total_wall_clock` (user-visible)
43
+ - **decode tok/s** — only meaningful when content chunks span >50 ms; otherwise marked `n/a (server buffered)`
44
+ - `streamed`, `chunk_count` for diagnosis
45
+
46
+ vLLM with `--tool-call-parser gemma4` buffers chunks server-side until tool-call boundaries are resolved, so decode-only measurements are usually meaningless on this stack. **Prefer e2e tok/s.**
47
+
48
+ ---
49
+
50
+ ## Baseline (noisy — taken during stress run)
51
+
52
+ Captured 2026-05-01 at ~16:30 CDT against live vLLM on :8001, while the 1700-prompt stress run was active. **Numbers are contaminated** — the same prompt swung 25× in TTFT depending on whether the stress harness was mid-request. Treat as ceiling, not signal.
53
+
54
+ ```
55
+ short ttft p50=3.47s e2e p50=9.5 tok/s out p50=33 tok
56
+ medium ttft p50=1.41s e2e p50=44.8 tok/s out p50=65 tok
57
+ ```
58
+
59
+ Best uncontended values observed (single iter):
60
+ - short: ttft 0.73 s / e2e 44.6 tok/s
61
+ - medium: ttft 1.24 s / e2e 48.4 tok/s
62
+
63
+ Even uncontended, e2e is below the ~70 tok/s documented in `CLAUDE.md`. Likely explanation: small outputs are TTFT-dominated. Long-output workload needed to isolate decode rate.
64
+
65
+ **Files:** `perf_results/baseline_1777672322.json`
66
+
67
+ ---
68
+
69
+ ## Sweep matrix (run after stress completes)
70
+
71
+ 7 configs total. Each = restart vLLM + re-run `perf_sweep.py baseline` with all four workloads × 5 iters.
72
+
73
+ | # | Config name | Change vs current | Hypothesis |
74
+ | -- | --------------------- | ------------------------------------------------- | ------------------------------------------------------------------------- |
75
+ | 0 | `current` | (none — re-measure cleanly without stress) | Establishes uncontaminated baseline |
76
+ | 1 | `flash_attn` | `--attention-backend FLASH_ATTN` | Article: flash improves TTFT and decode |
77
+ | 2 | `kv_fp16` | drop `--kv-cache-dtype fp8` (=fp16 default) | Does fp8 cost quality? Compare e2e + spot-check answers |
78
+ | 3 | `prefix_cache_on` | add `--enable-prefix-caching` | Big win for repeated system prompts (huge for Drydock TUI) |
79
+ | 4 | `seqs_4` | `--max-num-seqs 4` | Better concurrency under stress harness load |
80
+ | 5 | `seqs_8` | `--max-num-seqs 8` | Stress test concurrency limit |
81
+ | 6 | `winner_combo` | best of 1+3 (likely flash + prefix cache) | Combined effect |
82
+
83
+ **Total wall time:** ~7 configs × ~5 min restart + ~3 min benchmark ≈ 1 h.
84
+
85
+ **Pass criteria for "winner":**
86
+ 1. Equal or better e2e tok/s on `medium` workload (drydock-typical)
87
+ 2. No quality regression on a 5-PRD spot check (run `shakedown.py` on 5 PRDs, must still pass)
88
+ 3. No timeouts on `xlong` workload (catches OOM under long contexts)
89
+ 4. Either equal-or-lower TTFT on `medium`, or a documented justification why higher TTFT is acceptable
90
+
91
+ ---
92
+
93
+ ## What's NOT in the sweep (and why)
94
+
95
+ - **`temperature: 1.0` / `top_k: 40`** — bad advice for coding agents. We escalate temp deliberately as a loop-break lever (`agent_loop.py:2032`), not a default. Skipped.
96
+ - **Q3\_K\_M (Unsloth GGUF)** — different ecosystem (llama.cpp). Becomes relevant only when bringing up the customer-hardware portability path (Phase 1 tail of the Sovereign PRD).
97
+ - **`gpu-memory-utilization` higher than 0.95** — already at the practical ceiling.
98
+ - **Tensor-parallel size > 2** — only have 2 GPUs.
99
+
100
+ ---
101
+
102
+ ## Next actions
103
+
104
+ 1. ⏸ Wait for stress harness to drain to `0/0` (ETA ~10–12 h from 16:30 CDT 2026-05-01).
105
+ 2. ▢ Run `current` config clean baseline (5 iters, all four workloads).
106
+ 3. ▢ Run configs 1–5 sequentially, comparing against `current`.
107
+ 4. ▢ Build winning combo, validate via `shakedown.py` 5-PRD spot check.
108
+ 5. ▢ Lock the winner into `start_gemma4.sh` and `CLAUDE.md`.
109
+ 6. ▢ Move on to Step 2 of the framework: **manual failure triage** of `MODEL_SHORTCOMINGS.md` + Admiral logs + `BASELINE_412.md` to seed the classification taxonomy.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.28
3
+ Version: 2.7.29
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,520 @@
1
+ # Product Requirements Document (PRD)
2
+
3
+ # Project Name: **Drydock Sovereign AI Stack v2**
4
+
5
+ ### Local Adaptive AI System — Gemma 4 26B + Drydock + GraphRAG (roadmap) + Deep Noir (roadmap)
6
+
7
+ ---
8
+
9
+ ## Adaptation Notes (vs. upstream PRD draft)
10
+
11
+ This doc starts from a community PRD draft. Where the draft conflicts with what
12
+ Drydock has already committed to or measured, the draft loses. Specifically:
13
+
14
+ | Upstream draft says | What we actually do | Why |
15
+ | -------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
16
+ | Runtime: llama.cpp / llama-server (Q3\_K\_M) | vLLM Docker (`vllm/vllm-openai:gemma4`), AWQ-4bit | Already shipped, 0% timeouts, 70% SWE-bench file match. llama.cpp/Ollama become **portability roadmap**. |
17
+ | Context window: 32 768 | **131 072** (`--max-model-len 131072`) | Our hardware (2× RTX 4060 Ti 16GB) handles it with `fp8` KV cache. |
18
+ | `temperature: 1.0`, `top_k: 40` | `temperature: 0.0–0.2` baseline | Article advice targets chat/prose. For agentic coding, temp 1.0 *causes* the loops it claims to fix. We only |
19
+ | | | escalate temp to ~1.0 deliberately as a loop-break lever (`agent_loop.py:2032`). |
20
+ | KV cache `q8_0` | `--kv-cache-dtype fp8` | vLLM-native equivalent. Different ecosystem (vLLM vs. llama.cpp). |
21
+ | Tier 3: Jetson AGX Orin as supported | **Explicitly out of scope for v2** | Per operator rule — Jetson is not to be modified or treated as a deployment target this cycle. |
22
+ | GraphRAG / Deep Noir / full Evaluator | **Roadmap**, not "current components" | We have Admiral, stress harness, MetaHarness, autonomous\_review. GraphRAG and Deep Noir are real future work. |
23
+ | Cloud-assisted proposer (anywhere) | **Local-only proposer** | Air-gap is the product pitch; cloud proposer contradicts the brand. |
24
+
25
+ ---
26
+
27
+ # 1. Executive Summary
28
+
29
+ Drydock Sovereign AI Stack v2 is a fully local, privacy-first AI platform for
30
+ secure environments, defense-adjacent customers, regulated enterprises, and
31
+ research labs that need frontier-style assistance without sending data to the
32
+ cloud.
33
+
34
+ The system pairs:
35
+
36
+ - **Gemma 4 26B-A4B-it (AWQ-4bit)** — Google's MoE reasoning model (only ~4B
37
+ active params per token)
38
+ - **vLLM** — production-grade inference server (Docker, tensor-parallel)
39
+ - **Drydock harness** — orchestration, tool use, loop detection, Admiral
40
+ observer, MetaHarness self-improvement
41
+ - **GraphRAG memory** — *roadmap, Phase 2*
42
+ - **Deep Noir activation steering** — *roadmap, Phase 4 — leverages the
43
+ operator's own research*
44
+ - **Evaluator loop** — already partially shipped (Admiral + stress + autonomous
45
+ review); deepens in Phase 3
46
+
47
+ Category claim: **AI that improves after installation.**
48
+
49
+ ---
50
+
51
+ # 2. Product Vision
52
+
53
+ A sovereign AI system that:
54
+
55
+ - Runs offline on customer hardware
56
+ - Uses local GPUs only
57
+ - Protects sensitive data (no telemetry, no remote model calls)
58
+ - Learns customer-specific knowledge
59
+ - Performs coding and reasoning tasks autonomously
60
+ - Self-diagnoses failures (Admiral) and self-improves (MetaHarness, evaluator)
61
+ - Improves continuously without phoning home
62
+
63
+ ---
64
+
65
+ # 3. Core Problem Statement
66
+
67
+ ## Cloud AI problems
68
+
69
+ - Data exposure
70
+ - Recurring per-seat subscriptions
71
+ - Vendor lock-in
72
+ - No control over model updates / silent regressions
73
+ - Unavailable in air-gapped or classified networks
74
+
75
+ ## DIY local AI problems
76
+
77
+ - Difficult setup, hardware-specific tuning
78
+ - Poor inference performance without serving expertise
79
+ - Weak retrieval / no persistent memory
80
+ - No orchestration layer (raw chat ≠ agent)
81
+ - No self-improvement
82
+ - Hard to tune behavior per domain
83
+
84
+ Drydock Sovereign solves both.
85
+
86
+ ---
87
+
88
+ # 4. System Architecture
89
+
90
+ ```text
91
+ ┌────────────────────┐
92
+ │ Gemma 4 26B-A4B │ ← MoE, ~4B active/token
93
+ │ (AWQ-4bit) │
94
+ └────────┬───────────┘
95
+
96
+ ┌────────▼───────────┐
97
+ │ vLLM (Docker) │ ← :8000, fp8 KV cache,
98
+ │ tensor-parallel 2 │ 131K ctx, gemma4 tool parser
99
+ └────────┬───────────┘
100
+
101
+ ┌────────▼───────────┐
102
+ │ llm_balancer │ ← :8001, OpenAI-compatible,
103
+ │ (failover/health) │ cron keepalive
104
+ └────────┬───────────┘
105
+
106
+ ┌────────▼───────────┐
107
+ │ Drydock Harness │ ← v2 (TUI) + v3 (clean rewrite)
108
+ │ • Tool execution │
109
+ │ • Loop detection │
110
+ │ • Adaptive think │
111
+ │ • search_replace │
112
+ │ • write_file safety
113
+ │ • Subagents │
114
+ └────────┬───────────┘
115
+
116
+ ┌─────────────────────┼─────────────────────────┐
117
+ │ │ │
118
+ ┌────────▼─────────┐ ┌────────▼────────┐ ┌───────────▼──────────┐
119
+ │ Admiral observer │ │ MetaHarness │ │ Stress harness + │
120
+ │ (ship) │ │ self-improve │ │ stress_watcher │
121
+ │ │ │ (local-only) │ │ (continuous regression)
122
+ └──────────────────┘ └─────────────────┘ └──────────────────────┘
123
+
124
+ ┌────────▼───────────┐
125
+ │ GraphRAG (Phase 2)│ ← persistent memory
126
+ └────────┬───────────┘
127
+
128
+ ┌────────▼───────────┐
129
+ │ Deep Noir (Phase 4)│ ← activation steering
130
+ └────────────────────┘
131
+ ```
132
+
133
+ ---
134
+
135
+ # 5. Core Components
136
+
137
+ ## 5.1 Base Model Layer
138
+
139
+ **Gemma 4 26B-A4B-it-AWQ-4bit** (Google, MoE, ~4B active per token).
140
+
141
+ Used for:
142
+
143
+ - Coding (primary)
144
+ - Reasoning over local repos and documents
145
+ - Technical assistance / shell automation
146
+ - Document understanding (text)
147
+
148
+ Operational notes:
149
+
150
+ - Thinking-token leak (`<|channel>thought<channel|>`) is filtered in
151
+ `providers.py` before display and before message-history storage.
152
+ - `tool_choice="auto"`; the gemma4 tool-call parser handles native tool
153
+ decisions.
154
+ - Adaptive thinking: OFF for routine writes, HIGH for planning and user
155
+ messages, LOW for error recovery — eliminates 30–120s hangs between file
156
+ writes (see `CLAUDE.md` learnings).
157
+
158
+ ## 5.2 Hosting / Runtime Layer
159
+
160
+ ### Primary runtime: **vLLM (already shipped)**
161
+
162
+ ```bash
163
+ # /data3/Models/start_gemma4.sh
164
+ docker run -d --gpus all --name gemma4 -p 8000:8000 \
165
+ -v /data3/Models:/models --ipc=host \
166
+ vllm/vllm-openai:gemma4 \
167
+ --model /models/Gemma-4-26B-A4B-it-AWQ-4bit \
168
+ --quantization compressed-tensors \
169
+ --tensor-parallel-size 2 \
170
+ --max-model-len 131072 \
171
+ --max-num-seqs 2 \
172
+ --gpu-memory-utilization 0.95 \
173
+ --kv-cache-dtype fp8 \
174
+ --served-model-name gemma4 \
175
+ --trust-remote-code \
176
+ --tool-call-parser gemma4 \
177
+ --enable-auto-tool-choice \
178
+ --attention-backend TRITON_ATTN
179
+ ```
180
+
181
+ | Setting | Value | Why |
182
+ | ------------------- | ---------------------- | ------------------------------------------------ |
183
+ | Quantization | AWQ-4bit (compressed-tensors) | Fits 2× RTX 4060 Ti 16GB |
184
+ | Context | 131 072 | Coding/RAG headroom |
185
+ | Tensor parallel | 2 | Both GPUs |
186
+ | KV cache dtype | `fp8` | vLLM equivalent of `q8_0` |
187
+ | Tool-call parser | `gemma4` | Native function-call decoding |
188
+ | Attention backend | `TRITON_ATTN` | Stable on Ampere/Ada; flash-attn benchmark TBD |
189
+ | Max sequences | 2 | Matches 2-GPU serving budget |
190
+
191
+ ### Portability runtimes (roadmap, customer-hardware story)
192
+
193
+ To ship onto customer hardware that prefers other stacks, Drydock must support:
194
+
195
+ - **llama.cpp / llama-server** — for single-GPU customers (RTX 3090/4090).
196
+ Recommended GGUF: **Q3\_K\_M** (community sweet spot for 24GB cards).
197
+ - **Ollama** — easiest first-install path; same Q3\_K\_M.
198
+ - **vLLM** — current baseline; multi-GPU, AWQ.
199
+ - **Failover** between providers via `llm_balancer.py` (already present).
200
+
201
+ ### Drydock connection spec (customer-tunable)
202
+
203
+ ```yaml
204
+ provider: openai_compatible
205
+ base_url: http://localhost:8001/v1 # llm_balancer in front of vLLM
206
+ model: gemma4
207
+ context_window: 131072
208
+ temperature: 0.2 # coding default; 1.0 ONLY as a loop-break lever
209
+ top_p: 0.95 # vLLM default; do not set top_k unless tuning
210
+ ```
211
+
212
+ > ⚠ **Do not** copy the `temperature: 1.0`, `top_k: 40` values from generic
213
+ > "run Gemma locally" articles. Those are tuned for chat/prose. Used as the
214
+ > default for an agentic coding harness, they cause exactly the loops and
215
+ > typos those articles attribute to "the model." Drydock uses temp 1.0
216
+ > deliberately as a loop-break escalation, not a baseline.
217
+
218
+ ## 5.3 Drydock Harness Layer
219
+
220
+ The control plane. Already shipped (v2 TUI + v3 clean rewrite).
221
+
222
+ **Already shipped:**
223
+
224
+ - Prompt routing, tool execution, shell automation
225
+ - Loop detection (advisory nudges + FORCE_STOP only on pure no-op duplicates)
226
+ - `search_replace` quality-of-life: file_path inference, "already applied"
227
+ detection, raw-code fallback
228
+ - `write_file` safety: dedup escalation, missing-sibling-import check,
229
+ stub-class anti-pattern detection
230
+ - Adaptive thinking (per-call thinking budget)
231
+ - Subagent progress streaming
232
+ - Hallucinated-tool suppression (`exit_plan_mode`, etc.)
233
+ - Auto-AGENTS.md per project (devstral-era; Gemma 4 doesn't strictly need it)
234
+
235
+ **Planned for this PRD:**
236
+
237
+ - **Read-before-write enforcement** — block / warn when a tool call would
238
+ modify a file the agent never read in this session. Directly addresses the
239
+ "model leans on internal priors instead of retrieval" failure mode (see §10).
240
+ - Pluggable retriever interface for GraphRAG (Phase 2)
241
+ - Steering hook for Deep Noir vectors (Phase 4)
242
+
243
+ ## 5.4 GraphRAG Memory Layer (Phase 2)
244
+
245
+ Persistent organisational memory — **not yet implemented.**
246
+
247
+ Sources: PDFs, Office docs, spreadsheets, markdown vaults, source code,
248
+ ticketing exports, manuals, research papers.
249
+
250
+ Pipeline:
251
+
252
+ ```text
253
+ ingest → parse → chunk → embed → vector index → graph links → reranker
254
+ ```
255
+
256
+ Used when:
257
+
258
+ - Internal knowledge required
259
+ - Context missing in working set
260
+ - Cross-session continuity matters
261
+
262
+ Operational requirement (per §10): retrieval must beat the model's prior.
263
+
264
+ ## 5.5 Deep Noir Layer (Phase 4)
265
+
266
+ Activation-steering vectors derived from the operator's own Deep Noir research
267
+ (see project memory). Targeted use cases:
268
+
269
+ - Reduced hallucinations (suppress "make stuff up" directions)
270
+ - Secure-coding mode (suppress eval/exec/shell-injection prone outputs)
271
+ - Citation mode (boost "quote source" directions in RAG flows)
272
+ - Legal-precision / analyst / domain-bias presets
273
+
274
+ Local-only. No hosted steering service.
275
+
276
+ ## 5.6 Evaluator Layer
277
+
278
+ Already partially shipped — the system already self-observes.
279
+
280
+ **Already shipped:**
281
+
282
+ - **Admiral** — live observer that detects skip clusters, RSS bloat,
283
+ raw-markdown leakage, TUI-recycle conditions, and intervenes
284
+ - **Stress harness + `stress_watcher.py`** — continuous regression run
285
+ (~1700 prompts), watcher kills leaky TUIs, babysitter relaunches harness
286
+ - **`autonomous_review.sh`** — cron-driven Claude review every 30 min
287
+ - **`functional_tests.sh` per PRD** + `BASELINE_412.md` — real feature
288
+ tests, no `--help`-only signals
289
+
290
+ **To ship in Phase 3:**
291
+
292
+ - Per-task evaluator that classifies failures into:
293
+ ```
294
+ Need memory? → enqueue GraphRAG ingest
295
+ Need retrieval? → tune reranker / chunking
296
+ Need tool? → suggest harness extension
297
+ Need steering? → flag for Deep Noir
298
+ Need fine-tune? → recommend LoRA candidate
299
+ ```
300
+ - Pareto frontier tracking (accuracy vs. token cost vs. time)
301
+ - Execution trace logging per task (Meta-Harness arXiv:2603.28052)
302
+
303
+ ---
304
+
305
+ # 6. Adaptive Failure Logic
306
+
307
+ ```text
308
+ If context missing:
309
+ → enqueue GraphRAG ingest (Phase 2) | meanwhile: inject AGENTS.md hints
310
+
311
+ If no tool available:
312
+ → emit harness extension suggestion to evaluator queue
313
+
314
+ If behavior poor on a category (e.g., language interpreters):
315
+ → surface worked example in stuck mode (already wired for tree-walking interpreter)
316
+ → Phase 4: apply Deep Noir vector
317
+
318
+ If repeated reasoning failures across sessions:
319
+ → recommend LoRA candidate (data captured by execution trace logging)
320
+
321
+ If loops detected:
322
+ → loop-break sampling (temp+0.3/0.5, freq_pen 0.4–0.7, fresh seed)
323
+ → planner reset + diversity strategy
324
+ → only escalates to FORCE_STOP on pure no-op duplicates
325
+ ```
326
+
327
+ All logic is **advisory-first**. Hard stops are reserved for objectively useless
328
+ work (identical-content rewrites). Per operator rule: safety mechanisms must
329
+ not block legitimate retries.
330
+
331
+ ---
332
+
333
+ # 7. Markets
334
+
335
+ ## Primary
336
+
337
+ - Government secure systems (defense-adjacent first; classified later)
338
+ - Defense contractors
339
+ - Regulated industries: legal, healthcare, financial services
340
+ - Industrial / OT environments
341
+ - Engineering teams with sensitive IP
342
+ - Research labs requiring data isolation
343
+
344
+ ## Beachhead (per startup direction)
345
+
346
+ Defense / gov-adjacent vertical. Target a first paid pilot ($5–25K) within
347
+ 90 days of v2 alpha.
348
+
349
+ ---
350
+
351
+ # 8. Hardware Targets
352
+
353
+ | Tier | Hardware | Status |
354
+ | ----------- | --------------------------------- | ---------------------------------------- |
355
+ | Tier 0 dev | 2× RTX 4060 Ti 16GB (current) | ✅ shipped, baseline |
356
+ | Tier 1 | RTX 3090 / 4090 (single 24GB) | Roadmap — needs llama.cpp Q3\_K\_M path |
357
+ | Tier 2 | RTX A6000 / RTX 6000 Ada (48GB) | Roadmap — single-card vLLM AWQ |
358
+ | Tier 3 | Multi-GPU server rack | Roadmap — tensor-parallel vLLM |
359
+ | **Out of scope** | Jetson AGX Orin | Explicitly excluded this cycle |
360
+
361
+ ---
362
+
363
+ # 9. Key Use Cases
364
+
365
+ ### Secure coding assistant (current strength)
366
+
367
+ - Local repo coding, bug fixing, refactors
368
+ - Shell automation with allowlist/denylist enforcement
369
+ - PRD-driven project building (370-PRD test suite)
370
+
371
+ ### Internal knowledge AI (Phase 2)
372
+
373
+ - Policy lookup, contract review, manual Q&A
374
+ - Cross-document reasoning over GraphRAG corpus
375
+
376
+ ### Research copilot (Phase 2+)
377
+
378
+ - Paper summarisation and method comparison
379
+ - Drafting with grounded citations
380
+
381
+ ### Ops assistant (current)
382
+
383
+ - Script generation, log triage, workflow automation
384
+ - Already proven by `autonomous_review.sh` running on Drydock itself
385
+
386
+ ---
387
+
388
+ # 10. Gemma 4 Operational Warning — Retrieval vs. Prior
389
+
390
+ Confirmed in real-world deployments and consistent with Drydock's own failure
391
+ modes (stub-class anti-pattern, missing-sibling-imports, "writes a function
392
+ without reading the file"): **Gemma 4 leans on its training prior even when
393
+ ground truth is in retrieved context.**
394
+
395
+ Drydock must enforce:
396
+
397
+ 1. **Retrieval-first prompts** — "answer using the provided context; if the
398
+ context is insufficient, say so." (system-prompt update)
399
+ 2. **Mandatory citations** in RAG flows — answer must reference a chunk id
400
+ 3. **Read-before-write enforcement** in the harness — if `write_file` /
401
+ `search_replace` targets an existing file the agent never read in this
402
+ session, return an advisory and inject a `read_file` nudge before
403
+ permitting the write
404
+ 4. **Evaluator grounding checks** — sample answers and verify retrieved
405
+ chunks were actually used (token overlap or citation presence)
406
+ 5. **Source-priority templates** — RAG prompt templates that pin retrieved
407
+ evidence above the model's prior
408
+
409
+ The read-before-write check is the highest-value low-risk item; it directly
410
+ mitigates several of the failure classes already in `MODEL_SHORTCOMINGS.md`.
411
+
412
+ ---
413
+
414
+ # 11. Roadmap
415
+
416
+ ### Phase 1 — 30 days (Foundation, mostly done)
417
+
418
+ - ✅ Gemma 4 local hosting (vLLM Docker)
419
+ - ✅ Drydock harness (v2 TUI + v3 rewrite)
420
+ - ✅ Coding workflows + 370-PRD benchmark
421
+ - ✅ Admiral, stress harness, autonomous review
422
+ - ▢ **Read-before-write enforcement** (this PRD's first new build)
423
+ - ▢ Customer-hardware portability bring-up (llama.cpp + Ollama backends)
424
+
425
+ ### Phase 2 — 60 days (Memory)
426
+
427
+ - ▢ GraphRAG ingestion pipeline (PDFs, code, markdown)
428
+ - ▢ Pluggable retriever interface in Drydock
429
+ - ▢ Memory routing (when to retrieve, when not to)
430
+ - ▢ Citation-mode prompt templates
431
+ - ▢ Operator dashboards
432
+
433
+ ### Phase 3 — 90 days (Self-Improvement)
434
+
435
+ - ▢ Per-task evaluator with classifier (memory / retrieval / tool / steering / tune)
436
+ - ▢ Execution trace logging (full prompts + tool calls per task)
437
+ - ▢ Anti-loop signal feedback into proposer
438
+ - ▢ Autonomous upgrade loop (local-only proposer)
439
+ - ▢ First paid pilot ($5–25K, defense-adjacent)
440
+
441
+ ### Phase 4 — 120 days (Steering)
442
+
443
+ - ▢ Deep Noir vector pipeline
444
+ - ▢ Domain modules (secure-coding, legal-precision, analyst, citation)
445
+ - ▢ Measured improvements on per-domain benchmarks
446
+
447
+ ---
448
+
449
+ # 12. Metrics
450
+
451
+ | Metric | Target | Baseline |
452
+ | ------------------------------------- | ------ | -------------------------- |
453
+ | Coding success (functional\_tests) | +25 % | 94 % on 412-suite (current)|
454
+ | Hallucinations (RAG citation miss) | −40 % | TBD — establish in Phase 2 |
455
+ | Repeat failures across sessions | −50 % | TBD — needs trace logging |
456
+ | Retrieval relevance (P@5) | +60 % | TBD — Phase 2 baseline |
457
+ | Customer cloud dependency | −70 % | Brand promise, qualitative |
458
+ | Task completion rate (interactive) | +35 % | Current shakedown baseline |
459
+ | SWE-bench file match | maintain ≥70 % | 70 % current |
460
+
461
+ Metrics with "TBD" baselines are explicitly required to be **measured** before
462
+ Phase 2 begins, not estimated.
463
+
464
+ ---
465
+
466
+ # 13. Risks
467
+
468
+ | Risk | Mitigation |
469
+ | --------------------------------------------- | --------------------------------------------------- |
470
+ | Local model weaker than frontier cloud | Harness compensates; pick tasks where local wins |
471
+ | Poor retrieval quality | Reranker, chunking discipline, evaluator gating |
472
+ | Steering instability (Deep Noir) | Sandbox eval, per-domain regression suite |
473
+ | Hardware fragmentation | Preset configs per Tier; portability roadmap above |
474
+ | Model regression from upstream releases | Pin model + image; gate updates through stress run |
475
+ | DIY copycats (open weights + Ollama) | Moat is harness + memory + steering, not weights |
476
+ | Cron clobbering active edits | `.pause_auto_release` and `.pause_watchdog` flags |
477
+ | Cloud creep in proposer / evaluator | Hard architectural rule: local-only proposer |
478
+
479
+ ---
480
+
481
+ # 14. Business Model
482
+
483
+ - **Software license** — install on customer hardware, per-seat or per-node
484
+ - **Appliance** — prebuilt secure workstation (Tier 1/2 hardware, image
485
+ preloaded, factory-trusted)
486
+ - **Enterprise support** — annual maintenance, signed updates
487
+ - **Premium secure deployments** — government / classified pricing, on-prem
488
+ build/audit support
489
+ - **Open core** — harness + agent loop OSS, evaluator/steering/retrieval
490
+ bundles commercial
491
+
492
+ ---
493
+
494
+ # 15. Strategic Moat
495
+
496
+ Not the model weights (open). Not the quantization (commodity). Not the
497
+ harness alone (replicable).
498
+
499
+ The compound moat:
500
+
501
+ - Self-improvement logic (evaluator + autonomous review + stress)
502
+ - Memory systems (GraphRAG + retrieval discipline)
503
+ - Adaptive routing (per-failure-class actions)
504
+ - Activation steering (Deep Noir, derived from operator's own research)
505
+ - Secure deployment expertise (air-gap, signed updates, audit logs)
506
+ - Polished local UX (TUI today, appliance tomorrow)
507
+
508
+ ---
509
+
510
+ # 16. Final Thesis
511
+
512
+ Open models are commodities.
513
+ Inference hosting is commoditizing.
514
+ RAG is commoditizing.
515
+
516
+ What stays valuable:
517
+
518
+ > **A local AI system that knows why it failed and fixes itself.**
519
+
520
+ That is Drydock Sovereign AI Stack v2.
@@ -1343,12 +1343,17 @@ class AgentLoop:
1343
1343
  result_dict = result_model.model_dump()
1344
1344
  text = "\n".join(f"{k}: {v}" for k, v in result_dict.items())
1345
1345
 
1346
- # After task subagent completes, nudge the model to continue rather
1347
- # than stall (Gemma 4 sees "completed: True" and produces empty turn).
1348
- if tool_call.tool_name == "task" and result_dict.get("completed"):
1349
- self._inject_system_note(
1350
- "Task complete. Continue with your next step — call the next tool now."
1351
- )
1346
+ # After task subagent finishes (completed or cancelled), nudge the
1347
+ # model to continue — Gemma 4 produces an empty turn without this.
1348
+ if tool_call.tool_name == "task":
1349
+ if result_dict.get("completed"):
1350
+ self._inject_system_note(
1351
+ "Task complete. Continue with your next step — call the next tool now."
1352
+ )
1353
+ else:
1354
+ self._inject_system_note(
1355
+ "Task subagent stopped. Continue with your current goal — call the next tool now."
1356
+ )
1352
1357
 
1353
1358
  # After a successful bash test of built code, nudge to wrap up
1354
1359
  if tool_call.tool_name in ("bash", "run_command"):