boost-skill-cli 1.2.15__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.15 → boost_skill_cli-1.2.16}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/configuration.py +3 -1
  4. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/mcp.py +2 -1
  5. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/paths.py +1 -0
  6. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/rag.py +73 -11
  7. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  8. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  9. boost_skill_cli-1.2.16/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +37 -0
  10. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap.html +34 -1
  11. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_retrieval.py +7 -1
  12. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_configuration.py +10 -2
  13. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_clean_internal_cache.py +1 -0
  14. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcp.py +5 -0
  15. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rag.py +7 -7
  16. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rag_fusion.py +7 -4
  17. boost_skill_cli-1.2.16/tests/unit/test_rerank_cache.py +128 -0
  18. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.gitattributes +0 -0
  19. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.gitignore +0 -0
  20. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.gitleaks.toml +0 -0
  21. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.htmlvalidate.json +0 -0
  22. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.lighthouserc.json +0 -0
  23. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.lycheeignore +0 -0
  24. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.markdownlint-cli2.jsonc +0 -0
  25. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.pre-commit-config.yaml +0 -0
  26. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.stylelintrc.json +0 -0
  27. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale/styles/boost/Terminology.yml +0 -0
  28. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  29. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale.ini +0 -0
  30. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/CLAUDE.md +0 -0
  31. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/CODE_OF_CONDUCT.md +0 -0
  32. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/CONTRIBUTING.md +0 -0
  33. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/LICENSE +0 -0
  34. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/MANIFEST.in +0 -0
  35. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/Makefile +0 -0
  36. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/README.md +0 -0
  37. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/SECURITY.md +0 -0
  38. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost +0 -0
  39. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/__init__.py +0 -0
  40. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/__main__.py +0 -0
  41. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/cli.py +0 -0
  42. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/cliparse.py +0 -0
  43. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/__init__.py +0 -0
  44. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/_common.py +0 -0
  45. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/bmad.py +0 -0
  46. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/discovery.py +0 -0
  47. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/hooks.py +0 -0
  48. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/info.py +0 -0
  49. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/intelligence.py +0 -0
  50. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/pkg.py +0 -0
  51. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/quality.py +0 -0
  52. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/run.py +0 -0
  53. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/safety.py +0 -0
  54. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/taps.py +0 -0
  55. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/team.py +0 -0
  56. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/__init__.py +0 -0
  57. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/adapters.py +0 -0
  58. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/agents.py +0 -0
  59. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/ai.py +0 -0
  60. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/bmad.py +0 -0
  61. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/bootstrap.py +0 -0
  62. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/browse.py +0 -0
  63. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/builtin.py +0 -0
  64. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/capabilities.py +0 -0
  65. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/catalog.py +0 -0
  66. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/catalogbundle.py +0 -0
  67. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/chat.py +0 -0
  68. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/claude_settings.py +0 -0
  69. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/complete.py +0 -0
  70. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/config.py +0 -0
  71. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/dense.py +0 -0
  72. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/ed25519.py +0 -0
  73. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/embed.py +0 -0
  74. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/faithfulness.py +0 -0
  75. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/frontmatter.py +0 -0
  76. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/gitutil.py +0 -0
  77. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/imperative.py +0 -0
  78. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/injectscan.py +0 -0
  79. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/installscan.py +0 -0
  80. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/integrity.py +0 -0
  81. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/journal.py +0 -0
  82. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/localembed.py +0 -0
  83. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/lockfile.py +0 -0
  84. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/logs.py +0 -0
  85. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/mcpdecl.py +0 -0
  86. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/mcphost.py +0 -0
  87. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/minisign.py +0 -0
  88. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/nethttp.py +0 -0
  89. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/output.py +0 -0
  90. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/policy.py +0 -0
  91. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/projectlock.py +0 -0
  92. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/provenance.py +0 -0
  93. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/registry.py +0 -0
  94. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/resolve.py +0 -0
  95. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/rules.py +0 -0
  96. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/scopes.py +0 -0
  97. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/secretscan.py +0 -0
  98. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/selfupdate.py +0 -0
  99. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/serve.py +0 -0
  100. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/stackprobe.py +0 -0
  101. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/staleness.py +0 -0
  102. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/store.py +0 -0
  103. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/trustaudit.py +0 -0
  104. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/typosquat.py +0 -0
  105. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/updatediff.py +0 -0
  106. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/util.py +0 -0
  107. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/workflows.py +0 -0
  108. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/data/registries.json +0 -0
  109. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/data/rules/boost-first.mdc +0 -0
  110. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/errors.py +0 -0
  111. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/spin.py +0 -0
  112. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/__init__.py +0 -0
  113. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/_compat.py +0 -0
  114. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/graph.py +0 -0
  115. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/loader.py +0 -0
  116. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/py.typed +0 -0
  117. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/retriever.py +0 -0
  118. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  119. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  120. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/requires.txt +0 -0
  121. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/top_level.txt +0 -0
  122. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/codecov.yml +0 -0
  123. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/.claude/settings.local.json +0 -0
  124. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/DEBUGGING.md +0 -0
  125. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/adapters.html +0 -0
  126. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/README.md +0 -0
  127. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-components-core.md +0 -0
  128. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-containers.md +0 -0
  129. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-context.md +0 -0
  130. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-dynamic-install.md +0 -0
  131. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/distill.gif +0 -0
  132. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/doctor.gif +0 -0
  133. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/explain.gif +0 -0
  134. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/hooks.gif +0 -0
  135. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/install.gif +0 -0
  136. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/pulse.gif +0 -0
  137. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/search.gif +0 -0
  138. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/tap.gif +0 -0
  139. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/distill.tape +0 -0
  140. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/doctor.tape +0 -0
  141. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/explain.tape +0 -0
  142. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/hooks.tape +0 -0
  143. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/install.tape +0 -0
  144. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/pulse.tape +0 -0
  145. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/search.tape +0 -0
  146. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/tap.tape +0 -0
  147. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel.html +0 -0
  148. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/chat.html +0 -0
  149. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/commands.html +0 -0
  150. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo-index.json +0 -0
  151. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo.gif +0 -0
  152. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo.html +0 -0
  153. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo.tape +0 -0
  154. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/design-roadmap.html +0 -0
  155. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/eval-latest.json +0 -0
  156. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/eval.html +0 -0
  157. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/index.html +0 -0
  158. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/langchain.html +0 -0
  159. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/mcp-hub.html +0 -0
  160. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/rag-architecture.md +0 -0
  161. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D01.md +0 -0
  162. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D02.md +0 -0
  163. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D03.md +0 -0
  164. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D04.md +0 -0
  165. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D05.md +0 -0
  166. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D06.md +0 -0
  167. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D07.md +0 -0
  168. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D08.md +0 -0
  169. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D09.md +0 -0
  170. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D10.md +0 -0
  171. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D11.md +0 -0
  172. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D12.md +0 -0
  173. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D13.md +0 -0
  174. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D14.md +0 -0
  175. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D15.md +0 -0
  176. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D16.md +0 -0
  177. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D17.md +0 -0
  178. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D18.md +0 -0
  179. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D19.md +0 -0
  180. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D20.md +0 -0
  181. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D21.md +0 -0
  182. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D22.md +0 -0
  183. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D23.md +0 -0
  184. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D24.md +0 -0
  185. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D25.md +0 -0
  186. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D26.md +0 -0
  187. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  188. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  189. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  190. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  191. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  192. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  193. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  194. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  195. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  196. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  197. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  198. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  199. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  200. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-rule.md +0 -0
  201. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  202. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  203. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  204. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  205. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  206. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  207. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  208. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  209. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  210. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  211. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  212. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  213. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  214. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  215. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  216. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  217. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  218. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  219. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  220. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-carousel-page.md +0 -0
  221. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  222. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  223. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  224. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  225. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  226. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  227. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  228. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  229. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  230. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  231. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  232. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  233. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  234. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  235. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  236. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  237. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  238. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  239. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  240. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  241. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  242. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  243. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  244. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  245. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  246. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  247. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  248. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  249. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  250. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  251. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  252. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  253. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  254. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  255. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  256. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  257. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  258. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  259. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  260. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  261. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  262. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  263. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  264. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  265. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  266. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  267. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-community-health-files.md +0 -0
  268. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  269. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  270. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  271. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  272. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  273. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  274. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  275. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  276. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  277. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  278. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  279. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  280. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  281. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  282. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  283. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  284. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  285. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  286. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  287. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  288. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  289. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  290. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  291. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  292. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  293. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  294. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  295. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  296. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  297. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  298. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  299. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  300. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  301. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  302. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  303. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  304. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  305. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  306. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  307. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  308. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  309. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  310. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  311. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  312. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  313. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  314. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  315. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  316. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  317. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  318. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  319. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  320. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  321. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  322. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  323. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  324. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  325. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  326. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  327. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  328. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  329. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  330. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  331. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  332. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  333. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  334. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  335. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  336. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  337. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  338. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  339. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  340. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  341. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  342. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  343. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  344. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  345. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  346. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  347. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  348. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  349. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  350. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  351. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  352. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  353. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  354. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  355. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  356. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  357. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  358. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  359. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  360. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  361. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  362. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  363. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  364. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  365. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  366. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  367. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  368. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  369. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  370. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  371. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  372. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  373. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  374. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  375. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  376. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  377. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  378. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  379. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  380. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  381. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  382. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  383. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  384. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  385. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  386. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  387. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  388. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  389. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  390. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  391. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  392. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  393. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  394. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  395. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  396. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  397. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  398. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  399. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  400. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  401. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  402. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  403. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  404. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  405. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  406. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  407. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  408. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  409. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  410. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  411. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  412. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  413. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  414. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  415. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  416. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  417. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  418. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  419. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  420. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  421. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  422. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  423. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  424. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  425. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  426. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  427. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  428. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  429. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  430. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  431. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  432. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  433. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  434. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  435. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  436. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  437. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  438. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  439. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  440. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  441. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  442. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  443. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  444. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workspace-scope-install.md +0 -0
  445. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/zip-strict-audit.md +0 -0
  446. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  447. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  448. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  449. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/eslint.config.mjs +0 -0
  450. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/README.md +0 -0
  451. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/__init__.py +0 -0
  452. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/baseline.json +0 -0
  453. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/faithfulness.py +0 -0
  454. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/golden_set.json +0 -0
  455. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/make_corpus.py +0 -0
  456. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/make_golden.py +0 -0
  457. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/metrics.py +0 -0
  458. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/publish_golden_dataset.py +0 -0
  459. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/run_evals.py +0 -0
  460. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/examples/README.md +0 -0
  461. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/examples/adapt-demo.sh +0 -0
  462. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/examples/boost-run-prototype.sh +0 -0
  463. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/index.html +0 -0
  464. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/noxfile.py +0 -0
  465. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/pyproject.toml +0 -0
  466. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/coverage-tools.in +0 -0
  467. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/coverage-tools.txt +0 -0
  468. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/lint-tools.in +0 -0
  469. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/lint-tools.txt +0 -0
  470. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/mutation-tools.in +0 -0
  471. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/mutation-tools.txt +0 -0
  472. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/platform-pins.lock +0 -0
  473. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/release-tools.in +0 -0
  474. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/release-tools.txt +0 -0
  475. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/test-tools.in +0 -0
  476. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/test-tools.txt +0 -0
  477. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/a11y_check.py +0 -0
  478. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/bench_cli.sh +0 -0
  479. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_command_reference.py +0 -0
  480. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_demo_index.py +0 -0
  481. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_registries.py +0 -0
  482. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_roadmap.py +0 -0
  483. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_scale_corpus.py +0 -0
  484. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/check_anchors.py +0 -0
  485. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/check_licenses.py +0 -0
  486. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/check_required_checks.py +0 -0
  487. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/ensure_eval_corpus.sh +0 -0
  488. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_corpus.py +0 -0
  489. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_explain.py +0 -0
  490. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_gate.py +0 -0
  491. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_recommend.py +0 -0
  492. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_stats_summary.py +0 -0
  493. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/import_budget.py +0 -0
  494. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/lock_toolchain.py +0 -0
  495. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/measure_registry.py +0 -0
  496. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/mutation_gate.py +0 -0
  497. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/mutation_shards.py +0 -0
  498. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/mutation_weights.json +0 -0
  499. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/page_budget.py +0 -0
  500. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/perf_gate.py +0 -0
  501. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/post_deploy_smoke.py +0 -0
  502. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/publish_eval_json.py +0 -0
  503. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/release_guard.py +0 -0
  504. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/release_preflight.py +0 -0
  505. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/serve_docs.py +0 -0
  506. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/setup.cfg +0 -0
  507. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/sonar-project.properties +0 -0
  508. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/README.md +0 -0
  509. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/boost.css +0 -0
  510. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/boost.js +0 -0
  511. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/demo.html +0 -0
  512. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/adapt.feature +0 -0
  513. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/browse.feature +0 -0
  514. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/count.feature +0 -0
  515. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/discover.feature +0 -0
  516. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/doctor.feature +0 -0
  517. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/environment.py +0 -0
  518. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/explain.feature +0 -0
  519. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/index.feature +0 -0
  520. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/install.feature +0 -0
  521. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/list.feature +0 -0
  522. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/mcp.feature +0 -0
  523. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/search.feature +0 -0
  524. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/cli_steps.py +0 -0
  525. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/discovery_steps.py +0 -0
  526. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/mcp_steps.py +0 -0
  527. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/quality_steps.py +0 -0
  528. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/conftest.py +0 -0
  529. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/baseline.json +0 -0
  530. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/explain.jsonl +0 -0
  531. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/golden-natural.jsonl +0 -0
  532. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/golden.jsonl +0 -0
  533. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/recommend.jsonl +0 -0
  534. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/taps-scale.txt +0 -0
  535. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/taps.txt +0 -0
  536. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_capabilities_policy.py +0 -0
  537. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_adapt.py +0 -0
  538. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_bmad.py +0 -0
  539. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_catalog.py +0 -0
  540. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_chat.py +0 -0
  541. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_discovery.py +0 -0
  542. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_hooks.py +0 -0
  543. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_info.py +0 -0
  544. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_intelligence.py +0 -0
  545. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_pkg.py +0 -0
  546. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_quality.py +0 -0
  547. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_taps.py +0 -0
  548. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_team.py +0 -0
  549. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_everyday_loop.py +0 -0
  550. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_integrity_enforce.py +0 -0
  551. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_kind_conformance.py +0 -0
  552. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_property_parsers.py +0 -0
  553. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_run.py +0 -0
  554. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_tap_signing.py +0 -0
  555. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_workspace_scope.py +0 -0
  556. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/README.md +0 -0
  557. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  558. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  559. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  560. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  561. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  562. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  563. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  564. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  565. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  566. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  567. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  568. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  569. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  570. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  571. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  572. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  573. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  574. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  575. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  576. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  577. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  578. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  579. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  580. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_frontmatter.py +0 -0
  581. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_registry.py +0 -0
  582. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/conftest.py +0 -0
  583. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/test_graph.py +0 -0
  584. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/test_loader.py +0 -0
  585. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/test_retriever.py +0 -0
  586. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/make_fixture.py +0 -0
  587. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/perf/test_benchmarks.py +0 -0
  588. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/smoke.sh +0 -0
  589. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_a11y_check.py +0 -0
  590. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_action_pin_lockstep.py +0 -0
  591. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_adapters.py +0 -0
  592. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_multi.py +0 -0
  593. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_runner.py +0 -0
  594. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_agents.py +0 -0
  595. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_ai.py +0 -0
  596. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_bmad_core.py +0 -0
  597. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_boost_first_offer.py +0 -0
  598. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_bootstrap.py +0 -0
  599. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_browse.py +0 -0
  600. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_builtin.py +0 -0
  601. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_capabilities.py +0 -0
  602. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_catalog.py +0 -0
  603. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_catalogbundle.py +0 -0
  604. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_chat.py +0 -0
  605. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_check_anchors.py +0 -0
  606. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_check_licenses.py +0 -0
  607. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_claude_settings.py +0 -0
  608. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_cliparse.py +0 -0
  609. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_codeql_analysis_key.py +0 -0
  610. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_command_reference_fresh.py +0 -0
  611. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_community_health_files.py +0 -0
  612. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_compact.py +0 -0
  613. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_complete.py +0 -0
  614. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_complete_rc_block.py +0 -0
  615. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_config.py +0 -0
  616. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_content_dedupe.py +0 -0
  617. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_content_identity.py +0 -0
  618. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_crash_redaction.py +0 -0
  619. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dedup_trust.py +0 -0
  620. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_demo_index.py +0 -0
  621. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense.py +0 -0
  622. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_embed_dedupe.py +0 -0
  623. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fallback.py +0 -0
  624. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fix_hint.py +0 -0
  625. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_ready_order.py +0 -0
  626. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_real_schema.py +0 -0
  627. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  628. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shards.py +0 -0
  629. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_status.py +0 -0
  630. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dependabot_config.py +0 -0
  631. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_docs_pages_linked.py +0 -0
  632. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_docsite_chrome.py +0 -0
  633. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_ed25519.py +0 -0
  634. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_embed.py +0 -0
  635. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_embed_local.py +0 -0
  636. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_embed_truncated_response.py +0 -0
  637. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_entry_key.py +0 -0
  638. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_errors_and_cli_table.py +0 -0
  639. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_baseline.py +0 -0
  640. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_corpus.py +0 -0
  641. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_faithfulness.py +0 -0
  642. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_gate.py +0 -0
  643. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_grading.py +0 -0
  644. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_metrics.py +0 -0
  645. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_stats_summary.py +0 -0
  646. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  647. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_faithfulness.py +0 -0
  648. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_frontmatter.py +0 -0
  649. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_fuzz_targets.py +0 -0
  650. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  651. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitleaks_config.py +0 -0
  652. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil.py +0 -0
  653. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_lfs.py +0 -0
  654. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_sparse.py +0 -0
  655. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_imperative.py +0 -0
  656. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_import_budget.py +0 -0
  657. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_injectscan.py +0 -0
  658. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_install_permission_error.py +0 -0
  659. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_installscan.py +0 -0
  660. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_integrity.py +0 -0
  661. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_journal.py +0 -0
  662. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_langchain_packaging.py +0 -0
  663. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_link_ownership.py +0 -0
  664. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_localembed.py +0 -0
  665. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_localembed_e2e.py +0 -0
  666. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_lockfile.py +0 -0
  667. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_logs.py +0 -0
  668. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_marketing_counts.py +0 -0
  669. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcp_install_scan.py +0 -0
  670. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcpdecl.py +0 -0
  671. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcphost.py +0 -0
  672. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_measure_registry.py +0 -0
  673. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_minisign.py +0 -0
  674. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_hardening.py +0 -0
  675. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_shards.py +0 -0
  676. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_subfile_shards.py +0 -0
  677. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutmut_source_paths.py +0 -0
  678. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_nethttp.py +0 -0
  679. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_output.py +0 -0
  680. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_page_budget.py +0 -0
  681. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_paths.py +0 -0
  682. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_perf_gate.py +0 -0
  683. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_confusions.py +0 -0
  684. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_injection.py +0 -0
  685. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_secrets.py +0 -0
  686. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_platform_pins.py +0 -0
  687. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_policy.py +0 -0
  688. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_post_deploy_smoke.py +0 -0
  689. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_project_mcp_sidecar.py +0 -0
  690. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_projectlock.py +0 -0
  691. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_provenance.py +0 -0
  692. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_publish_golden_dataset.py +0 -0
  693. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rag_fastpath.py +0 -0
  694. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registries_fresh.py +0 -0
  695. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registry.py +0 -0
  696. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registry_categories.py +0 -0
  697. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registry_control_chars.py +0 -0
  698. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_release_guard.py +0 -0
  699. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_release_preflight.py +0 -0
  700. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_required_checks.py +0 -0
  701. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_resolve.py +0 -0
  702. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_roadmap_fresh.py +0 -0
  703. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rules.py +0 -0
  704. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_scale_corpus.py +0 -0
  705. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_scopes.py +0 -0
  706. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_secretscan.py +0 -0
  707. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_selfupdate.py +0 -0
  708. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_serve.py +0 -0
  709. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_serve_docs.py +0 -0
  710. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_shards_matrix.py +0 -0
  711. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_smoke_covers_every_command.py +0 -0
  712. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_spin.py +0 -0
  713. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_stackprobe.py +0 -0
  714. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_staleness.py +0 -0
  715. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_store.py +0 -0
  716. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_store_materialize.py +0 -0
  717. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_sync_blocked_links.py +0 -0
  718. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  719. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_token_parity.py +0 -0
  720. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_toolchain_lock.py +0 -0
  721. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_trustaudit.py +0 -0
  722. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_typosquat.py +0 -0
  723. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_updatediff.py +0 -0
  724. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_util.py +0 -0
  725. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_version.py +0 -0
  726. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_visual_harness_flags.py +0 -0
  727. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency.py +0 -0
  728. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  729. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  730. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_timeouts.py +0 -0
  731. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflows.py +0 -0
  732. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  733. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/a11y_check.mjs +0 -0
  734. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/console_check.mjs +0 -0
  735. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/package-lock.json +0 -0
  736. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/package.json +0 -0
  737. {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.15
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.15'
22
- __version_tuple__ = version_tuple = (1, 2, 15)
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.",
@@ -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
@@ -841,6 +842,49 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
841
842
  return _windowed(dedupe_by_content(hits, k), terms)
842
843
 
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))
886
+
887
+
844
888
  #: The label `rerank` returns when the LLM pass actually ran. Every other value
845
889
  #: is a retrieval engine's own name, i.e. "the rerank did not happen". Callers
846
890
  #: that quote what the rerank buys have to be able to tell those apart without
@@ -860,6 +904,15 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
860
904
  answered, so a confident "BM25 full-content" sent debugging somewhere else.
861
905
 
862
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).
863
916
  """
864
917
  top = hits[:max(limit, 15)]
865
918
  if not ai.available():
@@ -868,17 +921,26 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
868
921
  "- %s [%s]: %s" % (h["entry"]["name"], h["entry"].get("kind", "skill"),
869
922
  (h["snippet"] or h["entry"].get("description", ""))[:180])
870
923
  for h in top)
871
- reply = ai.ask(
872
- "Task: %s\n\nCandidate skills (name, kind, best matching text):\n%s\n\n"
873
- "Order the skill names best-match-first for the task. "
874
- "Reply with ONLY a JSON array of names." % (query, listing),
875
- system="You rank AI coding skills by how well they fit a task.",
876
- max_tokens=400)
877
- order = _json_array(reply)
878
- if not order:
879
- # The model answered but not with a JSON array, so the ordering falls
880
- # back to whatever retrieval produced — and so must the label.
881
- 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])
882
944
  by_name = {h["entry"]["name"]: h for h in hits}
883
945
  picked = [by_name[str(n)] for n in order if str(n) in by_name]
884
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.15
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
@@ -400,6 +400,7 @@ docs/roadmap/items/shareable-catalogue-bundle.md
400
400
  docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
401
401
  docs/roadmap/items/single-imperative-rule-extractor.md
402
402
  docs/roadmap/items/single-tech-stack-prober.md
403
+ docs/roadmap/items/smart-rerank-pays-per-novel-query.md
403
404
  docs/roadmap/items/split-oversized-command-modules.md
404
405
  docs/roadmap/items/startup-and-import-time-budget-x-importtime.md
405
406
  docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md
@@ -695,6 +696,7 @@ tests/unit/test_registry_control_chars.py
695
696
  tests/unit/test_release_guard.py
696
697
  tests/unit/test_release_preflight.py
697
698
  tests/unit/test_required_checks.py
699
+ tests/unit/test_rerank_cache.py
698
700
  tests/unit/test_resolve.py
699
701
  tests/unit/test_roadmap_fresh.py
700
702
  tests/unit/test_rules.py
@@ -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>261</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>
@@ -8817,6 +8817,39 @@ fuzzy filter.</p>
8817
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>
8818
8818
  </div>
8819
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>
8820
8853
  <!-- /ROADMAP:cards -->
8821
8854
 
8822
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))
@@ -1887,7 +1887,7 @@ class TestSearchNamesItsRanker:
1887
1887
  assert "did NOT run" not in text
1888
1888
 
1889
1889
  def test_rerank_returns_that_label_only_when_the_llm_answered(
1890
- self, monkeypatch):
1890
+ self, monkeypatch, sandbox):
1891
1891
  """The producer and the consumer of the label must agree.
