boost-skill-cli 1.2.14__tar.gz → 1.2.16__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 (737) hide show
  1. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
  2. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/PKG-INFO +1 -1
  3. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/configuration.py +3 -1
  5. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/dense.py +10 -2
  6. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/mcp.py +2 -1
  7. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/paths.py +1 -0
  8. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/rag.py +182 -26
  9. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  10. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
  11. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/rag-architecture.md +15 -0
  12. boost_skill_cli-1.2.16/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +49 -0
  13. boost_skill_cli-1.2.16/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +37 -0
  14. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap.html +79 -1
  15. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_retrieval.py +7 -1
  16. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_configuration.py +10 -2
  17. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_clean_internal_cache.py +1 -0
  18. boost_skill_cli-1.2.16/tests/unit/test_dense_ready_order.py +40 -0
  19. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcp.py +5 -0
  20. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_rag.py +28 -12
  21. boost_skill_cli-1.2.16/tests/unit/test_rag_fastpath.py +279 -0
  22. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_rag_fusion.py +7 -4
  23. boost_skill_cli-1.2.16/tests/unit/test_rerank_cache.py +128 -0
  24. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.gitattributes +0 -0
  25. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.gitignore +0 -0
  26. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.gitleaks.toml +0 -0
  27. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.htmlvalidate.json +0 -0
  28. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.lighthouserc.json +0 -0
  29. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.lycheeignore +0 -0
  30. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.markdownlint-cli2.jsonc +0 -0
  31. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.pre-commit-config.yaml +0 -0
  32. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.stylelintrc.json +0 -0
  33. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.vale/styles/boost/Terminology.yml +0 -0
  34. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.vale.ini +0 -0
  35. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/CLAUDE.md +0 -0
  36. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/CODE_OF_CONDUCT.md +0 -0
  37. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/CONTRIBUTING.md +0 -0
  38. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/LICENSE +0 -0
  39. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/MANIFEST.in +0 -0
  40. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/Makefile +0 -0
  41. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/README.md +0 -0
  42. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/SECURITY.md +0 -0
  43. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost +0 -0
  44. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/__init__.py +0 -0
  45. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/__main__.py +0 -0
  46. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/cli.py +0 -0
  47. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/cliparse.py +0 -0
  48. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/__init__.py +0 -0
  49. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/_common.py +0 -0
  50. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/bmad.py +0 -0
  51. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/discovery.py +0 -0
  52. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/hooks.py +0 -0
  53. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/info.py +0 -0
  54. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/intelligence.py +0 -0
  55. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/pkg.py +0 -0
  56. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/quality.py +0 -0
  57. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/run.py +0 -0
  58. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/safety.py +0 -0
  59. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/taps.py +0 -0
  60. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/team.py +0 -0
  61. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/__init__.py +0 -0
  62. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/adapters.py +0 -0
  63. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/agents.py +0 -0
  64. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/ai.py +0 -0
  65. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/bmad.py +0 -0
  66. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/bootstrap.py +0 -0
  67. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/browse.py +0 -0
  68. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/builtin.py +0 -0
  69. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/capabilities.py +0 -0
  70. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/catalog.py +0 -0
  71. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/catalogbundle.py +0 -0
  72. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/chat.py +0 -0
  73. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/claude_settings.py +0 -0
  74. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/complete.py +0 -0
  75. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/config.py +0 -0
  76. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/ed25519.py +0 -0
  77. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/embed.py +0 -0
  78. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/faithfulness.py +0 -0
  79. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/frontmatter.py +0 -0
  80. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/gitutil.py +0 -0
  81. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/imperative.py +0 -0
  82. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/injectscan.py +0 -0
  83. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/installscan.py +0 -0
  84. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/integrity.py +0 -0
  85. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/journal.py +0 -0
  86. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/localembed.py +0 -0
  87. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/lockfile.py +0 -0
  88. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/logs.py +0 -0
  89. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/mcpdecl.py +0 -0
  90. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/mcphost.py +0 -0
  91. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/minisign.py +0 -0
  92. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/nethttp.py +0 -0
  93. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/output.py +0 -0
  94. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/policy.py +0 -0
  95. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/projectlock.py +0 -0
  96. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/provenance.py +0 -0
  97. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/registry.py +0 -0
  98. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/resolve.py +0 -0
  99. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/rules.py +0 -0
  100. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/scopes.py +0 -0
  101. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/secretscan.py +0 -0
  102. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/selfupdate.py +0 -0
  103. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/serve.py +0 -0
  104. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/stackprobe.py +0 -0
  105. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/staleness.py +0 -0
  106. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/store.py +0 -0
  107. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/trustaudit.py +0 -0
  108. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/typosquat.py +0 -0
  109. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/updatediff.py +0 -0
  110. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/util.py +0 -0
  111. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/workflows.py +0 -0
  112. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/data/registries.json +0 -0
  113. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/data/rules/boost-first.mdc +0 -0
  114. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/errors.py +0 -0
  115. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/spin.py +0 -0
  116. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/__init__.py +0 -0
  117. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/_compat.py +0 -0
  118. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/graph.py +0 -0
  119. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/loader.py +0 -0
  120. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/py.typed +0 -0
  121. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/retriever.py +0 -0
  122. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  123. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  124. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/requires.txt +0 -0
  125. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/top_level.txt +0 -0
  126. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/codecov.yml +0 -0
  127. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/.claude/settings.local.json +0 -0
  128. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/DEBUGGING.md +0 -0
  129. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/adapters.html +0 -0
  130. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/README.md +0 -0
  131. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-components-core.md +0 -0
  132. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-containers.md +0 -0
  133. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-context.md +0 -0
  134. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-dynamic-install.md +0 -0
  135. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/distill.gif +0 -0
  136. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/doctor.gif +0 -0
  137. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/explain.gif +0 -0
  138. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/hooks.gif +0 -0
  139. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/install.gif +0 -0
  140. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/pulse.gif +0 -0
  141. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/search.gif +0 -0
  142. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/tap.gif +0 -0
  143. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/distill.tape +0 -0
  144. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/doctor.tape +0 -0
  145. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/explain.tape +0 -0
  146. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/hooks.tape +0 -0
  147. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/install.tape +0 -0
  148. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/pulse.tape +0 -0
  149. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/search.tape +0 -0
  150. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/tap.tape +0 -0
  151. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel.html +0 -0
  152. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/chat.html +0 -0
  153. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/commands.html +0 -0
  154. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo-index.json +0 -0
  155. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo.gif +0 -0
  156. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo.html +0 -0
  157. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo.tape +0 -0
  158. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/design-roadmap.html +0 -0
  159. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/eval-latest.json +0 -0
  160. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/eval.html +0 -0
  161. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/index.html +0 -0
  162. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/langchain.html +0 -0
  163. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/mcp-hub.html +0 -0
  164. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D01.md +0 -0
  165. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D02.md +0 -0
  166. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D03.md +0 -0
  167. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D04.md +0 -0
  168. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D05.md +0 -0
  169. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D06.md +0 -0
  170. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D07.md +0 -0
  171. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D08.md +0 -0
  172. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D09.md +0 -0
  173. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D10.md +0 -0
  174. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D11.md +0 -0
  175. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D12.md +0 -0
  176. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D13.md +0 -0
  177. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D14.md +0 -0
  178. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D15.md +0 -0
  179. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D16.md +0 -0
  180. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D17.md +0 -0
  181. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D18.md +0 -0
  182. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D19.md +0 -0
  183. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D20.md +0 -0
  184. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D21.md +0 -0
  185. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D22.md +0 -0
  186. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D23.md +0 -0
  187. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D24.md +0 -0
  188. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D25.md +0 -0
  189. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D26.md +0 -0
  190. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  191. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  192. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  193. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  194. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  195. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  196. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  197. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  198. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  199. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  200. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  201. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  202. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  203. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-rule.md +0 -0
  204. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  205. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  206. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  207. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  208. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  209. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  210. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  211. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  212. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  213. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  214. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  215. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  216. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  217. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  218. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  219. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  220. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  221. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  222. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-carousel-page.md +0 -0
  223. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  224. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  225. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  226. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  227. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  228. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  229. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  230. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  231. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  232. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  233. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  234. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  235. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  236. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  237. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  238. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  239. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  240. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  241. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  242. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  243. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  244. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  245. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  246. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  247. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  248. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  249. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  250. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  251. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  252. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  253. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  254. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  255. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  256. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  257. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  258. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  259. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  260. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  261. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  262. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  263. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  264. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  265. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  266. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  267. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  268. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  269. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-community-health-files.md +0 -0
  270. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  271. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  272. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  273. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  274. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  275. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  276. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  277. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  278. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  279. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  280. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  281. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  282. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  283. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  284. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  285. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  286. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  287. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  288. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  289. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  290. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  291. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  292. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  293. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  294. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  295. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  296. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  297. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  298. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  299. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  300. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  301. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  302. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  303. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  304. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  305. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  306. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  307. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  308. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  309. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  310. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  311. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  312. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  313. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  314. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  315. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  316. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  317. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  318. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  319. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  320. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  321. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  322. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  323. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  324. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  325. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  326. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  327. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  328. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  329. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  330. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  331. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  332. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  333. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  334. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  335. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  336. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  337. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  338. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  339. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  340. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  341. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  342. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  343. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  344. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  345. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  346. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  347. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  348. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  349. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  350. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  351. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  352. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  353. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  354. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  355. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  356. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  357. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  358. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  359. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  360. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  361. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  362. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  363. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  364. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  365. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  366. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  367. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  368. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  369. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  370. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  371. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  372. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  373. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  374. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  375. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  376. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  377. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  378. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  379. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  380. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  381. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  382. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  383. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  384. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  385. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  386. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  387. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  388. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  389. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  390. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  391. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  392. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  393. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  394. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  395. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  396. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  397. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  398. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  399. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  400. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  401. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  402. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  403. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  404. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  405. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  406. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  407. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  408. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  409. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  410. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  411. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  412. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  413. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  414. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  415. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  416. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  417. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  418. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  419. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  420. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  421. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  422. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  423. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  424. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  425. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  426. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  427. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  428. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  429. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  430. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  431. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  432. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  433. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  434. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  435. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  436. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  437. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  438. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  439. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  440. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  441. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  442. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  443. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  444. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  445. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  446. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workspace-scope-install.md +0 -0
  447. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/zip-strict-audit.md +0 -0
  448. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  449. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  450. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  451. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/eslint.config.mjs +0 -0
  452. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/README.md +0 -0
  453. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/__init__.py +0 -0
  454. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/baseline.json +0 -0
  455. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/faithfulness.py +0 -0
  456. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/golden_set.json +0 -0
  457. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/make_corpus.py +0 -0
  458. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/make_golden.py +0 -0
  459. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/metrics.py +0 -0
  460. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/publish_golden_dataset.py +0 -0
  461. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/run_evals.py +0 -0
  462. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/examples/README.md +0 -0
  463. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/examples/adapt-demo.sh +0 -0
  464. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/examples/boost-run-prototype.sh +0 -0
  465. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/index.html +0 -0
  466. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/noxfile.py +0 -0
  467. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/pyproject.toml +0 -0
  468. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/coverage-tools.in +0 -0
  469. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/coverage-tools.txt +0 -0
  470. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/lint-tools.in +0 -0
  471. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/lint-tools.txt +0 -0
  472. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/mutation-tools.in +0 -0
  473. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/mutation-tools.txt +0 -0
  474. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/platform-pins.lock +0 -0
  475. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/release-tools.in +0 -0
  476. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/release-tools.txt +0 -0
  477. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/test-tools.in +0 -0
  478. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/test-tools.txt +0 -0
  479. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/a11y_check.py +0 -0
  480. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/bench_cli.sh +0 -0
  481. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_command_reference.py +0 -0
  482. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_demo_index.py +0 -0
  483. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_registries.py +0 -0
  484. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_roadmap.py +0 -0
  485. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_scale_corpus.py +0 -0
  486. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/check_anchors.py +0 -0
  487. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/check_licenses.py +0 -0
  488. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/check_required_checks.py +0 -0
  489. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/ensure_eval_corpus.sh +0 -0
  490. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_corpus.py +0 -0
  491. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_explain.py +0 -0
  492. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_gate.py +0 -0
  493. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_recommend.py +0 -0
  494. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_stats_summary.py +0 -0
  495. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/import_budget.py +0 -0
  496. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/lock_toolchain.py +0 -0
  497. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/measure_registry.py +0 -0
  498. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/mutation_gate.py +0 -0
  499. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/mutation_shards.py +0 -0
  500. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/mutation_weights.json +0 -0
  501. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/page_budget.py +0 -0
  502. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/perf_gate.py +0 -0
  503. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/post_deploy_smoke.py +0 -0
  504. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/publish_eval_json.py +0 -0
  505. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/release_guard.py +0 -0
  506. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/release_preflight.py +0 -0
  507. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/serve_docs.py +0 -0
  508. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/setup.cfg +0 -0
  509. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/sonar-project.properties +0 -0
  510. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/README.md +0 -0
  511. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/boost.css +0 -0
  512. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/boost.js +0 -0
  513. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/demo.html +0 -0
  514. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/adapt.feature +0 -0
  515. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/browse.feature +0 -0
  516. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/count.feature +0 -0
  517. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/discover.feature +0 -0
  518. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/doctor.feature +0 -0
  519. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/environment.py +0 -0
  520. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/explain.feature +0 -0
  521. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/index.feature +0 -0
  522. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/install.feature +0 -0
  523. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/list.feature +0 -0
  524. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/mcp.feature +0 -0
  525. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/search.feature +0 -0
  526. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/cli_steps.py +0 -0
  527. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/discovery_steps.py +0 -0
  528. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/mcp_steps.py +0 -0
  529. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/quality_steps.py +0 -0
  530. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/conftest.py +0 -0
  531. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/baseline.json +0 -0
  532. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/explain.jsonl +0 -0
  533. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/golden-natural.jsonl +0 -0
  534. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/golden.jsonl +0 -0
  535. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/recommend.jsonl +0 -0
  536. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/taps-scale.txt +0 -0
  537. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/taps.txt +0 -0
  538. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_capabilities_policy.py +0 -0
  539. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_adapt.py +0 -0
  540. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_bmad.py +0 -0
  541. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_catalog.py +0 -0
  542. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_chat.py +0 -0
  543. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_discovery.py +0 -0
  544. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_hooks.py +0 -0
  545. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_info.py +0 -0
  546. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_intelligence.py +0 -0
  547. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_pkg.py +0 -0
  548. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_quality.py +0 -0
  549. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_taps.py +0 -0
  550. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_team.py +0 -0
  551. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_everyday_loop.py +0 -0
  552. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_integrity_enforce.py +0 -0
  553. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_kind_conformance.py +0 -0
  554. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_property_parsers.py +0 -0
  555. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_run.py +0 -0
  556. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_tap_signing.py +0 -0
  557. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_workspace_scope.py +0 -0
  558. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/README.md +0 -0
  559. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  560. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  561. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  562. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  563. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  564. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  565. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  566. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  567. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  568. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  569. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  570. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  571. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  572. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  573. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  574. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  575. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  576. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  577. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  578. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  579. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  580. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  581. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  582. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_frontmatter.py +0 -0
  583. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_registry.py +0 -0
  584. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/conftest.py +0 -0
  585. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/test_graph.py +0 -0
  586. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/test_loader.py +0 -0
  587. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/test_retriever.py +0 -0
  588. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/make_fixture.py +0 -0
  589. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/perf/test_benchmarks.py +0 -0
  590. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/smoke.sh +0 -0
  591. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_a11y_check.py +0 -0
  592. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_action_pin_lockstep.py +0 -0
  593. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_adapters.py +0 -0
  594. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_multi.py +0 -0
  595. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_runner.py +0 -0
  596. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_agents.py +0 -0
  597. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_ai.py +0 -0
  598. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_bmad_core.py +0 -0
  599. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_boost_first_offer.py +0 -0
  600. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_bootstrap.py +0 -0
  601. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_browse.py +0 -0
  602. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_builtin.py +0 -0
  603. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_capabilities.py +0 -0
  604. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_catalog.py +0 -0
  605. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_catalogbundle.py +0 -0
  606. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_chat.py +0 -0
  607. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_check_anchors.py +0 -0
  608. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_check_licenses.py +0 -0
  609. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_claude_settings.py +0 -0
  610. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_cliparse.py +0 -0
  611. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_codeql_analysis_key.py +0 -0
  612. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_command_reference_fresh.py +0 -0
  613. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_community_health_files.py +0 -0
  614. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_compact.py +0 -0
  615. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_complete.py +0 -0
  616. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_complete_rc_block.py +0 -0
  617. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_config.py +0 -0
  618. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_content_dedupe.py +0 -0
  619. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_content_identity.py +0 -0
  620. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_crash_redaction.py +0 -0
  621. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dedup_trust.py +0 -0
  622. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_demo_index.py +0 -0
  623. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense.py +0 -0
  624. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_embed_dedupe.py +0 -0
  625. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fallback.py +0 -0
  626. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fix_hint.py +0 -0
  627. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_real_schema.py +0 -0
  628. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  629. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shards.py +0 -0
  630. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_status.py +0 -0
  631. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dependabot_config.py +0 -0
  632. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_docs_pages_linked.py +0 -0
  633. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_docsite_chrome.py +0 -0
  634. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_ed25519.py +0 -0
  635. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_embed.py +0 -0
  636. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_embed_local.py +0 -0
  637. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_embed_truncated_response.py +0 -0
  638. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_entry_key.py +0 -0
  639. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_errors_and_cli_table.py +0 -0
  640. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_baseline.py +0 -0
  641. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_corpus.py +0 -0
  642. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_faithfulness.py +0 -0
  643. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_gate.py +0 -0
  644. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_grading.py +0 -0
  645. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_metrics.py +0 -0
  646. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_stats_summary.py +0 -0
  647. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  648. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_faithfulness.py +0 -0
  649. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_frontmatter.py +0 -0
  650. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_fuzz_targets.py +0 -0
  651. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  652. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitleaks_config.py +0 -0
  653. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil.py +0 -0
  654. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_lfs.py +0 -0
  655. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_sparse.py +0 -0
  656. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_imperative.py +0 -0
  657. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_import_budget.py +0 -0
  658. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_injectscan.py +0 -0
  659. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_install_permission_error.py +0 -0
  660. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_installscan.py +0 -0
  661. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_integrity.py +0 -0
  662. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_journal.py +0 -0
  663. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_langchain_packaging.py +0 -0
  664. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_link_ownership.py +0 -0
  665. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_localembed.py +0 -0
  666. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_localembed_e2e.py +0 -0
  667. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_lockfile.py +0 -0
  668. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_logs.py +0 -0
  669. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_marketing_counts.py +0 -0
  670. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcp_install_scan.py +0 -0
  671. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcpdecl.py +0 -0
  672. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcphost.py +0 -0
  673. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_measure_registry.py +0 -0
  674. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_minisign.py +0 -0
  675. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_hardening.py +0 -0
  676. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_shards.py +0 -0
  677. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_subfile_shards.py +0 -0
  678. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutmut_source_paths.py +0 -0
  679. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_nethttp.py +0 -0
  680. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_output.py +0 -0
  681. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_page_budget.py +0 -0
  682. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_paths.py +0 -0
  683. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_perf_gate.py +0 -0
  684. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_confusions.py +0 -0
  685. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_injection.py +0 -0
  686. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_secrets.py +0 -0
  687. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_platform_pins.py +0 -0
  688. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_policy.py +0 -0
  689. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_post_deploy_smoke.py +0 -0
  690. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_project_mcp_sidecar.py +0 -0
  691. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_projectlock.py +0 -0
  692. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_provenance.py +0 -0
  693. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_publish_golden_dataset.py +0 -0
  694. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registries_fresh.py +0 -0
  695. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registry.py +0 -0
  696. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registry_categories.py +0 -0
  697. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registry_control_chars.py +0 -0
  698. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_release_guard.py +0 -0
  699. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_release_preflight.py +0 -0
  700. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_required_checks.py +0 -0
  701. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_resolve.py +0 -0
  702. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_roadmap_fresh.py +0 -0
  703. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_rules.py +0 -0
  704. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_scale_corpus.py +0 -0
  705. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_scopes.py +0 -0
  706. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_secretscan.py +0 -0
  707. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_selfupdate.py +0 -0
  708. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_serve.py +0 -0
  709. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_serve_docs.py +0 -0
  710. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_shards_matrix.py +0 -0
  711. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_smoke_covers_every_command.py +0 -0
  712. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_spin.py +0 -0
  713. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_stackprobe.py +0 -0
  714. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_staleness.py +0 -0
  715. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_store.py +0 -0
  716. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_store_materialize.py +0 -0
  717. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_sync_blocked_links.py +0 -0
  718. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  719. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_token_parity.py +0 -0
  720. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_toolchain_lock.py +0 -0
  721. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_trustaudit.py +0 -0
  722. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_typosquat.py +0 -0
  723. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_updatediff.py +0 -0
  724. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_util.py +0 -0
  725. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_version.py +0 -0
  726. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_visual_harness_flags.py +0 -0
  727. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency.py +0 -0
  728. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  729. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  730. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_timeouts.py +0 -0
  731. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflows.py +0 -0
  732. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  733. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/a11y_check.mjs +0 -0
  734. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/console_check.mjs +0 -0
  735. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/package-lock.json +0 -0
  736. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/package.json +0 -0
  737. {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/visual_check.mjs +0 -0
@@ -25,6 +25,7 @@ dotfiles
25
25
  DSPy
26
26
  else's
27
27
  env
28
+ eval
28
29
  evals
29
30
  freemium
30
31
  frontmatter
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.14
3
+ Version: 1.2.16
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.14'
22
- __version_tuple__ = version_tuple = (1, 2, 14)
21
+ __version__ = version = '1.2.16'
22
+ __version_tuple__ = version_tuple = (1, 2, 16)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1305,7 +1305,9 @@ REGISTRY.register(
1305
1305
  "either: take what fits, discard the rest, the task stays yours. It costs "
1306
1306
  "10-15 seconds — an LLM reranks every match, which is what makes the top "
1307
1307
  "result worth acting on rather than skimming. Worth budgeting for, not a "
1308
- "surprise. Coming back empty is a real answer too, not a "
1308
+ "surprise — and only a novel search pays it: repeating an identical "
1309
+ "search skips the LLM and answers from a local cache. "
1310
+ "Coming back empty is a real answer too, not a "
1309
1311
  "wasted turn: it means build it yourself, now knowing nothing already "
1310
1312
  "covers it — and on a machine with nothing tapped yet it says so and names "
1311
1313
  "the one command that fixes it, rather than reporting a miss.",
@@ -263,8 +263,16 @@ def status() -> dict:
263
263
 
264
264
 
265
265
  def ready() -> bool:
266
- """True when a usable, provider-matched vector index exists on disk."""
267
- if not have_backend() or not embed.available() or not db_path().exists():
266
+ """True when a usable, provider-matched vector index exists on disk.
267
+
268
+ The stat comes first, deliberately: on a machine with no vector store —
269
+ every BM25-only install — this must answer False without importing the
270
+ backend, because ``have_backend()`` drags in numpy via sqlite_vec
271
+ (~120 ms measured) and every cold ``boost search`` asks.
272
+ """
273
+ if not db_path().exists():
274
+ return False
275
+ if not have_backend() or not embed.available():
268
276
  return False
269
277
  con = _connect()
270
278
  if con is None:
@@ -194,7 +194,8 @@ INSTRUCTIONS = (
194
194
  "what exists. Both are read-only and install nothing. boost_list is "
195
195
  "instant. boost_search costs 10-15 seconds: it retrieves, then an LLM "
196
196
  "reranks every match, which is what makes the top result worth acting on "
197
- "rather than skimming ten.\n"
197
+ "rather than skimming ten. Only a novel search pays it — repeating an "
198
+ "identical search skips the LLM and answers from a local cache.\n"
198
199
  "\n"
199
200
  "WORTH THE SECONDS (boost_search — boost_list is free, call it whenever). "
200
201
  "Two signals, both readable from the request itself rather than from work "
@@ -85,6 +85,7 @@ INTERNAL_CACHE_FILES = frozenset({
85
85
  "rag_index.json", # rag.index_path() — BM25 index
86
86
  "rag_postings.sqlite", # rag.postings_path() — BM25 postings
87
87
  "rag_vectors.sqlite", # dense.db_path() — dense vectors
88
+ "rerank_cache.json", # rag.rerank_cache_path() — LLM rerank orders
88
89
  "discovery.json", # discovery._discovery_path()
89
90
  "_names.txt", # complete.names_file() — shell completion
90
91
  })
@@ -19,6 +19,7 @@ import contextlib
19
19
  import hashlib
20
20
  import json
21
21
  import math
22
+ import os
22
23
  import re
23
24
  import sqlite3
24
25
  from collections import defaultdict
@@ -445,12 +446,16 @@ def _load_raw() -> dict | None:
445
446
  p = index_path()
446
447
  key = str(p)
447
448
  try:
448
- mtime = p.stat().st_mtime
449
+ st = p.stat()
449
450
  except OSError:
450
451
  _CACHE.pop(key, None)
451
452
  return None
453
+ # (mtime_ns, size), not bare mtime: a rewrite landing inside one mtime
454
+ # tick would otherwise serve the previous index from this cache forever —
455
+ # the same stamp `catalog._cached_tap` already uses, for the same reason.
456
+ stamp = (st.st_mtime_ns, st.st_size)
452
457
  cached = _CACHE.get(key)
453
- if isinstance(cached, tuple) and cached[0] == mtime:
458
+ if isinstance(cached, tuple) and cached[0] == stamp:
454
459
  return cached[1] # type: ignore[return-value]
455
460
  try:
456
461
  data = json.loads(p.read_text(encoding="utf-8"))
@@ -458,7 +463,7 @@ def _load_raw() -> dict | None:
458
463
  return None
459
464
  if not isinstance(data, dict) or data.get("version") != INDEX_VERSION:
460
465
  return None
461
- _CACHE[key] = (mtime, data)
466
+ _CACHE[key] = (stamp, data)
462
467
  return data
463
468
 
464
469
 
@@ -699,16 +704,97 @@ def dedupe_by_content(hits: list[Hit], limit: int) -> list[Hit]:
699
704
  # Same body already shown. Keep its rank, but prefer a better source.
700
705
  kept = out[seen]
701
706
  if source_rank(hit["entry"]) < source_rank(kept["entry"]):
702
- # cast, not a literal annotation: `Hit` is total=False for the
703
- # optional `content` key, and NotRequired needs 3.11 while boost
704
- # targets 3.9.
705
- out[seen] = cast(Hit, {"entry": hit["entry"],
706
- "score": kept["score"],
707
- "snippet": kept["snippet"],
708
- "content": digest})
707
+ # Copy the kept hit wholesale and swap only the entry: a literal
708
+ # rebuild here would silently drop anything else the caller
709
+ # carried on the hit (retrieve defers snippet windowing through
710
+ # this function, so the carry is load-bearing, not hygiene).
711
+ out[seen] = cast(Hit, {**kept, "entry": hit["entry"]})
709
712
  return out[:limit]
710
713
 
711
714
 
715
+ def _windowed(hits: list[Hit], terms: Sequence[str]) -> list[Hit]:
716
+ """Window each hit's raw stored snip onto the query terms.
717
+
718
+ Deferred to the hits actually returned: ranking carries the raw ``snip``
719
+ through dedupe, and only the survivors pay ``_passage`` — the eager
720
+ version computed 39,726 windows on a real machine to display 60.
721
+ """
722
+ return [cast(Hit, {**h, "snippet": _passage(h["snippet"], terms)})
723
+ for h in hits]
724
+
725
+
726
+ def _retrieve_from_index(docs: list[dict], scores: dict[int, float],
727
+ terms: list[str], k: int, kind: str | None,
728
+ ) -> list[Hit] | None:
729
+ """Rank from the index's own doc metadata — no full-catalogue parse.
730
+
731
+ The slow path builds a ``live`` map by parsing every tap cache on the
732
+ machine (458 files, ~100 MB, 0.32 s measured) to serve two needs: filter
733
+ docs whose entry is gone, and hand back real entry dicts. On a fresh index
734
+ both are answerable cheaper: every doc of a still-configured tap is live
735
+ by construction (``ensure()`` rebuilds on staleness), and only the final
736
+ ``k`` survivors need materialising — so only *their* taps' caches load.
737
+
738
+ Ranking, dedupe and tie-breaks use index-side values (``n``/``h``/``k``)
739
+ that ``build()`` copied from the same cache entries the slow path reads,
740
+ plus a shadow entry carrying the two fields ``source_rank`` consults
741
+ (``tap``, ``curated``) from one ``registry.list_taps()`` snapshot — never
742
+ a second config read, and never :func:`registry.get`, which raises for a
743
+ concurrently-untapped name.
744
+
745
+ Returns ``None`` when any survivor's entry cannot be materialised (a tap
746
+ cache vanished or moved under a stat-fresh index): the caller reruns the
747
+ query through the explicit-entries path, whose output is the contract.
748
+ Byte-identical-or-fall-back, never approximate.
749
+ """
750
+ taps = {t.name: t for t in registry.list_taps()}
751
+ best: dict[tuple[str, str], tuple[float, str, str, str]] = {}
752
+ for doc_id, score in scores.items():
753
+ d = docs[doc_id]
754
+ if kind is not None and d["k"] != kind:
755
+ continue
756
+ if d["t"] not in taps: # untapped repos stop ranking, stale or not
757
+ continue
758
+ key = (d["t"], d["f"])
759
+ prev = best.get(key)
760
+ if prev is None or score > prev[0]:
761
+ best[key] = (score, d["snip"], d.get("h", ""), d["n"])
762
+ ranked = sorted(best.items(),
763
+ key=lambda kv: (-kv[1][0], kv[1][3], kv[0]))
764
+ # The shadow entry carries exactly what downstream code reads before
765
+ # materialisation: `source_rank` consults tap + curated, and the loop
766
+ # below reads tap + skill_md. Nothing else — an extra field here would
767
+ # be dead weight pretending to be contract.
768
+ hits: list[Hit] = [
769
+ {"entry": {"tap": key[0], "skill_md": key[1],
770
+ "curated": taps[key[0]].curated},
771
+ "score": score, "content": digest,
772
+ "snippet": snip} # type: ignore[typeddict-item]
773
+ for key, (score, snip, digest, _name) in ranked]
774
+ # The FULL ranked list flows through dedupe, exactly as the slow path's
775
+ # does: a curated duplicate at rank 3,000 legally replaces the displayed
776
+ # source of survivor #1, so the promotion scan cannot be truncated.
777
+ survivors = dedupe_by_content(hits, len(hits))
778
+ loaded: dict[str, dict[tuple[str, str], dict]] = {}
779
+ out: list[Hit] = []
780
+ for hit in survivors:
781
+ if len(out) == k:
782
+ break
783
+ tap_name = hit["entry"]["tap"]
784
+ tap = taps.get(tap_name)
785
+ if tap is None: # promoted source raced an untap
786
+ return None
787
+ if tap_name not in loaded:
788
+ loaded[tap_name] = {entry_key(e): e
789
+ for e in catalog.load_tap(tap)}
790
+ entry = loaded[tap_name].get((tap_name, hit["entry"]["skill_md"]))
791
+ if entry is None:
792
+ return None
793
+ out.append(cast(Hit, {**hit, "entry": entry,
794
+ "snippet": _passage(hit["snippet"], terms)}))
795
+ return out
796
+
797
+
712
798
  def retrieve(query: str, k: int = 60, kind: str | None = None,
713
799
  entries: list[dict] | None = None) -> list[Hit]:
714
800
  """Top-k full-content hits for ``query``. ``[]`` if the index is empty."""
@@ -718,11 +804,20 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
718
804
  terms = tokenize(query)
719
805
  if not terms:
720
806
  return []
721
- entries = catalog.all_entries() if entries is None else entries
722
- live = {entry_key(e): e for e in entries}
723
807
  docs = raw["docs"]
808
+ scores = _bm25(terms, raw, read_postings(terms))
809
+ if entries is None:
810
+ fast = _retrieve_from_index(docs, scores, terms, k, kind)
811
+ if fast is not None:
812
+ return fast
813
+ # An entry vanished between index and cache: answer from the full
814
+ # catalogue exactly as before the fast path existed. One side effect
815
+ # rides along only here now — load_tap's rescan of old-CACHE_FORMAT
816
+ # caches, which otherwise happens on tap operations and build().
817
+ entries = catalog.all_entries()
818
+ live = {entry_key(e): e for e in entries}
724
819
  best: dict[tuple[str, str], tuple[float, str, str]] = {}
725
- for doc_id, score in _bm25(terms, raw, read_postings(terms)).items():
820
+ for doc_id, score in scores.items():
726
821
  d = docs[doc_id]
727
822
  if kind is not None and d["k"] != kind:
728
823
  continue
@@ -742,9 +837,52 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
742
837
  # or they still consume the slots they were removed from.
743
838
  hits: list[Hit] = [
744
839
  {"entry": live[key], "score": score, "content": digest,
745
- "snippet": _passage(snip, terms)} # type: ignore[typeddict-item]
840
+ "snippet": snip} # type: ignore[typeddict-item]
746
841
  for key, (score, snip, digest) in ranked]
747
- return dedupe_by_content(hits, k)
842
+ return _windowed(dedupe_by_content(hits, k), terms)
843
+
844
+
845
+ def rerank_cache_path() -> Path:
846
+ """Where cached rerank orders live; in ``paths.INTERNAL_CACHE_FILES``."""
847
+ return paths.cache_dir() / "rerank_cache.json"
848
+
849
+
850
+ #: FIFO cap on cached rerank orders. 200 entries is a few days of real use at
851
+ #: a few KB total; the point is bounding the file, not maximising hits.
852
+ RERANK_CACHE_CAP = 200
853
+
854
+
855
+ def _rerank_cache_load() -> dict:
856
+ """The cache as a dict, ``{}`` for missing/corrupt — never an error."""
857
+ try:
858
+ data = json.loads(rerank_cache_path().read_text(encoding="utf-8"))
859
+ except (OSError, json.JSONDecodeError):
860
+ return {}
861
+ return data if isinstance(data, dict) else {}
862
+
863
+
864
+ def _rerank_cache_get(key: str) -> list | None:
865
+ """A cached name order for ``key``, or None on any doubt at all."""
866
+ order = _rerank_cache_load().get(key)
867
+ return order if isinstance(order, list) and order else None
868
+
869
+
870
+ def _rerank_cache_put(key: str, order: list) -> None:
871
+ """Store ``order``, evicting oldest-inserted beyond the cap.
872
+
873
+ JSON objects round-trip in insertion order, so the dict itself is the
874
+ FIFO — no timestamps to tie-break. Best-effort on purpose: a read-only
875
+ cache dir loses the cache, never the search, and a concurrent writer
876
+ clobbering this write costs a future miss, not corruption.
877
+ """
878
+ cache = _rerank_cache_load()
879
+ cache.pop(key, None)
880
+ cache[key] = order
881
+ while len(cache) > RERANK_CACHE_CAP:
882
+ cache.pop(next(iter(cache)))
883
+ with contextlib.suppress(OSError):
884
+ paths.ensure_dirs()
885
+ util.atomic_write_text(rerank_cache_path(), json.dumps(cache))
748
886
 
749
887
 
750
888
  #: The label `rerank` returns when the LLM pass actually ran. Every other value
@@ -766,6 +904,15 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
766
904
  answered, so a confident "BM25 full-content" sent debugging somewhere else.
767
905
 
768
906
  The default keeps direct callers unchanged; ``search`` passes the real one.
907
+
908
+ Repeat calls answer from a small on-disk cache keyed on a hash of exactly
909
+ what the LLM would see — query, limit, and the candidate listing — so it
910
+ self-invalidates on any reindex, ranking drift, or snippet change without
911
+ ever inspecting why. Only the parsed name order is stored; a hit replays
912
+ through the same deterministic reorder below, and keeps the LLM_RANKER
913
+ label because it *is* the LLM's ordering. ``BOOST_NO_RERANK_CACHE=1``
914
+ bypasses both read and write (the Tier 2a eval sets it, so a graded
915
+ rerank is always live).
769
916
  """
770
917
  top = hits[:max(limit, 15)]
771
918
  if not ai.available():
@@ -774,17 +921,26 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
774
921
  "- %s [%s]: %s" % (h["entry"]["name"], h["entry"].get("kind", "skill"),
775
922
  (h["snippet"] or h["entry"].get("description", ""))[:180])
776
923
  for h in top)
777
- reply = ai.ask(
778
- "Task: %s\n\nCandidate skills (name, kind, best matching text):\n%s\n\n"
779
- "Order the skill names best-match-first for the task. "
780
- "Reply with ONLY a JSON array of names." % (query, listing),
781
- system="You rank AI coding skills by how well they fit a task.",
782
- max_tokens=400)
783
- order = _json_array(reply)
784
- if not order:
785
- # The model answered but not with a JSON array, so the ordering falls
786
- # back to whatever retrieval produced — and so must the label.
787
- return hits[:limit], engine
924
+ caching = not os.environ.get("BOOST_NO_RERANK_CACHE")
925
+ cache_key = hashlib.sha256(
926
+ ("%s\n%d\n%s" % (query, limit, listing)).encode("utf-8", "replace")
927
+ ).hexdigest()
928
+ order = _rerank_cache_get(cache_key) if caching else None
929
+ if order is None:
930
+ reply = ai.ask(
931
+ "Task: %s\n\nCandidate skills (name, kind, best matching text):\n%s\n\n"
932
+ "Order the skill names best-match-first for the task. "
933
+ "Reply with ONLY a JSON array of names." % (query, listing),
934
+ system="You rank AI coding skills by how well they fit a task.",
935
+ max_tokens=400)
936
+ order = _json_array(reply)
937
+ if not order:
938
+ # The model answered but not with a JSON array, so the ordering
939
+ # falls back to whatever retrieval produced — and so must the
940
+ # label. Not cached: a degrade reply is a retry, not an answer.
941
+ return hits[:limit], engine
942
+ if caching:
943
+ _rerank_cache_put(cache_key, [str(n) for n in order])
788
944
  by_name = {h["entry"]["name"]: h for h in hits}
789
945
  picked = [by_name[str(n)] for n in order if str(n) in by_name]
790
946
  rest = [h for h in hits if h["entry"]["name"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.14
3
+ Version: 1.2.16
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -213,6 +213,7 @@ docs/roadmap/items/ci-time-is-now-runner-queueing.md
213
213
  docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
214
214
  docs/roadmap/items/code-scanning-rule-can-be-restored.md
215
215
  docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
216
+ docs/roadmap/items/cold-search-reads-the-whole-catalogue.md
216
217
  docs/roadmap/items/command-carousel-page.md
217
218
  docs/roadmap/items/command-reference-docs-site.md
218
219
  docs/roadmap/items/completions-complete-only-command-names.md
@@ -399,6 +400,7 @@ docs/roadmap/items/shareable-catalogue-bundle.md
399
400
  docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
400
401
  docs/roadmap/items/single-imperative-rule-extractor.md
401
402
  docs/roadmap/items/single-tech-stack-prober.md
403
+ docs/roadmap/items/smart-rerank-pays-per-novel-query.md
402
404
  docs/roadmap/items/split-oversized-command-modules.md
403
405
  docs/roadmap/items/startup-and-import-time-budget-x-importtime.md
404
406
  docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md
@@ -615,6 +617,7 @@ tests/unit/test_dense.py
615
617
  tests/unit/test_dense_embed_dedupe.py
616
618
  tests/unit/test_dense_fallback.py
617
619
  tests/unit/test_dense_fix_hint.py
620
+ tests/unit/test_dense_ready_order.py
618
621
  tests/unit/test_dense_shard_real_schema.py
619
622
  tests/unit/test_dense_shard_unreadable_vectors.py
620
623
  tests/unit/test_dense_shards.py
@@ -684,6 +687,7 @@ tests/unit/test_projectlock.py
684
687
  tests/unit/test_provenance.py
685
688
  tests/unit/test_publish_golden_dataset.py
686
689
  tests/unit/test_rag.py
690
+ tests/unit/test_rag_fastpath.py
687
691
  tests/unit/test_rag_fusion.py
688
692
  tests/unit/test_registries_fresh.py
689
693
  tests/unit/test_registry.py
@@ -692,6 +696,7 @@ tests/unit/test_registry_control_chars.py
692
696
  tests/unit/test_release_guard.py
693
697
  tests/unit/test_release_preflight.py
694
698
  tests/unit/test_required_checks.py
699
+ tests/unit/test_rerank_cache.py
695
700
  tests/unit/test_resolve.py
696
701
  tests/unit/test_roadmap_fresh.py
697
702
  tests/unit/test_rules.py
@@ -135,6 +135,21 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
135
135
  Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
136
136
  dict-of-postings scan — comfortably sub-second per query in Python.
137
137
 
138
+ **Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
139
+ `entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
140
+ the index's own doc metadata and materialises real catalog entries only for the
141
+ final `k` survivors, loading only *their* taps' caches (`_retrieve_from_index`).
142
+ The previous shape parsed every tap cache on the machine per query
143
+ (`catalog.all_entries()`: 458 files / ~100 MB / 0.32 s measured at 71.6k
144
+ entries) and computed a display snippet for every scored doc (39,726 calls to
145
+ serve 60). Snippet windowing now runs on returned hits only, on both paths.
146
+ The contract is byte-identical-or-fall-back: any survivor whose entry cannot be
147
+ materialised (a tap cache vanished under a stat-fresh index) reruns the query
148
+ through the explicit-`entries` path rather than approximating. An explicit
149
+ `entries=` list (the eval harness, `boost chat`) keeps today's exact path.
150
+ `dense.ready()` stats the store before importing the backend for the same
151
+ cold-path reason. Measured end to end: 0.94 s → 0.49 s cold at 458 taps.
152
+
138
153
  ### 6b. Two-stage pipeline — upgrade `boost_search` / `catalog.search` **in place**
139
154
 
140
155
  No parallel MCP tool (per decision). The upgraded flow:
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: cold-search-reads-the-whole-catalogue
3
+ board: code
4
+ section: pipeline
5
+ status: inflight
6
+ category: Performance · Search
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: 0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use
11
+ order: 122
12
+ owner: loop/search-perf
13
+ pr:
14
+ title: A cold search materialises 71,600 entries to print five
15
+ ---
16
+ Profiled cold <code>boost search</code> at real scale (458 taps, 71,600
17
+ entries): 0.94 s, of which <b>0.32 s</b> is <code>catalog.all_entries()</code>
18
+ parsing every tap cache on the machine (~100 MB of JSON) to build a
19
+ <code>live</code> map whose entries are only <i>displayed</i> for the final k
20
+ hits, <b>0.11 s</b> is <code>_passage</code> windowing a snippet for all
21
+ 39,726 scored docs to show 60, and <b>0.12 s</b> is <code>dense.ready()</code>
22
+ importing numpy via sqlite_vec just to answer "no vector store". BM25 scoring
23
+ itself: 18 ms. The engine was fine; the packaging around it was the cost.<br><br>
24
+ Shipped: <code>rag.retrieve(entries=None)</code> now ranks off the index's own
25
+ doc metadata (name/hash/kind/length all live there already), runs the full
26
+ ranked list through <code>dedupe_by_content</code> with shadow entries carrying
27
+ the two fields <code>source_rank</code> reads, and materialises real entries
28
+ for just the survivors' taps — with a <b>byte-identical-or-fall-back</b>
29
+ contract: any survivor that fails to materialise reruns the query through the
30
+ explicit-<code>entries</code> path (the eval-gate path, unchanged). Snippets
31
+ window on returned hits only, on both paths; <code>dense.ready()</code> stats
32
+ before importing; <code>_load_raw</code> keys its cache on
33
+ <code>(mtime_ns, size)</code>. Measured after: <b>0.94 s → 0.49 s cold</b>.
34
+ Complement of the shipped <i>cache-the-catalog-entry-set-across-rag-queries</i>
35
+ (PR 114), which memoised <code>all_entries</code> per process — warm repeats
36
+ were already amortised; this removes the cold-start read entirely.<br><br>
37
+ Analysed and deliberately <b>deferred</b>: moving the per-doc
38
+ <code>snip</code> out of <code>rag_index.json</code> into the postings SQLite.
39
+ <i>bm25-index-is-one-json-blob</i> declined it at 743 entries (14% of the
40
+ JSON); at 71.6k the premise inverts — snips are ~76% (46 MB → 11.4 MB slim,
41
+ 103 ms → 37 ms parse) — but an adversarial design review found the v6→v7
42
+ in-place migration can clobber a concurrently rebuilt pair without a
43
+ build-id pairing token, and a mixed-version machine (pipx CLI + long-running
44
+ MCP serve) thrashes full 71k-file reindexes across the version boundary.
45
+ 66 ms does not buy that; if the recorded (tap, skill_md)-keyed postings
46
+ follow-up ever lands, fold the snip move into that single format bump.
47
+ Residual known cost: the "semantic search is off" hint imports the backend
48
+ (~0.1 s) on machines with the extra installed but no store built — the one
49
+ state where that line is the advice.
@@ -0,0 +1,37 @@
1
+ ---
2
+ id: smart-rerank-pays-per-novel-query
3
+ board: code
4
+ section: dx
5
+ status: inflight
6
+ category: Performance · MCP
7
+ complexity: S
8
+ impact: High
9
+ wow: 3
10
+ note: MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one
11
+ order: 123
12
+ owner: loop/search-perf
13
+ pr:
14
+ title: The smart rerank pays the LLM again for a search it already answered
15
+ ---
16
+ The MCP <code>boost_search</code> path passes <code>smart=True</code> on every
17
+ call and <i>mcp-search-cost-was-understated</i> measured it at 11.7-17.0 s —
18
+ nearly all of it the LLM rerank, paid again in full for a byte-identical
19
+ repeat of the previous search. Agents retry searches constantly (a session
20
+ restart, a re-planned task, a second agent asking the same question), so the
21
+ honest "10-15 seconds" cost doctrine was billing every ask at first-ask
22
+ prices.<br><br>
23
+ Shipped: <code>rag.rerank</code> keeps a small FIFO cache
24
+ (<code>~/.boost/cache/rerank_cache.json</code>, 200 entries, registered in
25
+ <code>paths.INTERNAL_CACHE_FILES</code> so <code>boost clean</code> spares
26
+ it) keyed on a sha256 of <b>exactly what the LLM sees</b> — query, limit, and
27
+ the candidate listing — so it self-invalidates on any reindex, ranking drift,
28
+ or snippet change without inspecting why. Only the parsed name order is
29
+ stored; a hit replays through the same deterministic reorder as a live reply
30
+ and keeps the <code>Claude relevance</code> label, because it is the LLM's
31
+ ordering. Degrade replies are never cached. <code>BOOST_NO_RERANK_CACHE=1</code>
32
+ bypasses read and write — the Tier 2a eval sets it, so a graded rerank is
33
+ always live. Both MCP cost surfaces (server instructions and the
34
+ <code>boost_search</code> description) now state the repeat-search cost, pinned
35
+ by the same agreement test that keeps them from drifting apart. Sibling of
36
+ <i>cold-search-reads-the-whole-catalogue</i>, which took the retrieval half of
37
+ the same search from 0.94 s to 0.49 s.
@@ -133,7 +133,7 @@
133
133
  <div class="stat"><b>16</b><span>Shipped</span></div>
134
134
  <div class="stat"><b>1</b><span>Next up</span></div>
135
135
  <div class="stat"><b>7</b><span>Planned</span></div>
136
- <div class="stat"><b>260</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>262</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -6849,6 +6849,51 @@ was a comment. A comment cannot fail a build.</p>
6849
6849
  <span class="m">a comment in the sibling file predicted this exact failure</span>
6850
6850
  </div>
6851
6851
  </article>
6852
+
6853
+ <article class="cap rcard" id="cold-search-reads-the-whole-catalogue">
6854
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Performance · Search</span></div>
6855
+ <h3>A cold search materialises 71,600 entries to print five</h3>
6856
+ <p>Profiled cold <code>boost search</code> at real scale (458 taps, 71,600
6857
+ entries): 0.94 s, of which <b>0.32 s</b> is <code>catalog.all_entries()</code>
6858
+ parsing every tap cache on the machine (~100 MB of JSON) to build a
6859
+ <code>live</code> map whose entries are only <i>displayed</i> for the final k
6860
+ hits, <b>0.11 s</b> is <code>_passage</code> windowing a snippet for all
6861
+ 39,726 scored docs to show 60, and <b>0.12 s</b> is <code>dense.ready()</code>
6862
+ importing numpy via sqlite_vec just to answer "no vector store". BM25 scoring
6863
+ itself: 18 ms. The engine was fine; the packaging around it was the cost.<br><br>
6864
+ Shipped: <code>rag.retrieve(entries=None)</code> now ranks off the index's own
6865
+ doc metadata (name/hash/kind/length all live there already), runs the full
6866
+ ranked list through <code>dedupe_by_content</code> with shadow entries carrying
6867
+ the two fields <code>source_rank</code> reads, and materialises real entries
6868
+ for just the survivors' taps — with a <b>byte-identical-or-fall-back</b>
6869
+ contract: any survivor that fails to materialise reruns the query through the
6870
+ explicit-<code>entries</code> path (the eval-gate path, unchanged). Snippets
6871
+ window on returned hits only, on both paths; <code>dense.ready()</code> stats
6872
+ before importing; <code>_load_raw</code> keys its cache on
6873
+ <code>(mtime_ns, size)</code>. Measured after: <b>0.94 s → 0.49 s cold</b>.
6874
+ Complement of the shipped <i>cache-the-catalog-entry-set-across-rag-queries</i>
6875
+ (PR 114), which memoised <code>all_entries</code> per process — warm repeats
6876
+ were already amortised; this removes the cold-start read entirely.<br><br>
6877
+ Analysed and deliberately <b>deferred</b>: moving the per-doc
6878
+ <code>snip</code> out of <code>rag_index.json</code> into the postings SQLite.
6879
+ <i>bm25-index-is-one-json-blob</i> declined it at 743 entries (14% of the
6880
+ JSON); at 71.6k the premise inverts — snips are ~76% (46 MB → 11.4 MB slim,
6881
+ 103 ms → 37 ms parse) — but an adversarial design review found the v6→v7
6882
+ in-place migration can clobber a concurrently rebuilt pair without a
6883
+ build-id pairing token, and a mixed-version machine (pipx CLI + long-running
6884
+ MCP serve) thrashes full 71k-file reindexes across the version boundary.
6885
+ 66 ms does not buy that; if the recorded (tap, skill_md)-keyed postings
6886
+ follow-up ever lands, fold the snip move into that single format bump.
6887
+ Residual known cost: the "semantic search is off" hint imports the backend
6888
+ (~0.1 s) on machines with the extra installed but no store built — the one
6889
+ state where that line is the advice.</p>
6890
+ <div class="meta">
6891
+ <span class="m">Complexity <b>M</b></span>
6892
+ <span class="m hi">Impact <b>High</b></span>
6893
+ <span class="m">Wow <b class="wow">★★★★</b></span>
6894
+ <span class="m">0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use</span>
6895
+ </div>
6896
+ </article>
6852
6897
  <!-- /ROADMAP:cards -->
6853
6898
 
6854
6899
  </div>
@@ -8772,6 +8817,39 @@ fuzzy filter.</p>
8772
8817
  <span class="m">search rows learned kind/tap/installed with a stated drop order; browse got its gradient, an empty state, a badge rail, a list scrollbar and a session chip</span>
8773
8818
  </div>
8774
8819
  </article>
8820
+
8821
+ <article class="cap rcard" id="smart-rerank-pays-per-novel-query">
8822
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Performance · MCP</span></div>
8823
+ <h3>The smart rerank pays the LLM again for a search it already answered</h3>
8824
+ <p>The MCP <code>boost_search</code> path passes <code>smart=True</code> on every
8825
+ call and <i>mcp-search-cost-was-understated</i> measured it at 11.7-17.0 s —
8826
+ nearly all of it the LLM rerank, paid again in full for a byte-identical
8827
+ repeat of the previous search. Agents retry searches constantly (a session
8828
+ restart, a re-planned task, a second agent asking the same question), so the
8829
+ honest "10-15 seconds" cost doctrine was billing every ask at first-ask
8830
+ prices.<br><br>
8831
+ Shipped: <code>rag.rerank</code> keeps a small FIFO cache
8832
+ (<code>~/.boost/cache/rerank_cache.json</code>, 200 entries, registered in
8833
+ <code>paths.INTERNAL_CACHE_FILES</code> so <code>boost clean</code> spares
8834
+ it) keyed on a sha256 of <b>exactly what the LLM sees</b> — query, limit, and
8835
+ the candidate listing — so it self-invalidates on any reindex, ranking drift,
8836
+ or snippet change without inspecting why. Only the parsed name order is
8837
+ stored; a hit replays through the same deterministic reorder as a live reply
8838
+ and keeps the <code>Claude relevance</code> label, because it is the LLM's
8839
+ ordering. Degrade replies are never cached. <code>BOOST_NO_RERANK_CACHE=1</code>
8840
+ bypasses read and write — the Tier 2a eval sets it, so a graded rerank is
8841
+ always live. Both MCP cost surfaces (server instructions and the
8842
+ <code>boost_search</code> description) now state the repeat-search cost, pinned
8843
+ by the same agreement test that keeps them from drifting apart. Sibling of
8844
+ <i>cold-search-reads-the-whole-catalogue</i>, which took the retrieval half of
8845
+ the same search from 0.94 s to 0.49 s.</p>
8846
+ <div class="meta">
8847
+ <span class="m">Complexity <b>S</b></span>
8848
+ <span class="m hi">Impact <b>High</b></span>
8849
+ <span class="m">Wow <b class="wow">★★★</b></span>
8850
+ <span class="m">MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one</span>
8851
+ </div>
8852
+ </article>
8775
8853
  <!-- /ROADMAP:cards -->
8776
8854
 
8777
8855
  </div>
@@ -50,6 +50,7 @@ import argparse
50
50
  import hashlib
51
51
  import json
52
52
  import math
53
+ import os
53
54
  import sys
54
55
  from collections.abc import Callable, Iterable, Sequence
55
56
  from pathlib import Path
@@ -306,7 +307,12 @@ def hybrid_ranker(k: int) -> Ranker:
306
307
 
307
308
 
308
309
  def rerank_ranker(k: int) -> Ranker:
309
- """BM25 shortlist reordered by the LLM rerank stage (Tier 2a)."""
310
+ """BM25 shortlist reordered by the LLM rerank stage (Tier 2a).
311
+
312
+ The rerank cache is disabled for the whole run: a graded rerank must be
313
+ live, or the eval silently measures a stale cached order.
314
+ """
315
+ os.environ["BOOST_NO_RERANK_CACHE"] = "1"
310
316
  def rank(q: str) -> list[str]:
311
317
  hits = rag.retrieve(q, k=max(k * 4, 60))
312
318
  reranked, _label = rag.rerank(q, hits, limit=max(k, 15))