boost-skill-cli 1.2.56__tar.gz → 1.2.58__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 (826) hide show
  1. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/CLAUDE.md +14 -0
  2. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/Makefile +12 -1
  3. {boost_skill_cli-1.2.56/boost_skill_cli.egg-info → boost_skill_cli-1.2.58}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  6. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
  7. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/tool-call-eval-tier.md +2 -1
  8. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap.html +1 -1
  9. boost_skill_cli-1.2.58/scripts/eval_tools.py +339 -0
  10. boost_skill_cli-1.2.58/tests/eval/tool_calls.jsonl +32 -0
  11. boost_skill_cli-1.2.58/tests/unit/test_bot_pr_dco.py +130 -0
  12. boost_skill_cli-1.2.58/tests/unit/test_eval_tools.py +290 -0
  13. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.gitattributes +0 -0
  14. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.gitignore +0 -0
  15. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.gitleaks.toml +0 -0
  16. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.htmlvalidate.json +0 -0
  17. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.lighthouserc.json +0 -0
  18. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.lycheeignore +0 -0
  19. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.markdownlint-cli2.jsonc +0 -0
  20. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.pre-commit-config.yaml +0 -0
  21. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.stylelintrc.json +0 -0
  22. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.vale/styles/boost/AIWriting.yml +0 -0
  23. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.vale/styles/boost/Terminology.yml +0 -0
  24. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  25. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/.vale.ini +0 -0
  26. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/CODE_OF_CONDUCT.md +0 -0
  27. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/CONTRIBUTING.md +0 -0
  28. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/DCO +0 -0
  29. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/GOVERNANCE.md +0 -0
  30. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/LICENSE +0 -0
  31. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/MAINTAINERS.md +0 -0
  32. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/MANIFEST.in +0 -0
  33. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/README.md +0 -0
  34. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/SECURITY.md +0 -0
  35. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/SUPPORT.md +0 -0
  36. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost +0 -0
  37. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/__init__.py +0 -0
  38. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/__main__.py +0 -0
  39. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/cli.py +0 -0
  40. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/cliparse.py +0 -0
  41. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/__init__.py +0 -0
  42. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/_common.py +0 -0
  43. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/bmad.py +0 -0
  44. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/configuration.py +0 -0
  45. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/discovery.py +0 -0
  46. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/hooks.py +0 -0
  47. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/info.py +0 -0
  48. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/intelligence.py +0 -0
  49. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/pkg.py +0 -0
  50. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/quality.py +0 -0
  51. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/quickstart.py +0 -0
  52. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/run.py +0 -0
  53. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/safety.py +0 -0
  54. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/taps.py +0 -0
  55. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/commands/team.py +0 -0
  56. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/__init__.py +0 -0
  57. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/adapters.py +0 -0
  58. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/agents.py +0 -0
  59. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/ai.py +0 -0
  60. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/aihost.py +0 -0
  61. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/bmad.py +0 -0
  62. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/bootstrap.py +0 -0
  63. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/browse.py +0 -0
  64. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/builtin.py +0 -0
  65. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/capabilities.py +0 -0
  66. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/catalog.py +0 -0
  67. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/catalogbundle.py +0 -0
  68. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/chat.py +0 -0
  69. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/claude_settings.py +0 -0
  70. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/complete.py +0 -0
  71. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/config.py +0 -0
  72. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/dense.py +0 -0
  73. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/ed25519.py +0 -0
  74. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/embed.py +0 -0
  75. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/faithfulness.py +0 -0
  76. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/frontmatter.py +0 -0
  77. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/gitutil.py +0 -0
  78. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/hookhost.py +0 -0
  79. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/imperative.py +0 -0
  80. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/injectscan.py +0 -0
  81. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/installscan.py +0 -0
  82. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/integrity.py +0 -0
  83. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/journal.py +0 -0
  84. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/localembed.py +0 -0
  85. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/lockfile.py +0 -0
  86. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/logs.py +0 -0
  87. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/mcp.py +0 -0
  88. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/mcpdecl.py +0 -0
  89. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/mcphost.py +0 -0
  90. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/minisign.py +0 -0
  91. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/nethttp.py +0 -0
  92. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/output.py +0 -0
  93. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/paths.py +0 -0
  94. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/policy.py +0 -0
  95. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/projectlock.py +0 -0
  96. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/provenance.py +0 -0
  97. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/rag.py +0 -0
  98. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/registry.py +0 -0
  99. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/resolve.py +0 -0
  100. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/rules.py +0 -0
  101. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/scopes.py +0 -0
  102. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/secretscan.py +0 -0
  103. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/selfupdate.py +0 -0
  104. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/serve.py +0 -0
  105. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/shards.py +0 -0
  106. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/stackprobe.py +0 -0
  107. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/staleness.py +0 -0
  108. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/store.py +0 -0
  109. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/trustaudit.py +0 -0
  110. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/typosquat.py +0 -0
  111. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/updatediff.py +0 -0
  112. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/util.py +0 -0
  113. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/core/workflows.py +0 -0
  114. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/data/registries.json +0 -0
  115. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/data/rules/boost-first.mdc +0 -0
  116. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/errors.py +0 -0
  117. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_cli/spin.py +0 -0
  118. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_langchain/__init__.py +0 -0
  119. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_langchain/_compat.py +0 -0
  120. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_langchain/graph.py +0 -0
  121. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_langchain/loader.py +0 -0
  122. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_langchain/py.typed +0 -0
  123. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_langchain/retriever.py +0 -0
  124. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  125. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  126. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_skill_cli.egg-info/requires.txt +0 -0
  127. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/boost_skill_cli.egg-info/top_level.txt +0 -0
  128. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/codecov.yml +0 -0
  129. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/.claude/settings.local.json +0 -0
  130. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/DEBUGGING.md +0 -0
  131. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/adapters.html +0 -0
  132. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/architecture/README.md +0 -0
  133. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/architecture/c4-components-core.md +0 -0
  134. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/architecture/c4-containers.md +0 -0
  135. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/architecture/c4-context.md +0 -0
  136. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/architecture/c4-dynamic-install.md +0 -0
  137. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/bmad.md +0 -0
  138. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/distill.gif +0 -0
  139. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/doctor.gif +0 -0
  140. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/explain.gif +0 -0
  141. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/hooks.gif +0 -0
  142. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/install.gif +0 -0
  143. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/pulse.gif +0 -0
  144. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/search.gif +0 -0
  145. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/gifs/tap.gif +0 -0
  146. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/distill.tape +0 -0
  147. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/doctor.tape +0 -0
  148. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/explain.tape +0 -0
  149. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/hooks.tape +0 -0
  150. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/install.tape +0 -0
  151. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/pulse.tape +0 -0
  152. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/search.tape +0 -0
  153. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel/tapes/tap.tape +0 -0
  154. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/carousel.html +0 -0
  155. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/chat.html +0 -0
  156. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/code-review.md +0 -0
  157. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/commands.html +0 -0
  158. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/commit-audit.md +0 -0
  159. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/demo-index.json +0 -0
  160. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/demo.gif +0 -0
  161. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/demo.html +0 -0
  162. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/demo.tape +0 -0
  163. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/dependencies.md +0 -0
  164. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/design-roadmap.html +0 -0
  165. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/eval-latest.json +0 -0
  166. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/eval.html +0 -0
  167. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/index.html +0 -0
  168. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/langchain.html +0 -0
  169. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/mcp-hub.html +0 -0
  170. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/openssf-badge.md +0 -0
  171. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/openssf-playbook.md +0 -0
  172. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/rag-architecture.md +0 -0
  173. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D01.md +0 -0
  174. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D02.md +0 -0
  175. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D03.md +0 -0
  176. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D04.md +0 -0
  177. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D05.md +0 -0
  178. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D06.md +0 -0
  179. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D07.md +0 -0
  180. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D08.md +0 -0
  181. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D09.md +0 -0
  182. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D10.md +0 -0
  183. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D11.md +0 -0
  184. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D12.md +0 -0
  185. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D13.md +0 -0
  186. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D14.md +0 -0
  187. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D15.md +0 -0
  188. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D16.md +0 -0
  189. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D17.md +0 -0
  190. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D18.md +0 -0
  191. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D19.md +0 -0
  192. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D20.md +0 -0
  193. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D21.md +0 -0
  194. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D22.md +0 -0
  195. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D23.md +0 -0
  196. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D24.md +0 -0
  197. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D25.md +0 -0
  198. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D26.md +0 -0
  199. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/BOOST-D27.md +0 -0
  200. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  201. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  202. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  203. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  204. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  205. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  206. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  207. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  208. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  209. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  210. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  211. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  212. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  213. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  214. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  215. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  216. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/boost-first-rule.md +0 -0
  217. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  218. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  219. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/branch-current-gate.md +0 -0
  220. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  221. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  222. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  223. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  224. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  225. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  226. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  227. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  228. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  229. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  230. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  231. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  232. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  233. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  234. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/cli-command-audit.md +0 -0
  235. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  236. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  237. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  238. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  239. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/command-carousel-page.md +0 -0
  240. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  241. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  242. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  243. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  244. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  245. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  246. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  247. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  248. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  249. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  250. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  251. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  252. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  253. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  254. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  255. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  256. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  257. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  258. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  259. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  260. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  261. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  262. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  263. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  264. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  265. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  266. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  267. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  268. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  269. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  270. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  271. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  272. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  273. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  274. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  275. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  276. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  277. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  278. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  279. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  280. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  281. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  282. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  283. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  284. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  285. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  286. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  287. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  288. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  289. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  290. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  291. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  292. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/github-community-health-files.md +0 -0
  293. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  294. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  295. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  296. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  297. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  298. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  299. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  300. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  301. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  302. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  303. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  304. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  305. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  306. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  307. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  308. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  309. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  310. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  311. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  312. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  313. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  314. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  315. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  316. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  317. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  318. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  319. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  320. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  321. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  322. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  323. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  324. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  325. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  326. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  327. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  328. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  329. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  330. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  331. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  332. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  333. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  334. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  335. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  336. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  337. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  338. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  339. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  340. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  341. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  342. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  343. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  344. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  345. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  346. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  347. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  348. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  349. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  350. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  351. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  352. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  353. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  354. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  355. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  356. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  357. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  358. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  359. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  360. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  361. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  362. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  363. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  364. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  365. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  366. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  367. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  368. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  369. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  370. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/openssf-playbook.md +0 -0
  371. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/openssf-silver.md +0 -0
  372. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  373. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  374. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  375. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  376. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  377. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  378. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  379. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  380. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  381. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  382. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  383. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  384. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  385. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  386. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  387. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  388. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  389. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  390. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  391. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  392. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  393. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  394. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  395. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  396. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  397. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  398. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  399. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  400. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  401. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  402. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  403. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  404. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/relicence-apache-2.md +0 -0
  405. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  406. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  407. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  408. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  409. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  410. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  411. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  412. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  413. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  414. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  415. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  416. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  417. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  418. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  419. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  420. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  421. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  422. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  423. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  424. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  425. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  426. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  427. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  428. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  429. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  430. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  431. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  432. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  433. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  434. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  435. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  436. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  437. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  438. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  439. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  440. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  441. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  442. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  443. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  444. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  445. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  446. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  447. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  448. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  449. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  450. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  451. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  452. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  453. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  454. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  455. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  456. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  457. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  458. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  459. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  460. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  461. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  462. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  463. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  464. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  465. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  466. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  467. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  468. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  469. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  470. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  471. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  472. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  473. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  474. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  475. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  476. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  477. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  478. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  479. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  480. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  481. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  482. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  483. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  484. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/workspace-scope-install.md +0 -0
  485. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/zip-strict-audit.md +0 -0
  486. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  487. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  488. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/security-design.md +0 -0
  489. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/semantic-search.md +0 -0
  490. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  491. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/verifying-releases.md +0 -0
  492. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/vex/meta.md +0 -0
  493. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/vex/openvex.json +0 -0
  494. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  495. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  496. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  497. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  498. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/eslint.config.mjs +0 -0
  499. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/README.md +0 -0
  500. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/__init__.py +0 -0
  501. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/baseline.json +0 -0
  502. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/faithfulness.py +0 -0
  503. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/golden_set.json +0 -0
  504. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/make_corpus.py +0 -0
  505. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/make_golden.py +0 -0
  506. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/metrics.py +0 -0
  507. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/publish_golden_dataset.py +0 -0
  508. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/evals/run_evals.py +0 -0
  509. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/examples/README.md +0 -0
  510. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/examples/adapt-demo.sh +0 -0
  511. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/examples/boost-run-prototype.sh +0 -0
  512. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/index.html +0 -0
  513. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/noxfile.py +0 -0
  514. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/pyproject.toml +0 -0
  515. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/coverage-tools.in +0 -0
  516. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/coverage-tools.txt +0 -0
  517. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/lint-tools.in +0 -0
  518. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/lint-tools.txt +0 -0
  519. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/mutation-tools.in +0 -0
  520. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/mutation-tools.txt +0 -0
  521. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/platform-pins.lock +0 -0
  522. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/release-tools.in +0 -0
  523. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/release-tools.txt +0 -0
  524. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/test-tools.in +0 -0
  525. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/requirements/test-tools.txt +0 -0
  526. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/a11y_check.py +0 -0
  527. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/add_spdx_headers.py +0 -0
  528. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/bench_cli.sh +0 -0
  529. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/build_command_reference.py +0 -0
  530. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/build_demo_index.py +0 -0
  531. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/build_registries.py +0 -0
  532. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/build_roadmap.py +0 -0
  533. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/build_scale_corpus.py +0 -0
  534. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/build_vex.py +0 -0
  535. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/check_anchors.py +0 -0
  536. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/check_branch_current.py +0 -0
  537. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/check_dco.py +0 -0
  538. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/check_licenses.py +0 -0
  539. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/check_reproducible.py +0 -0
  540. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/check_required_checks.py +0 -0
  541. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/ensure_eval_corpus.sh +0 -0
  542. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/eval_corpus.py +0 -0
  543. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/eval_explain.py +0 -0
  544. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/eval_gate.py +0 -0
  545. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/eval_recommend.py +0 -0
  546. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/eval_retrieval.py +0 -0
  547. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/eval_stats_summary.py +0 -0
  548. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/import_budget.py +0 -0
  549. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/lock_toolchain.py +0 -0
  550. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/measure_registry.py +0 -0
  551. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/mutation_gate.py +0 -0
  552. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/mutation_shards.py +0 -0
  553. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/mutation_weights.json +0 -0
  554. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/normalize_sdist.py +0 -0
  555. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/page_budget.py +0 -0
  556. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/perf_gate.py +0 -0
  557. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/post_deploy_smoke.py +0 -0
  558. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/publish_eval_json.py +0 -0
  559. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/publish_shards.py +0 -0
  560. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/release_guard.py +0 -0
  561. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/release_preflight.py +0 -0
  562. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/serve_docs.py +0 -0
  563. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/scripts/shard_plan.py +0 -0
  564. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/setup.cfg +0 -0
  565. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/sonar-project.properties +0 -0
  566. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/style/README.md +0 -0
  567. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/style/boost.css +0 -0
  568. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/style/boost.js +0 -0
  569. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/style/demo.html +0 -0
  570. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/adapt.feature +0 -0
  571. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/browse.feature +0 -0
  572. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/count.feature +0 -0
  573. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/discover.feature +0 -0
  574. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/doctor.feature +0 -0
  575. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/environment.py +0 -0
  576. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/explain.feature +0 -0
  577. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/index.feature +0 -0
  578. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/install.feature +0 -0
  579. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/list.feature +0 -0
  580. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/mcp.feature +0 -0
  581. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/search.feature +0 -0
  582. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/steps/cli_steps.py +0 -0
  583. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/steps/discovery_steps.py +0 -0
  584. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/steps/mcp_steps.py +0 -0
  585. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/bdd/features/steps/quality_steps.py +0 -0
  586. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/conftest.py +0 -0
  587. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/baseline.json +0 -0
  588. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/explain.jsonl +0 -0
  589. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/golden-natural.jsonl +0 -0
  590. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/golden.jsonl +0 -0
  591. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/recommend.jsonl +0 -0
  592. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/taps-scale.txt +0 -0
  593. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/eval/taps.txt +0 -0
  594. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_bmad_all_hosts.py +0 -0
  595. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_capabilities_policy.py +0 -0
  596. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_adapt.py +0 -0
  597. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_bmad.py +0 -0
  598. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_catalog.py +0 -0
  599. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_chat.py +0 -0
  600. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_configuration.py +0 -0
  601. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_discovery.py +0 -0
  602. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_hooks.py +0 -0
  603. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_hooks_gemini.py +0 -0
  604. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_info.py +0 -0
  605. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_intelligence.py +0 -0
  606. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_pane_width.py +0 -0
  607. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_pkg.py +0 -0
  608. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_quality.py +0 -0
  609. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_quickstart.py +0 -0
  610. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_tap_pins.py +0 -0
  611. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_taps.py +0 -0
  612. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_cli_team.py +0 -0
  613. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_everyday_loop.py +0 -0
  614. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_integrity_enforce.py +0 -0
  615. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_kind_conformance.py +0 -0
  616. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_property_parsers.py +0 -0
  617. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_run.py +0 -0
  618. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_tap_signing.py +0 -0
  619. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/functional/test_workspace_scope.py +0 -0
  620. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/README.md +0 -0
  621. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  622. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  623. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  624. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  625. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  626. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  627. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  628. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  629. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  630. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  631. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  632. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  633. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  634. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  635. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  636. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  637. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  638. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  639. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  640. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  641. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  642. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  643. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  644. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/fuzz_frontmatter.py +0 -0
  645. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/fuzz/fuzz_registry.py +0 -0
  646. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/langchain/conftest.py +0 -0
  647. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/langchain/test_graph.py +0 -0
  648. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/langchain/test_loader.py +0 -0
  649. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/langchain/test_retriever.py +0 -0
  650. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/make_fixture.py +0 -0
  651. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/perf/test_benchmarks.py +0 -0
  652. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/smoke.sh +0 -0
  653. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_a11y_check.py +0 -0
  654. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_action_pin_lockstep.py +0 -0
  655. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_adapters.py +0 -0
  656. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_adapters_multi.py +0 -0
  657. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_adapters_runner.py +0 -0
  658. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_agents.py +0 -0
  659. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_ai.py +0 -0
  660. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_aihost.py +0 -0
  661. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_bmad_core.py +0 -0
  662. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_boost_first_offer.py +0 -0
  663. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_bootstrap.py +0 -0
  664. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_branch_current.py +0 -0
  665. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_browse.py +0 -0
  666. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_builtin.py +0 -0
  667. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_capabilities.py +0 -0
  668. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_catalog.py +0 -0
  669. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_catalogbundle.py +0 -0
  670. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_chat.py +0 -0
  671. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_check_anchors.py +0 -0
  672. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_check_dco.py +0 -0
  673. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_check_licenses.py +0 -0
  674. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_check_reproducible.py +0 -0
  675. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_claude_settings.py +0 -0
  676. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_clean_internal_cache.py +0 -0
  677. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_cliparse.py +0 -0
  678. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_codeql_analysis_key.py +0 -0
  679. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_command_reference_fresh.py +0 -0
  680. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_community_health_files.py +0 -0
  681. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_compact.py +0 -0
  682. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_complete.py +0 -0
  683. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_complete_rc_block.py +0 -0
  684. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_config.py +0 -0
  685. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_content_dedupe.py +0 -0
  686. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_content_identity.py +0 -0
  687. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_crash_redaction.py +0 -0
  688. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dedup_trust.py +0 -0
  689. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_demo_index.py +0 -0
  690. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense.py +0 -0
  691. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_embed_dedupe.py +0 -0
  692. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_entry_reuse.py +0 -0
  693. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_fallback.py +0 -0
  694. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_fix_hint.py +0 -0
  695. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_progress.py +0 -0
  696. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_quantized.py +0 -0
  697. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_ready_order.py +0 -0
  698. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_shard_real_schema.py +0 -0
  699. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  700. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_shards.py +0 -0
  701. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_status.py +0 -0
  702. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dense_status_cheap.py +0 -0
  703. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_dependabot_config.py +0 -0
  704. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_docs_pages_linked.py +0 -0
  705. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_docsite_chrome.py +0 -0
  706. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_ed25519.py +0 -0
  707. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_embed.py +0 -0
  708. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_embed_local.py +0 -0
  709. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_embed_truncated_response.py +0 -0
  710. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_entry_key.py +0 -0
  711. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_errors_and_cli_table.py +0 -0
  712. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_baseline.py +0 -0
  713. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_corpus.py +0 -0
  714. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_faithfulness.py +0 -0
  715. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_gate.py +0 -0
  716. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_grading.py +0 -0
  717. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_metrics.py +0 -0
  718. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_eval_stats_summary.py +0 -0
  719. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  720. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_faithfulness.py +0 -0
  721. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_frontmatter.py +0 -0
  722. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_fuzz_targets.py +0 -0
  723. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  724. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_gitleaks_config.py +0 -0
  725. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_gitutil.py +0 -0
  726. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_gitutil_lfs.py +0 -0
  727. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_gitutil_sparse.py +0 -0
  728. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_hook_settings_hosts.py +0 -0
  729. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_hookhost.py +0 -0
  730. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_imperative.py +0 -0
  731. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_import_budget.py +0 -0
  732. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_injectscan.py +0 -0
  733. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_install_permission_error.py +0 -0
  734. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_installscan.py +0 -0
  735. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_integrity.py +0 -0
  736. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_journal.py +0 -0
  737. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_langchain_packaging.py +0 -0
  738. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_link_ownership.py +0 -0
  739. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_localembed.py +0 -0
  740. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_localembed_e2e.py +0 -0
  741. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_lockfile.py +0 -0
  742. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_logs.py +0 -0
  743. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_marketing_counts.py +0 -0
  744. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mcp.py +0 -0
  745. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mcp_install_scan.py +0 -0
  746. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mcp_read.py +0 -0
  747. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mcpdecl.py +0 -0
  748. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mcphost.py +0 -0
  749. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_measure_registry.py +0 -0
  750. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_minisign.py +0 -0
  751. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mutation_hardening.py +0 -0
  752. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mutation_shards.py +0 -0
  753. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mutation_subfile_shards.py +0 -0
  754. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_mutmut_source_paths.py +0 -0
  755. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_nethttp.py +0 -0
  756. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_normalize_sdist.py +0 -0
  757. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_output.py +0 -0
  758. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_page_budget.py +0 -0
  759. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_paths.py +0 -0
  760. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_perf_gate.py +0 -0
  761. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_pkg_confusions.py +0 -0
  762. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_pkg_injection.py +0 -0
  763. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_pkg_secrets.py +0 -0
  764. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_platform_pins.py +0 -0
  765. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_policy.py +0 -0
  766. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_post_deploy_smoke.py +0 -0
  767. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_project_mcp_sidecar.py +0 -0
  768. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_projectlock.py +0 -0
  769. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_provenance.py +0 -0
  770. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_publish_golden_dataset.py +0 -0
  771. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_rag.py +0 -0
  772. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_rag_fastpath.py +0 -0
  773. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_rag_fusion.py +0 -0
  774. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_registries_fresh.py +0 -0
  775. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_registry.py +0 -0
  776. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_registry_categories.py +0 -0
  777. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_registry_control_chars.py +0 -0
  778. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_registry_parallel.py +0 -0
  779. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_release_guard.py +0 -0
  780. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_release_preflight.py +0 -0
  781. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_required_checks.py +0 -0
  782. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_rerank_cache.py +0 -0
  783. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_resolve.py +0 -0
  784. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_roadmap_fresh.py +0 -0
  785. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_rules.py +0 -0
  786. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_scale_corpus.py +0 -0
  787. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_scopes.py +0 -0
  788. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_secretscan.py +0 -0
  789. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_selfupdate.py +0 -0
  790. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_serve.py +0 -0
  791. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_serve_docs.py +0 -0
  792. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_shard_plan.py +0 -0
  793. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_shards.py +0 -0
  794. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_shards_incremental.py +0 -0
  795. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_shards_matrix.py +0 -0
  796. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_smoke_covers_every_command.py +0 -0
  797. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_spdx_headers.py +0 -0
  798. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_spin.py +0 -0
  799. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_stackprobe.py +0 -0
  800. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_staleness.py +0 -0
  801. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_store.py +0 -0
  802. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_store_materialize.py +0 -0
  803. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_sync_blocked_links.py +0 -0
  804. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  805. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_tap_pins.py +0 -0
  806. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_token_parity.py +0 -0
  807. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_toolchain_lock.py +0 -0
  808. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_trustaudit.py +0 -0
  809. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_typosquat.py +0 -0
  810. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_updatediff.py +0 -0
  811. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_util.py +0 -0
  812. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_version.py +0 -0
  813. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_version_tags.py +0 -0
  814. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_vex.py +0 -0
  815. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_visual_harness_flags.py +0 -0
  816. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_workflow_concurrency.py +0 -0
  817. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  818. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  819. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_workflow_timeouts.py +0 -0
  820. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_workflows.py +0 -0
  821. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  822. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/visual/a11y_check.mjs +0 -0
  823. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/visual/console_check.mjs +0 -0
  824. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/visual/package-lock.json +0 -0
  825. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/visual/package.json +0 -0
  826. {boost_skill_cli-1.2.56 → boost_skill_cli-1.2.58}/tests/visual/visual_check.mjs +0 -0
@@ -105,6 +105,20 @@ opt-in evals stay out of `check` and all degrade cleanly:
105
105
  the `[eval]` extra **and** a judge key (`OPENAI_API_KEY`, or `ANTHROPIC_API_KEY`
106
106
  with `langchain-anthropic`) plus boost AI to generate the explanations.
107
107
 
108
+ - `make eval-tools` — Tier 3 tool-call **behaviour**. Every tier above grades
109
+ what boost returns *once it is asked*; this grades whether it is asked, which
110
+ is the step they all depend on — a gate flooring recall@k at 0.78 reports
111
+ nothing when retrieval was never invoked. It scores **two** numbers and
112
+ gating on one would be the same hole `eval` had before hit@1: a floor on a
113
+ should-call prompt set, and a **ceiling on a should-not-call set** drawn from
114
+ the shipped skip list, because call rate alone rewards making the tool
115
+ descriptions maximally assertive — the capture `core/mcp.py` is written to
116
+ avoid. Rates carry a Wilson interval over N runs and floors are judged
117
+ against the bound, not the point estimate: at 3/3 the normal approximation
118
+ claims [1.00, 1.00] and would let a wording regression hide behind one lucky
119
+ run. Drives a real host, so it is opt-in, out of `check`, and degrades
120
+ cleanly when `claude` is not on `PATH`.
121
+
108
122
  The `[eval]` extra (`pip install -e '.[eval]'`) carries `ranx` + `ragas`; nothing
109
123
  in it is ever imported by the CLI or the required gate. It pins the langchain 0.3
110
124
  stack because ragas 0.2.x breaks against langchain ≥1.0 — an isolated cost of the
@@ -10,7 +10,7 @@ PYTEST := $(VENV)/bin/pytest
10
10
  # pinned taps out of the developer's real ~/.boost.
11
11
  EVAL_HOME := $(CURDIR)/.eval-home
12
12
 
13
- .PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo carousel clean-test eval eval-ai eval-rec eval-stats eval-explain evals evals-baseline evals-golden evals-online audit dist-check bdd bench bench-cli fuzz post-deploy
13
+ .PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo carousel clean-test eval eval-ai eval-rec eval-stats eval-explain eval-tools evals evals-baseline evals-golden evals-online audit dist-check bdd bench bench-cli fuzz post-deploy
14
14
 
15
15
  # Every tool comes from a hash-pinned requirements/*.txt — the same files CI
16
16
  # installs (see scripts/lock_toolchain.py). pip enforces the hashes, so a dev
@@ -165,6 +165,17 @@ eval-explain:
165
165
  PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
166
166
  BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_explain.py --fail-under 0.80
167
167
 
168
+ # Tier 3: tool-call BEHAVIOUR — does an agent call boost's tools when it
169
+ # should, and stay away when it should not. Tiers 1 and 2 grade what boost
170
+ # returns once it is asked; this grades whether it is asked, which is the step
171
+ # everything downstream depends on. Two numbers, never one: a floor on the
172
+ # should-call half AND a ceiling on the should-not-call half, because scoring
173
+ # call rate alone rewards an assertive surface — the capture core/mcp.py is
174
+ # written to avoid. Drives a real host and spends real tokens, so it is opt-in
175
+ # and OUT of `check`; degrades cleanly when no host is on PATH.
176
+ eval-tools:
177
+ $(PY) scripts/eval_tools.py --runs 3
178
+
168
179
  # Retrieval-quality gate over the HERMETIC golden set: recall@5/@10, MRR, and
169
180
  # nDCG@5/@10 with graded (3/2/1) relevance, plus a paired-bootstrap regression
170
181
  # test against the committed evals/baseline.json. Part of `check` and required
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.56
3
+ Version: 1.2.58
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.56'
22
- __version_tuple__ = version_tuple = (1, 2, 56)
21
+ __version__ = version = '1.2.58'
22
+ __version_tuple__ = version_tuple = (1, 2, 58)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.56
3
+ Version: 1.2.58
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -542,6 +542,7 @@ scripts/eval_gate.py
542
542
  scripts/eval_recommend.py
543
543
  scripts/eval_retrieval.py
544
544
  scripts/eval_stats_summary.py
545
+ scripts/eval_tools.py
545
546
  scripts/import_budget.py
546
547
  scripts/lock_toolchain.py
547
548
  scripts/measure_registry.py
@@ -588,6 +589,7 @@ tests/eval/golden.jsonl
588
589
  tests/eval/recommend.jsonl
589
590
  tests/eval/taps-scale.txt
590
591
  tests/eval/taps.txt
592
+ tests/eval/tool_calls.jsonl
591
593
  tests/functional/test_bmad_all_hosts.py
592
594
  tests/functional/test_capabilities_policy.py
593
595
  tests/functional/test_cli_adapt.py
