drydock-cli 2.7.29__tar.gz → 2.7.30__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 (690) hide show
  1. drydock_cli-2.7.30/.auto_release.lock +1 -0
  2. drydock_cli-2.7.30/.claude/scheduled_tasks.lock +1 -0
  3. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/PKG-INFO +1 -1
  4. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/SOVEREIGN_PRD.md +112 -36
  5. drydock_cli-2.7.30/TRIAGE_v1.md +128 -0
  6. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/bash.py +18 -10
  7. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/read_file.py +28 -12
  8. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/pyproject.toml +1 -1
  9. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_bash.py +12 -1
  10. drydock_cli-2.7.30/tests/tools/test_read_file_dedup_alternating_offset.py +109 -0
  11. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_read_file_dedup_reembed.py +6 -3
  12. drydock_cli-2.7.30/trip_log.md +719 -0
  13. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/uv.lock +1 -1
  14. drydock_cli-2.7.29/.auto_release.lock +0 -1
  15. drydock_cli-2.7.29/.claude/scheduled_tasks.lock +0 -1
  16. drydock_cli-2.7.29/trip_log.md +0 -1523
  17. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/CODEOWNERS +0 -0
  18. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  19. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  20. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/build-and-upload.yml +0 -0
  22. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/ci.yml +0 -0
  23. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/issue-labeler.yml +0 -0
  24. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.github/workflows/release.yml +0 -0
  25. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.gitignore +0 -0
  26. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.pre-commit-config.yaml +0 -0
  27. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.python-version +0 -0
  28. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.typos.toml +0 -0
  29. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.vscode/extensions.json +0 -0
  30. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.vscode/launch.json +0 -0
  31. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/.vscode/settings.json +0 -0
  32. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/AGENTS.md +0 -0
  33. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/Admiral.md +0 -0
  34. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/BASELINE_412.md +0 -0
  35. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/CHANGELOG.md +0 -0
  36. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/CLAUDE.md +0 -0
  37. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/CONTRIBUTING.md +0 -0
  38. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/DEPLOYMENT.md +0 -0
  39. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/Drydock_rebrand.md +0 -0
  40. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/LICENSE +0 -0
  41. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/MODEL_SHORTCOMINGS.md +0 -0
  42. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/NOTICE +0 -0
  43. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/OVERNIGHT_PROGRESS.md +0 -0
  44. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  45. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/PERF_SWEEP_PLAN.md +0 -0
  46. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/PRD.md +0 -0
  47. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/README.md +0 -0
  48. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/action.yml +0 -0
  49. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/README.md +0 -0
  50. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results1.tsv +0 -0
  51. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results13.tsv +0 -0
  52. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results14.tsv +0 -0
  53. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results15.tsv +0 -0
  54. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results16.tsv +0 -0
  55. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results17.tsv +0 -0
  56. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results18.tsv +0 -0
  57. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results19.tsv +0 -0
  58. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results2.tsv +0 -0
  59. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results20.tsv +0 -0
  60. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results3.tsv +0 -0
  61. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results4.tsv +0 -0
  62. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results5.tsv +0 -0
  63. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results6.tsv +0 -0
  64. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results7.tsv +0 -0
  65. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results8.tsv +0 -0
  66. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results9.tsv +0 -0
  67. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/baseline_history/results_evolved_v1.tsv +0 -0
  68. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/distribution/zed/LICENSE +0 -0
  69. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/distribution/zed/extension.toml +0 -0
  70. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/distribution/zed/icons/mistral_vibe.svg +0 -0
  71. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/docs/README.md +0 -0
  72. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/docs/acp-setup.md +0 -0
  73. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/docs/proxy-setup.md +0 -0
  74. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/__init__.py +0 -0
  75. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/__init__.py +0 -0
  76. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/acp_agent_loop.py +0 -0
  77. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/acp_logger.py +0 -0
  78. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/entrypoint.py +0 -0
  79. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/__init__.py +0 -0
  80. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/base.py +0 -0
  81. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/bash.py +0 -0
  82. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/read_file.py +0 -0
  83. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/search_replace.py +0 -0
  84. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/todo.py +0 -0
  85. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/builtins/write_file.py +0 -0
  86. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/tools/session_update.py +0 -0
  87. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/acp/utils.py +0 -0
  88. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/__init__.py +0 -0
  89. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/detectors.py +0 -0
  90. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/detectors_proposed.py +0 -0
  91. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/history.py +0 -0
  92. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/interventions.py +0 -0
  93. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/llm_analyzer.py +0 -0
  94. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/metrics.py +0 -0
  95. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/opus_escalator.py +0 -0
  96. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/persistence.py +0 -0
  97. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/policy.py +0 -0
  98. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/proposer.py +0 -0
  99. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/stager.py +0 -0
  100. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/task_classifier.py +0 -0
  101. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/tuning.py +0 -0
  102. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/validator.py +0 -0
  103. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/admiral/worker.py +0 -0
  104. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/__init__.py +0 -0
  105. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/__init__.py +0 -0
  106. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/base.py +0 -0
  107. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/path_completion.py +0 -0
  108. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/autocompletion/slash_command.py +0 -0
  109. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/cli.py +0 -0
  110. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/clipboard.py +0 -0
  111. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/commands.py +0 -0
  112. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/entrypoint.py +0 -0
  113. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/history_manager.py +0 -0
  114. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  115. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  116. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  117. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/terminal_setup.py +0 -0
  118. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/__init__.py +0 -0
  119. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  120. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/app.py +0 -0
  121. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/app.tcss +0 -0
  122. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/external_editor.py +0 -0
  123. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  124. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  125. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  126. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  127. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  128. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  129. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  130. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  131. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  132. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  133. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  134. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  135. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  136. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  137. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  138. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  139. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  140. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  141. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  142. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  143. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  144. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  145. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  146. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  147. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  148. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  149. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  150. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  151. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  152. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  153. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  154. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  155. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  156. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  157. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  158. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  159. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  160. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/history.py +0 -0
  161. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  162. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/textual_ui/windowing/state.py +0 -0
  163. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/__init__.py +0 -0
  164. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  165. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  166. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  167. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  168. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  169. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/update.py +0 -0
  170. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/cli/update_notifier/whats_new.py +0 -0
  171. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/__init__.py +0 -0
  172. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agent_loop.py +0 -0
  173. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agents/__init__.py +0 -0
  174. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agents/manager.py +0 -0
  175. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/agents/models.py +0 -0
  176. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/auth/__init__.py +0 -0
  177. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/auth/crypto.py +0 -0
  178. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/auth/github.py +0 -0
  179. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/__init__.py +0 -0
  180. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/completers.py +0 -0
  181. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  182. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  183. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  184. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  185. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  186. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/fuzzy.py +0 -0
  187. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/path_prompt.py +0 -0
  188. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  189. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/build_orchestrator.py +0 -0
  190. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/checkpoint.py +0 -0
  191. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/__init__.py +0 -0
  192. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/_settings.py +0 -0
  193. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/doctor.py +0 -0
  194. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/harness_files/__init__.py +0 -0
  195. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  196. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/config/harness_files/_paths.py +0 -0
  197. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/consultant.py +0 -0
  198. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/drydock_states.py +0 -0
  199. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/hooks.py +0 -0
  200. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/__init__.py +0 -0
  201. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/anthropic.py +0 -0
  202. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/base.py +0 -0
  203. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/factory.py +0 -0
  204. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/generic.py +0 -0
  205. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/mistral.py +0 -0
  206. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  207. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/backend/vertex.py +0 -0
  208. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/exceptions.py +0 -0
  209. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/format.py +0 -0
  210. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/message_utils.py +0 -0
  211. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/llm/types.py +0 -0
  212. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/logger.py +0 -0
  213. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/middleware.py +0 -0
  214. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/output_formatters.py +0 -0
  215. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/__init__.py +0 -0
  216. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/_drydock_home.py +0 -0
  217. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/_local_config_walk.py +0 -0
  218. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/paths/conventions.py +0 -0
  219. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/plan_session.py +0 -0
  220. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/plugins.py +0 -0
  221. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/programmatic.py +0 -0
  222. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/__init__.py +0 -0
  223. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/builder.md +0 -0
  224. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/cli.md +0 -0
  225. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/compact.md +0 -0
  226. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/dangerous_directory.md +0 -0
  227. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/diagnostic.md +0 -0
  228. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/explore.md +0 -0
  229. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/gemma4.md +0 -0
  230. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/planner.md +0 -0
  231. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/project_context.md +0 -0
  232. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/prompts/tests.md +0 -0
  233. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/proxy_setup.py +0 -0
  234. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/agent_memory.py +0 -0
  235. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/checkpoints.py +0 -0
  236. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/session_loader.py +0 -0
  237. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/session_logger.py +0 -0
  238. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/session_migration.py +0 -0
  239. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session/state_file.py +0 -0
  240. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/session_checker.py +0 -0
  241. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/__init__.py +0 -0
  242. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/manager.py +0 -0
  243. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/models.py +0 -0
  244. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/skills/parser.py +0 -0
  245. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/slug.py +0 -0
  246. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/system_prompt.py +0 -0
  247. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/telemetry/__init__.py +0 -0
  248. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/telemetry/send.py +0 -0
  249. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/errors.py +0 -0
  250. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/git.py +0 -0
  251. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/nuage.py +0 -0
  252. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/teleport.py +0 -0
  253. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/teleport/types.py +0 -0
  254. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/base.py +0 -0
  255. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/_task_manager.py +0 -0
  256. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  257. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/cron.py +0 -0
  258. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  259. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/glob_tool.py +0 -0
  260. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/grep.py +0 -0
  261. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  262. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/lsp.py +0 -0
  263. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  264. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  265. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/powershell.py +0 -0
  266. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  267. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  268. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  269. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  270. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  271. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  272. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  273. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  274. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  275. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  276. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  277. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  278. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  279. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  280. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/task.md +0 -0
  281. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  282. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  283. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  284. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  285. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  286. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  287. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  288. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/search_replace.py +0 -0
  289. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/task.py +0 -0
  290. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/todo.py +0 -0
  291. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/tool_search.py +0 -0
  292. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/webfetch.py +0 -0
  293. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/websearch.py +0 -0
  294. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/worktree.py +0 -0
  295. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/builtins/write_file.py +0 -0
  296. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/injection_guard.py +0 -0
  297. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/manager.py +0 -0
  298. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp/__init__.py +0 -0
  299. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp/registry.py +0 -0
  300. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp/tools.py +0 -0
  301. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/mcp_sampling.py +0 -0
  302. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/ui.py +0 -0
  303. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/tools/utils.py +0 -0
  304. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/trusted_folders.py +0 -0
  305. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/types.py +0 -0
  306. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/core/utils.py +0 -0
  307. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/__init__.py +0 -0
  308. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/base.py +0 -0
  309. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/onboarding.tcss +0 -0
  310. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/__init__.py +0 -0
  311. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/api_key.py +0 -0
  312. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/choice.py +0 -0
  313. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/local_model.py +0 -0
  314. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/onboarding/screens/welcome.py +0 -0
  315. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  316. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  317. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/__init__.py +0 -0
  318. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/api-design/SKILL.md +0 -0
  319. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/audit-tests/SKILL.md +0 -0
  320. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/batch/SKILL.md +0 -0
  321. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/commit-code/SKILL.md +0 -0
  322. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/context-summary/SKILL.md +0 -0
  323. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/create-presentation/SKILL.md +0 -0
  324. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/deep-research/SKILL.md +0 -0
  325. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/deploy/SKILL.md +0 -0
  326. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/diff-review/SKILL.md +0 -0
  327. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/doc-gen/SKILL.md +0 -0
  328. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/explain-code/SKILL.md +0 -0
  329. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/explore-code/SKILL.md +0 -0
  330. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/fix-issue/SKILL.md +0 -0
  331. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/git-ops/SKILL.md +0 -0
  332. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/init-project/SKILL.md +0 -0
  333. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/investigate/SKILL.md +0 -0
  334. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/loop/SKILL.md +0 -0
  335. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/migrate/SKILL.md +0 -0
  336. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/perf-analyze/SKILL.md +0 -0
  337. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/plan-impl/SKILL.md +0 -0
  338. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/pr-review/SKILL.md +0 -0
  339. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/refactor/SKILL.md +0 -0
  340. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/regex-help/SKILL.md +0 -0
  341. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/review/SKILL.md +0 -0
  342. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/security-review/SKILL.md +0 -0
  343. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/ship/SKILL.md +0 -0
  344. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/simplify/SKILL.md +0 -0
  345. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/strong-tests/SKILL.md +0 -0
  346. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/skills/test-verify/SKILL.md +0 -0
  347. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock/whats_new.md +0 -0
  348. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock-acp.spec +0 -0
  349. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/drydock_terms.md +0 -0
  350. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/flake.lock +0 -0
  351. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/flake.nix +0 -0
  352. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/nohup.out +0 -0
  353. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/perf_results/baseline_1777672181.json +0 -0
  354. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/perf_results/baseline_1777672218.json +0 -0
  355. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/perf_results/baseline_1777672322.json +0 -0
  356. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/README.md +0 -0
  357. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/config_base.toml +0 -0
  358. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/config_best.toml +0 -0
  359. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/domain_spec.md +0 -0
  360. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/experimenter.py +0 -0
  361. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/kernel.py +0 -0
  362. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/mini_prd.md +0 -0
  363. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/mini_prompts.txt +0 -0
  364. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/proposer.py +0 -0
  365. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/research/results.tsv +0 -0
  366. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/resume.md +0 -0
  367. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/README.md +0 -0
  368. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/admiral_probe.py +0 -0
  369. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/audit_sampler.py +0 -0
  370. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/auto_generate_tests.py +0 -0
  371. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/auto_release.sh +0 -0
  372. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/auto_test_loop.sh +0 -0
  373. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/autonomous_review.sh +0 -0
  374. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/autonomous_review_prompt.md +0 -0
  375. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/backup.sh +0 -0
  376. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/bump_version.py +0 -0
  377. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/comprehensive_loop.py +0 -0
  378. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/deploy_to_github.sh +0 -0
  379. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/discover_cli_tools.sh +0 -0
  380. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/evolve_tests.py +0 -0
  381. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/gen_2000_prompts.py +0 -0
  382. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/install.sh +0 -0
  383. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/llm_balancer.py +0 -0
  384. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/mega_loop.py +0 -0
  385. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/meta_ralph_loop.py +0 -0
  386. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/monitor_swebench.sh +0 -0
  387. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/monitor_test_battery.sh +0 -0
  388. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/notify_release.py +0 -0
  389. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/oss_task_harness.py +0 -0
  390. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/overnight_agents_test.sh +0 -0
  391. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/perf_baseline_when_idle.sh +0 -0
  392. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/perf_sweep.py +0 -0
  393. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/poll_issues.sh +0 -0
  394. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/port_task.py +0 -0
  395. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/prepare_release.py +0 -0
  396. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/publish_to_pypi.sh +0 -0
  397. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/ralph_loop.py +0 -0
  398. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/research_babysitter.sh +0 -0
  399. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/session_loop_audit.py +0 -0
  400. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown.py +0 -0
  401. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_interactive.py +0 -0
  402. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_regression.sh +0 -0
  403. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_suite.sh +0 -0
  404. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/shakedown_variance.sh +0 -0
  405. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_babysitter.sh +0 -0
  406. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_50.txt +0 -0
  407. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_realuser.txt +0 -0
  408. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_tool_agent.txt +0 -0
  409. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  410. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_shakedown.py +0 -0
  411. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_telegram_status.py +0 -0
  412. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/stress_watcher.py +0 -0
  413. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/telegram_bot.py +0 -0
  414. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_bank.sh +0 -0
  415. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_full.sh +0 -0
  416. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_smoke.sh +0 -0
  417. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/test_tui_path.py +0 -0
  418. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/tui_test.py +0 -0
  419. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/scripts/vllm_failover.sh +0 -0
  420. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/test/project/dummy +0 -0
  421. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/__init__.py +0 -0
  422. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/conftest.py +0 -0
  423. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_acp.py +0 -0
  424. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_agent_thought.py +0 -0
  425. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_bash.py +0 -0
  426. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_compact_session_updates.py +0 -0
  427. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_content.py +0 -0
  428. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_initialize.py +0 -0
  429. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_list_sessions.py +0 -0
  430. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_load_session.py +0 -0
  431. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_multi_session.py +0 -0
  432. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_new_session.py +0 -0
  433. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_proxy_setup_acp.py +0 -0
  434. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_read_file.py +0 -0
  435. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_search_replace.py +0 -0
  436. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_set_config_option.py +0 -0
  437. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_set_mode.py +0 -0
  438. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_set_model.py +0 -0
  439. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_tool_call_session_update.py +0 -0
  440. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_utils.py +0 -0
  441. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/acp/test_write_file.py +0 -0
  442. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_file_indexer.py +0 -0
  443. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_fuzzy.py +0 -0
  444. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  445. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  446. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_completion_controller.py +0 -0
  447. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  448. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_slash_command_controller.py +0 -0
  449. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  450. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/__init__.py +0 -0
  451. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/data/__init__.py +0 -0
  452. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/data/fireworks.py +0 -0
  453. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/data/mistral.py +0 -0
  454. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_anthropic_adapter.py +0 -0
  455. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_backend.py +0 -0
  456. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  457. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_reasoning_adapter.py +0 -0
  458. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  459. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  460. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  461. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  462. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_bell_notifications.py +0 -0
  463. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_braille_renderer.py +0 -0
  464. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_clipboard.py +0 -0
  465. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_commands.py +0 -0
  466. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_copy_shortcuts.py +0 -0
  467. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_external_editor.py +0 -0
  468. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_no_markup_static.py +0 -0
  469. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_question_app.py +0 -0
  470. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_spinner.py +0 -0
  471. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_switching_mode.py +0 -0
  472. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  473. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  474. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_session_resume.py +0 -0
  475. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/test_ui_skill_dispatch.py +0 -0
  476. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/textual_ui/__init__.py +0 -0
  477. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/cli/textual_ui/test_session_picker.py +0 -0
  478. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/conftest.py +0 -0
  479. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_agents.py +0 -0
  480. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_auth_crypto.py +0 -0
  481. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_auth_github.py +0 -0
  482. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  483. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  484. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_config_load_dotenv.py +0 -0
  485. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_config_paths.py +0 -0
  486. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_config_resolution.py +0 -0
  487. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_file_logging.py +0 -0
  488. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_plan_session.py +0 -0
  489. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_proxy_setup.py +0 -0
  490. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_slug.py +0 -0
  491. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_telemetry_send.py +0 -0
  492. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_teleport_git.py +0 -0
  493. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_teleport_nuage.py +0 -0
  494. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_teleport_service.py +0 -0
  495. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_trusted_folders.py +0 -0
  496. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/core/test_utils.py +0 -0
  497. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/common.py +0 -0
  498. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/conftest.py +0 -0
  499. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/mock_server.py +0 -0
  500. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  501. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/test_cli_tui_streaming.py +0 -0
  502. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  503. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/fixtures/doc_qa_system_prd.md +0 -0
  504. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/__init__.py +0 -0
  505. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/mock_backend_factory.py +0 -0
  506. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/mock_entrypoint.py +0 -0
  507. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/mock/utils.py +0 -0
  508. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/onboarding/test_run_onboarding.py +0 -0
  509. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/onboarding/test_ui_onboarding.py +0 -0
  510. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/session/test_session_loader.py +0 -0
  511. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/session/test_session_logger.py +0 -0
  512. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/session/test_session_migration.py +0 -0
  513. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/conftest.py +0 -0
  514. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/test_manager.py +0 -0
  515. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/test_models.py +0 -0
  516. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/skills/test_parser.py +0 -0
  517. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  518. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  519. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  520. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  521. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  522. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  523. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  524. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  525. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  526. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  527. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  528. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  529. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  530. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  531. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  532. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  533. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  534. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  535. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  536. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  537. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  538. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  539. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  540. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  541. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  542. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  543. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  544. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  545. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  546. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  547. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  548. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  549. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  550. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  551. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  552. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  553. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  554. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  555. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  556. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  557. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  558. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  559. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  560. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  561. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  562. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  563. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  564. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  565. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  566. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  567. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  568. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  569. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  570. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  571. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  572. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  573. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  574. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  575. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  576. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  577. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/base_snapshot_test_app.py +0 -0
  578. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/conftest.py +0 -0
  579. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/snap_compare.py +0 -0
  580. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  581. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  582. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  583. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  584. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  585. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  586. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  587. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  588. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  589. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  590. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  591. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  592. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  593. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  594. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/stubs/fake_backend.py +0 -0
  595. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/stubs/fake_client.py +0 -0
  596. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/stubs/fake_tool.py +0 -0
  597. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral.py +0 -0
  598. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral_phase3.py +0 -0
  599. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral_proposed.py +0 -0
  600. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_admiral_struggle_dedup.py +0 -0
  601. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_auto_compact.py +0 -0
  602. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_backend.py +0 -0
  603. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_observer_streaming.py +0 -0
  604. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_stats.py +0 -0
  605. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_tasks.py +0 -0
  606. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agent_tool_call.py +0 -0
  607. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_agents.py +0 -0
  608. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_build.py +0 -0
  609. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_debug.py +0 -0
  610. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_multiagent.py +0 -0
  611. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_prd.py +0 -0
  612. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_prd_extended.py +0 -0
  613. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_tools.py +0 -0
  614. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_bank_update.py +0 -0
  615. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_build_projects.py +0 -0
  616. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_checkpoint.py +0 -0
  617. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_cli_programmatic_preload.py +0 -0
  618. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_current_bugs.py +0 -0
  619. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_drydock_regression.py +0 -0
  620. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_drydock_tasks.py +0 -0
  621. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  622. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_full_regression.py +0 -0
  623. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_hallucinated_tool_suppression.py +0 -0
  624. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_history_manager.py +0 -0
  625. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_integration.py +0 -0
  626. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_issue_fixes.py +0 -0
  627. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_loop_detection.py +0 -0
  628. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_message_id.py +0 -0
  629. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_message_merging.py +0 -0
  630. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_middleware.py +0 -0
  631. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_multi_agent.py +0 -0
  632. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_read_file_not_found_listing.py +0 -0
  633. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_real_failures.py +0 -0
  634. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_real_issues.py +0 -0
  635. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_real_workflow.py +0 -0
  636. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_reasoning_content.py +0 -0
  637. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_search_replace_args_not_truncated.py +0 -0
  638. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_smoke.py +0 -0
  639. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_system_prompt.py +0 -0
  640. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_tagged_text.py +0 -0
  641. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_task_complete_nudge.py +0 -0
  642. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_tool_args.py +0 -0
  643. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncate_args_valid_json.py +0 -0
  644. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncated_arg_path_hint.py +0 -0
  645. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncated_search_replace_escalation.py +0 -0
  646. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_truncated_write_escalation.py +0 -0
  647. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_ui_external_editor.py +0 -0
  648. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_ui_input_history.py +0 -0
  649. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_user_issues.py +0 -0
  650. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_wall_of_text_rescue.py +0 -0
  651. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_workloads.py +0 -0
  652. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/test_write_file_missing_path.py +0 -0
  653. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/testbank_helpers.py +0 -0
  654. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_ask_user_question.py +0 -0
  655. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_exit_plan_mode.py +0 -0
  656. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_grep.py +0 -0
  657. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_invoke_context.py +0 -0
  658. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  659. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_manager_get_tool_config.py +0 -0
  660. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_mcp.py +0 -0
  661. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_mcp_sampling.py +0 -0
  662. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_read_file_directory.py +0 -0
  663. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_read_file_limit_truncation.py +0 -0
  664. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_append_fallback.py +0 -0
  665. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_dir_path.py +0 -0
  666. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_empty_content.py +0 -0
  667. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_hard_stop.py +0 -0
  668. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_malformed_block.py +0 -0
  669. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  670. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  671. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_task.py +0 -0
  672. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_ui_bash_execution.py +0 -0
  673. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_webfetch.py +0 -0
  674. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_websearch.py +0 -0
  675. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  676. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  677. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  678. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  679. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_do_update.py +0 -0
  680. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  681. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_github_update_gateway.py +0 -0
  682. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  683. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_ui_update_notification.py +0 -0
  684. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_update_use_case.py +0 -0
  685. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/tests/update_notifier/test_whats_new.py +0 -0
  686. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/README.md +0 -0
  687. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/cli_subcommand_dispatch.py +0 -0
  688. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/lookup.json +0 -0
  689. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/sql_parser.py +0 -0
  690. {drydock_cli-2.7.29 → drydock_cli-2.7.30}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2123904
