boost-skill-cli 1.2.20__tar.gz → 1.2.21__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 (744) hide show
  1. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
  2. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/PKG-INFO +1 -1
  3. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/discovery.py +19 -0
  5. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/rag.py +65 -0
  6. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  7. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/rag-architecture.md +14 -0
  8. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-has-no-stemming.md +28 -10
  9. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap.html +27 -9
  10. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_discovery.py +23 -0
  11. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rag.py +123 -0
  12. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.gitattributes +0 -0
  13. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.gitignore +0 -0
  14. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.gitleaks.toml +0 -0
  15. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.htmlvalidate.json +0 -0
  16. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.lighthouserc.json +0 -0
  17. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.lycheeignore +0 -0
  18. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.markdownlint-cli2.jsonc +0 -0
  19. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.pre-commit-config.yaml +0 -0
  20. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.stylelintrc.json +0 -0
  21. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.vale/styles/boost/Terminology.yml +0 -0
  22. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.vale.ini +0 -0
  23. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/CLAUDE.md +0 -0
  24. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/CODE_OF_CONDUCT.md +0 -0
  25. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/CONTRIBUTING.md +0 -0
  26. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/LICENSE +0 -0
  27. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/MANIFEST.in +0 -0
  28. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/Makefile +0 -0
  29. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/README.md +0 -0
  30. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/SECURITY.md +0 -0
  31. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost +0 -0
  32. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/__init__.py +0 -0
  33. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/__main__.py +0 -0
  34. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/cli.py +0 -0
  35. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/cliparse.py +0 -0
  36. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/__init__.py +0 -0
  37. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/_common.py +0 -0
  38. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/bmad.py +0 -0
  39. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/configuration.py +0 -0
  40. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/hooks.py +0 -0
  41. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/info.py +0 -0
  42. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/intelligence.py +0 -0
  43. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/pkg.py +0 -0
  44. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/quality.py +0 -0
  45. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/run.py +0 -0
  46. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/safety.py +0 -0
  47. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/taps.py +0 -0
  48. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/team.py +0 -0
  49. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/__init__.py +0 -0
  50. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/adapters.py +0 -0
  51. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/agents.py +0 -0
  52. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/ai.py +0 -0
  53. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/bmad.py +0 -0
  54. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/bootstrap.py +0 -0
  55. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/browse.py +0 -0
  56. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/builtin.py +0 -0
  57. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/capabilities.py +0 -0
  58. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/catalog.py +0 -0
  59. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/catalogbundle.py +0 -0
  60. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/chat.py +0 -0
  61. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/claude_settings.py +0 -0
  62. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/complete.py +0 -0
  63. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/config.py +0 -0
  64. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/dense.py +0 -0
  65. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/ed25519.py +0 -0
  66. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/embed.py +0 -0
  67. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/faithfulness.py +0 -0
  68. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/frontmatter.py +0 -0
  69. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/gitutil.py +0 -0
  70. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/imperative.py +0 -0
  71. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/injectscan.py +0 -0
  72. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/installscan.py +0 -0
  73. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/integrity.py +0 -0
  74. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/journal.py +0 -0
  75. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/localembed.py +0 -0
  76. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/lockfile.py +0 -0
  77. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/logs.py +0 -0
  78. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/mcp.py +0 -0
  79. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/mcpdecl.py +0 -0
  80. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/mcphost.py +0 -0
  81. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/minisign.py +0 -0
  82. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/nethttp.py +0 -0
  83. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/output.py +0 -0
  84. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/paths.py +0 -0
  85. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/policy.py +0 -0
  86. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/projectlock.py +0 -0
  87. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/provenance.py +0 -0
  88. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/registry.py +0 -0
  89. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/resolve.py +0 -0
  90. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/rules.py +0 -0
  91. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/scopes.py +0 -0
  92. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/secretscan.py +0 -0
  93. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/selfupdate.py +0 -0
  94. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/serve.py +0 -0
  95. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/stackprobe.py +0 -0
  96. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/staleness.py +0 -0
  97. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/store.py +0 -0
  98. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/trustaudit.py +0 -0
  99. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/typosquat.py +0 -0
  100. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/updatediff.py +0 -0
  101. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/util.py +0 -0
  102. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/workflows.py +0 -0
  103. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/data/registries.json +0 -0
  104. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/data/rules/boost-first.mdc +0 -0
  105. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/errors.py +0 -0
  106. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/spin.py +0 -0
  107. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/__init__.py +0 -0
  108. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/_compat.py +0 -0
  109. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/graph.py +0 -0
  110. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/loader.py +0 -0
  111. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/py.typed +0 -0
  112. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/retriever.py +0 -0
  113. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  114. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  115. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  116. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/requires.txt +0 -0
  117. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/top_level.txt +0 -0
  118. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/codecov.yml +0 -0
  119. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/.claude/settings.local.json +0 -0
  120. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/DEBUGGING.md +0 -0
  121. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/adapters.html +0 -0
  122. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/README.md +0 -0
  123. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-components-core.md +0 -0
  124. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-containers.md +0 -0
  125. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-context.md +0 -0
  126. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-dynamic-install.md +0 -0
  127. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/distill.gif +0 -0
  128. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/doctor.gif +0 -0
  129. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/explain.gif +0 -0
  130. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/hooks.gif +0 -0
  131. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/install.gif +0 -0
  132. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/pulse.gif +0 -0
  133. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/search.gif +0 -0
  134. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/tap.gif +0 -0
  135. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/distill.tape +0 -0
  136. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/doctor.tape +0 -0
  137. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/explain.tape +0 -0
  138. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/hooks.tape +0 -0
  139. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/install.tape +0 -0
  140. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/pulse.tape +0 -0
  141. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/search.tape +0 -0
  142. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/tap.tape +0 -0
  143. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel.html +0 -0
  144. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/chat.html +0 -0
  145. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/commands.html +0 -0
  146. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo-index.json +0 -0
  147. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo.gif +0 -0
  148. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo.html +0 -0
  149. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo.tape +0 -0
  150. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/design-roadmap.html +0 -0
  151. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/eval-latest.json +0 -0
  152. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/eval.html +0 -0
  153. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/index.html +0 -0
  154. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/langchain.html +0 -0
  155. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/mcp-hub.html +0 -0
  156. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D01.md +0 -0
  157. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D02.md +0 -0
  158. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D03.md +0 -0
  159. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D04.md +0 -0
  160. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D05.md +0 -0
  161. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D06.md +0 -0
  162. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D07.md +0 -0
  163. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D08.md +0 -0
  164. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D09.md +0 -0
  165. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D10.md +0 -0
  166. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D11.md +0 -0
  167. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D12.md +0 -0
  168. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D13.md +0 -0
  169. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D14.md +0 -0
  170. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D15.md +0 -0
  171. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D16.md +0 -0
  172. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D17.md +0 -0
  173. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D18.md +0 -0
  174. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D19.md +0 -0
  175. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D20.md +0 -0
  176. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D21.md +0 -0
  177. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D22.md +0 -0
  178. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D23.md +0 -0
  179. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D24.md +0 -0
  180. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D25.md +0 -0
  181. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D26.md +0 -0
  182. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  183. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  184. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  185. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  186. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  187. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  188. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  189. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  190. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  191. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  192. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  193. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  194. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  195. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-rule.md +0 -0
  196. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  197. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  198. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  199. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  200. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  201. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  202. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  203. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  204. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  205. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  206. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  207. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  208. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  209. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  210. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  211. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  212. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  213. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  214. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  215. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  216. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-carousel-page.md +0 -0
  217. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  218. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  219. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  220. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  221. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  222. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  223. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  224. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  225. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  226. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  227. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  228. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  229. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  230. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  231. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  232. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  233. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  234. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  235. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  236. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  237. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  238. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  239. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  240. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  241. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  242. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  243. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  244. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  245. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  246. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  247. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  248. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  249. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  250. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  251. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  252. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  253. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  254. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  255. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  256. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  257. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  258. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  259. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  260. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  261. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  262. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  263. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  264. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-community-health-files.md +0 -0
  265. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  266. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  267. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  268. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  269. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  270. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  271. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  272. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  273. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  274. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  275. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  276. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  277. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  278. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  279. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  280. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  281. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  282. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  283. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  284. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  285. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  286. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  287. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  288. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  289. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  290. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  291. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  292. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  293. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  294. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  295. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  296. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  297. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  298. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  299. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  300. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  301. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  302. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  303. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  304. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  305. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  306. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  307. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  308. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  309. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  310. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  311. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  312. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  313. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  314. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  315. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  316. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  317. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  318. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  319. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  320. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  321. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  322. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  323. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  324. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  325. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  326. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  327. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  328. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  329. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  330. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  331. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  332. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  333. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  334. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  335. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  336. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  337. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  338. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  339. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  340. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  341. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  342. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  343. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  344. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  345. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  346. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  347. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  348. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  349. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  350. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  351. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  352. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  353. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  354. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  355. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  356. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  357. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  358. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  359. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  360. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  361. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  362. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  363. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  364. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  365. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  366. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  367. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  368. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  369. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  370. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  371. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  372. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  373. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  374. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  375. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  376. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  377. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  378. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  379. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  380. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  381. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  382. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  383. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  384. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  385. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  386. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  387. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  388. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  389. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  390. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  391. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  392. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  393. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  394. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  395. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  396. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  397. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  398. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  399. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  400. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  401. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  402. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  403. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  404. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  405. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  406. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  407. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  408. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  409. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  410. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  411. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  412. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  413. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  414. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  415. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  416. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  417. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  418. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  419. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  420. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  421. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  422. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  423. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  424. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  425. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  426. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  427. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  428. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  429. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  430. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  431. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  432. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  433. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  434. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  435. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  436. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  437. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  438. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  439. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  440. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  441. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  442. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  443. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  444. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workspace-scope-install.md +0 -0
  445. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/zip-strict-audit.md +0 -0
  446. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  447. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  448. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  449. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/eslint.config.mjs +0 -0
  450. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/README.md +0 -0
  451. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/__init__.py +0 -0
  452. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/baseline.json +0 -0
  453. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/faithfulness.py +0 -0
  454. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/golden_set.json +0 -0
  455. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/make_corpus.py +0 -0
  456. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/make_golden.py +0 -0
  457. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/metrics.py +0 -0
  458. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/publish_golden_dataset.py +0 -0
  459. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/run_evals.py +0 -0
  460. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/examples/README.md +0 -0
  461. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/examples/adapt-demo.sh +0 -0
  462. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/examples/boost-run-prototype.sh +0 -0
  463. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/index.html +0 -0
  464. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/noxfile.py +0 -0
  465. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/pyproject.toml +0 -0
  466. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/coverage-tools.in +0 -0
  467. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/coverage-tools.txt +0 -0
  468. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/lint-tools.in +0 -0
  469. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/lint-tools.txt +0 -0
  470. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/mutation-tools.in +0 -0
  471. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/mutation-tools.txt +0 -0
  472. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/platform-pins.lock +0 -0
  473. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/release-tools.in +0 -0
  474. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/release-tools.txt +0 -0
  475. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/test-tools.in +0 -0
  476. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/test-tools.txt +0 -0
  477. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/a11y_check.py +0 -0
  478. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/bench_cli.sh +0 -0
  479. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_command_reference.py +0 -0
  480. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_demo_index.py +0 -0
  481. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_registries.py +0 -0
  482. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_roadmap.py +0 -0
  483. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_scale_corpus.py +0 -0
  484. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/check_anchors.py +0 -0
  485. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/check_licenses.py +0 -0
  486. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/check_required_checks.py +0 -0
  487. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/ensure_eval_corpus.sh +0 -0
  488. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_corpus.py +0 -0
  489. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_explain.py +0 -0
  490. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_gate.py +0 -0
  491. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_recommend.py +0 -0
  492. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_retrieval.py +0 -0
  493. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_stats_summary.py +0 -0
  494. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/import_budget.py +0 -0
  495. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/lock_toolchain.py +0 -0
  496. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/measure_registry.py +0 -0
  497. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/mutation_gate.py +0 -0
  498. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/mutation_shards.py +0 -0
  499. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/mutation_weights.json +0 -0
  500. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/page_budget.py +0 -0
  501. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/perf_gate.py +0 -0
  502. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/post_deploy_smoke.py +0 -0
  503. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/publish_eval_json.py +0 -0
  504. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/release_guard.py +0 -0
  505. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/release_preflight.py +0 -0
  506. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/serve_docs.py +0 -0
  507. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/setup.cfg +0 -0
  508. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/sonar-project.properties +0 -0
  509. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/README.md +0 -0
  510. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/boost.css +0 -0
  511. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/boost.js +0 -0
  512. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/demo.html +0 -0
  513. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/adapt.feature +0 -0
  514. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/browse.feature +0 -0
  515. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/count.feature +0 -0
  516. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/discover.feature +0 -0
  517. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/doctor.feature +0 -0
  518. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/environment.py +0 -0
  519. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/explain.feature +0 -0
  520. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/index.feature +0 -0
  521. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/install.feature +0 -0
  522. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/list.feature +0 -0
  523. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/mcp.feature +0 -0
  524. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/search.feature +0 -0
  525. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/cli_steps.py +0 -0
  526. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/discovery_steps.py +0 -0
  527. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/mcp_steps.py +0 -0
  528. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/quality_steps.py +0 -0
  529. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/conftest.py +0 -0
  530. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/baseline.json +0 -0
  531. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/explain.jsonl +0 -0
  532. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/golden-natural.jsonl +0 -0
  533. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/golden.jsonl +0 -0
  534. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/recommend.jsonl +0 -0
  535. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/taps-scale.txt +0 -0
  536. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/taps.txt +0 -0
  537. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_capabilities_policy.py +0 -0
  538. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_adapt.py +0 -0
  539. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_bmad.py +0 -0
  540. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_catalog.py +0 -0
  541. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_chat.py +0 -0
  542. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_configuration.py +0 -0
  543. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_hooks.py +0 -0
  544. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_info.py +0 -0
  545. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_intelligence.py +0 -0
  546. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_pkg.py +0 -0
  547. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_quality.py +0 -0
  548. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_taps.py +0 -0
  549. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_team.py +0 -0
  550. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_everyday_loop.py +0 -0
  551. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_integrity_enforce.py +0 -0
  552. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_kind_conformance.py +0 -0
  553. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_property_parsers.py +0 -0
  554. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_run.py +0 -0
  555. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_tap_signing.py +0 -0
  556. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_workspace_scope.py +0 -0
  557. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/README.md +0 -0
  558. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  559. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  560. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  561. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  562. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  563. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  564. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  565. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  566. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  567. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  568. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  569. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  570. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  571. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  572. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  573. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  574. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  575. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  576. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  577. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  578. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  579. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  580. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  581. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_frontmatter.py +0 -0
  582. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_registry.py +0 -0
  583. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/conftest.py +0 -0
  584. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/test_graph.py +0 -0
  585. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/test_loader.py +0 -0
  586. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/test_retriever.py +0 -0
  587. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/make_fixture.py +0 -0
  588. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/perf/test_benchmarks.py +0 -0
  589. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/smoke.sh +0 -0
  590. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_a11y_check.py +0 -0
  591. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_action_pin_lockstep.py +0 -0
  592. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_adapters.py +0 -0
  593. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_multi.py +0 -0
  594. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_runner.py +0 -0
  595. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_agents.py +0 -0
  596. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_ai.py +0 -0
  597. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_bmad_core.py +0 -0
  598. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_boost_first_offer.py +0 -0
  599. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_bootstrap.py +0 -0
  600. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_browse.py +0 -0
  601. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_builtin.py +0 -0
  602. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_capabilities.py +0 -0
  603. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_catalog.py +0 -0
  604. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_catalogbundle.py +0 -0
  605. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_chat.py +0 -0
  606. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_check_anchors.py +0 -0
  607. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_check_licenses.py +0 -0
  608. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_claude_settings.py +0 -0
  609. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_clean_internal_cache.py +0 -0
  610. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_cliparse.py +0 -0
  611. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_codeql_analysis_key.py +0 -0
  612. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_command_reference_fresh.py +0 -0
  613. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_community_health_files.py +0 -0
  614. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_compact.py +0 -0
  615. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_complete.py +0 -0
  616. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_complete_rc_block.py +0 -0
  617. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_config.py +0 -0
  618. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_content_dedupe.py +0 -0
  619. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_content_identity.py +0 -0
  620. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_crash_redaction.py +0 -0
  621. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dedup_trust.py +0 -0
  622. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_demo_index.py +0 -0
  623. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense.py +0 -0
  624. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_embed_dedupe.py +0 -0
  625. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fallback.py +0 -0
  626. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fix_hint.py +0 -0
  627. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_quantized.py +0 -0
  628. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_ready_order.py +0 -0
  629. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_real_schema.py +0 -0
  630. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  631. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shards.py +0 -0
  632. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status.py +0 -0
  633. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status_cheap.py +0 -0
  634. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dependabot_config.py +0 -0
  635. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_docs_pages_linked.py +0 -0
  636. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_docsite_chrome.py +0 -0
  637. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_ed25519.py +0 -0
  638. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_embed.py +0 -0
  639. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_embed_local.py +0 -0
  640. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_embed_truncated_response.py +0 -0
  641. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_entry_key.py +0 -0
  642. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_errors_and_cli_table.py +0 -0
  643. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_baseline.py +0 -0
  644. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_corpus.py +0 -0
  645. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_faithfulness.py +0 -0
  646. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_gate.py +0 -0
  647. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_grading.py +0 -0
  648. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_metrics.py +0 -0
  649. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_stats_summary.py +0 -0
  650. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  651. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_faithfulness.py +0 -0
  652. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_frontmatter.py +0 -0
  653. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_fuzz_targets.py +0 -0
  654. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  655. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitleaks_config.py +0 -0
  656. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil.py +0 -0
  657. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_lfs.py +0 -0
  658. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_sparse.py +0 -0
  659. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_imperative.py +0 -0
  660. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_import_budget.py +0 -0
  661. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_injectscan.py +0 -0
  662. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_install_permission_error.py +0 -0
  663. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_installscan.py +0 -0
  664. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_integrity.py +0 -0
  665. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_journal.py +0 -0
  666. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_langchain_packaging.py +0 -0
  667. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_link_ownership.py +0 -0
  668. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_localembed.py +0 -0
  669. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_localembed_e2e.py +0 -0
  670. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_lockfile.py +0 -0
  671. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_logs.py +0 -0
  672. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_marketing_counts.py +0 -0
  673. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcp.py +0 -0
  674. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcp_install_scan.py +0 -0
  675. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcpdecl.py +0 -0
  676. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcphost.py +0 -0
  677. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_measure_registry.py +0 -0
  678. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_minisign.py +0 -0
  679. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_hardening.py +0 -0
  680. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_shards.py +0 -0
  681. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_subfile_shards.py +0 -0
  682. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutmut_source_paths.py +0 -0
  683. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_nethttp.py +0 -0
  684. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_output.py +0 -0
  685. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_page_budget.py +0 -0
  686. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_paths.py +0 -0
  687. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_perf_gate.py +0 -0
  688. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_confusions.py +0 -0
  689. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_injection.py +0 -0
  690. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_secrets.py +0 -0
  691. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_platform_pins.py +0 -0
  692. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_policy.py +0 -0
  693. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_post_deploy_smoke.py +0 -0
  694. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_project_mcp_sidecar.py +0 -0
  695. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_projectlock.py +0 -0
  696. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_provenance.py +0 -0
  697. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_publish_golden_dataset.py +0 -0
  698. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fastpath.py +0 -0
  699. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fusion.py +0 -0
  700. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registries_fresh.py +0 -0
  701. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registry.py +0 -0
  702. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registry_categories.py +0 -0
  703. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registry_control_chars.py +0 -0
  704. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_release_guard.py +0 -0
  705. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_release_preflight.py +0 -0
  706. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_required_checks.py +0 -0
  707. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rerank_cache.py +0 -0
  708. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_resolve.py +0 -0
  709. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_roadmap_fresh.py +0 -0
  710. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rules.py +0 -0
  711. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_scale_corpus.py +0 -0
  712. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_scopes.py +0 -0
  713. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_secretscan.py +0 -0
  714. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_selfupdate.py +0 -0
  715. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_serve.py +0 -0
  716. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_serve_docs.py +0 -0
  717. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_shards_matrix.py +0 -0
  718. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_smoke_covers_every_command.py +0 -0
  719. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_spin.py +0 -0
  720. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_stackprobe.py +0 -0
  721. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_staleness.py +0 -0
  722. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_store.py +0 -0
  723. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_store_materialize.py +0 -0
  724. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_sync_blocked_links.py +0 -0
  725. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  726. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_token_parity.py +0 -0
  727. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_toolchain_lock.py +0 -0
  728. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_trustaudit.py +0 -0
  729. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_typosquat.py +0 -0
  730. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_updatediff.py +0 -0
  731. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_util.py +0 -0
  732. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_version.py +0 -0
  733. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_visual_harness_flags.py +0 -0
  734. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency.py +0 -0
  735. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  736. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  737. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_timeouts.py +0 -0
  738. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflows.py +0 -0
  739. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  740. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/a11y_check.mjs +0 -0
  741. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/console_check.mjs +0 -0
  742. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/package-lock.json +0 -0
  743. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/package.json +0 -0
  744. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/visual_check.mjs +0 -0