1892
1892
 
1893
1893
  `rag.LLM_RANKER` exists so this is impossible to drift rather than
@@ -1910,8 +1910,16 @@ class TestSearchNamesItsRanker:
1910
1910
  assert label == rag.LLM_RANKER
1911
1911
  assert [h["entry"]["name"] for h in order] == ["a", "b"]
1912
1912
 
1913
+ # Repeating the SAME query now answers from the rerank cache: the
1914
+ # order is still the LLM's, so the label stays with it — no new ask.
1915
+ monkeypatch.setattr(ai, "ask",
1916
+ lambda *a, **k: pytest.fail("cache must answer"))
1917
+ assert rag.rerank("q", hits, engine="BM25 full-content")[1] == \
1918
+ rag.LLM_RANKER
1919
+
1913
1920
  # The model replied, but not with an order — the label must fall back
1914
1921
  # with the ordering, or it claims a rerank that did not take effect.
1922
+ # A fresh query, so the cache cannot answer for the degraded model.
1915
1923
  monkeypatch.setattr(ai, "ask", lambda *a, **k: "sorry, I cannot")
1916
- assert rag.rerank("q", hits, engine="BM25 full-content")[1] == \
1924
+ assert rag.rerank("q2", hits, engine="BM25 full-content")[1] == \
1917
1925
  "BM25 full-content"
@@ -86,6 +86,7 @@ class TestInternalCacheRegistryHasNoDrift:
86
86
  owners = {
87
87
  "rag.index_path": rag.index_path,
88
88
  "rag.postings_path": rag.postings_path,
89
+ "rag.rerank_cache_path": rag.rerank_cache_path,
89
90
  "dense.db_path": dense.db_path,
90
91
  "discovery._discovery_path": discovery._discovery_path,
91
92
  "complete.names_file": complete.names_file,
@@ -198,6 +198,11 @@ class TestHandleRequest:
198
198
  assert "10-15 seconds" in mcp.INSTRUCTIONS
199
199
  assert "10-15 seconds" in desc["boost_search"]
200
200
  assert "a few seconds" not in mcp.INSTRUCTIONS.lower()
201
+ # The repeat-search cost claim is backed by rag's rerank cache; both
202
+ # surfaces must state it, or an agent budgets 15 s for a lookup that
203
+ # would have been free.
204
+ assert "answers from a local cache" in mcp.INSTRUCTIONS
205
+ assert "answers from a local cache" in desc["boost_search"]
201
206
 
202
207
  def test_instructions_still_separate_the_free_tool_from_the_slow_one(self):
203
208
  # boost_list really is instant, and collapsing the two costs into one
@@ -523,14 +523,14 @@ def _hit(name, score, snippet="s", kind="skill", desc="d"):
523
523
 
524
524
 
525
525
  class TestRerank:
526
- def test_no_ai_returns_bm25_order(self, monkeypatch):
526
+ def test_no_ai_returns_bm25_order(self, monkeypatch, sandbox):
527
527
  monkeypatch.setattr(rag.ai, "available", lambda: False)
528
528
  hits = [_hit("a", 2.0), _hit("b", 1.0)]
529
529
  out, label = rag.rerank("q", hits, limit=5)
530
530
  assert [h["entry"]["name"] for h in out] == ["a", "b"]
531
531
  assert label == "BM25 full-content"
532
532
 
533
- def test_ai_reorders(self, monkeypatch):
533
+ def test_ai_reorders(self, monkeypatch, sandbox):
534
534
  monkeypatch.setattr(rag.ai, "available", lambda: True)
535
535
  monkeypatch.setattr(rag.ai, "ask", lambda *a, **k: '["b", "a"]')
536
536
  hits = [_hit("a", 2.0), _hit("b", 1.0)]
@@ -538,14 +538,14 @@ class TestRerank:
538
538
  assert [h["entry"]["name"] for h in out] == ["b", "a"]
539
539
  assert label == "Claude relevance"
540
540
 
541
- def test_ai_partial_order_appends_rest(self, monkeypatch):
541
+ def test_ai_partial_order_appends_rest(self, monkeypatch, sandbox):
542
542
  monkeypatch.setattr(rag.ai, "available", lambda: True)
543
543
  monkeypatch.setattr(rag.ai, "ask", lambda *a, **k: '["b"]')
544
544
  hits = [_hit("a", 2.0), _hit("b", 1.0)]
545
545
  out, _label = rag.rerank("q", hits, limit=5)
546
546
  assert [h["entry"]["name"] for h in out] == ["b", "a"]
547
547
 
548
- def test_ai_garbage_reply_degrades(self, monkeypatch):
548
+ def test_ai_garbage_reply_degrades(self, monkeypatch, sandbox):
549
549
  monkeypatch.setattr(rag.ai, "available", lambda: True)
550
550
  monkeypatch.setattr(rag.ai, "ask", lambda *a, **k: "no json here")
551
551
  hits = [_hit("a", 2.0), _hit("b", 1.0)]
@@ -553,13 +553,13 @@ class TestRerank:
553
553
  assert [h["entry"]["name"] for h in out] == ["a", "b"]
554
554
  assert label == "BM25 full-content"
555
555
 
556
- def test_limit_truncates(self, monkeypatch):
556
+ def test_limit_truncates(self, monkeypatch, sandbox):
557
557
  monkeypatch.setattr(rag.ai, "available", lambda: False)
558
558
  hits = [_hit("a", 3.0), _hit("b", 2.0), _hit("c", 1.0)]
559
559
  out, _ = rag.rerank("q", hits, limit=2)
560
560
  assert len(out) == 2
561
561
 
562
- def test_prompt_carries_task_and_candidate_snippets(self, monkeypatch):
562
+ def test_prompt_carries_task_and_candidate_snippets(self, monkeypatch, sandbox):
563
563
  captured = {}
564
564
  monkeypatch.setattr(rag.ai, "available", lambda: True)
565
565
 
@@ -1100,7 +1100,7 @@ class TestRetrieveInternals:
1100
1100
 
1101
1101
 
1102
1102
  class TestRerankExact:
1103
- def test_exact_prompt_and_kwargs(self, monkeypatch):
1103
+ def test_exact_prompt_and_kwargs(self, monkeypatch, sandbox):
1104
1104
  cap = {}
1105
1105
  monkeypatch.setattr(rag.ai, "available", lambda: True)
1106
1106
 
@@ -230,7 +230,8 @@ class TestRerankPreservesTheEngineLabel:
230
230
  def _hits():
231
231
  return [_hit("a", 2.0), _hit("b", 1.0)]
232
232
 
233
- def test_no_ai_reports_the_engine_that_retrieved(self, monkeypatch):
233
+ def test_no_ai_reports_the_engine_that_retrieved(self, monkeypatch,
234
+ sandbox):
234
235
  # THE regression. Fusion ran, the LLM was absent, and the old code
235
236
  # answered "BM25 full-content" — naming an engine that did not rank
236
237
  # these hits alone.
@@ -239,14 +240,16 @@ class TestRerankPreservesTheEngineLabel:
239
240
  engine="hybrid RRF (BM25 + dense)")