@@ -0,0 +1 @@
1
+ {"sessionId":"71137671-5857-422e-ac69-082962e223e2","pid":2049518,"procStart":"416025348","acquiredAt":1777694583206}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.29
3
+ Version: 2.7.30
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Project Name: **Drydock Sovereign AI Stack v2**
4
4
 
5
- ### Local Adaptive AI System — Gemma 4 26B + Drydock + GraphRAG (roadmap) + Deep Noir (roadmap)
5
+ ### Local Adaptive AI System — Gemma 4 26B + Drydock + GraphRAG + Deep Noir (parallel v2 modules)
6
6
 
7
7
  ---
8
8
 
@@ -19,7 +19,7 @@ Drydock has already committed to or measured, the draft loses. Specifically:
19
19
  | | | escalate temp to ~1.0 deliberately as a loop-break lever (`agent_loop.py:2032`). |
20
20
  | KV cache `q8_0` | `--kv-cache-dtype fp8` | vLLM-native equivalent. Different ecosystem (vLLM vs. llama.cpp). |
21
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. |
22
+ | GraphRAG / Deep Noir as faith-based "current" | **First-class roadmap modules**, both ship | They are deployable v2 capabilities, not contingent on classifier verdict. Classifier sequences engineering attention; it doesn't gate module existence. |
23
23
  | Cloud-assisted proposer (anywhere) | **Local-only proposer** | Air-gap is the product pitch; cloud proposer contradicts the brand. |