@@ -98,6 +98,8 @@ stderr
98
98
  Stdlib
99
99
  stdlib
100
100
  stdout
101
+ stemmer
102
+ stemming
101
103
  subagents
102
104
  subcommand
103
105
  tappable
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.20
3
+ Version: 1.2.21
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -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.20'
22
- __version_tuple__ = version_tuple = (1, 2, 20)
21
+ __version__ = version = '1.2.21'
22
+ __version_tuple__ = version_tuple = (1, 2, 21)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -176,10 +176,29 @@ def cmd_search(argv):
176
176
  installed=e["name"] in installed, lay=lay))
177
177
  out.info(out.role("%d match%s · ranked by %s"
178
178
  % (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
179
+ if use_rag:
180
+ _note_stem_expansions(query)
179
181
  _hint_semantic_search(engine)
180
182
  return 0
181
183
 
182
184
 
185
+ def _note_stem_expansions(query: str) -> None:
186
+ """Say when a query term was widened to the word actually indexed.
187
+
188
+ Staying quiet would be a worse answer than the old empty one: the user
189
+ asked for `brainstorm` and is looking at results for `brainstorming`, and
190
+ only one of those is a word they typed.
191
+ """
192
+ subs = rag.stem_expansions(rag.tokenize(query))
193
+ if not subs:
194
+ return
195
+ said = ", ".join("%r" % term for term in subs)
196
+ shown = ", ".join("%r" % term for term in subs.values())
197
+ out.info(out.role(out.truncate(
198
+ "no exact match for %s — showing %s" % (said, shown),
199
+ max(0, out.term_width() - 2)), "muted"))
200
+
201
+
183
202
  def _hint_semantic_search(engine: str) -> None:
184
203
  """Say that a better engine exists, when BM25 answered alone.
185
204
 
@@ -383,6 +383,65 @@ def read_postings(terms: Sequence[str]) -> dict[str, list[list[int]]]:
383
383
  return dict(out) # noqa: FURB123 out is a defaultdict; .copy() would keep the factory
384
384
 
385
385
 
386
+ # A query term shorter than this expands to noise: `cal` prefixes `calendar`,
387
+ # `calculate` and `callbacks` alike, and picking one of them for the user is a
388
+ # guess rather than a correction.
389
+ STEM_MIN_LEN = 4
390
+
391
+
392
+ def stem_expansions(terms: Sequence[str]) -> dict[str, str]:
393
+ """Map each term that indexes *nothing* to the commonest term it prefixes.
394
+
395
+ `tokenize` is exact-match, so a query term and its own inflection are
396
+ unrelated strings: `boost search brainstorm` returned zero matches while
397
+ `brainstorming` returned the skill, and `boost chat` had the same hole.
398
+ Measured over the 461 tap caches on one real machine, 4,663 of 29,607 item
399
+ names (15.7%) were unreachable by an attested stem — `pattern` missed 474
400
+ names ending `-patterns`, `skill` missed 252 ending `-skills`.
401
+
402
+ **A term that has postings is never expanded.** That is the whole safety
403
+ argument: this can only ever add signal where `_bm25` scored exactly none
404
+ (it skips a term with no posting list), so a query whose terms all exist
405
+ ranks byte-identically and the retrieval floors cannot move. It is also why
406
+ this is a fallback rather than a stemmer — a real stemmer conflates terms
407
+ that both exist, which changes established rankings and needs an index
408
+ format bump and a regenerated baseline.
409
+
410
+ Returns ``{}`` — never raises — when the store is missing or unreadable,
411
+ matching :func:`read_postings`.
412
+ """
413
+ uniq = [t for t in dict.fromkeys(terms) if len(t) >= STEM_MIN_LEN]
414
+ if not uniq:
415
+ return {}
416
+ indexed = read_postings(uniq)
417
+ missing = [t for t in uniq if not indexed.get(t)]
418
+ if not missing:
419
+ return {}
420
+ try:
421
+ con = sqlite3.connect("file:%s?mode=ro" % postings_path(), uri=True)
422
+ except sqlite3.Error:
423
+ return {}
424
+ out: dict[str, str] = {}
425
+ try:
426
+ for term in missing:
427
+ # `tokenize` emits only [a-z0-9]+, and "~" sorts above every
428
+ # character it can produce — so this half-open range is exactly the
429
+ # terms beginning with `term`, and it rides the postings_term index
430
+ # instead of scanning. Ties break on the term itself so the choice
431
+ # is deterministic across machines.
432
+ row = con.execute(
433
+ "SELECT term FROM postings WHERE term > ? AND term < ? "
434
+ "GROUP BY term ORDER BY COUNT(*) DESC, term LIMIT 1",
435
+ (term, term + "~")).fetchone()
436
+ if row:
437
+ out[term] = row[0]
438
+ except sqlite3.Error:
439
+ return {}
440
+ finally:
441
+ con.close()
442
+ return out
443
+
444
+
386
445
  def _all_postings() -> dict[str, list[list[int]]]:
387
446
  """Every posting — only the incremental rebuild path needs this."""
388
447
  try:
@@ -804,6 +863,12 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
804
863
  terms = tokenize(query)
805
864
  if not terms:
806
865
  return []
866
+ # Substitute before scoring, not after: the expanded term has to reach the
867
+ # snippet windowing too, or the hit is highlighted on a word it does not
868
+ # contain.
869
+ substitutions = stem_expansions(terms)
870
+ if substitutions:
871
+ terms = [substitutions.get(t, t) for t in terms]
807
872
  docs = raw["docs"]
808
873
  scores = _bm25(terms, raw, read_postings(terms))
809
874
  if entries is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.20
3
+ Version: 1.2.21
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -135,6 +135,20 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
135
135
  Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
136
136
  dict-of-postings scan — comfortably sub-second per query in Python.
137
137
 
138
+ **Tokenization is exact-match, and `stem_expansions` is the one concession to that.**
139
+ A query term and its own inflection are unrelated strings, so `boost search brainstorm`
140
+ returned nothing while `brainstorming` returned the skill. Measured over 461 tap caches,
141
+ 4,663 of 29,607 item names (15.7%) were unreachable by an attested stem — `pattern` missed
142
+ 474 names ending `-patterns`. Before scoring, any term with **no** posting list is replaced
143
+ by the commonest term it prefixes, found with an index-backed range scan over the postings
144
+ table. A term that *has* postings is never touched: expansion only ever adds signal where
145
+ `_bm25` scored exactly none, so a query whose terms all exist ranks byte-identically and the
146
+ retrieval floors cannot move. That is what makes it a fallback rather than a stemmer — a real
147
+ stemmer conflates terms that both exist, which changes established rankings and would need an
148
+ index-format bump and a regenerated baseline. Terms shorter than `STEM_MIN_LEN` (4) are left
149
+ alone, because a three-letter prefix expands to a guess. `boost search` states the
150
+ substitution rather than silently answering a different question.
151
+
138
152
  **Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
139
153
  `entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
140
154
  the index's own doc metadata and materialises real catalog entries only for the
@@ -2,14 +2,14 @@
2
2
  id: bm25-has-no-stemming
3
3
  board: code
4
4
  section: pipeline
5
- status: next
5
+ status: inflight
6
6
  category: Search · Retrieval
7
7
  complexity: M
8
8
  impact: High
9
9
  wow: 4
10
- note: boost search brainstorm finds nothing while brainstorming finds it; 15.7% of catalog names are unreachable by their own stem
10
+ note: a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still
11
11
  order: 127
12
- owner:
12
+ owner: loop/bm25-stem-fallback
13
13
  pr:
14
14
  title: <code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it
15
15
  ---
@@ -41,10 +41,28 @@ BM25 path — which is what every user without the extra runs, what
41
41
  <code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
42
42
  easily reproduce a plain user's result.
43
43
 
44
- <b>Two fixes, and they are not the same size.</b> A <b>zero-match prefix fallback</b> — on 0
45
- hits, retry against vocabulary tokens by prefix — touches no index format, needs no baseline
46
- regeneration, and fires only where BM25 currently returns nothing, so it cannot move a single
47
- eval metric; it fixes the exact observed symptom in both <code>search</code> and
48
- <code>chat</code>. A <b>real stemmer</b> is the better answer and costs an index-format bump plus
49
- a regenerated <code>tests/eval/baseline.json</code>, and would move all four floored metrics.
50
- Either lands in <code>core/rag.py</code>, so the tests must kill mutants, not merely cover lines.
44
+ <b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
45
+ whole query returns zero hits — was drafted and rejected, because it does not fix the reported
46
+ case. <code>boost chat &ldquo;what helps me brainstorm&rdquo;</code> already returns non-empty
47
+ results from its other words, so a zero-hit trigger never fires and chat stays broken.
48
+ Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
49
+ term it prefixes, found by an index-backed range scan (<code>term &gt; ? AND term &lt; ?</code>,
50
+ upper bound <code>term + "~"</code> because <code>~</code> outranks every character
51
+ <code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
52
+ <code>analy</code> &rarr; <code>analyze</code>). Measured after: <code>search brainstorm</code>
53
+ returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
54
+
55
+ <b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
56
+ <em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
57
+ no posting list, so expansion can only add signal where there was exactly none — meaning any
58
+ query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
59
+ <code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
60
+ <code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
61
+ rewrites a query that already worked and fails. Nine hand-written mutants were run against the
62
+ new lines and all nine died, including that one.
63
+
64
+ <b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
65
+ inflection — a user typing <code>patterns</code> still will not reach an item named
66
+ <code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
67
+ Closing that means conflating terms that both exist, which changes established rankings and costs
68
+ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.
@@ -7055,7 +7055,7 @@ state where that line is the advice.</p>
7055
7055
  </article>
7056
7056
 
7057
7057
  <article class="cap rcard" id="bm25-has-no-stemming">
7058
- <div class="head"><span class="pill next">Next</span><span class="cat">Search · Retrieval</span></div>
7058
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Retrieval</span></div>
7059
7059
  <h3><code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it</h3>
7060
7060
  <p><b>The symptom, in two commands against the same five-skill tap.</b>
7061
7061
  <code>boost search brainstorming</code> returns the skill.
@@ -7085,18 +7085,36 @@ BM25 path — which is what every user without the extra runs, what
7085
7085
  <code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
7086
7086
  easily reproduce a plain user's result.
7087
7087
 
7088
- <b>Two fixes, and they are not the same size.</b> A <b>zero-match prefix fallback</b> — on 0
7089
- hits, retry against vocabulary tokens by prefix — touches no index format, needs no baseline
7090
- regeneration, and fires only where BM25 currently returns nothing, so it cannot move a single
7091
- eval metric; it fixes the exact observed symptom in both <code>search</code> and
7092
- <code>chat</code>. A <b>real stemmer</b> is the better answer and costs an index-format bump plus
7093
- a regenerated <code>tests/eval/baseline.json</code>, and would move all four floored metrics.
7094
- Either lands in <code>core/rag.py</code>, so the tests must kill mutants, not merely cover lines.</p>
7088
+ <b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
7089
+ whole query returns zero hits — was drafted and rejected, because it does not fix the reported
7090
+ case. <code>boost chat &ldquo;what helps me brainstorm&rdquo;</code> already returns non-empty
7091
+ results from its other words, so a zero-hit trigger never fires and chat stays broken.
7092
+ Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
7093
+ term it prefixes, found by an index-backed range scan (<code>term &gt; ? AND term &lt; ?</code>,
7094
+ upper bound <code>term + "~"</code> because <code>~</code> outranks every character
7095
+ <code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
7096
+ <code>analy</code> &rarr; <code>analyze</code>). Measured after: <code>search brainstorm</code>
7097
+ returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
7098
+
7099
+ <b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
7100
+ <em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
7101
+ no posting list, so expansion can only add signal where there was exactly none — meaning any
7102
+ query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
7103
+ <code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
7104
+ <code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
7105
+ rewrites a query that already worked and fails. Nine hand-written mutants were run against the
7106
+ new lines and all nine died, including that one.
7107
+
7108
+ <b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
7109
+ inflection — a user typing <code>patterns</code> still will not reach an item named
7110
+ <code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
7111
+ Closing that means conflating terms that both exist, which changes established rankings and costs
7112
+ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.</p>
7095
7113
  <div class="meta">
7096
7114
  <span class="m">Complexity <b>M</b></span>
7097
7115
  <span class="m hi">Impact <b>High</b></span>
7098
7116
  <span class="m">Wow <b class="wow">★★★★</b></span>
7099
- <span class="m">boost search brainstorm finds nothing while brainstorming finds it; 15.7% of catalog names are unreachable by their own stem</span>
7117
+ <span class="m">a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still</span>
7100
7118
  </div>
7101
7119
  </article>
7102
7120
  <!-- /ROADMAP:cards -->
@@ -128,6 +128,29 @@ class TestSearch:
128
128
  # integer heuristic score — assert the shape, not a magic constant.
129
129
  assert isinstance(data[0]["score"], float) and data[0]["score"] > 0
130
130
 
131
+ def test_a_stem_query_reaches_the_inflected_skill_and_says_so(
132
+ self, boost, tapped):
133
+ """`boost search brainstorm` used to return nothing at all while
134
+ `brainstorming` returned the skill, and send the user off to search the
135
+ whole of GitHub for something already in their catalogue."""
136
+ r = boost("search", "brainstorm")
137
+ assert "brainstorming" in r.out
138
+ assert "no matches" not in r.out
139
+ # The widening is stated, not silent — the user asked for one word and
140
+ # is being shown results for another.
141
+ assert "no exact match for 'brainstorm'" in r.out
142
+ assert "brainstorming" in r.out
143
+
144
+ def test_an_exact_query_is_not_annotated(self, boost, tapped):
145
+ r = boost("search", "brainstorming")
146
+ assert "brainstorming" in r.out
147
+ assert "no exact match" not in r.out
148
+
149
+ def test_a_query_matching_nothing_is_not_annotated_either(self, boost, tapped):
150
+ r = boost("search", "zzzznothing")
151
+ assert "no exact match" not in r.out
152
+ assert "no matches for 'zzzznothing'" in r.out
153
+
131
154
  def test_no_taps_fails_with_hint(self, boost):
132
155
  r = boost("search", "anything", expect=1)
133
156
  assert "no taps configured — nothing to search" in r.err
@@ -431,6 +431,129 @@ class TestBuildAndRetrieve:
431
431
  assert len(snip) <= rag.SNIP_WIDTH + 2 # windowed, not whole chunk
432
432
 
433
433
 
434
+ @pytest.fixture()
435
+ def stem_corpus(tmp_path, monkeypatch, sandbox):
436
+ """A corpus with deliberately paired singular/plural vocabulary.
437
+
438
+ `pattern` AND `patterns` both exist as terms, which is what lets the
439
+ never-expand-an-existing-token invariant be tested: a build that dropped
440
+ that guard would expand `pattern` to `patterns` and change a query that
441
+ already worked.
442
+ """
443
+ root = tmp_path / "stems"
444
+ items = {
445
+ "alpha": "pattern matching for structured logs.",
446
+ "beta": "patterns and antipatterns in distributed systems.",
447
+ "gamma": "webhook delivery retries.",
448
+ "delta": "webhooks and callbacks delivery.",
449
+ "epsilon": "delivered payloads and receipts to analyze.",
450
+ }
451
+ entries = []
452
+ for name, body in items.items():
453
+ (root / name).mkdir(parents=True)
454
+ (root / name / "SKILL.md").write_text(
455
+ "---\nname: %s\n---\n\n%s\n" % (name, body), encoding="utf-8")
456
+ entries.append(_entry(name, skill_md="%s/SKILL.md" % name))
457
+ monkeypatch.setattr(rag, "_tap_paths", lambda: {"acme/skills": root})
458
+ monkeypatch.setattr(rag, "_tap_commits", lambda: {"acme__skills": "c1"})
459
+ rag.build(entries=entries, force=True)
460
+ return entries
461
+
462
+
463
+ class TestStemExpansions:
464
+ """`boost search brainstorm` found nothing while `brainstorming` found the
465
+ skill: `tokenize` is exact-match, so a query term and its own inflection are
466
+ unrelated strings. Measured over the 461 tap caches on one real machine,
467
+ 4,663 of 29,607 item names (15.7%) were unreachable by an attested stem —
468
+ `pattern` missed 474 names ending `-patterns`, `skill` missed 252.
469
+ """
470
+
471
+ def test_a_term_that_has_postings_is_never_expanded(self, stem_corpus):
472
+ """The invariant the whole design rests on.
473
+
474
+ Expansion may only ever add signal where there was exactly none, which
475
+ is what makes it unable to move a ranking that already worked — and so
476
+ unable to move the eval floors. `pattern` and `patterns` both exist
477
+ here, so a build that dropped the guard would rewrite `pattern` into
478
+ `patterns` and this fails.
479
+ """
480
+ assert rag.stem_expansions(["pattern"]) == {}
481
+ assert rag.stem_expansions(["webhook"]) == {}
482
+ assert rag.stem_expansions(["pattern", "webhook", "delivery"]) == {}
483
+
484
+ def test_only_the_missing_term_of_a_mixed_query_is_expanded(self, stem_corpus):
485
+ assert rag.stem_expansions(["pattern", "callback"]) == {
486
+ "callback": "callbacks"}
487
+
488
+ def test_picks_the_commonest_expansion_not_the_first_alphabetically(
489
+ self, stem_corpus):
490
+ """`delivery` is in two documents and `delivered` in one, and
491
+ `delivered` sorts first — so ordering by document count is the only way
492
+ to land on `delivery`."""
493
+ assert rag.stem_expansions(["deliver"]) == {"deliver": "delivery"}
494
+
495
+ @pytest.mark.parametrize("term,expected", [
496
+ ("cal", {}), # 3 chars: below the floor
497
+ ("call", {"call": "callbacks"}), # 4 chars: exactly at it
498
+ ("callb", {"callb": "callbacks"}),
499
+ ])
500
+ def test_the_minimum_term_length_boundary(self, stem_corpus, term, expected):
501
+ """Short prefixes expand to noise, so there is a floor; these pin it at
502
+ exactly 4, which a mutant moving it either way breaks."""
503
+ assert rag.stem_expansions([term]) == expected
504
+
505
+ def test_a_term_whose_next_character_is_z_is_still_found(self, stem_corpus):
506
+ """`z` is the highest character `tokenize` can emit, so an upper bound
507
+ of ``term + "z"`` silently excludes exactly the terms that continue
508
+ with one — `analy` would never reach `analyze`. The bound is `~`,
509
+ which sorts above every character a token can contain.
510
+ """
511
+ assert rag.stem_expansions(["analy"]) == {"analy": "analyze"}
512
+
513
+ def test_a_term_that_prefixes_nothing_stays_missing(self, stem_corpus):
514
+ assert rag.stem_expansions(["zzzznothing"]) == {}
515
+
516
+ def test_the_upper_bound_does_not_leak_past_the_prefix(self, stem_corpus):
517
+ """`camel` sorts after `call` but is not a `call`-prefixed term, so a
518
+ range whose upper bound is wrong would drag in neighbours."""
519
+ assert rag.stem_expansions(["calm"]) == {}
520
+
521
+ def test_no_postings_file_yields_no_expansions(self, sandbox):
522
+ assert rag.stem_expansions(["callback"]) == {}
523
+
524
+ def test_duplicate_terms_are_asked_once_and_answered_once(self, stem_corpus):
525
+ assert rag.stem_expansions(["callback", "callback"]) == {
526
+ "callback": "callbacks"}
527
+
528
+
529
+ class TestRetrieveUsesStemExpansions:
530
+ def test_a_singular_query_reaches_the_plural_item(self, stem_corpus):
531
+ """The reported symptom, in miniature: `callbacks` is indexed, the user
532
+ types `callback`, and before this the answer was nothing at all."""
533
+ hits = rag.retrieve("callback", entries=stem_corpus)
534
+ assert [h["entry"]["name"] for h in hits] == ["delta"]
535
+
536
+ def test_the_snippet_highlights_the_term_that_actually_matched(
537
+ self, stem_corpus):
538
+ hits = rag.retrieve("callback", entries=stem_corpus)
539
+ assert "callbacks" in hits[0]["snippet"].lower()
540
+
541
+ def test_a_query_whose_terms_all_exist_is_untouched(self, stem_corpus):
542
+ names = [h["entry"]["name"]
543
+ for h in rag.retrieve("pattern", entries=stem_corpus)]
544
+ assert names == ["alpha"] # not beta, which owns `patterns`
545
+
546
+ def test_a_mixed_query_keeps_the_existing_term_and_fixes_the_other(
547
+ self, stem_corpus):
548
+ names = {h["entry"]["name"]
549
+ for h in rag.retrieve("pattern callback", entries=stem_corpus)}
550
+ assert names == {"alpha", "delta"}
551
+
552
+ def test_a_query_that_matches_nothing_at_all_still_returns_nothing(
553
+ self, stem_corpus):
554
+ assert rag.retrieve("zzzznothing", entries=stem_corpus) == []
555
+
556
+
434
557
  class TestBm25Math:
435
558
  """Pin the exact BM25 arithmetic (k1=1.2, b=0.75) so formula mutants die."""
436
559
 
File without changes