boost-skill-cli 1.0.337__tar.gz → 1.0.339__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 (580) hide show
  1. {boost_skill_cli-1.0.337/boost_skill_cli.egg-info → boost_skill_cli-1.0.339}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/rag.py +20 -5
  4. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  6. boost_skill_cli-1.0.339/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +49 -0
  7. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap.html +46 -1
  8. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/pyproject.toml +6 -0
  9. boost_skill_cli-1.0.339/tests/unit/test_localembed_e2e.py +170 -0
  10. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_rag.py +8 -3
  11. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_rag_fusion.py +92 -0
  12. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.gitattributes +0 -0
  13. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.gitignore +0 -0
  14. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.gitleaks.toml +0 -0
  15. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.htmlvalidate.json +0 -0
  16. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.lighthouserc.json +0 -0
  17. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.lycheeignore +0 -0
  18. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.markdownlint-cli2.jsonc +0 -0
  19. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.pre-commit-config.yaml +0 -0
  20. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.stylelintrc.json +0 -0
  21. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.vale/styles/boost/Terminology.yml +0 -0
  22. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  23. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.vale.ini +0 -0
  24. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/CLAUDE.md +0 -0
  25. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/CODE_OF_CONDUCT.md +0 -0
  26. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/LICENSE +0 -0
  28. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/Makefile +0 -0
  30. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/README.md +0 -0
  31. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/SECURITY.md +0 -0
  32. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost +0 -0
  33. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/__init__.py +0 -0
  34. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/__main__.py +0 -0
  35. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/cli.py +0 -0
  36. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/cliparse.py +0 -0
  37. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/__init__.py +0 -0
  38. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/_common.py +0 -0
  39. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/bmad.py +0 -0
  40. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/configuration.py +0 -0
  41. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/discovery.py +0 -0
  42. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/hooks.py +0 -0
  43. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/info.py +0 -0
  44. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/intelligence.py +0 -0
  45. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/pkg.py +0 -0
  46. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/quality.py +0 -0
  47. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/run.py +0 -0
  48. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/safety.py +0 -0
  49. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/taps.py +0 -0
  50. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/team.py +0 -0
  51. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/__init__.py +0 -0
  52. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/adapters.py +0 -0
  53. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/agents.py +0 -0
  54. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/ai.py +0 -0
  55. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/capabilities.py +0 -0
  56. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/catalog.py +0 -0
  57. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/claude_settings.py +0 -0
  58. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/config.py +0 -0
  59. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/dense.py +0 -0
  60. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/ed25519.py +0 -0
  61. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/embed.py +0 -0
  62. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/faithfulness.py +0 -0
  63. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/frontmatter.py +0 -0
  64. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/gitutil.py +0 -0
  65. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/imperative.py +0 -0
  66. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/injectscan.py +0 -0
  67. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/installscan.py +0 -0
  68. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/integrity.py +0 -0
  69. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/journal.py +0 -0
  70. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/localembed.py +0 -0
  71. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/lockfile.py +0 -0
  72. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/logs.py +0 -0
  73. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/mcp.py +0 -0
  74. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/mcpdecl.py +0 -0
  75. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/mcphost.py +0 -0
  76. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/minisign.py +0 -0
  77. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/nethttp.py +0 -0
  78. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/output.py +0 -0
  79. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/paths.py +0 -0
  80. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/policy.py +0 -0
  81. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/projectlock.py +0 -0
  82. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/provenance.py +0 -0
  83. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/registry.py +0 -0
  84. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/resolve.py +0 -0
  85. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/rules.py +0 -0
  86. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/scopes.py +0 -0
  87. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/secretscan.py +0 -0
  88. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/selfupdate.py +0 -0
  89. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/serve.py +0 -0
  90. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/stackprobe.py +0 -0
  91. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/staleness.py +0 -0
  92. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/store.py +0 -0
  93. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/trustaudit.py +0 -0
  94. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/typosquat.py +0 -0
  95. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/updatediff.py +0 -0
  96. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/util.py +0 -0
  97. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/workflows.py +0 -0
  98. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/data/registries.json +0 -0
  99. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/errors.py +0 -0
  100. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/spin.py +0 -0
  101. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  102. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  103. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/requires.txt +0 -0
  104. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/top_level.txt +0 -0
  105. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/codecov.yml +0 -0
  106. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/.claude/settings.local.json +0 -0
  107. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/DEBUGGING.md +0 -0
  108. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/adapters.html +0 -0
  109. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/README.md +0 -0
  110. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-components-core.md +0 -0
  111. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-containers.md +0 -0
  112. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-context.md +0 -0
  113. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-dynamic-install.md +0 -0
  114. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/distill.gif +0 -0
  115. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/doctor.gif +0 -0
  116. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/explain.gif +0 -0
  117. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/hooks.gif +0 -0
  118. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/install.gif +0 -0
  119. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/pulse.gif +0 -0
  120. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/search.gif +0 -0
  121. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/tap.gif +0 -0
  122. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/distill.tape +0 -0
  123. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/doctor.tape +0 -0
  124. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/explain.tape +0 -0
  125. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/hooks.tape +0 -0
  126. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/install.tape +0 -0
  127. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/pulse.tape +0 -0
  128. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/search.tape +0 -0
  129. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/tap.tape +0 -0
  130. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel.html +0 -0
  131. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/commands.html +0 -0
  132. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/demo.gif +0 -0
  133. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/demo.tape +0 -0
  134. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/design-roadmap.html +0 -0
  135. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/eval.html +0 -0
  136. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/index.html +0 -0
  137. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/mcp-hub.html +0 -0
  138. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/rag-architecture.md +0 -0
  139. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D01.md +0 -0
  140. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D02.md +0 -0
  141. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D03.md +0 -0
  142. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D04.md +0 -0
  143. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D05.md +0 -0
  144. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D06.md +0 -0
  145. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D07.md +0 -0
  146. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D08.md +0 -0
  147. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D09.md +0 -0
  148. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D10.md +0 -0
  149. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D11.md +0 -0
  150. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D12.md +0 -0
  151. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D13.md +0 -0
  152. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D14.md +0 -0
  153. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D15.md +0 -0
  154. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D16.md +0 -0
  155. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D17.md +0 -0
  156. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D18.md +0 -0
  157. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D19.md +0 -0
  158. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D20.md +0 -0
  159. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D21.md +0 -0
  160. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D22.md +0 -0
  161. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D23.md +0 -0
  162. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D24.md +0 -0
  163. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D25.md +0 -0
  164. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D26.md +0 -0
  165. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  166. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  167. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  168. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  169. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  170. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  171. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  172. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  173. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  174. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  175. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  176. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  177. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  178. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  179. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  180. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  181. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  182. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  183. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  184. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  185. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  186. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  187. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  188. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/command-carousel-page.md +0 -0
  189. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  190. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  191. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  192. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  193. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  194. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  195. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  196. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  197. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  198. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  199. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  200. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  201. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  202. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  203. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  204. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  205. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  206. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  207. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  208. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  209. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  210. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  211. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  212. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  213. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  214. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  215. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  216. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  217. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  218. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/github-community-health-files.md +0 -0
  219. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  220. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  221. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  222. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  223. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  224. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  225. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  226. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  227. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  228. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  229. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  230. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  231. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  232. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  233. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  234. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  235. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  236. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  237. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  238. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  239. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  240. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  241. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  242. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  243. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  244. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  245. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  246. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  247. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  248. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  249. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  250. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  251. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  252. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  253. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  254. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  255. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  256. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  257. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  258. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  259. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  260. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  261. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  262. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  263. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  264. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  265. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  266. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  267. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  268. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  269. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  270. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  271. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  272. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  273. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  274. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  275. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  276. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  277. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  278. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  279. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  280. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  281. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  282. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  283. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  284. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  285. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  286. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  287. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  288. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  289. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  290. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  291. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  292. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  293. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  294. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  295. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  296. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  297. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  298. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  299. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  300. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  301. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  302. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  303. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  304. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  305. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  306. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  307. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  308. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  309. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  310. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  311. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  312. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  313. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  314. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  315. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  316. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  317. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  318. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  319. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  320. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  321. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  322. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  323. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  324. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  325. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  326. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  327. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  328. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  329. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  330. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  331. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  332. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  333. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  334. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  335. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  336. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  337. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  338. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  339. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  340. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  341. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  342. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  343. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  344. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  345. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  346. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  347. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  348. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  349. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  350. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  351. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  352. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workspace-scope-install.md +0 -0
  353. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  354. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/eslint.config.mjs +0 -0
  355. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/README.md +0 -0
  356. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/__init__.py +0 -0
  357. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/baseline.json +0 -0
  358. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/faithfulness.py +0 -0
  359. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/golden_set.json +0 -0
  360. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/make_corpus.py +0 -0
  361. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/make_golden.py +0 -0
  362. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/metrics.py +0 -0
  363. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/run_evals.py +0 -0
  364. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/examples/README.md +0 -0
  365. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/examples/adapt-demo.sh +0 -0
  366. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/examples/boost-run-prototype.sh +0 -0
  367. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/index.html +0 -0
  368. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/noxfile.py +0 -0
  369. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/coverage-tools.in +0 -0
  370. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/coverage-tools.txt +0 -0
  371. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/lint-tools.in +0 -0
  372. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/lint-tools.txt +0 -0
  373. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/mutation-tools.in +0 -0
  374. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/mutation-tools.txt +0 -0
  375. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/platform-pins.lock +0 -0
  376. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/release-tools.in +0 -0
  377. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/release-tools.txt +0 -0
  378. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/test-tools.in +0 -0
  379. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/test-tools.txt +0 -0
  380. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/a11y_check.py +0 -0
  381. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/bench_cli.sh +0 -0
  382. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/build_command_reference.py +0 -0
  383. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/build_registries.py +0 -0
  384. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/build_roadmap.py +0 -0
  385. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/check_anchors.py +0 -0
  386. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/check_licenses.py +0 -0
  387. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/check_required_checks.py +0 -0
  388. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/ensure_eval_corpus.sh +0 -0
  389. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_explain.py +0 -0
  390. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_gate.py +0 -0
  391. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_recommend.py +0 -0
  392. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_retrieval.py +0 -0
  393. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_stats_summary.py +0 -0
  394. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/import_budget.py +0 -0
  395. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/lock_toolchain.py +0 -0
  396. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/mutation_gate.py +0 -0
  397. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/mutation_shards.py +0 -0
  398. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/mutation_weights.json +0 -0
  399. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/perf_gate.py +0 -0
  400. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/post_deploy_smoke.py +0 -0
  401. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/release_guard.py +0 -0
  402. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/release_preflight.py +0 -0
  403. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/setup.cfg +0 -0
  404. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/sonar-project.properties +0 -0
  405. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/README.md +0 -0
  406. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/boost.css +0 -0
  407. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/boost.js +0 -0
  408. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/demo.html +0 -0
  409. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/adapt.feature +0 -0
  410. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/browse.feature +0 -0
  411. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/count.feature +0 -0
  412. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/discover.feature +0 -0
  413. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/doctor.feature +0 -0
  414. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/environment.py +0 -0
  415. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/explain.feature +0 -0
  416. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/index.feature +0 -0
  417. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/install.feature +0 -0
  418. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/list.feature +0 -0
  419. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/mcp.feature +0 -0
  420. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/search.feature +0 -0
  421. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/cli_steps.py +0 -0
  422. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/discovery_steps.py +0 -0
  423. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/mcp_steps.py +0 -0
  424. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/quality_steps.py +0 -0
  425. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/conftest.py +0 -0
  426. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/baseline.json +0 -0
  427. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/explain.jsonl +0 -0
  428. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/golden-natural.jsonl +0 -0
  429. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/golden.jsonl +0 -0
  430. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/recommend.jsonl +0 -0
  431. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/taps.txt +0 -0
  432. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_capabilities_policy.py +0 -0
  433. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_adapt.py +0 -0
  434. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_bmad.py +0 -0
  435. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_configuration.py +0 -0
  436. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_discovery.py +0 -0
  437. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_hooks.py +0 -0
  438. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_info.py +0 -0
  439. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_intelligence.py +0 -0
  440. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_pkg.py +0 -0
  441. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_quality.py +0 -0
  442. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_taps.py +0 -0
  443. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_team.py +0 -0
  444. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_everyday_loop.py +0 -0
  445. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_integrity_enforce.py +0 -0
  446. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_property_parsers.py +0 -0
  447. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_run.py +0 -0
  448. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_tap_signing.py +0 -0
  449. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_workspace_scope.py +0 -0
  450. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/README.md +0 -0
  451. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  452. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  453. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  454. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  455. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  456. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  457. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  458. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  459. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  460. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  461. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  462. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  463. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  464. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  465. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  466. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  467. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  468. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  469. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  470. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  471. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/fuzz_frontmatter.py +0 -0
  472. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/fuzz_registry.py +0 -0
  473. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/make_fixture.py +0 -0
  474. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/perf/test_benchmarks.py +0 -0
  475. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/smoke.sh +0 -0
  476. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_a11y_check.py +0 -0
  477. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_adapters.py +0 -0
  478. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_adapters_multi.py +0 -0
  479. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_adapters_runner.py +0 -0
  480. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_agents.py +0 -0
  481. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_ai.py +0 -0
  482. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_capabilities.py +0 -0
  483. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_catalog.py +0 -0
  484. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_check_anchors.py +0 -0
  485. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_check_licenses.py +0 -0
  486. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_claude_settings.py +0 -0
  487. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_cliparse.py +0 -0
  488. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_codeql_analysis_key.py +0 -0
  489. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_command_reference_fresh.py +0 -0
  490. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_community_health_files.py +0 -0
  491. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_config.py +0 -0
  492. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_content_dedupe.py +0 -0
  493. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dedup_trust.py +0 -0
  494. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense.py +0 -0
  495. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_fallback.py +0 -0
  496. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_fix_hint.py +0 -0
  497. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_shards.py +0 -0
  498. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_status.py +0 -0
  499. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dependabot_config.py +0 -0
  500. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_docs_pages_linked.py +0 -0
  501. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_docsite_chrome.py +0 -0
  502. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_ed25519.py +0 -0
  503. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_embed.py +0 -0
  504. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_embed_local.py +0 -0
  505. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_entry_key.py +0 -0
  506. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_errors_and_cli_table.py +0 -0
  507. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_baseline.py +0 -0
  508. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_faithfulness.py +0 -0
  509. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_gate.py +0 -0
  510. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_metrics.py +0 -0
  511. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_stats_summary.py +0 -0
  512. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_faithfulness.py +0 -0
  513. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_frontmatter.py +0 -0
  514. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_fuzz_targets.py +0 -0
  515. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_gitleaks_config.py +0 -0
  516. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_gitutil.py +0 -0
  517. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_imperative.py +0 -0
  518. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_import_budget.py +0 -0
  519. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_injectscan.py +0 -0
  520. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_installscan.py +0 -0
  521. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_integrity.py +0 -0
  522. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_journal.py +0 -0
  523. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_localembed.py +0 -0
  524. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_lockfile.py +0 -0
  525. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_logs.py +0 -0
  526. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_marketing_counts.py +0 -0
  527. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcp.py +0 -0
  528. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcp_install_scan.py +0 -0
  529. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcpdecl.py +0 -0
  530. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcphost.py +0 -0
  531. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_minisign.py +0 -0
  532. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutation_hardening.py +0 -0
  533. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutation_shards.py +0 -0
  534. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutation_subfile_shards.py +0 -0
  535. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutmut_source_paths.py +0 -0
  536. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_nethttp.py +0 -0
  537. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_output.py +0 -0
  538. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_paths.py +0 -0
  539. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_perf_gate.py +0 -0
  540. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_pkg_confusions.py +0 -0
  541. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_pkg_injection.py +0 -0
  542. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_pkg_secrets.py +0 -0
  543. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_platform_pins.py +0 -0
  544. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_policy.py +0 -0
  545. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_post_deploy_smoke.py +0 -0
  546. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_project_mcp_sidecar.py +0 -0
  547. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_projectlock.py +0 -0
  548. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_provenance.py +0 -0
  549. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_registries_fresh.py +0 -0
  550. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_registry.py +0 -0
  551. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_registry_categories.py +0 -0
  552. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_release_guard.py +0 -0
  553. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_release_preflight.py +0 -0
  554. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_required_checks.py +0 -0
  555. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_resolve.py +0 -0
  556. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_roadmap_fresh.py +0 -0
  557. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_rules.py +0 -0
  558. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_scopes.py +0 -0
  559. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_secretscan.py +0 -0
  560. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_selfupdate.py +0 -0
  561. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_serve.py +0 -0
  562. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_spin.py +0 -0
  563. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_stackprobe.py +0 -0
  564. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_staleness.py +0 -0
  565. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_store.py +0 -0
  566. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_token_parity.py +0 -0
  567. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_toolchain_lock.py +0 -0
  568. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_trustaudit.py +0 -0
  569. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_typosquat.py +0 -0
  570. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_updatediff.py +0 -0
  571. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_util.py +0 -0
  572. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_version.py +0 -0
  573. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_workflow_concurrency.py +0 -0
  574. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_workflow_timeouts.py +0 -0
  575. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_workflows.py +0 -0
  576. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/a11y_check.mjs +0 -0
  577. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/console_check.mjs +0 -0
  578. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/package-lock.json +0 -0
  579. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/package.json +0 -0
  580. {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.337
3
+ Version: 1.0.339
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.337'
22
- __version_tuple__ = version_tuple = (1, 0, 337)
21
+ __version__ = version = '1.0.339'
22
+ __version_tuple__ = version_tuple = (1, 0, 339)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -674,11 +674,22 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
674
674
  return dedupe_by_content(hits, k)
675
675
 
676
676
 
677
- def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str]:
678
- """Reorder the shortlist with the LLM bridge; degrade to BM25 order."""
677
+ def rerank(query: str, hits: List[Hit], limit: int = 10,
678
+ engine: str = "BM25 full-content") -> Tuple[List[Hit], str]:
679
+ """Reorder the shortlist with the LLM bridge; degrade to ``engine`` order.
680
+
681
+ ``engine`` is the label from whichever retrieval actually produced ``hits``.
682
+ Both degrade paths below return it rather than a hard-coded string: this
683
+ function does not know how the shortlist was built, and guessing was wrong
684
+ for every user whose dense store worked. Naming a specific wrong engine is
685
+ worse than naming none — the label is the only signal about which engine
686
+ answered, so a confident "BM25 full-content" sent debugging somewhere else.
687
+
688
+ The default keeps direct callers unchanged; ``search`` passes the real one.
689
+ """
679
690
  top = hits[:max(limit, 15)]
680
691
  if not ai.available():
681
- return hits[:limit], "BM25 full-content"
692
+ return hits[:limit], engine
682
693
  listing = "\n".join(
683
694
  "- %s [%s]: %s" % (h["entry"]["name"], h["entry"].get("kind", "skill"),
684
695
  (h["snippet"] or h["entry"].get("description", ""))[:180])
@@ -691,7 +702,9 @@ def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str
691
702
  max_tokens=400)
692
703
  order = _json_array(reply)
693
704
  if not order:
694
- return hits[:limit], "BM25 full-content"
705
+ # The model answered but not with a JSON array, so the ordering falls
706
+ # back to whatever retrieval produced — and so must the label.
707
+ return hits[:limit], engine
695
708
  by_name = {h["entry"]["name"]: h for h in hits}
696
709
  picked = [by_name[str(n)] for n in order if str(n) in by_name]
697
710
  rest = [h for h in hits if h["entry"]["name"]
@@ -832,7 +845,9 @@ def search(query: str, limit: int = 10, kind: Optional[str] = None,
832
845
  if hits is None:
833
846
  return None
834
847
  if smart:
835
- return rerank(query, hits, limit)
848
+ # Hand the retrieval label down rather than dropping it: when the
849
+ # rerank degrades, this is the only thing that knows what actually ran.
850
+ return rerank(query, hits, limit, engine=engine)
836
851
  return hits[:limit], engine
837
852
 
838
853
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.337
3
+ Version: 1.0.339
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -303,6 +303,7 @@ docs/roadmap/items/required-checks-config-drift.md
303
303
  docs/roadmap/items/retrieval-quality-eval-harness.md
304
304
  docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md
305
305
  docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md
306
+ docs/roadmap/items/roadmap-page-weight-grows-without-bound.md
306
307
  docs/roadmap/items/robust-tag-argument-parsing.md
307
308
  docs/roadmap/items/ruff-016-widens-the-default-rule-set.md
308
309
  docs/roadmap/items/rule-install-native-materialization.md
@@ -516,6 +517,7 @@ tests/unit/test_installscan.py
516
517
  tests/unit/test_integrity.py
517
518
  tests/unit/test_journal.py
518
519
  tests/unit/test_localembed.py
520
+ tests/unit/test_localembed_e2e.py
519
521
  tests/unit/test_lockfile.py
520
522
  tests/unit/test_logs.py
521
523
  tests/unit/test_marketing_counts.py
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: roadmap-page-weight-grows-without-bound
3
+ board: code
4
+ section: docsite
5
+ status: planned
6
+ category: Docs · Performance
7
+ complexity: M
8
+ impact: Med
9
+ wow: 2
10
+ note: 302 KB to 410 KB in one session; 164 shipped cards render in full
11
+ order: 76
12
+ owner:
13
+ pr:
14
+ title: <code>roadmap.html</code> grew 36% in one session and nothing bounds it
15
+ ---
16
+ The generated board is <b>407.6&nbsp;KB, of which 404.7&nbsp;KB is markup</b> — 189
17
+ <code>&lt;article&gt;</code> cards rendered eagerly into one DOM. Measured across this session's
18
+ merges it went <b>301.6&nbsp;KB &rarr; 409.9&nbsp;KB, a 36% rise</b>, monotonically increasing with
19
+ every card documented.
20
+
21
+ <b>The mechanism is that shipped work never stops costing.</b> Sizing the sections: <code>shipped</code>
22
+ 17.6&nbsp;KB / 16 cards, <code>next</code> 1.1&nbsp;KB / 1, <code>planned</code>
23
+ <b>383.0&nbsp;KB / 172</b> — but 164 of those 172 carry a <code>shipped</code> pill. They are finished
24
+ items grouped under their original section, each still rendering its full body, and those bodies grow
25
+ because closing an item well means recording what was measured and what turned out to be wrong. The
26
+ board is now mostly an archive that every visitor downloads in full.
27
+
28
+ <b>This is NOT what failed <code>lighthouse</code> on <code>#386</code>, and that is worth stating
29
+ because the correlation is seductive.</b> <code>#388</code> passed the same gate at
30
+ <b>409.9&nbsp;KB</b> — very slightly <em>larger</em> than <code>#386</code>'s 409.8&nbsp;KB, which
31
+ failed. A bigger page scoring better rules out page weight as that failure's cause; it was runner
32
+ variance, exactly as <code>lighthouse.yml</code>'s own comment predicts ("a single sample dips into
33
+ the 80s under runner load, which the median absorbs"). The performance floor is
34
+ <code>minScore 0.85</code> against a normal score of ~99–100, so there is real headroom today.
35
+
36
+ <b>The case for doing it anyway is the trend, not the current number.</b> At roughly +6&nbsp;KB per
37
+ merged card the page crosses 500&nbsp;KB within a few working sessions, and DOM size is precisely
38
+ what Lighthouse's performance category penalises — so this becomes the cause eventually even though
39
+ it is not the cause now.
40
+
41
+ <b>Likely levers, cheapest first.</b> Collapse shipped card bodies behind
42
+ <code>&lt;details&gt;</code> so the text ships but does not render — that alone addresses the
43
+ 383&nbsp;KB block and keeps every word searchable in the source. Failing that, render shipped items
44
+ as one-line entries linking to their item file, or paginate by section. All three live in
45
+ <code>scripts/build_roadmap.py</code>; none require touching an item file, which matters because the
46
+ item files are the merge-conflict-free part of this design.
47
+
48
+ <b>Do not raise the Lighthouse floor to fix this.</b> The floor is calibrated and honest; a page that
49
+ outgrows it should be made smaller, not re-graded.
@@ -111,7 +111,7 @@
111
111
  <div class="stat"><b>16</b><span>Shipped</span></div>
112
112
  <div class="stat"><b>1</b><span>Next up</span></div>
113
113
  <div class="stat"><b>4</b><span>Planned</span></div>
114
- <div class="stat"><b>189</b><span>Loop finds</span></div>
114
+ <div class="stat"><b>190</b><span>Loop finds</span></div>
115
115
  <!-- /ROADMAP:stats -->
116
116
  </div>
117
117
  </section>
@@ -5215,6 +5215,51 @@ so they were green on CI and red on any machine that had installed it.</p>
5215
5215
  <span class="m">silent BM25-only is the default outcome</span>
5216
5216
  </div>
5217
5217
  </article>
5218
+
5219
+ <article class="cap rcard" id="roadmap-page-weight-grows-without-bound">
5220
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Docs · Performance</span></div>
5221
+ <h3><code>roadmap.html</code> grew 36% in one session and nothing bounds it</h3>
5222
+ <p>The generated board is <b>407.6&nbsp;KB, of which 404.7&nbsp;KB is markup</b> — 189
5223
+ <code>&lt;article&gt;</code> cards rendered eagerly into one DOM. Measured across this session's
5224
+ merges it went <b>301.6&nbsp;KB &rarr; 409.9&nbsp;KB, a 36% rise</b>, monotonically increasing with
5225
+ every card documented.
5226
+
5227
+ <b>The mechanism is that shipped work never stops costing.</b> Sizing the sections: <code>shipped</code>
5228
+ 17.6&nbsp;KB / 16 cards, <code>next</code> 1.1&nbsp;KB / 1, <code>planned</code>
5229
+ <b>383.0&nbsp;KB / 172</b> — but 164 of those 172 carry a <code>shipped</code> pill. They are finished
5230
+ items grouped under their original section, each still rendering its full body, and those bodies grow
5231
+ because closing an item well means recording what was measured and what turned out to be wrong. The
5232
+ board is now mostly an archive that every visitor downloads in full.
5233
+
5234
+ <b>This is NOT what failed <code>lighthouse</code> on <code>#386</code>, and that is worth stating
5235
+ because the correlation is seductive.</b> <code>#388</code> passed the same gate at
5236
+ <b>409.9&nbsp;KB</b> — very slightly <em>larger</em> than <code>#386</code>'s 409.8&nbsp;KB, which
5237
+ failed. A bigger page scoring better rules out page weight as that failure's cause; it was runner
5238
+ variance, exactly as <code>lighthouse.yml</code>'s own comment predicts ("a single sample dips into
5239
+ the 80s under runner load, which the median absorbs"). The performance floor is
5240
+ <code>minScore 0.85</code> against a normal score of ~99–100, so there is real headroom today.
5241
+
5242
+ <b>The case for doing it anyway is the trend, not the current number.</b> At roughly +6&nbsp;KB per
5243
+ merged card the page crosses 500&nbsp;KB within a few working sessions, and DOM size is precisely
5244
+ what Lighthouse's performance category penalises — so this becomes the cause eventually even though
5245
+ it is not the cause now.
5246
+
5247
+ <b>Likely levers, cheapest first.</b> Collapse shipped card bodies behind
5248
+ <code>&lt;details&gt;</code> so the text ships but does not render — that alone addresses the
5249
+ 383&nbsp;KB block and keeps every word searchable in the source. Failing that, render shipped items
5250
+ as one-line entries linking to their item file, or paginate by section. All three live in
5251
+ <code>scripts/build_roadmap.py</code>; none require touching an item file, which matters because the
5252
+ item files are the merge-conflict-free part of this design.
5253
+
5254
+ <b>Do not raise the Lighthouse floor to fix this.</b> The floor is calibrated and honest; a page that
5255
+ outgrows it should be made smaller, not re-graded.</p>
5256
+ <div class="meta">
5257
+ <span class="m">Complexity <b>M</b></span>
5258
+ <span class="m">Impact <b>Med</b></span>
5259
+ <span class="m">Wow <b class="wow">★★</b></span>
5260
+ <span class="m">302 KB to 410 KB in one session; 164 shipped cards render in full</span>
5261
+ </div>
5262
+ </article>
5218
5263
  <!-- /ROADMAP:cards -->
5219
5264
 
5220
5265
  </div>
@@ -212,6 +212,12 @@ check_untyped_defs = true
212
212
  testpaths = ["tests"]
213
213
  addopts = "-q -p no:cacheprovider"
214
214
  filterwarnings = ["error::DeprecationWarning:boost_cli.*"]
215
+ # Registered so an unknown-mark warning cannot become an error here. The mark
216
+ # only selects; the actual guard is the BOOST_ONNX_E2E env gate on the module,
217
+ # so a plain `pytest` never downloads 133 MB of weights by surprise.
218
+ markers = [
219
+ "onnx: needs onnxruntime + the real pinned BGE weights (opt-in, see tests/unit/test_localembed_e2e.py)",
220
+ ]
215
221
 
216
222
  [tool.coverage.run]
217
223
  source = ["boost_cli"]
@@ -0,0 +1,170 @@
1
+ """End-to-end: the real ONNX runtime against the real pinned BGE weights.
2
+
3
+ Scope, stated precisely, because the obvious justification for this file is
4
+ wrong. ``test_localembed.py`` runs against a stub that "mimics onnxruntime", and
5
+ the tempting claim is that a stub cannot catch a pooling mistake. It can:
6
+ ``TestClsPooling::test_it_takes_the_first_token_not_the_mean`` feeds
7
+ ``cls_pool`` a hand-built tensor and pins CLS against the mean directly, in
8
+ microseconds and with no download. That test is *better* at that job than
9
+ anything here. This was checked rather than assumed — swapping ``cls_pool`` to
10
+ mean pooling reddens the stubbed suite immediately.
11
+
12
+ What no stub can do is run the actual graph. A fake session returns whatever
13
+ shape the test declared, so everything downstream of "does onnxruntime accept
14
+ these 133 MB and give back what we expect" is asserted against our own
15
+ assumptions. Three things only real weights prove:
16
+
17
+ * **Integration.** The pinned export loads under the installed onnxruntime, the
18
+ input names we feed match the ones it declares, and the result is 384 finite
19
+ unit-norm floats. Every ORT upgrade re-tests this for free.
20
+ * **Absolute similarity.** Ordering alone is a weak signal — measured here, mean
21
+ pooling *preserves* the near/far ordering while changing every vector. Pinning
22
+ the values catches a model or revision swap that ordering sails through.
23
+ * **Padding.** Batching a short text beside a long one exercises a real
24
+ attention mask; a fake session has none to get wrong.
25
+
26
+ Reference values come from the measurement published on the roadmap card when
27
+ the ONNX path shipped (#354), against these exact pinned weights.
28
+
29
+ Opt-in by design — ``BOOST_ONNX_E2E=1``. Without it this skips, so neither a
30
+ normal ``make test`` nor the mutation gate's in-``mutants/`` run is charged a
31
+ 133 MB download. CI sets it in the one job that caches the weights.
32
+ """
33
+ from __future__ import annotations
34
+
35
+ import math
36
+ import os
37
+
38
+ import pytest
39
+
40
+ from boost_cli.core import localembed
41
+
42
+ pytestmark = [
43
+ pytest.mark.onnx,
44
+ pytest.mark.skipif(os.environ.get("BOOST_ONNX_E2E") != "1",
45
+ reason="real-weights E2E; set BOOST_ONNX_E2E=1"),
46
+ ]
47
+
48
+ # Sentences from the published measurement. The first two are near-paraphrases
49
+ # in different vocabulary — no content word in common — which is the case BM25
50
+ # cannot serve and the dense tier exists for. The third is the distractor that
51
+ # BM25 actually returned for this query before the dense tier existed.
52
+ Q_SLOW = "making my application faster"
53
+ NEAR = "application performance tuning"
54
+ FAR = "quantum computing circuit simulation"
55
+
56
+ # Published against these weights: near 0.7691, far 0.5338. The tolerance is
57
+ # wide enough to absorb onnxruntime/platform float differences and narrow enough
58
+ # that a pooling change cannot hide inside it — CLS and mean pooling separate by
59
+ # far more than this on BGE.
60
+ NEAR_SIM, FAR_SIM, TOL = 0.7691, 0.5338, 0.03
61
+
62
+
63
+ def _dot(a, b):
64
+ return sum(x * y for x, y in zip(a, b))
65
+
66
+
67
+ @pytest.fixture(scope="module")
68
+ def vectors():
69
+ """Encode the three probe sentences once, with real weights.
70
+
71
+ ``importorskip`` rather than a plain import so a machine that opted in but
72
+ lacks the extra skips cleanly instead of erroring. ``ensure_model`` is what
73
+ downloads and verifies; a None return means the fetch failed, which is a
74
+ skip and not a failure — this test is about the model contract, not about
75
+ HuggingFace's uptime.
76
+ """
77
+ pytest.importorskip("onnxruntime")
78
+ pytest.importorskip("tokenizers")
79
+ if localembed.ensure_model() is None:
80
+ pytest.skip("pinned weights unavailable (download failed)")
81
+ out = localembed.encode([Q_SLOW, NEAR, FAR])
82
+ assert out is not None, "encode returned None with the backend present"
83
+ return dict(zip((Q_SLOW, NEAR, FAR), out))
84
+
85
+
86
+ class TestModelContract:
87
+ def test_dimension_matches_what_embed_advertises(self, vectors):
88
+ # Asserted against `embed.LOCAL_DIM` rather than a literal 384: that
89
+ # constant is what dense.py stores and rebuilds on, so the bug worth
90
+ # catching is the two disagreeing, not either one's value.
91
+ from boost_cli.core import embed
92
+ assert embed.LOCAL_DIM == 384 # the pinned export's hidden size
93
+ for text, vec in vectors.items():
94
+ assert len(vec) == embed.LOCAL_DIM, text
95
+
96
+ def test_vectors_are_l2_normalised(self, vectors):
97
+ # Cosine similarity downstream is a plain dot product, which is only
98
+ # correct on unit vectors.
99
+ for text, vec in vectors.items():
100
+ assert math.isclose(math.sqrt(_dot(vec, vec)), 1.0, abs_tol=1e-5), text
101
+
102
+ def test_every_component_is_finite(self, vectors):
103
+ # A NaN would poison the whole index and compare False against
104
+ # everything, so KNN would return an arbitrary neighbour set.
105
+ for text, vec in vectors.items():
106
+ assert all(math.isfinite(x) for x in vec), text
107
+
108
+
109
+ class TestSemanticContract:
110
+ """The part a stub cannot fake, and the reason the tier exists."""
111
+
112
+ def test_paraphrase_outranks_the_distractor(self, vectors):
113
+ # A floor, not a precision instrument: measured against a mean-pooled
114
+ # build, this ordering SURVIVES — so it does not catch pooling and is
115
+ # not claimed to. What it does catch is a model that loaded but is not
116
+ # discriminating at all, which is the failure that makes the whole
117
+ # keyless tier pointless while every shape assertion still passes.
118
+ near = _dot(vectors[Q_SLOW], vectors[NEAR])
119
+ far = _dot(vectors[Q_SLOW], vectors[FAR])
120
+ assert near > far, (
121
+ "'%s' must rank nearer to '%s' than to '%s' (got %.4f vs %.4f)"
122
+ % (Q_SLOW, NEAR, FAR, near, far))
123
+ assert near - far > 0.10, (
124
+ "margin collapsed to %.4f — the model is loading but not "
125
+ "discriminating; suspect pooling or a wrong input name"
126
+ % (near - far))
127
+
128
+ def test_similarities_match_the_published_measurement(self, vectors):
129
+ # This is the one that earns the download. Verified against a mean-pooled
130
+ # build: ordering held, these values moved, and this test was what
131
+ # noticed. Same for a deliberate MODEL_REV repin, where sha256 passes by
132
+ # construction and only the numbers reveal that vectors changed.
133
+ near = _dot(vectors[Q_SLOW], vectors[NEAR])
134
+ far = _dot(vectors[Q_SLOW], vectors[FAR])
135
+ assert math.isclose(near, NEAR_SIM, abs_tol=TOL), (
136
+ "near-pair similarity %.4f drifted from the published %.4f"
137
+ % (near, NEAR_SIM))
138
+ assert math.isclose(far, FAR_SIM, abs_tol=TOL), (
139
+ "far-pair similarity %.4f drifted from the published %.4f"
140
+ % (far, FAR_SIM))
141
+
142
+ def test_a_sentence_is_maximally_similar_to_itself(self, vectors):
143
+ # Sanity floor: a degenerate model that maps everything to one point
144
+ # would pass the ordering test by accident but fails here against the
145
+ # off-diagonal.
146
+ self_sim = _dot(vectors[NEAR], vectors[NEAR])
147
+ cross = _dot(vectors[NEAR], vectors[FAR])
148
+ assert math.isclose(self_sim, 1.0, abs_tol=1e-5)
149
+ assert self_sim > cross + 0.10
150
+
151
+
152
+ class TestDeterminism:
153
+ def test_encoding_twice_gives_identical_vectors(self, vectors):
154
+ # The store is a cache keyed on content, so a non-deterministic encoder
155
+ # would make every reindex produce a different index for the same input.
156
+ again = localembed.encode([NEAR])
157
+ assert again is not None
158
+ for a, b in zip(again[0], vectors[NEAR]):
159
+ assert math.isclose(a, b, abs_tol=1e-6)
160
+
161
+ def test_batching_does_not_change_a_vector(self, vectors):
162
+ # Padding to the longest row in a batch must not leak into the CLS
163
+ # token. Encoding alone vs. alongside a much longer sentence is the
164
+ # cheapest way to catch an attention-mask mistake.
165
+ alone = localembed.encode([NEAR])
166
+ batched = localembed.encode([NEAR, FAR * 20])
167
+ assert alone is not None and batched is not None
168
+ for a, b in zip(alone[0], batched[0]):
169
+ assert math.isclose(a, b, abs_tol=1e-4), (
170
+ "padding changed the vector — suspect the attention mask")
@@ -965,18 +965,23 @@ class TestSearchForwarding:
965
965
  rag.search("q", limit=1, smart=False)
966
966
  assert cap["k"] == 60 # max(60, 4)
967
967
 
968
- def test_forwards_query_and_limit_to_rerank(self, sandbox, monkeypatch):
968
+ def test_forwards_query_limit_and_engine_to_rerank(self, sandbox, monkeypatch):
969
+ # `engine` joined the signature so a degraded rerank can report what
970
+ # actually retrieved instead of assuming BM25; asserted here because
971
+ # dropping it again would be silent — search would still return a
972
+ # plausible label, just the wrong one.
969
973
  self._ready_index()
970
974
  monkeypatch.setattr(rag, "retrieve", lambda *a, **k: [_hit("a", 1.0)])
971
975
  cap = {}
972
976
 
973
- def spyr(query, hits, limit=10):
974
- cap.update(query=query, limit=limit)
977
+ def spyr(query, hits, limit=10, engine="BM25 full-content"):
978
+ cap.update(query=query, limit=limit, engine=engine)
975
979
  return ([], "x")
976
980
  monkeypatch.setattr(rag, "rerank", spyr)
977
981
  rag.search("theq", limit=5) # smart defaults to True
978
982
  assert cap["query"] == "theq"
979
983
  assert cap["limit"] == 5
984
+ assert cap["engine"] == "BM25 full-content" # what this index is
980
985
 
981
986
 
982
987
  class TestIndexPath:
@@ -209,3 +209,95 @@ class TestRetrieveAnyFuses:
209
209
  rag.retrieve_any("q", kind="rule", entries=ents)
210
210
  assert ("bm25", "rule", ents) in seen
211
211
  assert ("dense", "rule", ents) in seen
212
+
213
+
214
+ class TestRerankPreservesTheEngineLabel:
215
+ """The engine that actually retrieved must survive the rerank stage.
216
+
217
+ ``rerank`` hard-coded ``"BM25 full-content"`` on both of its degrade paths,
218
+ and ``search`` discards ``retrieve_any``'s label whenever ``smart`` is on —
219
+ which is the default, and what the MCP ``boost_search`` tool uses. So a user
220
+ whose dense store and fusion were working perfectly, but who had no
221
+ ``ANTHROPIC_API_KEY``, was told they were on BM25.
222
+
223
+ That is the same class of silent misreport the dense-status work existed to
224
+ kill: the label is the only signal a user has about which engine answered,
225
+ and a wrong one sends the investigation somewhere else entirely. Worse here
226
+ than a missing label, because it names a specific wrong engine confidently.
227
+ """
228
+
229
+ @staticmethod
230
+ def _hits():
231
+ return [_hit("a", 2.0), _hit("b", 1.0)]
232
+
233
+ def test_no_ai_reports_the_engine_that_retrieved(self, monkeypatch):
234
+ # THE regression. Fusion ran, the LLM was absent, and the old code
235
+ # answered "BM25 full-content" — naming an engine that did not rank
236
+ # these hits alone.
237
+ monkeypatch.setattr(rag.ai, "available", lambda: False)
238
+ _out, label = rag.rerank("q", self._hits(), limit=5,
239
+ engine="hybrid RRF (BM25 + dense)")
240
+ assert label == "hybrid RRF (BM25 + dense)"
241
+
242
+ def test_no_ai_reports_dense_when_dense_retrieved(self, monkeypatch):
243
+ monkeypatch.setattr(rag.ai, "available", lambda: True)
244
+ monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: "not json at all")
245
+ _out, label = rag.rerank("q", self._hits(), limit=5,
246
+ engine="dense vectors")
247
+ assert label == "dense vectors"
248
+
249
+ def test_an_unparseable_reply_keeps_the_engine_too(self, monkeypatch):
250
+ # The second degrade path: the model answered, but not with a JSON
251
+ # array. Ordering falls back, so the label must fall back with it.
252
+ monkeypatch.setattr(rag.ai, "available", lambda: True)
253
+ monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: "sorry, I can't")
254
+ _out, label = rag.rerank("q", self._hits(), limit=5,
255
+ engine="hybrid RRF (BM25 + dense)")
256
+ assert label == "hybrid RRF (BM25 + dense)"
257
+
258
+ def test_a_successful_rerank_still_says_claude(self, monkeypatch):
259
+ # The LLM really did decide the order here, so crediting the retrieval
260
+ # engine instead would be the same bug pointing the other way.
261
+ monkeypatch.setattr(rag.ai, "available", lambda: True)
262
+ monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: '["b", "a"]')
263
+ out, label = rag.rerank("q", self._hits(), limit=5,
264
+ engine="hybrid RRF (BM25 + dense)")
265
+ assert _names(out) == ["b", "a"]
266
+ assert label == "Claude relevance"
267
+
268
+ def test_the_default_keeps_existing_callers_honest(self, monkeypatch):
269
+ # Back-compat: an omitted engine still reads "BM25 full-content", so
270
+ # this is additive for anything that calls rerank directly.
271
+ monkeypatch.setattr(rag.ai, "available", lambda: False)
272
+ _out, label = rag.rerank("q", self._hits(), limit=5)
273
+ assert label == "BM25 full-content"
274
+
275
+
276
+ class TestSearchReportsTheTruthEndToEnd:
277
+ """`search` is where the label is chosen, so the bug is only really fixed
278
+ if it survives the whole path an MCP call takes."""
279
+
280
+ @staticmethod
281
+ def _wire(monkeypatch, engine_hits, ai_ok):
282
+ from boost_cli.core import dense as dense_mod
283
+ monkeypatch.setattr(rag, "ready", lambda: True)
284
+ monkeypatch.setattr(rag, "retrieve", lambda *_a, **_k: list(engine_hits))
285
+ monkeypatch.setattr(dense_mod, "ready", lambda: True)
286
+ monkeypatch.setattr(dense_mod, "retrieve", lambda *_a, **_k: list(engine_hits))
287
+ monkeypatch.setattr(rag.ai, "available", lambda: ai_ok)
288
+
289
+ def test_fused_retrieval_without_a_key_is_not_called_bm25(self, monkeypatch):
290
+ # Exactly the MCP boost_search path: smart defaults on, no key.
291
+ self._wire(monkeypatch, [_hit("a"), _hit("b")], ai_ok=False)
292
+ result = rag.search("q", limit=5)
293
+ assert result is not None
294
+ _hits, label = result
295
+ assert label != "BM25 full-content"
296
+ assert "dense" in label, label
297
+
298
+ def test_smart_off_is_unaffected(self, monkeypatch):
299
+ self._wire(monkeypatch, [_hit("a")], ai_ok=True)
300
+ result = rag.search("q", limit=5, smart=False)
301
+ assert result is not None
302
+ _hits, label = result
303
+ assert "dense" in label, label