24
24
 
25
25
  ---
@@ -38,14 +38,36 @@ The system pairs:
38
38
  - **vLLM** — production-grade inference server (Docker, tensor-parallel)
39
39
  - **Drydock harness** — orchestration, tool use, loop detection, Admiral
40
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
41
+ - **GraphRAG memory** — first-class deployable module; persistent context for
42
+ customer corpora (PDFs, code, manuals, tickets). Roadmap: Phase 2 first cut,
43
+ hardened in Phase 3.
44
+ - **Deep Noir activation steering** — first-class deployable module; behavior
45
+ shaping via activation vectors derived from the operator's own research.
46
+ Roadmap: Phase 3 first cut, deepened in Phase 4.
47
+ - **Evaluator + classifier loop** — already partially shipped (Admiral + stress
48
+ + autonomous review). The classifier (added in Phase 2) sequences which
49
+ module gets engineering attention next; it does **not** gate whether a module
50
+ ships.
46
51
 
47
52
  Category claim: **AI that improves after installation.**
48
53
 
54
+ ### Module posture (read this before reading the rest)
55
+
56
+ Two questions are kept separate throughout this PRD:
57
+
58
+ 1. **What ships as a deployable customer module?**
59
+ *All three:* harness, GraphRAG, Deep Noir. Defense-adjacent and regulated
60
+ customers ask for these by name; the answer is "yes, here's the module."
61
+ 2. **Where does engineering attention go next?**
62
+ *Classifier-driven.* The Phase 2 classifier tags each failure as
63
+ harness-class / steering-class / retrieval-class / model-prior /
64
+ ambiguous-input and feeds a prioritized backlog. The classifier sequences
65
+ our work; it does **not** decide whether a module exists.
66
+
67
+ The product is the **living loop** that ties these together: failures get
68
+ classified, the right module gets the fix, the customer's deployment quietly
69
+ improves over time.
70
+
49
71
  ---