@@ -656,6 +658,7 @@ tests/unit/test_aihost.py
656
658
  tests/unit/test_bmad_core.py
657
659
  tests/unit/test_boost_first_offer.py
658
660
  tests/unit/test_bootstrap.py
661
+ tests/unit/test_bot_pr_dco.py
659
662
  tests/unit/test_branch_current.py
660
663
  tests/unit/test_browse.py
661
664
  tests/unit/test_builtin.py
@@ -711,6 +714,7 @@ tests/unit/test_eval_gate.py
711
714
  tests/unit/test_eval_grading.py
712
715
  tests/unit/test_eval_metrics.py
713
716
  tests/unit/test_eval_stats_summary.py
717
+ tests/unit/test_eval_tools.py
714
718
  tests/unit/test_failure_alerting_covers_unattended.py
715
719
  tests/unit/test_faithfulness.py
716
720
  tests/unit/test_frontmatter.py
@@ -2,12 +2,13 @@
2
2
  id: tool-call-eval-tier
3
3
  board: code
4
4
  section: planned
5
- status: planned
5
+ status: inflight
6
6
  category: Quality · Eval
7
7
  complexity: L
8
8
  impact: High
9
9
  wow: 4
10
10
  note: boost floors four retrieval metrics and measures whether an agent ever calls the tools zero times
11
+ owner: feat/tool-call-eval
11
12
  order: 96
12
13
  title: a Tier 3 eval for tool-call behaviour, floored in <b>both</b> directions
13
14
  ---
@@ -814,7 +814,7 @@ an oversight.</p></details>
814
814
  </article>
815
815
 
816
816
  <article class="cap rcard" id="tool-call-eval-tier">
817
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Quality · Eval</span></div>
817
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Quality · Eval</span></div>
818
818
  <h3>a Tier 3 eval for tool-call behaviour, floored in <b>both</b> directions</h3>
819
819
  <p>boost's required gate floors <b>four</b> retrieval metrics — recall@k &ge; 0.78, hit@1 &ge; 0.40,
820
820
  MRR &ge; 0.52, nDCG@k &ge; 0.58 — over a 91-query golden set and a 10,152-entry corpus, every