240
241
  assert label == "hybrid RRF (BM25 + dense)"
241
242
 
242
- def test_no_ai_reports_dense_when_dense_retrieved(self, monkeypatch):
243
+ def test_no_ai_reports_dense_when_dense_retrieved(self, monkeypatch,
244
+ sandbox):
243
245
  monkeypatch.setattr(rag.ai, "available", lambda: True)
244
246
  monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: "not json at all")
245
247
  _out, label = rag.rerank("q", self._hits(), limit=5,
246
248
  engine="dense vectors")
247
249
  assert label == "dense vectors"
248
250
 
249
- def test_an_unparseable_reply_keeps_the_engine_too(self, monkeypatch):
251
+ def test_an_unparseable_reply_keeps_the_engine_too(self, monkeypatch,
252
+ sandbox):
250
253
  # The second degrade path: the model answered, but not with a JSON
251
254
  # array. Ordering falls back, so the label must fall back with it.
252
255
  monkeypatch.setattr(rag.ai, "available", lambda: True)
@@ -255,7 +258,7 @@ class TestRerankPreservesTheEngineLabel:
255
258
  engine="hybrid RRF (BM25 + dense)")
256
259
  assert label == "hybrid RRF (BM25 + dense)"
257
260
 
258
- def test_a_successful_rerank_still_says_claude(self, monkeypatch):
261
+ def test_a_successful_rerank_still_says_claude(self, monkeypatch, sandbox):
259
262
  # The LLM really did decide the order here, so crediting the retrieval