50
72
 
51
73
  # 2. Product Vision
@@ -122,11 +144,11 @@ Drydock Sovereign solves both.
122
144
  └──────────────────┘ └─────────────────┘ └──────────────────────┘
123
145
 
124
146
  ┌────────▼───────────┐
125
- │ GraphRAG (Phase 2)│ ← persistent memory
147
+ │ GraphRAG (Phase 2)│ ← persistent memory module
126
148
  └────────┬───────────┘
127
149
 
128
150
  ┌────────▼───────────┐
129
- │ Deep Noir (Phase 4)│ ← activation steering
151
+ │ Deep Noir (Phase 3)│ ← activation steering module
130
152
  └────────────────────┘
131
153
  ```
132
154
 
@@ -237,12 +259,18 @@ The control plane. Already shipped (v2 TUI + v3 clean rewrite).
237
259
  - **Read-before-write enforcement** — block / warn when a tool call would
238
260
  modify a file the agent never read in this session. Directly addresses the
239
261
  "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)
262
+ - Pluggable **retriever interface** for GraphRAG (Phase 2 — module ships then)
263
+ - **Steering hook** for Deep Noir vectors (Phase 3 — module ships then)
264
+ - Failure-class **classifier** signal consumer (routes incoming
265
+ classifier output to harness / GraphRAG / Deep Noir dispatchers)
266
+
267
+ ## 5.4 GraphRAG Memory Layer — Phase 2 first cut, hardened in Phase 3
242
268
 
243
- ## 5.4 GraphRAG Memory Layer (Phase 2)
269
+ **Status:** first-class deployable module. Not yet implemented; ships as a
270
+ parallel v2 deliverable alongside Deep Noir.
244
271
 
245
- Persistent organisational memory **not yet implemented.**
272
+ Persistent organisational memory. Customers turn it on by pointing it at their
273
+ corpus; it ingests, indexes, and serves grounded retrieval to Drydock.
246
274
 
247
275
  Sources: PDFs, Office docs, spreadsheets, markdown vaults, source code,
248
276
  ticketing exports, manuals, research papers.
@@ -250,9 +278,22 @@ ticketing exports, manuals, research papers.
250
278
  Pipeline:
251
279
 
252
280
  ```text