@@ -0,0 +1,339 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright the boost contributors.
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ """Tier 3: does an agent CALL boost's tools when it should — and stay away when
5
+ it should not.
6
+
7
+ Tiers 1 and 2 grade what boost returns *once it is asked*: recall@k, hit@1, MRR
8
+ and nDCG over a 91-query golden set. Nothing measured whether an agent asks,
9
+ and that is the step everything downstream depends on. A gate flooring
10
+ recall@k at 0.78 reports nothing when retrieval is never invoked.
11
+
12
+ TWO NUMBERS, NEVER ONE. A tier that scores call rate alone rewards making the
13
+ tool descriptions maximally assertive, which is precisely the capture
14
+ `core/mcp.py` is written to avoid — and boost already learned this one tier
15
+ down: flooring recall without hit@1 passed a ranker that found the answer every
16
+ time and never ranked it first. So the set has two halves, and this reports a
17
+ floor on the should-call half AND a ceiling on the should-not-call half. One
18
+ number without the other is an incentive to ship the thing boost refuses to be.
19
+
20
+ PER HOST, NEVER AVERAGED. The registered hosts do not see the same boost text:
21
+ Claude Code puts server `instructions` in the system prompt, and Gemini CLI
22
+ never delivers them in interactive mode at all. One averaged score would hide a
23
+ host where the guidance is simply absent, and would credit or blame wording for
24
+ a delivery failure.
25
+
26
+ AN INTERVAL, NOT A VERDICT PER RUN. The outcome is stochastic, so a single
27
+ replay cannot tell a wording regression from a sampling wobble. Every rate is
28
+ reported with a Wilson score interval over N runs, and a floor is judged
29
+ against the interval bound rather than the point estimate.
30
+
31
+ WHAT THIS MEASURES, AND THE CONFOUND TO CONTROL FOR. The host reads more than
32
+ the MCP tool descriptions: an installed boost RULE is standing instructions in
33
+ the agent's own context file, and `boost-first` says in as many words to call
34
+ these tools. A run on a machine where that rule is installed is measuring
35
+ rule + descriptions, and attributing the result to wording alone would be
36
+ wrong. `--report-context` prints what was in scope so a number is never read
37
+ without it; compare hosts and wordings only across runs with the same answer.
38
+
39
+ FIRST REAL RUN, and it is why the ceiling exists. Four prompts, one run each,
40
+ against Claude Code on a machine with the `boost-first` rule installed:
41
+ should-call 1/1, should-NOT-call **3/3**. The host called boost for "What is
42
+ the difference between a Python list and a tuple?" — a question, which boost's
43
+ own skip list excuses by name. A call-rate-only tier would have reported a
44
+ perfect 1.00 and called it a triumph.
45
+
46
+ Opt-in and key-gated like the other Tier 2/3 evals — it drives a real host and
47
+ spends real tokens, so it must NOT join the required `check` gate, and it
48
+ degrades cleanly when no host is reachable.
49
+
50
+ Usage:
51
+ python3 scripts/eval_tools.py --dry-run # show the plan, call nothing
52
+ python3 scripts/eval_tools.py --runs 3 # 3 runs per prompt
53
+ python3 scripts/eval_tools.py --floor-call 0.60 --ceiling-false-call 0.20
54
+ """
55
+ from __future__ import annotations
56
+
57
+ import argparse
58
+ import json
59
+ import math
60
+ import os
61
+ import shutil
62
+ import subprocess
63
+ import sys
64
+ from pathlib import Path
65
+
66
+ ROOT = Path(__file__).resolve().parent.parent
67
+ DEFAULT_SET = ROOT / "tests" / "eval" / "tool_calls.jsonl"
68
+
69
+ #: Tool names that count as "the agent asked boost". Prefixed forms are matched
70
+ #: too — hosts namespace MCP tools differently (`mcp__boost__boost_search`,
71
+ #: `mcp_boost_boost_search`), and matching the bare suffix keeps one list
72
+ #: correct across all of them.
73
+ BOOST_TOOLS = ("boost_search", "boost_list", "boost_info", "boost_read",
74
+ "boost_install", "boost_doctor", "boost_discover_github")
75
+
76
+ #: Only these count as *consulting the shelf*. `boost_install` is downstream of
77
+ #: a decision already made, and scoring it as a check would let a run that
78
+ #: installed without looking count as a success.
79
+ CONSULT_TOOLS = ("boost_search", "boost_list", "boost_info", "boost_read")
80
+
81
+
82
+ # ----------------------------------------------------------------- data
83
+
84
+ def load_set(path: Path) -> list[dict]:
85
+ """Rows from the JSONL prompt set. `#` comments and blank lines allowed."""
86
+ rows: list[dict] = []
87
+ for line in path.read_text(encoding="utf-8").splitlines():
88
+ line = line.strip()
89
+ if not line or line.startswith("#"):
90
+ continue
91
+ rows.append(json.loads(line))
92
+ if not rows:
93
+ raise SystemExit("no prompts in %s" % path)
94
+ bad = [r["id"] for r in rows if r.get("expect") not in ("call", "no-call")]
95
+ if bad:
96
+ raise SystemExit("rows with no usable `expect`: %s" % ", ".join(bad))
97
+ ids = [r["id"] for r in rows]
98
+ dupes = sorted({i for i in ids if ids.count(i) > 1})
99
+ if dupes:
100
+ raise SystemExit("duplicate row ids: %s" % ", ".join(dupes))
101
+ return rows
102
+
103
+
104
+ def halves(rows: list[dict]) -> tuple[list[dict], list[dict]]:
105
+ """``(should_call, should_not_call)``.
106
+
107
+ Both must be non-empty: a set with one half is the single-number failure
108
+ this whole tier exists to refuse, so it is an error rather than a warning.
109
+ """
110
+ call = [r for r in rows if r["expect"] == "call"]
111
+ no_call = [r for r in rows if r["expect"] == "no-call"]
112
+ if not call or not no_call:
113
+ raise SystemExit(
114
+ "the prompt set needs BOTH halves — %d should-call, %d should-not-call. "
115
+ "Scoring one direction rewards an assertive surface, which is the "
116
+ "capture this tier exists to detect." % (len(call), len(no_call)))
117
+ return call, no_call
118
+
119
+
120
+ # -------------------------------------------------------------- scoring
121
+
122
+ def wilson(k: int, n: int, z: float = 1.96) -> tuple[float, float]:
123
+ """Wilson score interval for ``k`` successes in ``n`` trials.
124
+
125
+ Wilson rather than the textbook normal approximation because this tier runs
126
+ small N by design (a live host call is seconds and money). At n=3, k=3 the
127
+ normal interval is [1.0, 1.0] — it claims certainty from three samples,
128
+ which would let a wording regression hide behind a lucky run. Wilson gives
129
+ [0.44, 1.0] there and stays inside [0, 1] at the edges.
130
+
131
+ ``n == 0`` returns ``(0.0, 1.0)``: no evidence is the widest interval, not
132
+ a score of zero.
133
+ """
134
+ if n <= 0:
135
+ return 0.0, 1.0
136
+ p = k / n
137
+ d = 1 + z * z / n
138
+ centre = (p + z * z / (2 * n)) / d
139
+ half = z * math.sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / d
140
+ return max(0.0, centre - half), min(1.0, centre + half)
141
+
142
+
143
+ def rate(observations: list[bool]) -> dict:
144
+ """``{k, n, rate, lo, hi}`` for a list of per-run booleans."""
145
+ k, n = sum(1 for o in observations if o), len(observations)
146
+ lo, hi = wilson(k, n)
147
+ return {"k": k, "n": n, "rate": (k / n) if n else 0.0, "lo": lo, "hi": hi}
148
+
149
+
150
+ def score_host(rows: list[dict], observed: dict[str, list[bool]]) -> dict:
151
+ """Per-host metrics from ``{row_id: [called?, ...]}``.
152
+
153
+ Rows with no observations are reported as ``skipped`` rather than counted
154
+ as failures — a host that could not be reached must not read as a host that
155
+ declined to call.
156
+ """
157
+ call_rows, no_call_rows = halves(rows)
158
+
159
+ def seen(rs: list[dict]) -> list[bool]:
160
+ return [o for r in rs for o in observed.get(r["id"], [])]
161
+
162
+ skipped = sorted(r["id"] for r in rows if not observed.get(r["id"]))
163
+ return {
164
+ "call_rate": rate(seen(call_rows)),
165
+ "false_call_rate": rate(seen(no_call_rows)),
166
+ "skipped": skipped,
167
+ "per_row": {r["id"]: rate(observed.get(r["id"], [])) for r in rows},
168
+ }
169
+
170
+
171
+ def verdict(metrics: dict, floor_call: float, ceiling_false: float) -> list[str]:
172
+ """Failure reasons, empty when the host passes both directions.
173
+
174
+ Judged against the INTERVAL, not the point estimate: the floor must clear
175
+ the lower bound and the ceiling must clear the upper bound. With small N a
176
+ point estimate of 0.67 from two of three runs is indistinguishable from
177
+ noise, and gating on it would make the tier itself flaky.
178
+ """
179
+ out = []
180
+ c, f = metrics["call_rate"], metrics["false_call_rate"]
181
+ if c["n"] == 0:
182
+ out.append("no should-call observations")
183
+ elif c["lo"] < floor_call:
184
+ out.append("call rate %.2f [%.2f-%.2f] under floor %.2f (%d/%d)"
185
+ % (c["rate"], c["lo"], c["hi"], floor_call, c["k"], c["n"]))
186
+ if f["n"] and f["hi"] > ceiling_false:
187
+ out.append("false-call rate %.2f [%.2f-%.2f] over ceiling %.2f (%d/%d)"
188
+ % (f["rate"], f["lo"], f["hi"], ceiling_false, f["k"], f["n"]))
189
+ return out
190
+
191
+
192
+ # ----------------------------------------------------------------- probe
193
+
194
+ def called_boost(events: str) -> bool:
195
+ """Did this run's event stream contain a boost CONSULT tool call?
196
+
197
+ Reads the host's own stream rather than the model's prose: an agent that
198
+ says "let me check boost" and does not is a miss, and one that calls
199
+ without narrating is a hit. Substring matching on the bare tool name covers
200
+ every host's namespacing (`mcp__boost__boost_search`, `mcp_boost_…`).
201
+ """
202
+ return any(name in events for name in CONSULT_TOOLS)
203
+
204
+
205
+ def claude_available() -> bool:
206
+ return shutil.which("claude") is not None
207
+
208
+
209
+ def run_claude(prompt: str, timeout: int) -> str | None:
210
+ """One `claude -p` run, returning its raw event stream (or None).
211
+
212
+ `--output-format stream-json` is what makes the probe honest: it emits a
213
+ `tool_use` block per call, so the observation is the host's record of what
214
+ happened rather than the model's account of it.
215
+ """
216
+ cmd = ["claude", "-p", prompt, "--output-format", "stream-json",
217
+ "--verbose", "--max-turns", "2"]
218
+ try:
219
+ proc = subprocess.run(cmd, capture_output=True, text=True,
220
+ timeout=timeout)
221
+ except (subprocess.TimeoutExpired, OSError):
222
+ return None
223
+ # A non-zero exit with output still carries the events we care about; only
224
+ # a silent failure is unusable.
225
+ return proc.stdout or None
226
+
227
+
228
+ # ------------------------------------------------------------------ cli
229
+
230
+ def _print_context() -> None:
231
+ """Name the installed RULES, because they are part of what is being scored.
232
+
233
+ A rule is standing instructions in the agent's own context file, and
234
+ boost's own `boost-first` rule tells the agent to call these tools. A rate
235
+ measured with it installed is a rate for rule + descriptions; reading it as
236
+ a verdict on the descriptions alone is the mistake this line exists to
237
+ prevent. Printed, never subtracted — the honest move is to say what was in
238
+ scope, not to guess at its share.
239
+ """
240
+ try:
241
+ from boost_cli.core import lockfile
242
+ rules = sorted(lockfile.all_installed().get("rule") or {})
243
+ except Exception: # a context note must never fail the run it annotates
244
+ print("context: could not read the lock file")
245
+ return
246
+ print("context: %d rule(s) installed and in scope for every prompt%s"
247
+ % (len(rules), (" — " + ", ".join(rules)) if rules else ""))
248
+ if rules:
249
+ print(" these are standing instructions; the rates below are "
250
+ "for rule + descriptions, not descriptions alone.")
251
+
252
+
253
+ def _report(host: str, rows: list[dict], metrics: dict,
254
+ reasons: list[str]) -> None:
255
+ c, f = metrics["call_rate"], metrics["false_call_rate"]
256
+ print("\n== %s ==" % host)
257
+ print(" should-call %d/%d = %.2f [%.2f-%.2f]"
258
+ % (c["k"], c["n"], c["rate"], c["lo"], c["hi"]))
259
+ print(" should-NOT-call %d/%d = %.2f [%.2f-%.2f] (lower is better)"
260
+ % (f["k"], f["n"], f["rate"], f["lo"], f["hi"]))
261
+ if metrics["skipped"]:
262
+ print(" skipped (no observations): %s" % ", ".join(metrics["skipped"]))
263
+ for r in rows:
264
+ m = metrics["per_row"][r["id"]]
265
+ if not m["n"]:
266
+ continue
267
+ want = "call" if r["expect"] == "call" else "no-call"
268
+ ok = (m["k"] == m["n"]) if r["expect"] == "call" else (m["k"] == 0)
269
+ print(" %-24s want %-8s got %d/%d %s"
270
+ % (r["id"], want, m["k"], m["n"], "" if ok else "<-"))
271
+ for reason in reasons:
272
+ print(" FAIL: %s" % reason)
273
+
274
+
275
+ def main(argv: list[str] | None = None) -> int:
276
+ p = argparse.ArgumentParser(
277
+ prog="eval_tools.py",
278
+ description="Tier 3: tool-call behaviour, floored in both directions")
279
+ p.add_argument("--set", type=Path, default=DEFAULT_SET)
280
+ p.add_argument("--runs", type=int, default=1,
281
+ help="runs per prompt; more narrows the interval")
282
+ p.add_argument("--timeout", type=int, default=120)
283
+ p.add_argument("--floor-call", type=float, default=0.60,
284
+ help="lower bound of the should-call rate must clear this")
285
+ p.add_argument("--ceiling-false-call", type=float, default=0.20,
286
+ help="upper bound of the should-NOT-call rate must stay under")
287
+ p.add_argument("--dry-run", action="store_true",
288
+ help="print the plan and the halves; call no host")
289
+ p.add_argument("--json", action="store_true")
290
+ p.add_argument("--report-context", action="store_true", default=True,
291
+ help="name the installed rules in scope (default on); a "
292
+ "rate read without them is not attributable to wording")
293
+ args = p.parse_args(argv)
294
+
295
+ rows = load_set(args.set)
296
+ call_rows, no_call_rows = halves(rows)
297
+ if args.dry_run:
298
+ print("%d prompts: %d should-call, %d should-NOT-call, %d run(s) each"
299
+ % (len(rows), len(call_rows), len(no_call_rows), args.runs))
300
+ print("floor(call) >= %.2f ceiling(false-call) <= %.2f"
301
+ % (args.floor_call, args.ceiling_false_call))
302
+ for r in rows:
303
+ print(" %-24s %-8s %s" % (r["id"], r["expect"], r["prompt"][:56]))
304
+ return 0
305
+
306
+ if not claude_available():
307
+ # Degrade the way every other opt-in eval does: say what is missing and
308
+ # exit 0, so a contributor without a host is not handed a red build for
309
+ # a tier that is deliberately outside `check`.
310
+ print("no host available — this tier drives the `claude` CLI and it is "
311
+ "not on PATH. Install it, or run with --dry-run.")
312
+ return 0
313
+ if os.environ.get("BOOST_NO_AI"):
314
+ print("BOOST_NO_AI is set — refusing to spend tokens.")
315
+ return 0
316
+
317
+ if args.report_context:
318
+ _print_context()
319
+
320
+ observed: dict[str, list[bool]] = {}
321
+ for r in rows:
322
+ for _ in range(max(1, args.runs)):
323
+ events = run_claude(r["prompt"], args.timeout)
324
+ if events is None:
325
+ continue
326
+ observed.setdefault(r["id"], []).append(called_boost(events))
327
+
328
+ metrics = score_host(rows, observed)
329
+ reasons = verdict(metrics, args.floor_call, args.ceiling_false_call)
330
+ if args.json:
331
+ print(json.dumps({"host": "claude-code", "metrics": metrics,
332
+ "failures": reasons}, indent=2))
333
+ else:
334
+ _report("claude-code", rows, metrics, reasons)
335
+ return 1 if reasons else 0
336
+
337
+
338
+ if __name__ == "__main__":
339
+ sys.exit(main())
@@ -0,0 +1,32 @@
1
+ # Tier 3 tool-call behaviour set. One JSON object per line; `#` comments allowed.
2
+ #
3
+ # TWO HALVES, and the second is what makes the first honest. A tier that scores
4
+ # call rate alone rewards making boost maximally assertive — the exact capture
5
+ # `core/mcp.py`'s INSTRUCTIONS are written to avoid, and the same hole boost
6
+ # already found one tier down when it floored recall without hit@1.
7
+ #
8
+ # expect: "call" the request carries a signal boost's own text names --
9
+ # more than one file, or something outliving the session
10
+ # expect: "no-call" drawn from the SHIPPED skip list: "a question, a
11
+ # one-line edit, or a command you were just handed"
12
+ #
13
+ # `signals` records WHICH shipped trigger the row is exercising, so a failing
14
+ # row names the sentence to argue with rather than just a number. Keep every
15
+ # prompt free of the word "boost" and of any tool name: naming the tool tests
16
+ # obedience, not judgement, and would score a surface that never persuades.
17
+ {"id": "call-new-subsystem", "expect": "call", "signals": ["new subsystem", "outlives the session"], "prompt": "I'm adding a background job queue to this Python service. Set up the worker, the retry policy and the dead-letter handling."}
18
+ {"id": "call-ci-job", "expect": "call", "signals": ["a CI job", "outlives the session"], "prompt": "Add a GitHub Actions workflow that runs our tests on every pull request and blocks merge when they fail."}
19
+ {"id": "call-convention", "expect": "call", "signals": ["a convention", "outlives the session"], "prompt": "We want conventional commit messages enforced across the team from now on. Set that up."}
20
+ {"id": "call-code-review", "expect": "call", "signals": ["nameable task"], "prompt": "Set up a code review process for this repo."}
21
+ {"id": "call-dependency-choice", "expect": "call", "signals": ["a dependency", "architecture decision"], "prompt": "Pick an ORM for this new FastAPI service and wire up the first model and migration."}
22
+ {"id": "call-flaky-tests", "expect": "call", "signals": ["nameable task", "more than one file"], "prompt": "Our test suite fails maybe one run in five, different tests each time. Track it down and fix it."}
23
+ {"id": "call-linter-config", "expect": "call", "signals": ["environment and tooling config", "outlives the session"], "prompt": "Configure linting and formatting for this TypeScript monorepo so everyone gets the same result."}
24
+ {"id": "call-migration", "expect": "call", "signals": ["nameable task", "more than one file"], "prompt": "Write a database migration that splits the users table into users and profiles, with a backfill."}
25
+ {"id": "no-call-question", "expect": "no-call", "signals": ["a question"], "prompt": "What is the difference between a Python list and a tuple?"}
26
+ {"id": "no-call-one-line", "expect": "no-call", "signals": ["a one-line edit"], "prompt": "In README.md, change the word 'reciept' to 'receipt'."}
27
+ {"id": "no-call-handed-command", "expect": "no-call", "signals": ["a command you were just handed"], "prompt": "Run `git status` and tell me what branch I'm on."}
28
+ {"id": "no-call-explain-code", "expect": "no-call", "signals": ["a question"], "prompt": "Explain what this regex does: ^(?=.*[A-Z])(?=.*\\d).{8,}$"}
29
+ {"id": "no-call-arithmetic", "expect": "no-call", "signals": ["a question"], "prompt": "If a request takes 240 ms and we make 12 of them in parallel across 4 workers, roughly how long does the batch take?"}
30
+ {"id": "no-call-rename-var", "expect": "no-call", "signals": ["a one-line edit"], "prompt": "Rename the variable `tmp` to `buffer` on line 42 of parser.py."}
31
+ {"id": "no-call-read-file", "expect": "no-call", "signals": ["a command you were just handed"], "prompt": "Show me the first 20 lines of pyproject.toml."}
32
+ {"id": "no-call-typo-commit", "expect": "no-call", "signals": ["a one-line edit"], "prompt": "Fix the typo in the docstring of `parse_args` — it says 'arguemnts'."}
@@ -0,0 +1,130 @@
1
+ # Copyright the boost contributors.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Unit tests: a bot-opened PR must pass the DCO gate it will be graded by.
4
+
5
+ Five workflows open pull requests with `peter-evans/create-pull-request`:
6
+ `demo`, `eval-scale`, `eval-corpus-refresh`, `eval-stats` and `lock-refresh`.
7
+ That action's `author` input **defaults to `${{ github.actor }}`** — the human
8
+ whose push triggered the run — while its `committer` defaults to the bot. So
9
+ the commit arrives authored by a person who never wrote it and never signed off
10
+ on it, and `scripts/check_dco.py`, which deliberately matches the sign-off
11
+ against the commit's *own author*, fails the PR the workflow just opened.
12
+
13
+ That is what happened to #617, and the shape of the failure is why this test
14
+ exists rather than a comment: every one of these workflows is scheduled or
15
+ push-triggered, so the break lands on a branch nobody is watching, hours after
16
+ the change that caused it, in a PR whose whole purpose was to be routine. And
17
+ no human can fix it by signing off — the trailer has to name the author, and
18
+ the author did not write the content.
19
+
20
+ Naming the bot is the honest fix, not a workaround: `check_dco.EXEMPT_NAMES`
21
+ exempts `github-actions[bot]` precisely because an account that cannot agree to
22
+ a certificate must not be asked for one. This test asserts against
23
+ `check_dco`'s own predicate rather than a copied string, so tightening the
24
+ exemption list can never leave these workflows passing a rule they no longer
25
+ satisfy.
26
+ """
27
+ from __future__ import annotations
28
+
29
+ import importlib.util
30
+ from pathlib import Path
31
+
32
+ import pytest
33
+
34
+ yaml = pytest.importorskip("yaml")
35
+
36
+ ROOT = Path(__file__).resolve().parents[2]
37
+ WORKFLOWS = ROOT / ".github" / "workflows"
38
+ DCO = ROOT / "scripts" / "check_dco.py"
39
+
40
+ pytestmark = pytest.mark.skipif(
41
+ not WORKFLOWS.is_dir() or not DCO.exists(),
42
+ reason="repo-root .github/scripts not reachable (e.g. mutation sandbox)")
43
+
44
+ ACTION = "peter-evans/create-pull-request"
45
+
46
+
47
+ def _check_dco():
48
+ spec = importlib.util.spec_from_file_location("check_dco_for_workflows", DCO)
49
+ mod = importlib.util.module_from_spec(spec)
50
+ assert spec.loader is not None
51
+ spec.loader.exec_module(mod)
52
+ return mod
53
+
54
+
55
+ def _pr_steps() -> list[tuple[str, dict]]:
56
+ """Every create-pull-request step in the repo, as (workflow file, `with`)."""
57
+ found = []
58
+ for path in sorted(WORKFLOWS.glob("*.yml")):
59
+ data = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
60
+ for job in (data.get("jobs") or {}).values():
61
+ found.extend(
62
+ (path.name, step.get("with") or {})
63
+ for step in (job or {}).get("steps") or []
64
+ if ACTION in str((step or {}).get("uses", "")))
65
+ return found
66
+
67
+
68
+ def _split(spec: str) -> tuple[str, str]:
69
+ """`Display Name <email>` -> (name, email), the format the action takes."""
70
+ name, _, rest = spec.partition("<")
71
+ return name.strip(), rest.rstrip(">").strip()
72
+
73
+
74
+ class TestEveryBotPullRequestPassesTheDcoGate:
75
+ def test_the_workflows_that_open_prs_are_still_found(self):
76
+ # If this drops to zero the rest of the file passes vacuously, which is
77
+ # the failure mode a "for each step" test has by construction.
78
+ names = sorted({w for w, _ in _pr_steps()})
79
+ assert len(names) >= 5, names
80
+
81
+ @pytest.mark.parametrize("workflow,With", _pr_steps(),
82
+ ids=[w for w, _ in _pr_steps()])
83
+ def test_the_author_is_named_and_not_left_to_the_triggering_human(
84
+ self, workflow, With):
85
+ assert "author" in With, (
86
+ "%s leaves `author` unset, so it defaults to ${{ github.actor }} "
87
+ "and the bot's commit is authored by whoever pushed — check_dco "
88
+ "then fails the PR this workflow just opened (#617)" % workflow)
89
+ assert "github.actor" not in With["author"], With["author"]
90
+
91
+ @pytest.mark.parametrize("workflow,With", _pr_steps(),
92
+ ids=[w for w, _ in _pr_steps()])
93
+ def test_that_author_is_one_check_dco_actually_exempts(self, workflow, With):
94
+ # Asserted against check_dco's own predicate, not a copy of the string:
95
+ # the two must not be able to drift apart silently.
96
+ name, email = _split(With.get("author", ""))
97
+ assert _check_dco()._exempt(name, email), (
98
+ "%s authors its bot commit as %r <%s>, which check_dco does not "
99
+ "exempt — it would need a Signed-off-by from that identity"
100
+ % (workflow, name, email))
101
+
102
+ @pytest.mark.parametrize("workflow,With", _pr_steps(),
103
+ ids=[w for w, _ in _pr_steps()])
104
+ def test_the_commit_is_signed(self, workflow, With):
105
+ # `sign-commits` has GitHub build and sign the commit through its API,
106
+ # so these land Verified instead of unsigned. Separate property from the
107
+ # DCO fix above — a signed commit authored by the human would still fail
108
+ # the gate, and an unsigned bot commit would still pass it.
109
+ assert With.get("sign-commits") is True, (
110
+ "%s does not set `sign-commits: true`" % workflow)
111
+
112
+
113
+ class TestTheDefaultIsRecordedAsTheBug:
114
+ """Without this the fix above reads as an arbitrary preference."""
115
+
116
+ def test_the_actions_own_default_author_is_the_triggering_actor(self):
117
+ # Pinned from the action.yml at the SHA the workflows pin, so a future
118
+ # bump that changes the default is noticed here rather than in a red
119
+ # scheduled run. Kept as the *claim*, checked against the vendored
120
+ # workflows: every step must override it.
121
+ for _workflow, With in _pr_steps():
122
+ assert With.get("author"), "an unset author is the bug, not a style"
123
+
124
+ def test_a_human_author_would_be_rejected(self):
125
+ # The exact identity from #617's failure. If check_dco ever started
126
+ # exempting real accounts, the fix above would be pointless and this
127
+ # says so out loud.
128
+ mod = _check_dco()
129
+ assert not mod._exempt(
130
+ "jonnyeclectic", "8794867+jonnyeclectic@users.noreply.github.com")