260
263
  # engine instead would be the same bug pointing the other way.
261
264
  monkeypatch.setattr(rag.ai, "available", lambda: True)
@@ -0,0 +1,128 @@
1
+ """The LLM rerank cache: repeat searches must not pay the LLM again.
2
+
3
+ The MCP `boost_search` path passes ``smart=True`` on every call and measured
4
+ 11.7-17 s per search, nearly all of it the rerank. The cache keys on a hash of
5
+ *exactly what the LLM sees* (query, limit, candidate listing), so it
6
+ self-invalidates on any reindex, ranking change, snippet change or candidate
7
+ drift — and stores only the parsed name order, so a hit replays through the
8
+ same deterministic reorder code as a live reply.
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import json
13
+
14
+ import pytest
15
+
16
+ from boost_cli.core import ai, paths, rag
17
+
18
+
19
+ def _hit(name, score, snippet=""):
20
+ return {"entry": {"name": name, "tap": "acme/skills",
21
+ "skill_md": "%s/SKILL.md" % name},
22
+ "score": score, "snippet": snippet, "content": "h-" + name}
23
+
24
+
25
+ @pytest.fixture()
26
+ def asked(monkeypatch, sandbox):
27
+ """AI available; every ask recorded. Returns the call log."""
28
+ calls: list[str] = []
29
+
30
+ def fake_ask(prompt, *a, **k):
31
+ calls.append(prompt)
32
+ return '["beta", "alpha"]'
33
+
34
+ monkeypatch.setattr(ai, "available", lambda: True)
35
+ monkeypatch.setattr(ai, "ask", fake_ask)
36
+ return calls
37
+
38
+
39
+ HITS = [_hit("alpha", 2.0, "alpha snippet"), _hit("beta", 1.0, "beta snippet")]
40
+
41
+
42
+ class TestCacheHit:
43
+ def test_identical_rerank_answers_from_cache(self, asked):
44
+ first, label1 = rag.rerank("find the widget", list(HITS))
45
+ again, label2 = rag.rerank("find the widget", list(HITS))
46
+ assert len(asked) == 1 # one LLM call, not two
47
+ assert label1 == label2 == rag.LLM_RANKER # a hit IS the LLM's order
48
+ assert first == again
49
+ assert [h["entry"]["name"] for h in again][:2] == ["beta", "alpha"]
50
+
51
+ def test_cached_order_applies_to_the_hits_passed_now(self, asked):
52
+ """The cache stores the ORDER, not the hits: scores sit outside the
53
+ candidate listing, so rescored hits still key to the same entry and
54
+ get the cached order applied to their fresh values."""
55
+ rag.rerank("find the widget", list(HITS))
56
+ rescored = [_hit("alpha", 9.9, "alpha snippet"),
57
+ _hit("beta", 8.8, "beta snippet")]
58
+ again, _ = rag.rerank("find the widget", rescored)
59
+ assert len(asked) == 1
60
+ assert [h["entry"]["name"] for h in again][:2] == ["beta", "alpha"]
61
+ assert again[0]["score"] == 8.8 # fresh hit, cached order
62
+
63
+
64
+ class TestCacheKey:
65
+ def test_a_different_query_misses(self, asked):
66
+ rag.rerank("find the widget", list(HITS))
67
+ rag.rerank("find the gadget", list(HITS))
68
+ assert len(asked) == 2
69
+
70
+ def test_a_different_candidate_listing_misses(self, asked):
71
+ rag.rerank("find the widget", list(HITS))
72
+ changed = [_hit("alpha", 2.0, "reworded snippet"), HITS[1]]
73
+ rag.rerank("find the widget", changed)
74
+ assert len(asked) == 2
75
+
76
+ def test_a_different_limit_misses(self, asked):
77
+ rag.rerank("find the widget", list(HITS), limit=10)
78
+ rag.rerank("find the widget", list(HITS), limit=5)
79
+ assert len(asked) == 2
80
+
81
+
82
+ class TestDegradation:
83
+ def test_a_non_array_reply_is_not_cached(self, asked, monkeypatch):
84
+ monkeypatch.setattr(ai, "ask", lambda *a, **k: (asked.append("x"),
85
+ "no json here")[1])
86
+ _hits, label = rag.rerank("q", list(HITS), engine="BM25 full-content")
87
+ assert label == "BM25 full-content" # degrade, as today
88
+ rag.rerank("q", list(HITS))
89
+ assert len(asked) == 2 # second call asks again
90
+
91
+ def test_no_ai_means_no_cache_file(self, sandbox, monkeypatch):
92
+ monkeypatch.setattr(ai, "available", lambda: False)
93
+ _hits, label = rag.rerank("q", list(HITS), engine="dense vectors")
94
+ assert label == "dense vectors"
95
+ assert not rag.rerank_cache_path().exists()
96
+
97
+ def test_corrupt_cache_file_degrades_and_heals(self, asked):
98
+ paths.ensure_dirs()
99
+ rag.rerank_cache_path().write_text("not json{", encoding="utf-8")
100
+ rag.rerank("find the widget", list(HITS))
101
+ assert len(asked) == 1 # worked, asked live
102
+ data = json.loads(rag.rerank_cache_path().read_text(encoding="utf-8"))
103
+ assert len(data) == 1 # rewritten valid
104
+
105
+ def test_kill_switch_bypasses_read_and_write(self, asked, monkeypatch):
106
+ monkeypatch.setenv("BOOST_NO_RERANK_CACHE", "1")
107
+ rag.rerank("find the widget", list(HITS))
108
+ rag.rerank("find the widget", list(HITS))
109
+ assert len(asked) == 2
110
+ assert not rag.rerank_cache_path().exists()
111
+
112
+
113
+ class TestEviction:
114
+ def test_cache_is_capped_fifo(self, asked, monkeypatch):
115
+ monkeypatch.setattr(rag, "RERANK_CACHE_CAP", 3)
116
+ for q in ("q1", "q2", "q3", "q4"):
117
+ rag.rerank(q, list(HITS))
118
+ data = json.loads(rag.rerank_cache_path().read_text(encoding="utf-8"))
119
+ assert len(data) == 3 # capped
120
+ rag.rerank("q4", list(HITS))
121
+ assert len(asked) == 4 # newest still cached
122
+ rag.rerank("q1", list(HITS))
123
+ assert len(asked) == 5 # oldest was evicted
124
+
125
+
126
+ class TestRegistration:
127
+ def test_registered_so_boost_clean_spares_it(self):
128
+ assert rag.rerank_cache_path().name in paths.INTERNAL_CACHE_FILES
File without changes