253
- ingest → parse → chunk → embed → vector index → graph links → reranker
281
+ ingest → parse → chunk → embed → vector index → graph links → reranker → citation
254
282
  ```
255
283
 
284
+ Drydock-side integration:
285
+
286
+ - Pluggable retriever interface in the harness (so vector-only and
287
+ graph-augmented retrievers swap cleanly)
288
+ - Source-priority prompt templates (retrieved evidence pinned above prior)
289
+ - Mandatory citation in RAG flows; evaluator verifies citations resolve to
290
+ retrieved chunks
291
+ - Read-before-write enforcement (§5.3) makes retrievals actually get used,
292
+ not bypassed in favor of the model's prior
293
+
294
+ Local-only. No hosted vector DB. Embedding model and reranker run on the same
295
+ host as vLLM.
296
+
256
297
  Used when:
257
298
 
258
299
  - Internal knowledge required
@@ -261,17 +302,37 @@ Used when:
261
302
 
262
303
  Operational requirement (per §10): retrieval must beat the model's prior.
263
304
 
264
- ## 5.5 Deep Noir Layer (Phase 4)
305
+ ## 5.5 Deep Noir Activation Steering — Phase 3 first cut, deepened in Phase 4
306
+
307
+ **Status:** first-class deployable module. Ships as a parallel v2 deliverable
308
+ alongside GraphRAG.
265
309
 
266
310
  Activation-steering vectors derived from the operator's own Deep Noir research
267
- (see project memory). Targeted use cases:
311
+ (see project memory). Customers select preset modes per session or per
312
+ deployment; Drydock applies the chosen vector via vLLM's logit/activation
313
+ hooks (or a sidecar if vLLM upstream support lags).
314
+
315
+ Targeted use cases:
316
+
317
+ - **Reduced-hallucination mode** — suppress "make stuff up" directions; pairs
318
+ well with GraphRAG citation enforcement
319
+ - **Secure-coding mode** — suppress eval/exec/shell-injection-prone outputs
320
+ - **Citation mode** — boost "quote source" directions in RAG flows
321
+ - **Legal-precision / analyst / domain-bias presets** — opinionated stacks
322
+ for verticals
323
+
324
+ Drydock-side integration:
268
325
 
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
326
+ - Steering hook in the harness so the active vector is applied per request
327
+ - Per-failure-class routing: if the classifier tags a failure as
328
+ steering-class, Drydock surfaces "try mode X" to the user / queues a vector
329
+ refinement candidate
330
+ - Sandbox eval suite: each new vector is regression-tested against a category
331
+ benchmark before promotion
273
332
 
274
- Local-only. No hosted steering service.
333
+ Local-only. No hosted steering service. Vectors ship with the deployment;
334
+ retraining / refinement runs on customer hardware (per local-only-proposer
335
+ rule).
275
336
 
276
337
  ## 5.6 Evaluator Layer
277
338
 
@@ -313,7 +374,7 @@ If no tool available:
313
374
 
314
375
  If behavior poor on a category (e.g., language interpreters):
315
376
  → surface worked example in stuck mode (already wired for tree-walking interpreter)
316
- → Phase 4: apply Deep Noir vector
377
+ → Phase 3+: apply Deep Noir vector for that category
317
378
 
318
379
  If repeated reasoning failures across sessions:
319
380
  → recommend LoRA candidate (data captured by execution trace logging)
@@ -413,36 +474,51 @@ mitigates several of the failure classes already in `MODEL_SHORTCOMINGS.md`.
413
474
 
414
475
  # 11. Roadmap
415
476
 
416
- ### Phase 1 — 30 days (Foundation, mostly done)
477
+ ### Phase 1 — 30 days (Foundation + perf floor)
417
478
 
418
479
  - ✅ Gemma 4 local hosting (vLLM Docker)
419
480
  - ✅ Drydock harness (v2 TUI + v3 rewrite)
420
481
  - ✅ Coding workflows + 370-PRD benchmark
421
482
  - ✅ Admiral, stress harness, autonomous review
422
- - ▢ **Read-before-write enforcement** (this PRD's first new build)
483
+ - ▢ **Hosting performance sweep** lock the inference floor (`PERF_SWEEP_PLAN.md`)
484
+ - ▢ **Manual failure triage** — seed the classifier taxonomy from existing
485
+ diagnostic data (`MODEL_SHORTCOMINGS.md`, `BASELINE_412.md`, Admiral logs)
486
+ - ▢ **Read-before-write enforcement** in the harness
423
487
  - ▢ Customer-hardware portability bring-up (llama.cpp + Ollama backends)
424
488
 
425
- ### Phase 2 — 60 days (Memory)
489
+ ### Phase 2 — 60 days (Classifier + GraphRAG first cut)
426
490
 
427
- - ▢ GraphRAG ingestion pipeline (PDFs, code, markdown)
428
- - Pluggable retriever interface in Drydock
491
+ - ▢ **Failure classifier** extends Admiral / runs as a sibling; emits
492
+ structured signals tagged harness-class / retrieval-class / steering-class /
493
+ model-prior / ambiguous-input
494
+ - ▢ **GraphRAG ingestion pipeline** (PDFs, code, markdown) — first cut, ships
495
+ as a deployable module
496
+ - ▢ **Pluggable retriever interface** in Drydock (vector + graph backends)
429
497
  - ▢ Memory routing (when to retrieve, when not to)
430
- - ▢ Citation-mode prompt templates
431
- - ▢ Operator dashboards
498
+ - ▢ Citation-mode prompt templates + grounding eval
499
+ - ▢ Operator dashboards (per-class failure rates over time)
432
500
 
433
- ### Phase 3 — 90 days (Self-Improvement)
501
+ ### Phase 3 — 90 days (Deep Noir first cut + self-improvement)
434
502
 
435
- - ▢ Per-task evaluator with classifier (memory / retrieval / tool / steering / tune)
503
+ - ▢ **Deep Noir steering** first cut, ships as a deployable module;
504
+ initial vectors for reduced-hallucination, secure-coding, citation modes
505
+ - ▢ Steering hook in the harness; sandbox eval per new vector
506
+ - ▢ Classifier-driven dispatch: harness-class signals open auto-PRs to
507
+ drydock; retrieval-class signals queue corpus gaps; steering-class signals
508
+ queue vector candidates
436
509
  - ▢ Execution trace logging (full prompts + tool calls per task)
437
- - ▢ Anti-loop signal feedback into proposer
438
- - ▢ Autonomous upgrade loop (local-only proposer)
510
+ - ▢ Autonomous upgrade loop (**local-only** proposer)
439
511
  - ▢ First paid pilot ($5–25K, defense-adjacent)
440
512
 
441
- ### Phase 4 — 120 days (Steering)
513
+ ### Phase 4 — 120 days (Hardening + verticals)
442
514
 
443
- - ▢ Deep Noir vector pipeline
444
- - ▢ Domain modules (secure-coding, legal-precision, analyst, citation)
515
+ - ▢ Deep Noir vector deepening — additional vectors driven by classifier
516
+ evidence (legal-precision, analyst, per-vertical bias presets)
517
+ - ▢ GraphRAG hardening — graph-augmented retrieval, hybrid reranker,
518
+ ingestion freshness signals
519
+ - ▢ Domain bundles per vertical (secure-coding, legal-precision, analyst)
445
520
  - ▢ Measured improvements on per-domain benchmarks
521
+ - ▢ Appliance image (factory-trusted, signed updates, audit logs)
446
522
 
447
523
  ---
448
524
 
@@ -0,0 +1,128 @@
1
+ # Failure Triage v1 — Sovereign Stack v2 Framework, Step 2
2
+
3
+ **Date:** 2026-05-02
4
+ **Source data:** `MODEL_SHORTCOMINGS.md` (11 patterns) + `BASELINE_412.md` (32 dirty PRDs as of 2026-04-13) + open GH issues (0 at time of write).
5
+ **Goal:** Validate the classifier taxonomy and produce a starter backlog with the right module attached to each bucket.
6
+
7
+ This is a manual pass. Output of this triage drives:
8
+
9
+ 1. The taxonomy schema the Phase-2 classifier must be able to produce.
10
+ 2. Per-bucket evidence justifying GraphRAG and Deep Noir as first-class modules (vs. infra-on-faith).
11
+ 3. A prioritized engineering backlog by failure volume.
12
+
13
+ ---
14
+
15
+ ## Taxonomy (validated against existing data)
16
+
17
+ | Bucket | Definition | Primary dispatcher |
18
+ | ------------------- | ----------------------------------------------------------------------------------- | ---------------------------- |
19
+ | **harness** | Tool plumbing, prompt structure, control flow, write/edit safety, loop detection. | Drydock harness |
20
+ | **retrieval** | Missing context the model has no way to know without external lookup or memory. | GraphRAG / read-before-write |
21
+ | **steering** | Stable behavioral priors (direction biases) — what the model *tends* to reach for. | Deep Noir vectors |
22
+ | **model-prior** | Reasoning / world-knowledge gaps that aren't behavioral — true capability ceiling. | LoRA fine-tune / model swap |
23
+ | **ambiguous-input** | PRD / user prompt is genuinely under-specified; not a model failure. | Prompt template / ask-user |
24
+
25
+ A single failure can have a **primary** and a **secondary** bucket. The classifier's job is to emit the primary; the secondary is for prioritization.
26
+
27
+ ---
28
+
29
+ ## Per-pattern classification
30
+
31
+ Mapping each `MODEL_SHORTCOMINGS.md` pattern to bucket(s):
32
+
33
+ | # | Pattern (short) | Primary | Secondary | Status / dispatcher |
34
+ | - | ---------------------------------------------- | ------------- | --------- | ----------------------------------------------------------------------------------------------- |
35
+ | 1 | Catastrophic tool-arg malformation | harness | model | ✅ mitigated (`>50%` shrink refusal, raw-code fallback in `search_replace`) |
36
+ | 2 | Scaffolding without wiring | model-prior | retrieval | partially mitigated by worked examples + meta_ralph; model can't trace call graphs end-to-end |
37
+ | 3 | Subtle logic bugs undiagnosed | model-prior | steering | "trace failing line first" steering vector candidate |
38
+ | 4 | Inheritance blindness across packages | **retrieval** | model | **GraphRAG candidate.** Model can't grep parent-class packages without a hint |
39
+ | 5 | Regression during targeted fixes | harness | steering | ✅ mitigated (snapshot + rollback in ralph_loop). Steering candidate: "minimal-patch" direction |
40
+ | 6 | Blindness to own stuckness | harness | steering | partially mitigated (loop detection, dedup escalation). Steering: "switch approach when stuck" |
41
+ | 7 | Doesn't use web_search even when enabled | **steering** | model | **Deep Noir candidate.** Prompt rule alone insufficient; need to boost "search-when-stuck" dir |
42
+ | 8 | Hallucinated tool names | harness | — | ✅ mitigated (`_IGNORE_TOOLS` silent drop) |
43
+ | 9 | Empty response / thinking stall | harness | model | ✅ partially mitigated (truncate old tool results + thinking-stall nudge). Still seen on hard PRDs|
44
+ | 10a| Stub-class anti-pattern | harness | model | ✅ mitigated (`_check_stub_classes` in write_file) |
45
+ | 10b| Interactive fallback with CLI args present | model-prior | harness | minor; AST-check has weak signal. Steering candidate: "prefer-explicit-args" direction |
46
+ | 10c| Multi-module rewrites exceed 3-stage iteration| **retrieval** | model | **GraphRAG candidate.** Need persistent design memory across sessions (~3-4 file context limit) |
47
+ | 10 | Weak reasoning about performance / abstract | model-prior | steering | "abstract reasoning" prompt + worked examples. Hard problem; possibly model-ceiling |
48
+
49
+ ---
50
+
51
+ ## Per-bucket distribution
52
+
53
+ | Bucket | Primary count | With secondary | Comment |
54
+ | ------------------ | ------------- | -------------- | --------------------------------------------------------------------------------------------- |
55
+ | **harness** | 6 | 8 | 5/6 already mitigated. The harness is paying its rent and continues to be the highest-volume bucket. |
56
+ | **retrieval** | **2** | 4 | Cross-package inheritance + multi-module memory. **GraphRAG earns its slot** on these alone. |
57
+ | **steering** | **1** | 6 | Web-search habit is the cleanest steering candidate. Six others have steering as a viable secondary lever. **Deep Noir earns its slot.** |
58
+ | **model-prior** | 4 | 7 | Reasoning gaps (logic, abstract optimization, scaffolding-wiring). LoRA territory. |
59
+ | **ambiguous-input**| 0 | 0 | Not represented in MODEL_SHORTCOMINGS (curated for model issues). Will appear when classifier runs against live stress data. |
60
+
61
+ **Headline finding:** the existing failure corpus *does* justify GraphRAG and Deep Noir as parallel v2 modules. They're not infra-on-faith — there are concrete failure patterns for each.
62
+
63
+ ---
64
+
65
+ ## Module-by-module: what the data says
66
+
67
+ ### Harness (already shipping; deepest investment to date)
68
+
69
+ 5/6 primary-harness patterns are already mitigated. The classifier still routes harness-class signals here, and the autonomous_review cron is the half-built dispatcher. **Phase-1 work:** read-before-write enforcement (will move some pattern-4 / pattern-10c-style failures from "retrieval" into "this should have been caught at write time").
70
+
71
+ ### GraphRAG (Phase 2 first cut — justified)
72
+
73
+ Two clean primary signals:
74
+
75
+ - **Pattern 4: cross-package inheritance.** Flask `request.is_xml` — model read `wrappers.py` 13× looking for a method that lives in a parent class in a different package. With a one-line hint pointing at the parent, model solved it in 61s. This is exactly what code-aware GraphRAG should serve: "where is `is_json` actually defined across the package graph?"
76
+ - **Pattern 10c: multi-module architectural rewrites.** lang_interp's lexer→parser→type_checker→interpreter→repl chain exceeded the model's working-memory budget. Rolling design memory across sessions (PRD goals + per-module contracts + decisions made) is what GraphRAG would store.
77
+
78
+ **Implication:** the GraphRAG first cut shouldn't optimize for arbitrary PDF Q&A. It should optimize for two specific shapes:
79
+ 1. **Code graph** — symbol → definition site, including parent-class chains across packages.
80
+ 2. **Project memory** — PRD + design decisions + per-module contracts, persistent across drydock sessions.
81
+
82
+ This is a sharper, smaller scope than "ingest everything." Easier to ship in 60 days.
83
+
84
+ ### Deep Noir (Phase 3 first cut — justified)
85
+
86
+ One primary signal + six viable secondaries:
87
+
88
+ - **Primary: pattern 7, web-search habit.** Prompt rules don't move the needle. The model has a stable behavioral prior of "stay in local-only failure loop." A vector that boosts the "external lookup when stuck" direction is the textbook Deep Noir use case.
89
+ - **Secondary candidates (1 vector each):**
90
+ - "minimal-patch direction" (pattern 5: rewrites whole file when a 3-line change would do)
91
+ - "switch-approach-when-stuck direction" (pattern 6: keeps trying same pattern)
92
+ - "prefer-explicit-args direction" (pattern 10b: ignores `--password` flag, falls to `getpass()`)
93
+ - "trace-failing-line direction" (pattern 3: rewrites file instead of tracing the bug)
94
+
95
+ **Implication:** the Deep Noir first cut should ship **one well-tuned vector** (web-search habit) with a sandbox eval, not five vectors built in parallel. Volume of viable secondaries proves the program's value; engineering attention goes to the one with the cleanest signal first.
96
+
97
+ ### Model-prior (LoRA territory, longer horizon)
98
+
99
+ Patterns 2, 3, 10b, 10 — reasoning gaps, not behavior gaps. Steering can move some of these (5/4 secondary on pattern 3); LoRA fine-tuning is the eventual answer. **Out of scope for v2 first cuts.** Tracked in the project `feedback_finetuning_deep_noir.md` memory.
100
+
101
+ ---
102
+
103
+ ## Pareto: what to build next, in order
104
+
105
+ 1. **Hosting sweep** — already queued via `*/15` cron. Locks the perf floor before classifier has any meaning.
106
+ 2. **Read-before-write enforcement** in the harness (Phase 1, already in PRD). Cheapest way to convert some pattern-4 / pattern-10c failures into clean errors before the model commits to bad output.
107
+ 3. **Classifier first cut** (Phase 2) — emits the buckets in the table above, validated against this manual pass.
108
+ 4. **Code-graph GraphRAG first cut** (Phase 2) — narrowed scope: symbol/inheritance lookup + per-project design memory. Skip arbitrary PDF Q&A in v0.
109
+ 5. **Deep Noir vector v0** (Phase 3) — single vector for the web-search habit pattern, with a sandbox eval gating promotion.
110
+ 6. Successive vectors / GraphRAG hardening as the live classifier produces volume in those buckets.
111
+
112
+ ---
113
+
114
+ ## What this triage produced
115
+
116
+ - A 5-bucket taxonomy that fits all 11 documented patterns (no "other").
117
+ - Concrete justification (with cited evidence) for both GraphRAG and Deep Noir as v2 modules.
118
+ - A scoped first cut for each module — code-graph GraphRAG (not arbitrary corpora), single-vector Deep Noir (not five at once).
119
+ - A prioritized backlog where engineering attention follows volume.
120
+ - A schema for the classifier to emit. Phase-2 classifier work has a target now.
121
+
122
+ ---
123
+
124
+ ## Open questions for next pass (post-perf-baseline)
125
+
126
+ - Live stress-run failures — are the failure modes the same as the curated ones? Should add ambiguous-input bucket if PRDs are under-specified at observed rates.
127
+ - BASELINE_412 dirty PRDs — 32 packages × N tests is real failure volume. Per-PRD triage could surface patterns missing from MODEL_SHORTCOMINGS (e.g. pattern-12, pattern-13).
128
+ - Inter-rater check — once the Phase-2 classifier is built, run it on this same data and check agreement with this manual pass. <80% agreement = taxonomy is wrong.
@@ -505,16 +505,24 @@ class Bash(
505
505
  return
506
506
 
507
507
  encoding = _get_subprocess_encoding()
508
- stdout = (
509
- stdout_bytes.decode(encoding, errors="replace")[:max_bytes]
510
- if stdout_bytes
511
- else ""
512
- )
513
- stderr = (
514
- stderr_bytes.decode(encoding, errors="replace")[:max_bytes]
515
- if stderr_bytes
516
- else ""
517
- )
508
+ stdout_raw = stdout_bytes.decode(encoding, errors="replace") if stdout_bytes else ""
509
+ stderr_raw = stderr_bytes.decode(encoding, errors="replace") if stderr_bytes else ""
510
+ if len(stdout_raw) > max_bytes:
511
+ stdout = stdout_raw[:max_bytes] + (
512
+ f"\n[OUTPUT TRUNCATED: stdout exceeded {max_bytes} bytes. "
513
+ "Use 'grep -l' to list matching files only, narrow your "
514
+ "pattern, or pipe through 'head -50' to limit output. "
515
+ "Do NOT re-run the same command — the result will be "
516
+ "identical.]"
517
+ )
518
+ else:
519
+ stdout = stdout_raw
520
+ if len(stderr_raw) > max_bytes:
521
+ stderr = stderr_raw[:max_bytes] + (
522
+ f"\n[STDERR TRUNCATED: exceeded {max_bytes} bytes]"
523
+ )
524
+ else:
525
+ stderr = stderr_raw
518
526
 
519
527
  returncode = proc.returncode or 0
520
528
 
@@ -98,25 +98,28 @@ class ReadFile(
98
98
  # pointing to the earlier tool_result. Saves context + kills the
99
99
  # "re-read 50x for no reason" pattern. Also preserves Read-before-
100
100
  # Write because the stub still counts as having read the file.
101
+ #
102
+ # Per-slot dedup: track ALL (offset, limit) combinations independently.
103
+ # The old single-slot approach allowed alternating offsets to bypass
104
+ # dedup (read offset=0, read offset=50, read offset=0 again — the
105
+ # offset=50 read evicted the offset=0 cache entry each time).
101
106
  read_state = ctx.read_file_state if ctx else None
102
107
  path_key = str(file_path)
103
108
  try:
104
109
  current_mtime = file_path.stat().st_mtime_ns
105
110
  except OSError:
106
111
  current_mtime = 0
107
- prior = read_state.get(path_key) if read_state is not None else None
108
- if (
109
- prior is not None
110
- and prior.get("timestamp") == current_mtime
111
- and prior.get("offset") == args.offset
112
- and prior.get("limit") == args.limit
113
- ):
112
+ slot_key = (args.offset, args.limit)
113
+ existing_entry = read_state.get(path_key, {}) if read_state is not None else {}
114
+ slots: dict = existing_entry.get("_slots", {})
115
+ prior_slot = slots.get(slot_key)
116
+ if prior_slot is not None and prior_slot.get("timestamp") == current_mtime:
114
117
  # Re-embed the cached content so the model has it even if the
115
118
  # earlier tool_result was truncated by _truncate_old_tool_results.
116
119
  # Pointing at a stale/truncated prior result causes re-read loops.
117
- cached_content = prior.get("content", "")
118
- prior_lines = prior.get("lines_read", 0)
119
- dedup_count = prior.get("dedup_count", 0)
120
+ cached_content = prior_slot.get("content", "")
121
+ prior_lines = prior_slot.get("lines_read", 0)
122
+ dedup_count = prior_slot.get("dedup_count", 0)
120
123
  if dedup_count == 0:
121
124
  header = "[Unchanged since last read — content re-embedded]\n"
122
125
  else:
@@ -128,12 +131,13 @@ class ReadFile(
128
131
  f"or move on to the next task.]\n"
129
132
  )
130
133
  if read_state is not None:
131
- read_state[path_key] = {**prior, "dedup_count": dedup_count + 1}
134
+ slots[slot_key] = {**prior_slot, "dedup_count": dedup_count + 1}
135
+ read_state[path_key] = {**existing_entry, "_slots": slots}
132
136
  yield ReadFileResult(
133
137
  path=path_key,
134
138
  content=f"{header}{cached_content}",
135
139
  lines_read=prior_lines,
136
- was_truncated=prior.get("was_truncated", False),
140
+ was_truncated=prior_slot.get("was_truncated", False),
137
141
  )
138
142
  return
139
143
 
@@ -155,7 +159,18 @@ class ReadFile(
155
159
 
156
160
  # Record read state so Write/Edit can enforce Read-before-Write
157
161
  # and so future re-reads can dedup against this one.
162
+ # Top-level entry (backward-compat: write_file/search_replace check
163
+ # read_state.get(path_key) is not None). Per-slot entry enables
164
+ # independent dedup for every (offset, limit) combination so that
165
+ # alternating offsets can't bypass dedup.
158
166
  if read_state is not None:
167
+ slots[slot_key] = {
168
+ "content": content,
169
+ "timestamp": current_mtime,
170
+ "lines_read": len(read_result.lines),
171
+ "was_truncated": read_result.was_truncated,
172
+ "dedup_count": 0,
173
+ }
159
174
  read_state[path_key] = {
160
175
  "content": content,
161
176
  "timestamp": current_mtime,
@@ -163,6 +178,7 @@ class ReadFile(
163
178
  "limit": args.limit,
164
179
  "lines_read": len(read_result.lines),
165
180
  "was_truncated": read_result.was_truncated,
181
+ "_slots": slots,
166
182
  }
167
183
 
168
184
  yield ReadFileResult(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.29"
3
+ version = "2.7.30"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via vLLM"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -94,11 +94,22 @@ async def test_truncates_output_to_max_bytes(bash):
94
94
  bash_tool.run(BashArgs(command="printf 'abcdefghij'"))
95
95
  )
96
96
 
97
- assert result.stdout == "abcde"
97
+ assert result.stdout.startswith("abcde")
98
+ assert "[OUTPUT TRUNCATED" in result.stdout
99
+ assert "Do NOT re-run" in result.stdout
98
100
  assert result.stderr == ""
99
101
  assert result.returncode == 0
100
102
 
101
103
 
104
+ @pytest.mark.asyncio
105
+ async def test_truncation_notice_absent_when_output_fits(bash):
106
+ # No truncation notice when output is within max_output_bytes.
107
+ result = await collect_result(bash.run(BashArgs(command="printf 'short'")))
108
+
109
+ assert result.stdout == "short"
110
+ assert "[OUTPUT TRUNCATED" not in result.stdout
111
+
112
+
102
113
  @pytest.mark.asyncio
103
114
  async def test_decodes_non_utf8_bytes(bash):
104
115
  result = await collect_result(bash.run(BashArgs(command="printf '\\xff\\xfe'")))
@@ -0,0 +1,109 @@
1
+ """Regression test: read_file dedup fires correctly when model alternates offsets.
2
+
3
+ Bug: the single-slot cache (read_state[path_key]) was overwritten on every new
4
+ (offset, limit) pair. Reading at offset=0 stored slot A; reading at offset=50
5
+ (empty, past EOF) overwrote slot A with slot B. Re-reading at offset=0 then
6
+ saw no cache hit because the slot had offset=50, triggering a fresh disk read
7
+ and leaving the model in an infinite alternating-offset loop.
8
+
9
+ Fix: track each (offset, limit) combination independently in _slots so all
10
+ combinations are deduped regardless of read order.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import pytest
15
+ from unittest.mock import MagicMock
16
+
17
+ from drydock.core.tools.base import BaseToolState
18
+ from drydock.core.tools.builtins.read_file import (
19
+ ReadFile,
20
+ ReadFileArgs,
21
+ ReadFileResult,
22
+ ReadFileToolConfig,
23
+ )
24
+
25
+
26
+ async def _run(tool, args, ctx) -> ReadFileResult:
27
+ async for event in tool.run(args, ctx):
28
+ if isinstance(event, ReadFileResult):
29
+ return event
30
+ raise AssertionError("no ReadFileResult yielded")
31
+
32
+
33
+ @pytest.mark.asyncio
34
+ async def test_alternating_offsets_both_deduped(tmp_path):
35
+ """offset=0 dedup survives an interleaved offset=50 read on a short file."""
36
+ f = tmp_path / "short.py"
37
+ f.write_text("line1\nline2\nline3\n") # only 3 lines
38
+
39
+ tool = ReadFile(ReadFileToolConfig(), BaseToolState())
40
+ read_state: dict = {}
41
+ ctx = MagicMock()
42
+ ctx.read_file_state = read_state
43
+
44
+ args0 = ReadFileArgs(path=str(f), offset=0)
45
+ args50 = ReadFileArgs(path=str(f), offset=50)
46
+
47
+ # First read at offset=0 — populates cache for (0, None).
48
+ r1 = await _run(tool, args0, ctx)
49
+ assert "line1" in r1.content
50
+
51
+ # Read at offset=50 — past EOF, returns empty (or minimal) content.
52
+ r2 = await _run(tool, args50, ctx)
53
+ # Content may be empty; just ensure it doesn't crash.
54
+
55
+ # Re-read at offset=0 — MUST dedup and re-embed, NOT do a fresh disk read.
56
+ r3 = await _run(tool, args0, ctx)
57
+ assert "line1" in r3.content, "offset=0 dedup must survive interleaved offset=50 read"
58
+ assert "re-embedded" in r3.content or "REPEATED" in r3.content
59
+
60
+
61
+ @pytest.mark.asyncio
62
+ async def test_each_slot_deduped_independently(tmp_path):
63
+ """Each (offset, limit) slot fires dedup independently."""
64
+ f = tmp_path / "multi.py"
65
+ f.write_text("\n".join(f"line{i}" for i in range(200)) + "\n")
66
+
67
+ tool = ReadFile(ReadFileToolConfig(), BaseToolState())
68
+ read_state: dict = {}
69
+ ctx = MagicMock()
70
+ ctx.read_file_state = read_state
71
+
72
+ args_a = ReadFileArgs(path=str(f), offset=0, limit=50)
73
+ args_b = ReadFileArgs(path=str(f), offset=50, limit=50)
74
+
75
+ # First reads populate two independent slots.
76
+ r_a1 = await _run(tool, args_a, ctx)
77
+ r_b1 = await _run(tool, args_b, ctx)
78
+ assert "line0" in r_a1.content
79
+ assert "line50" in r_b1.content
80
+
81
+ # Re-read slot A after slot B — must dedup.
82
+ r_a2 = await _run(tool, args_a, ctx)
83
+ assert "line0" in r_a2.content
84
+ assert "re-embedded" in r_a2.content or "REPEATED" in r_a2.content
85
+
86
+ # Re-read slot B — must also dedup.
87
+ r_b2 = await _run(tool, args_b, ctx)
88
+ assert "line50" in r_b2.content
89
+ assert "re-embedded" in r_b2.content or "REPEATED" in r_b2.content
90
+
91
+
92
+ @pytest.mark.asyncio
93
+ async def test_write_file_compat_after_read(tmp_path):
94
+ """read_state[path_key] remains non-None after reads, so write_file can proceed."""
95
+ f = tmp_path / "code.py"
96
+ f.write_text("x = 1\n")
97
+
98
+ tool = ReadFile(ReadFileToolConfig(), BaseToolState())
99
+ read_state: dict = {}
100
+ ctx = MagicMock()
101
+ ctx.read_file_state = read_state
102
+
103
+ args = ReadFileArgs(path=str(f), offset=0)
104
+ await _run(tool, args, ctx)
105
+
106
+ # write_file checks: read_state.get(path_key) is not None
107
+ path_key = str(f)
108
+ assert read_state.get(path_key) is not None, "top-level entry must exist for write_file compat"
109
+ assert read_state[path_key].get("timestamp") is not None