boost-skill-cli 1.0.313__tar.gz → 1.0.314__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 (571) hide show
  1. {boost_skill_cli-1.0.313/boost_skill_cli.egg-info → boost_skill_cli-1.0.314}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/rag.py +68 -14
  4. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  6. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +66 -0
  7. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap.html +67 -1
  8. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_retrieval.py +22 -3
  9. boost_skill_cli-1.0.314/tests/eval/golden-natural.jsonl +84 -0
  10. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_discovery.py +7 -2
  11. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_rag.py +18 -7
  12. boost_skill_cli-1.0.314/tests/unit/test_rag_fusion.py +210 -0
  13. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.gitattributes +0 -0
  14. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.gitignore +0 -0
  15. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.gitleaks.toml +0 -0
  16. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.htmlvalidate.json +0 -0
  17. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.lighthouserc.json +0 -0
  18. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.lycheeignore +0 -0
  19. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.markdownlint-cli2.jsonc +0 -0
  20. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.pre-commit-config.yaml +0 -0
  21. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.stylelintrc.json +0 -0
  22. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.vale/styles/boost/Terminology.yml +0 -0
  23. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  24. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.vale.ini +0 -0
  25. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/CLAUDE.md +0 -0
  26. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/CODE_OF_CONDUCT.md +0 -0
  27. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/CONTRIBUTING.md +0 -0
  28. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/LICENSE +0 -0
  29. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/MANIFEST.in +0 -0
  30. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/Makefile +0 -0
  31. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/README.md +0 -0
  32. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/SECURITY.md +0 -0
  33. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost +0 -0
  34. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/__init__.py +0 -0
  35. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/__main__.py +0 -0
  36. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/cli.py +0 -0
  37. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/cliparse.py +0 -0
  38. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/__init__.py +0 -0
  39. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/_common.py +0 -0
  40. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/bmad.py +0 -0
  41. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/configuration.py +0 -0
  42. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/discovery.py +0 -0
  43. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/hooks.py +0 -0
  44. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/info.py +0 -0
  45. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/intelligence.py +0 -0
  46. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/pkg.py +0 -0
  47. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/quality.py +0 -0
  48. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/run.py +0 -0
  49. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/safety.py +0 -0
  50. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/taps.py +0 -0
  51. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/team.py +0 -0
  52. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/__init__.py +0 -0
  53. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/adapters.py +0 -0
  54. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/agents.py +0 -0
  55. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/ai.py +0 -0
  56. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/capabilities.py +0 -0
  57. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/catalog.py +0 -0
  58. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/claude_settings.py +0 -0
  59. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/config.py +0 -0
  60. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/dense.py +0 -0
  61. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/ed25519.py +0 -0
  62. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/embed.py +0 -0
  63. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/faithfulness.py +0 -0
  64. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/frontmatter.py +0 -0
  65. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/gitutil.py +0 -0
  66. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/imperative.py +0 -0
  67. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/injectscan.py +0 -0
  68. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/installscan.py +0 -0
  69. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/integrity.py +0 -0
  70. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/journal.py +0 -0
  71. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/localembed.py +0 -0
  72. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/lockfile.py +0 -0
  73. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/logs.py +0 -0
  74. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/mcp.py +0 -0
  75. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/mcpdecl.py +0 -0
  76. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/mcphost.py +0 -0
  77. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/minisign.py +0 -0
  78. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/nethttp.py +0 -0
  79. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/output.py +0 -0
  80. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/paths.py +0 -0
  81. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/policy.py +0 -0
  82. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/projectlock.py +0 -0
  83. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/provenance.py +0 -0
  84. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/registry.py +0 -0
  85. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/resolve.py +0 -0
  86. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/rules.py +0 -0
  87. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/scopes.py +0 -0
  88. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/secretscan.py +0 -0
  89. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/selfupdate.py +0 -0
  90. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/serve.py +0 -0
  91. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/stackprobe.py +0 -0
  92. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/staleness.py +0 -0
  93. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/store.py +0 -0
  94. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/trustaudit.py +0 -0
  95. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/typosquat.py +0 -0
  96. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/updatediff.py +0 -0
  97. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/util.py +0 -0
  98. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/workflows.py +0 -0
  99. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/data/registries.json +0 -0
  100. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/errors.py +0 -0
  101. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/spin.py +0 -0
  102. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  103. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  104. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/requires.txt +0 -0
  105. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/top_level.txt +0 -0
  106. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/codecov.yml +0 -0
  107. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/.claude/settings.local.json +0 -0
  108. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/DEBUGGING.md +0 -0
  109. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/adapters.html +0 -0
  110. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/README.md +0 -0
  111. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-components-core.md +0 -0
  112. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-containers.md +0 -0
  113. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-context.md +0 -0
  114. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-dynamic-install.md +0 -0
  115. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/distill.gif +0 -0
  116. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/doctor.gif +0 -0
  117. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/explain.gif +0 -0
  118. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/hooks.gif +0 -0
  119. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/install.gif +0 -0
  120. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/pulse.gif +0 -0
  121. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/search.gif +0 -0
  122. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/tap.gif +0 -0
  123. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/distill.tape +0 -0
  124. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/doctor.tape +0 -0
  125. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/explain.tape +0 -0
  126. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/hooks.tape +0 -0
  127. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/install.tape +0 -0
  128. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/pulse.tape +0 -0
  129. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/search.tape +0 -0
  130. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/tap.tape +0 -0
  131. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel.html +0 -0
  132. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/commands.html +0 -0
  133. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/demo.gif +0 -0
  134. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/demo.tape +0 -0
  135. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/design-roadmap.html +0 -0
  136. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/eval.html +0 -0
  137. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/index.html +0 -0
  138. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/mcp-hub.html +0 -0
  139. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/rag-architecture.md +0 -0
  140. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D01.md +0 -0
  141. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D02.md +0 -0
  142. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D03.md +0 -0
  143. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D04.md +0 -0
  144. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D05.md +0 -0
  145. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D06.md +0 -0
  146. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D07.md +0 -0
  147. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D08.md +0 -0
  148. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D09.md +0 -0
  149. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D10.md +0 -0
  150. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D11.md +0 -0
  151. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D12.md +0 -0
  152. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D13.md +0 -0
  153. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D14.md +0 -0
  154. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D15.md +0 -0
  155. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D16.md +0 -0
  156. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D17.md +0 -0
  157. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D18.md +0 -0
  158. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D19.md +0 -0
  159. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D20.md +0 -0
  160. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D21.md +0 -0
  161. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D22.md +0 -0
  162. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D23.md +0 -0
  163. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D24.md +0 -0
  164. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D25.md +0 -0
  165. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D26.md +0 -0
  166. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  167. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  168. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  169. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  170. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  171. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  172. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  173. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  174. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  175. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  176. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  177. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  178. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  179. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  180. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  181. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  182. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  183. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  184. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  185. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  186. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  187. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  188. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/command-carousel-page.md +0 -0
  189. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  190. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  191. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  192. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  193. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  194. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  195. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  196. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  197. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  198. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  199. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  200. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  201. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  202. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  203. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  204. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  205. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  206. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  207. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  208. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  209. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  210. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  211. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  212. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  213. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  214. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  215. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  216. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  217. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  218. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/github-community-health-files.md +0 -0
  219. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  220. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  221. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  222. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  223. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  224. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  225. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  226. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  227. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  228. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  229. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  230. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  231. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  232. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  233. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  234. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  235. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  236. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  237. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  238. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  239. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  240. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  241. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  242. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  243. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  244. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  245. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  246. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  247. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  248. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  249. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  250. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  251. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  252. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  253. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  254. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  255. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  256. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  257. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  258. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  259. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  260. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  261. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  262. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  263. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  264. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  265. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  266. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  267. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  268. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  269. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  270. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  271. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  272. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  273. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  274. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  275. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  276. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  277. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  278. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  279. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  280. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  281. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  282. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  283. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  284. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  285. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  286. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  287. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  288. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  289. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  290. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  291. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  292. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  293. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  294. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  295. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  296. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  297. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  298. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  299. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  300. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  301. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  302. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  303. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  304. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  305. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  306. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  307. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  308. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  309. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  310. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  311. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  312. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  313. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  314. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  315. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  316. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  317. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  318. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  319. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  320. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  321. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  322. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  323. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  324. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  325. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  326. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  327. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  328. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  329. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  330. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  331. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  332. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  333. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  334. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  335. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  336. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  337. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  338. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  339. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  340. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  341. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  342. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  343. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  344. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  345. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  346. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  347. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  348. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  349. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  350. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  351. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workspace-scope-install.md +0 -0
  352. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  353. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/eslint.config.mjs +0 -0
  354. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/README.md +0 -0
  355. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/__init__.py +0 -0
  356. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/baseline.json +0 -0
  357. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/faithfulness.py +0 -0
  358. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/golden_set.json +0 -0
  359. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/make_corpus.py +0 -0
  360. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/make_golden.py +0 -0
  361. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/metrics.py +0 -0
  362. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/run_evals.py +0 -0
  363. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/examples/README.md +0 -0
  364. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/examples/adapt-demo.sh +0 -0
  365. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/examples/boost-run-prototype.sh +0 -0
  366. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/index.html +0 -0
  367. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/noxfile.py +0 -0
  368. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/pyproject.toml +0 -0
  369. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/coverage-tools.in +0 -0
  370. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/coverage-tools.txt +0 -0
  371. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/lint-tools.in +0 -0
  372. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/lint-tools.txt +0 -0
  373. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/mutation-tools.in +0 -0
  374. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/mutation-tools.txt +0 -0
  375. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/platform-pins.lock +0 -0
  376. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/release-tools.in +0 -0
  377. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/release-tools.txt +0 -0
  378. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/test-tools.in +0 -0
  379. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/test-tools.txt +0 -0
  380. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/a11y_check.py +0 -0
  381. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/bench_cli.sh +0 -0
  382. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/build_command_reference.py +0 -0
  383. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/build_registries.py +0 -0
  384. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/build_roadmap.py +0 -0
  385. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/check_anchors.py +0 -0
  386. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/check_licenses.py +0 -0
  387. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/check_required_checks.py +0 -0
  388. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/ensure_eval_corpus.sh +0 -0
  389. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_explain.py +0 -0
  390. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_gate.py +0 -0
  391. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_recommend.py +0 -0
  392. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_stats_summary.py +0 -0
  393. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/import_budget.py +0 -0
  394. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/lock_toolchain.py +0 -0
  395. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/mutation_gate.py +0 -0
  396. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/mutation_shards.py +0 -0
  397. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/mutation_weights.json +0 -0
  398. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/perf_gate.py +0 -0
  399. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/post_deploy_smoke.py +0 -0
  400. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/release_guard.py +0 -0
  401. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/release_preflight.py +0 -0
  402. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/setup.cfg +0 -0
  403. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/sonar-project.properties +0 -0
  404. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/README.md +0 -0
  405. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/boost.css +0 -0
  406. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/boost.js +0 -0
  407. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/demo.html +0 -0
  408. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/adapt.feature +0 -0
  409. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/browse.feature +0 -0
  410. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/count.feature +0 -0
  411. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/discover.feature +0 -0
  412. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/doctor.feature +0 -0
  413. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/environment.py +0 -0
  414. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/explain.feature +0 -0
  415. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/index.feature +0 -0
  416. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/install.feature +0 -0
  417. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/list.feature +0 -0
  418. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/mcp.feature +0 -0
  419. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/search.feature +0 -0
  420. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/cli_steps.py +0 -0
  421. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/discovery_steps.py +0 -0
  422. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/mcp_steps.py +0 -0
  423. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/quality_steps.py +0 -0
  424. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/conftest.py +0 -0
  425. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/baseline.json +0 -0
  426. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/explain.jsonl +0 -0
  427. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/golden.jsonl +0 -0
  428. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/recommend.jsonl +0 -0
  429. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/taps.txt +0 -0
  430. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_capabilities_policy.py +0 -0
  431. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_adapt.py +0 -0
  432. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_bmad.py +0 -0
  433. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_configuration.py +0 -0
  434. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_hooks.py +0 -0
  435. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_info.py +0 -0
  436. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_intelligence.py +0 -0
  437. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_pkg.py +0 -0
  438. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_quality.py +0 -0
  439. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_taps.py +0 -0
  440. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_team.py +0 -0
  441. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_everyday_loop.py +0 -0
  442. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_integrity_enforce.py +0 -0
  443. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_property_parsers.py +0 -0
  444. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_run.py +0 -0
  445. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_tap_signing.py +0 -0
  446. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_workspace_scope.py +0 -0
  447. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/README.md +0 -0
  448. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  449. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  450. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  451. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  452. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  453. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  454. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  455. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  456. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  457. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  458. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  459. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  460. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  461. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  462. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  463. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  464. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  465. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  466. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  467. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  468. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/fuzz_frontmatter.py +0 -0
  469. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/fuzz_registry.py +0 -0
  470. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/make_fixture.py +0 -0
  471. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/perf/test_benchmarks.py +0 -0
  472. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/smoke.sh +0 -0
  473. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_a11y_check.py +0 -0
  474. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_adapters.py +0 -0
  475. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_adapters_multi.py +0 -0
  476. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_adapters_runner.py +0 -0
  477. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_agents.py +0 -0
  478. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_ai.py +0 -0
  479. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_capabilities.py +0 -0
  480. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_catalog.py +0 -0
  481. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_check_anchors.py +0 -0
  482. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_check_licenses.py +0 -0
  483. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_claude_settings.py +0 -0
  484. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_cliparse.py +0 -0
  485. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_codeql_analysis_key.py +0 -0
  486. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_command_reference_fresh.py +0 -0
  487. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_community_health_files.py +0 -0
  488. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_config.py +0 -0
  489. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dense.py +0 -0
  490. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dense_fallback.py +0 -0
  491. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dense_status.py +0 -0
  492. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dependabot_config.py +0 -0
  493. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_docs_pages_linked.py +0 -0
  494. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_docsite_chrome.py +0 -0
  495. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_ed25519.py +0 -0
  496. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_embed.py +0 -0
  497. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_embed_local.py +0 -0
  498. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_errors_and_cli_table.py +0 -0
  499. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_faithfulness.py +0 -0
  500. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_gate.py +0 -0
  501. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_metrics.py +0 -0
  502. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_stats_summary.py +0 -0
  503. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_faithfulness.py +0 -0
  504. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_frontmatter.py +0 -0
  505. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_fuzz_targets.py +0 -0
  506. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_gitleaks_config.py +0 -0
  507. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_gitutil.py +0 -0
  508. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_imperative.py +0 -0
  509. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_import_budget.py +0 -0
  510. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_injectscan.py +0 -0
  511. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_installscan.py +0 -0
  512. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_integrity.py +0 -0
  513. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_journal.py +0 -0
  514. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_localembed.py +0 -0
  515. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_lockfile.py +0 -0
  516. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_logs.py +0 -0
  517. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_marketing_counts.py +0 -0
  518. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcp.py +0 -0
  519. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcp_install_scan.py +0 -0
  520. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcpdecl.py +0 -0
  521. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcphost.py +0 -0
  522. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_minisign.py +0 -0
  523. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutation_hardening.py +0 -0
  524. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutation_shards.py +0 -0
  525. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutation_subfile_shards.py +0 -0
  526. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutmut_source_paths.py +0 -0
  527. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_nethttp.py +0 -0
  528. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_output.py +0 -0
  529. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_paths.py +0 -0
  530. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_perf_gate.py +0 -0
  531. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_pkg_confusions.py +0 -0
  532. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_pkg_injection.py +0 -0
  533. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_pkg_secrets.py +0 -0
  534. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_platform_pins.py +0 -0
  535. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_policy.py +0 -0
  536. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_post_deploy_smoke.py +0 -0
  537. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_project_mcp_sidecar.py +0 -0
  538. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_projectlock.py +0 -0
  539. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_provenance.py +0 -0
  540. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_registries_fresh.py +0 -0
  541. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_registry.py +0 -0
  542. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_registry_categories.py +0 -0
  543. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_release_guard.py +0 -0
  544. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_release_preflight.py +0 -0
  545. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_required_checks.py +0 -0
  546. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_resolve.py +0 -0
  547. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_roadmap_fresh.py +0 -0
  548. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_rules.py +0 -0
  549. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_scopes.py +0 -0
  550. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_secretscan.py +0 -0
  551. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_selfupdate.py +0 -0
  552. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_serve.py +0 -0
  553. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_spin.py +0 -0
  554. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_stackprobe.py +0 -0
  555. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_staleness.py +0 -0
  556. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_store.py +0 -0
  557. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_token_parity.py +0 -0
  558. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_toolchain_lock.py +0 -0
  559. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_trustaudit.py +0 -0
  560. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_typosquat.py +0 -0
  561. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_updatediff.py +0 -0
  562. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_util.py +0 -0
  563. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_version.py +0 -0
  564. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_workflow_concurrency.py +0 -0
  565. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_workflow_timeouts.py +0 -0
  566. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_workflows.py +0 -0
  567. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/a11y_check.mjs +0 -0
  568. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/console_check.mjs +0 -0
  569. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/package-lock.json +0 -0
  570. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/package.json +0 -0
  571. {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.313
3
+ Version: 1.0.314
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.0.313'
22
- __version_tuple__ = version_tuple = (1, 0, 313)
21
+ __version__ = version = '1.0.314'
22
+ __version_tuple__ = version_tuple = (1, 0, 314)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -421,10 +421,48 @@ def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str
421
421
  return (picked + rest)[:limit], "Claude relevance"
422
422
 
423
423
 
424
+ # The damping constant from the original reciprocal-rank-fusion paper. It is
425
+ # why plain RRF needs no tuning: large enough that the top few ranks are close
426
+ # together, so one engine's confident #1 cannot bury the other engine's #2.
427
+ RRF_K = 60
428
+
429
+
430
+ def rrf_fuse(rankings: List[List[Hit]], limit: int = 60) -> List[Hit]:
431
+ """Fuse ranked hit lists by reciprocal rank: ``sum 1/(RRF_K + rank)``.
432
+
433
+ Fuses on **ranks, not scores**, which is the whole point. A BM25 score and
434
+ a cosine similarity are on incomparable scales, so blending them needs a
435
+ calibration step that has to be fitted and re-fitted per corpus; rank
436
+ fusion sidesteps it entirely and is the respected zero-tuning default.
437
+
438
+ Entries are identified by ``(name, tap)`` — the same key both engines
439
+ already dedupe on — and the first ranking's hit object wins, so the caller
440
+ passes BM25 first and keeps its query-term-highlighted snippet for display.
441
+
442
+ The returned ``score`` is the fused rank score, not a BM25 score: it exists
443
+ to order these hits against each other, and comparing it to a raw BM25
444
+ score from elsewhere would be meaningless.
445
+ """
446
+ scores: Dict[Tuple[str, str], float] = {}
447
+ chosen: Dict[Tuple[str, str], Hit] = {}
448
+ for hits in rankings:
449
+ for rank, hit in enumerate(hits, start=1):
450
+ entry = hit["entry"]
451
+ key = (entry["name"], entry["tap"])
452
+ scores[key] = scores.get(key, 0.0) + 1.0 / (RRF_K + rank)
453
+ chosen.setdefault(key, hit)
454
+ ordered = sorted(scores, key=lambda key: (-scores[key], key[0], key[1]))
455
+ fused: List[Hit] = [
456
+ {"entry": chosen[key]["entry"], "score": scores[key],
457
+ "snippet": chosen[key]["snippet"]} # type: ignore[typeddict-item]
458
+ for key in ordered[:limit]]
459
+ return fused
460
+
461
+
424
462
  def retrieve_any(query: str, k: int = 60, kind: Optional[str] = None,
425
463
  entries: Optional[List[dict]] = None
426
464
  ) -> Tuple[Optional[List[Hit]], str]:
427
- """Prefer the opt-in dense backend, floor to BM25.
465
+ """Fuse BM25 and dense when both are available; floor to whichever is.
428
466
 
429
467
  Returns ``(hits, engine_label)``; ``hits`` is ``None`` only when no index of
430
468
  any kind exists so the caller can fall back to ``catalog.search``.
@@ -432,21 +470,37 @@ def retrieve_any(query: str, k: int = 60, kind: Optional[str] = None,
432
470
  Public because every retrieval entry point must make the same engine
433
471
  choice: `cmd_search` calling ``retrieve`` directly meant the CLI could
434
472
  never use a built dense index, while the MCP path could.
473
+
474
+ This used to *prefer* dense whenever it was ready. The golden-set eval
475
+ retired that: over 91 queries BM25 and local dense tie on hit@1, with the
476
+ recall and MRR gaps inside the noise floor, while human-phrased queries
477
+ separate them sharply in opposite directions. Preferring either one hands
478
+ half the queries to the engine that is worse at them, so they are fused.
479
+
480
+ Both engines are over-fetched to ``RRF_K`` before fusing. Fusing only the
481
+ top-k of each would discard exactly the candidates the other engine was
482
+ going to promote, which is most of the value.
435
483
  """
436
484
  from . import dense
437
- if dense.ready():
438
- hits = dense.retrieve(query, k=k, kind=kind, entries=entries)
439
- # An empty list is not the same answer as None. ``dense.retrieve``
440
- # returns ``[]`` whenever every KNN neighbour was dropped for a kind
441
- # mismatch or for no longer being live, which is a *thin index*, not a
442
- # verdict on the query — and taking it as final short-circuits the
443
- # documented "everything degrades to BM25" contract, so `boost search`
444
- # answered "no results" while a perfectly good BM25 index sat unused.
445
- # Only a non-empty dense result is final.
446
- if hits:
447
- return hits, "dense vectors"
448
- if ready():
449
- return retrieve(query, k=k, kind=kind, entries=entries), "BM25 full-content"
485
+ pool = max(k, RRF_K)
486
+ dense_hits = dense.retrieve(query, k=pool, kind=kind,
487
+ entries=entries) if dense.ready() else None
488
+ # An empty list is not the same answer as None. ``dense.retrieve`` returns
489
+ # ``[]`` whenever every KNN neighbour was dropped for a kind mismatch or
490
+ # for no longer being live, which is a *thin index*, not a verdict on the
491
+ # query — and taking it as final short-circuits the documented "everything
492
+ # degrades to BM25" contract, so `boost search` answered "no results" while
493
+ # a perfectly good BM25 index sat unused. Only a non-empty dense result
494
+ # counts as a ranking to fuse.
495
+ bm25_hits = retrieve(query, k=pool, kind=kind,
496
+ entries=entries) if ready() else None
497
+ if dense_hits and bm25_hits:
498
+ return (rrf_fuse([bm25_hits, dense_hits], limit=k),
499
+ "hybrid RRF (BM25 + dense)")
500
+ if dense_hits:
501
+ return dense_hits[:k], "dense vectors"
502
+ if bm25_hits is not None:
503
+ return bm25_hits[:k], "BM25 full-content"
450
504
  return None, ""
451
505
 
452
506
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.313
3
+ Version: 1.0.314
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -421,6 +421,7 @@ tests/bdd/features/steps/mcp_steps.py
421
421
  tests/bdd/features/steps/quality_steps.py
422
422
  tests/eval/baseline.json
423
423
  tests/eval/explain.jsonl
424
+ tests/eval/golden-natural.jsonl
424
425
  tests/eval/golden.jsonl
425
426
  tests/eval/recommend.jsonl
426
427
  tests/eval/taps.txt
@@ -534,6 +535,7 @@ tests/unit/test_project_mcp_sidecar.py
534
535
  tests/unit/test_projectlock.py
535
536
  tests/unit/test_provenance.py
536
537
  tests/unit/test_rag.py
538
+ tests/unit/test_rag_fusion.py
537
539
  tests/unit/test_registries_fresh.py
538
540
  tests/unit/test_registry.py
539
541
  tests/unit/test_registry_categories.py
@@ -194,3 +194,69 @@ A rerun stored all 3740, and two 30-batch replays never reproduced a failure, so
194
194
  resource pressure rather than a defect — the retry path (no commit recorded for a failed tap)
195
195
  did its job. The figures above come from a complete index.
196
196
 
197
+ <b>Step 4 shipped, measured against the same 91 queries.</b> <code>retrieve_any</code> no longer
198
+ picks an engine; it over-fetches <code>RRF_K</code>=60 from each and fuses by reciprocal rank,
199
+ <code>1/(60+rank)</code> summed, keyed on <code>(name, tap)</code> &mdash; the key both engines
200
+ already dedupe on. Adding a <code>hybrid</code> column to the eval:
201
+ <code>catalog.search</code> hit@1 0.714; BM25 hit@1 0.780, recall 1.000, MRR 0.860, nDCG 0.895;
202
+ dense hit@1 0.780, recall 0.956, MRR 0.853, nDCG 0.876; <b>hybrid hit@1 0.813, recall 0.978, MRR
203
+ 0.883, nDCG 0.905</b>.
204
+
205
+ Hybrid leads on <code>hit@1</code>, MRR and nDCG, and gives up 2 queries of recall to BM25.
206
+ <b>Neither difference is significant</b> by the bar set above: +3 net queries on hit@1 and &minus;2
207
+ on recall, both inside the ~6-query floor for <em>p</em>&lt;0.05 at this <em>n</em>. So the case for
208
+ fusing is not "it scores higher" &mdash; it is that fusing is the only option that is <em>at or near
209
+ best on both query shapes</em>, where preferring either engine is measurably wrong for half of them.
210
+
211
+ <b>This reverses a deliberate earlier decision</b>, and that is worth flagging rather than burying:
212
+ <code>test_a_non_empty_dense_result_is_still_final</code> existed precisely to stop
213
+ <code>retrieve_any</code> "always running BM25 too". Its premise was that a dense hit is the better
214
+ answer, which the tie above retires. The other half of that fix &mdash; an <em>empty</em> dense
215
+ result is a thin index, not a verdict, and must fall through to BM25 &mdash; still stands and is
216
+ still tested.
217
+
218
+ <b>One honest counter-observation.</b> On two hand-picked human-phrased queries, fusion at k=3
219
+ <em>lost</em> the best dense hit: <code>"my app is slow"</code> dropped
220
+ <code>performance-optimization</code> and <code>"I need to make my website accessible"</code>
221
+ dropped <code>accessibility-guidelines</code>, in both cases because a junk BM25 rank-1 outweighed a
222
+ good dense rank-2. That is exactly the tradeoff this card predicted &mdash; "rank fusion discards
223
+ confidence" &mdash; and it is an anecdote at n=2 against a measured win at n=91, so it did not block
224
+ shipping. It is the strongest argument for the query set step 6 still needs, and the first thing to
225
+ re-measure once that exists.
226
+
227
+ <b>Step 6's real deliverable, and it settles the question.</b> The missing piece was never a number
228
+ &mdash; it was a query set of the shape this feature exists for.
229
+ <code>tests/eval/golden-natural.jsonl</code> is 50 queries written from each target's own
230
+ <code>description</code> and nothing else, phrased as a user problem, with the target's distinctive
231
+ name tokens deliberately excluded (a query containing "docker" finds <code>docker-expert</code> by
232
+ string match and measures nothing). The whole set was written <em>before</em> any engine was run
233
+ against it and scored once, so it could not be selected to flatter a result already seen. A
234
+ mechanical check caught five queries that had leaked a name token and they were rewritten.
235
+
236
+ Over the same corpus at k=10, 50 queries: <code>catalog.search</code> recall 0.330 hit@1 0.080;
237
+ <b>BM25 recall 0.690 hit@1 0.240</b>; <b>dense recall 0.760 hit@1 0.420</b>;
238
+ <b>hybrid RRF recall 0.820 hit@1 0.420</b> MRR 0.559 nDCG 0.614.
239
+
240
+ <b>BM25 collapses on this shape</b> &mdash; hit@1 falls from 0.780 on the keyword set to
241
+ <b>0.240</b> here, recall from 1.000 to 0.690. And dense beats it by <b>+9 net queries</b> on hit@1
242
+ (21 of 50 against 12), which clears the ~6-query significance floor this card set. <b>That is the
243
+ first significant retrieval difference anyone has measured in this repo</b>, and it is in the
244
+ opposite direction from the keyword set.
245
+
246
+ So the two sets together say something neither says alone. On keyword queries BM25 and dense tie and
247
+ hybrid edges ahead; on natural queries BM25 is far behind and hybrid is at-or-above dense on every
248
+ metric. <b>Hybrid is the only engine that is at or near best on both shapes</b> &mdash; which is
249
+ precisely the argument step 4 was shipped on, now with a significant margin behind it rather than
250
+ +3 queries inside the noise.
251
+
252
+ One caveat the slice exposes: <code>skill</code> queries score hit@1 0.459 against
253
+ <code>workflow</code> 0.308. The workflows in this corpus are overwhelmingly
254
+ <code>&lt;technology&gt;-expert</code> agents, so a problem-phrased query has to bridge from a
255
+ symptom to a product name with no shared vocabulary at all &mdash; the hardest case, and the one
256
+ where a larger embedding model would most likely show its value. Worth re-running against Voyage
257
+ before concluding the local model is enough.
258
+
259
+ The set is deliberately <b>not</b> wired into <code>make eval</code> or the required gate: it needs
260
+ the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
261
+ flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.
262
+
@@ -780,7 +780,73 @@ is, at best, tied for them.
780
780
  <b>Method note.</b> The first indexing pass reported 3 taps failed to embed (2716 of 3740 passages).
781
781
  A rerun stored all 3740, and two 30-batch replays never reproduced a failure, so it was transient
782
782
  resource pressure rather than a defect &mdash; the retry path (no commit recorded for a failed tap)
783
- did its job. The figures above come from a complete index.</p>
783
+ did its job. The figures above come from a complete index.
784
+
785
+ <b>Step 4 shipped, measured against the same 91 queries.</b> <code>retrieve_any</code> no longer
786
+ picks an engine; it over-fetches <code>RRF_K</code>=60 from each and fuses by reciprocal rank,
787
+ <code>1/(60+rank)</code> summed, keyed on <code>(name, tap)</code> &mdash; the key both engines
788
+ already dedupe on. Adding a <code>hybrid</code> column to the eval:
789
+ <code>catalog.search</code> hit@1 0.714; BM25 hit@1 0.780, recall 1.000, MRR 0.860, nDCG 0.895;
790
+ dense hit@1 0.780, recall 0.956, MRR 0.853, nDCG 0.876; <b>hybrid hit@1 0.813, recall 0.978, MRR
791
+ 0.883, nDCG 0.905</b>.
792
+
793
+ Hybrid leads on <code>hit@1</code>, MRR and nDCG, and gives up 2 queries of recall to BM25.
794
+ <b>Neither difference is significant</b> by the bar set above: +3 net queries on hit@1 and &minus;2
795
+ on recall, both inside the ~6-query floor for <em>p</em>&lt;0.05 at this <em>n</em>. So the case for
796
+ fusing is not "it scores higher" &mdash; it is that fusing is the only option that is <em>at or near
797
+ best on both query shapes</em>, where preferring either engine is measurably wrong for half of them.
798
+
799
+ <b>This reverses a deliberate earlier decision</b>, and that is worth flagging rather than burying:
800
+ <code>test_a_non_empty_dense_result_is_still_final</code> existed precisely to stop
801
+ <code>retrieve_any</code> "always running BM25 too". Its premise was that a dense hit is the better
802
+ answer, which the tie above retires. The other half of that fix &mdash; an <em>empty</em> dense
803
+ result is a thin index, not a verdict, and must fall through to BM25 &mdash; still stands and is
804
+ still tested.
805
+
806
+ <b>One honest counter-observation.</b> On two hand-picked human-phrased queries, fusion at k=3
807
+ <em>lost</em> the best dense hit: <code>"my app is slow"</code> dropped
808
+ <code>performance-optimization</code> and <code>"I need to make my website accessible"</code>
809
+ dropped <code>accessibility-guidelines</code>, in both cases because a junk BM25 rank-1 outweighed a
810
+ good dense rank-2. That is exactly the tradeoff this card predicted &mdash; "rank fusion discards
811
+ confidence" &mdash; and it is an anecdote at n=2 against a measured win at n=91, so it did not block
812
+ shipping. It is the strongest argument for the query set step 6 still needs, and the first thing to
813
+ re-measure once that exists.
814
+
815
+ <b>Step 6's real deliverable, and it settles the question.</b> The missing piece was never a number
816
+ &mdash; it was a query set of the shape this feature exists for.
817
+ <code>tests/eval/golden-natural.jsonl</code> is 50 queries written from each target's own
818
+ <code>description</code> and nothing else, phrased as a user problem, with the target's distinctive
819
+ name tokens deliberately excluded (a query containing "docker" finds <code>docker-expert</code> by
820
+ string match and measures nothing). The whole set was written <em>before</em> any engine was run
821
+ against it and scored once, so it could not be selected to flatter a result already seen. A
822
+ mechanical check caught five queries that had leaked a name token and they were rewritten.
823
+
824
+ Over the same corpus at k=10, 50 queries: <code>catalog.search</code> recall 0.330 hit@1 0.080;
825
+ <b>BM25 recall 0.690 hit@1 0.240</b>; <b>dense recall 0.760 hit@1 0.420</b>;
826
+ <b>hybrid RRF recall 0.820 hit@1 0.420</b> MRR 0.559 nDCG 0.614.
827
+
828
+ <b>BM25 collapses on this shape</b> &mdash; hit@1 falls from 0.780 on the keyword set to
829
+ <b>0.240</b> here, recall from 1.000 to 0.690. And dense beats it by <b>+9 net queries</b> on hit@1
830
+ (21 of 50 against 12), which clears the ~6-query significance floor this card set. <b>That is the
831
+ first significant retrieval difference anyone has measured in this repo</b>, and it is in the
832
+ opposite direction from the keyword set.
833
+
834
+ So the two sets together say something neither says alone. On keyword queries BM25 and dense tie and
835
+ hybrid edges ahead; on natural queries BM25 is far behind and hybrid is at-or-above dense on every
836
+ metric. <b>Hybrid is the only engine that is at or near best on both shapes</b> &mdash; which is
837
+ precisely the argument step 4 was shipped on, now with a significant margin behind it rather than
838
+ +3 queries inside the noise.
839
+
840
+ One caveat the slice exposes: <code>skill</code> queries score hit@1 0.459 against
841
+ <code>workflow</code> 0.308. The workflows in this corpus are overwhelmingly
842
+ <code>&lt;technology&gt;-expert</code> agents, so a problem-phrased query has to bridge from a
843
+ symptom to a product name with no shared vocabulary at all &mdash; the hardest case, and the one
844
+ where a larger embedding model would most likely show its value. Worth re-running against Voyage
845
+ before concluding the local model is enough.
846
+
847
+ The set is deliberately <b>not</b> wired into <code>make eval</code> or the required gate: it needs
848
+ the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
849
+ flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.</p>
784
850
  <div class="meta">
785
851
  <span class="m">Complexity <b>L</b></span>
786
852
  <span class="m hi">Impact <b>High</b></span>
@@ -145,6 +145,22 @@ def dense_ranker(k: int) -> Ranker:
145
145
  [h["entry"]["name"] for h in (dense.retrieve(q, k=max(k * 4, 60)) or [])])
146
146
 
147
147
 
148
+ def hybrid_ranker(k: int) -> Ranker:
149
+ """BM25 and dense fused by reciprocal rank (rag.rrf_fuse).
150
+
151
+ Measured as its own engine rather than inferred from the other two: a
152
+ hybrid win must not be creditable to whichever component did not earn it,
153
+ which is why each engine is also reported alone.
154
+ """
155
+ def rank(q: str) -> List[str]:
156
+ pool = max(k * 4, 60)
157
+ b = rag.retrieve(q, k=pool)
158
+ d = dense.retrieve(q, k=pool) or []
159
+ return _dedupe([h["entry"]["name"]
160
+ for h in rag.rrf_fuse([b, d], limit=pool)])
161
+ return rank
162
+
163
+
148
164
  def rerank_ranker(k: int) -> Ranker:
149
165
  """BM25 shortlist reordered by the LLM rerank stage (Tier 2a)."""
150
166
  def rank(q: str) -> List[str]:
@@ -369,7 +385,7 @@ def main(argv: Optional[List[str]] = None) -> int:
369
385
  ap.add_argument("--golden", type=Path, default=DEFAULT_GOLDEN)
370
386
  ap.add_argument("-k", type=int, default=10, help="cutoff for @k metrics")
371
387
  ap.add_argument("--engines", default="auto",
372
- help="comma list of catalog,bm25,dense (default: auto)")
388
+ help="comma list of catalog,bm25,dense,hybrid (default: auto)")
373
389
  ap.add_argument("--build", action="store_true",
374
390
  help="(re)build the BM25 index before evaluating")
375
391
  ap.add_argument("--rerank", action="store_true",
@@ -406,10 +422,13 @@ def main(argv: Optional[List[str]] = None) -> int:
406
422
  if (args.engines == "auto" or "dense" in wanted) and dense.ready():
407
423
  if "dense" not in wanted:
408
424
  wanted.append("dense")
425
+ if (args.engines == "auto" or "hybrid" in wanted) and dense.ready():
426
+ if "hybrid" not in wanted:
427
+ wanted.append("hybrid")
409
428
  factory = {"catalog": catalog_ranker, "bm25": bm25_ranker,
410
- "dense": dense_ranker}
429
+ "dense": dense_ranker, "hybrid": hybrid_ranker}
411
430
  labels = {"catalog": "catalog.search", "bm25": "BM25 full-content",
412
- "dense": "dense vectors"}
431
+ "dense": "dense vectors", "hybrid": "hybrid RRF"}
413
432
 
414
433
  results: List[dict] = []
415
434
  per_cases: Dict[str, List[dict]] = {}
@@ -0,0 +1,84 @@
1
+ # Natural-language retrieval judgments — the queries golden.jsonl does not contain.
2
+ #
3
+ # WHY THIS FILE EXISTS. golden.jsonl grades catalog items by NAME, and its queries
4
+ # carry the vocabulary of the docs they target ("generate algorithmic art with
5
+ # p5.js flow fields"). That is BM25's home ground: measured over the pinned
6
+ # corpus it scores recall 1.000 there, which CLAUDE.md records as expected. So
7
+ # the set cannot distinguish retrieval engines on the thing the keyless dense
8
+ # work was built for — a user describing a PROBLEM in their own words.
9
+ #
10
+ # METHOD, stated so it can be checked rather than trusted:
11
+ # 1. Every query was written from the target's own `description` field and
12
+ # nothing else. No retrieval was run against any engine while composing —
13
+ # the whole set was written first and scored once, so the queries could not
14
+ # be selected to flatter a result already seen. That ordering is the point;
15
+ # see keyless-semantic-search-for-everyone for why fitting and reporting on
16
+ # one set is the failure mode here.
17
+ # 2. Queries deliberately AVOID the target's distinctive name tokens. A query
18
+ # containing "docker" finds docker-expert by string match and measures
19
+ # nothing. "my containers keep restarting" is the question a user actually
20
+ # has.
21
+ # 3. Where two items genuinely serve one intent (mcp-builder and build-mcp are
22
+ # near-duplicates in this corpus), both are listed relevant. Grading one as
23
+ # wrong would penalise an engine for a corpus duplication, not a retrieval
24
+ # failure.
25
+ #
26
+ # HOW TO RUN. Needs the pinned corpus (scripts/ensure_eval_corpus.sh) and, for
27
+ # the dense/hybrid columns, the [rag] extra plus a built store:
28
+ # python3 scripts/eval_retrieval.py --golden tests/eval/golden-natural.jsonl -k 10
29
+ # NOT wired into `make eval` or the required gate: that gate must stay
30
+ # deterministic and offline-ish, and this set is for comparing engines rather
31
+ # than flooring one. Adding it to the gate would also floor a number nobody has
32
+ # argued for yet.
33
+ #
34
+ # One JSON object per line: {query, relevant[], kind, note}
35
+ {"query": "my writing is too wordy and people skim past the important parts", "relevant": ["write-concisely"], "kind": "skill", "note": "clarity, no shared vocabulary with the name"}
36
+ {"query": "an error surfaces deep in the call stack and I cannot tell what originally triggered it", "relevant": ["root-cause-tracing"], "kind": "skill", "note": "tracing back from a symptom"}
37
+ {"query": "I keep patching symptoms instead of whatever is actually wrong underneath", "relevant": ["why", "root-cause-tracing"], "kind": "skill", "note": "five-whys intent"}
38
+ {"query": "what convention should I follow for the messages I write when recording changes in git", "relevant": ["commit"], "kind": "skill", "note": "conventional commits"}
39
+ {"query": "I keep stashing half-finished work every time I have to switch branches", "relevant": ["git-worktrees"], "kind": "skill", "note": "worktrees without naming them"}
40
+ {"query": "I want to attach review status to a commit without rewriting any history", "relevant": ["git-notes"], "kind": "skill", "note": "metadata on commits"}
41
+ {"query": "check what I changed for injection flaws and leaked credentials before it goes in", "relevant": ["security-auditor"], "kind": "workflow", "note": "vulnerability review"}
42
+ {"query": "am I actually exercising the risky paths or only the easy ones", "relevant": ["test-coverage-reviewer"], "kind": "workflow", "note": "coverage quality"}
43
+ {"query": "read through my diff and tell me what is broken in it", "relevant": ["bug-hunter"], "kind": "workflow", "note": "defect finding"}
44
+ {"query": "does this change follow the conventions the rest of the project uses", "relevant": ["code-reviewer"], "kind": "workflow", "note": "guideline adherence"}
45
+ {"query": "I need a single page covering what went wrong, why it happened and what we will do", "relevant": ["analyse-problem"], "kind": "skill", "note": "A3 report"}
46
+ {"query": "help me lay out everything that might be contributing, grouped into categories", "relevant": ["cause-and-effect"], "kind": "skill", "note": "fishbone"}
47
+ {"query": "I want to run small controlled experiments and keep iterating on the result", "relevant": ["plan-do-check-act"], "kind": "skill", "note": "PDCA"}
48
+ {"query": "drive my locally running site in a real browser and confirm it behaves", "relevant": ["webapp-testing"], "kind": "skill", "note": "playwright without the word"}
49
+ {"query": "get the text out of a scanned document so I can search it", "relevant": ["pdf"], "kind": "skill", "note": "extraction"}
50
+ {"query": "I need to edit a Word file programmatically", "relevant": ["docx"], "kind": "skill", "note": "office format"}
51
+ {"query": "read numbers out of a spreadsheet and write some back", "relevant": ["xlsx"], "kind": "skill", "note": "office format"}
52
+ {"query": "put together a slide deck for a presentation", "relevant": ["pptx"], "kind": "skill", "note": "office format"}
53
+ {"query": "make a short looping animation small enough to post in chat", "relevant": ["slack-gif-creator"], "kind": "skill", "note": "gif constraints"}
54
+ {"query": "make this match our company colours and typefaces", "relevant": ["brand-guidelines"], "kind": "skill", "note": "brand application"}
55
+ {"query": "the interface looks generic and I want it to feel deliberate", "relevant": ["frontend-design"], "kind": "skill", "note": "visual design intent"}
56
+ {"query": "expose an external API as tools an assistant can call", "relevant": ["mcp-builder", "build-mcp"], "kind": "skill", "note": "two near-duplicate items in this corpus"}
57
+ {"query": "the model keeps ignoring part of my instructions", "relevant": ["prompt-engineering"], "kind": "skill", "note": "prompt authoring"}
58
+ {"query": "I am running out of room in the window and important details get dropped", "relevant": ["context-engineering"], "kind": "skill", "note": "context limits"}
59
+ {"query": "I want to package a repeatable procedure so it can be reused later", "relevant": ["skill-creator", "create-skill"], "kind": "skill", "note": "duplicate intent in corpus"}
60
+ {"query": "how do I tell whether my changes to the instructions actually helped", "relevant": ["agent-evaluation"], "kind": "skill", "note": "measuring prompt changes"}
61
+ {"query": "run something automatically every time before code is committed", "relevant": ["create-hook"], "kind": "skill", "note": "git hooks"}
62
+ {"query": "turn this ticket into a proper technical specification", "relevant": ["analyze-issue"], "kind": "skill", "note": "issue to spec"}
63
+ {"query": "open a change request with the right template filled in", "relevant": ["create-pr"], "kind": "skill", "note": "PR creation"}
64
+ {"query": "gather all the unresolved feedback on my change into a task list", "relevant": ["load-pr-comments"], "kind": "skill", "note": "review comments"}
65
+ {"query": "the written guides no longer match what the code does", "relevant": ["update-docs"], "kind": "skill", "note": "stale documentation"}
66
+ {"query": "walk me through writing a guide together step by step", "relevant": ["doc-coauthoring"], "kind": "skill", "note": "structured authoring"}
67
+ {"query": "this needs careful multi-step logic rather than a quick guess", "relevant": ["thought-based-reasoning"], "kind": "skill", "note": "reasoning depth"}
68
+ {"query": "I want several different perspectives to argue about my design before I commit to it", "relevant": ["critique"], "kind": "skill", "note": "multi-judge debate"}
69
+ {"query": "look back over what you just produced and improve on it", "relevant": ["reflect"], "kind": "skill", "note": "self-refinement"}
70
+ {"query": "keep this lesson around so the same mistake is not repeated", "relevant": ["memorize"], "kind": "skill", "note": "persisting insights"}
71
+ {"query": "some of the decisions we recorded are probably out of date now", "relevant": ["decay"], "kind": "skill", "note": "evidence freshness"}
72
+ {"query": "generate visuals from code with a bit of controlled randomness", "relevant": ["algorithmic-art"], "kind": "skill", "note": "creative coding"}
73
+ {"query": "produce a good looking printable document rather than a web page", "relevant": ["canvas-design"], "kind": "skill", "note": "print output"}
74
+ {"query": "apply one consistent look across slides, documents and pages", "relevant": ["theme-factory"], "kind": "skill", "note": "theming"}
75
+ {"query": "what does calling the model actually cost per token", "relevant": ["claude-api"], "kind": "skill", "note": "pricing reference"}
76
+ {"query": "my containers keep restarting and I cannot work out why", "relevant": ["docker-expert"], "kind": "workflow", "note": "avoids the word docker"}
77
+ {"query": "the layout falls apart on a narrow screen", "relevant": ["css-expert"], "kind": "workflow", "note": "responsive layout"}
78
+ {"query": "I want automated tests that click through the app like a person would", "relevant": ["cypress-expert"], "kind": "workflow", "note": "e2e testing"}
79
+ {"query": "our full-text queries have got slow as the index grew", "relevant": ["elasticsearch-expert"], "kind": "workflow", "note": "search performance"}
80
+ {"query": "how should I choose partition and sort keys for this access pattern", "relevant": ["dynamodb-expert"], "kind": "workflow", "note": "key design"}
81
+ {"query": "my shell script fails silently in the pipeline and I never notice", "relevant": ["bash-expert"], "kind": "workflow", "note": "defensive scripting"}
82
+ {"query": "I need to configure a fleet of servers repeatably without doing it by hand", "relevant": ["ansible-expert"], "kind": "workflow", "note": "config management"}
83
+ {"query": "keep database schema versions in step across environments", "relevant": ["flyway-expert"], "kind": "workflow", "note": "migrations"}
84
+ {"query": "background jobs are piling up and not getting processed", "relevant": ["celery-expert", "bullmq-expert"], "kind": "workflow", "note": "two queue libraries, both defensible"}
@@ -1128,8 +1128,13 @@ class TestReindex:
1128
1128
  boost("reindex", "--dense")
1129
1129
  assert dense.ready() is True
1130
1130
  r = boost("search", "brainstorming")
1131
- assert "ranked by dense vectors" in r.out
1132
- assert "full-content BM25" not in r.out
1131
+ # Both indexes are built here, so retrieve_any fuses rather than
1132
+ # picking: the label names both engines. It used to read "ranked by
1133
+ # dense vectors", from when a ready dense store ended the search —
1134
+ # see rag.retrieve_any for why the golden-set tie retired that.
1135
+ assert "ranked by hybrid RRF (BM25 + dense)" in r.out
1136
+ assert "ranked by BM25 full-content" not in r.out, \
1137
+ "a built dense store must still contribute, not be bypassed"
1133
1138
 
1134
1139
  def test_empty_store_warns_instead_of_reporting_success(
1135
1140
  self, boost, tapped, monkeypatch):
@@ -964,7 +964,10 @@ class TestEngineRouting:
964
964
  rag._save([{"n": "a", "t": "x/y", "k": "skill", "c": 0, "l": 1,
965
965
  "snip": "s", "tf": {"react": 1}}], {})
966
966
 
967
- def test_prefers_dense_when_ready(self, sandbox, monkeypatch):
967
+ def test_dense_alone_when_bm25_has_no_index(self, sandbox, monkeypatch):
968
+ # Renamed: this never set up a BM25 index, so it was measuring "dense
969
+ # is the only engine available", not a preference between the two.
970
+ # There is no preference any more — with both present they fuse.
968
971
  monkeypatch.setattr(dense_mod, "ready", lambda: True)
969
972
  picked = [{"entry": {"name": "d", "tap": "x/y"}, "score": 9.0,
970
973
  "snippet": "D"}]
@@ -1018,18 +1021,26 @@ class TestEngineRouting:
1018
1021
  monkeypatch.setattr(dense_mod, "retrieve", lambda *a, **k: [])
1019
1022
  assert rag.search("react", smart=False) is None
1020
1023
 
1021
- def test_a_non_empty_dense_result_is_still_final(self, sandbox, monkeypatch):
1022
- # The fix must not turn into "always run BM25 too": a real dense hit
1023
- # ends the search, even with a BM25 index present that would rank
1024
- # something else first.
1024
+ def test_a_non_empty_dense_result_is_now_fused_not_final(self, sandbox,
1025
+ monkeypatch):
1026
+ # SUPERSEDED CONTRACT, deliberately. This used to assert that a real
1027
+ # dense hit ended the search — "the fix must not turn into 'always run
1028
+ # BM25 too'". The golden-set eval retired the premise: dense does not
1029
+ # beat BM25 there (hit@1 0.780 each over 91 queries), so ending the
1030
+ # search on a dense hit hands keyword queries to an engine that is at
1031
+ # best tied for them. Both rankings are now fused by RRF.
1032
+ #
1033
+ # The half of the old fix that still stands is tested above: an EMPTY
1034
+ # dense result is not a verdict, and must still fall through to BM25.
1025
1035
  self._bm25_ready()
1026
1036
  monkeypatch.setattr(dense_mod, "ready", lambda: True)
1027
1037
  monkeypatch.setattr(dense_mod, "retrieve", lambda *a, **k: [
1028
1038
  {"entry": {"name": "d", "tap": "x/y"}, "score": 9.0, "snippet": "D"}])
1029
1039
  hits, label = rag.search("react", smart=False,
1030
1040
  entries=[_entry("a", tap="x/y")])
1031
- assert label == "dense vectors"
1032
- assert [h["entry"]["name"] for h in hits] == ["d"]
1041
+ assert "hybrid" in label.lower(), label
1042
+ assert "d" in [h["entry"]["name"] for h in hits], \
1043
+ "the dense hit must survive fusion, not be dropped"
1033
1044
 
1034
1045
 
1035
1046
  class TestAtomicIndexSave: