boost-skill-cli 1.0.447__tar.gz → 1.0.448__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 (695) hide show
  1. {boost_skill_cli-1.0.447/boost_skill_cli.egg-info → boost_skill_cli-1.0.448}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/dense.py +73 -13
  4. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
  6. boost_skill_cli-1.0.448/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +78 -0
  7. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap.html +76 -1
  8. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/eval_corpus.py +13 -1
  9. boost_skill_cli-1.0.448/tests/unit/test_dense_shard_real_schema.py +155 -0
  10. boost_skill_cli-1.0.448/tests/unit/test_dense_shard_unreadable_vectors.py +109 -0
  11. boost_skill_cli-1.0.448/tests/unit/test_shards_matrix.py +136 -0
  12. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.gitattributes +0 -0
  13. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.gitignore +0 -0
  14. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.gitleaks.toml +0 -0
  15. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.htmlvalidate.json +0 -0
  16. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.lighthouserc.json +0 -0
  17. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.lycheeignore +0 -0
  18. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.markdownlint-cli2.jsonc +0 -0
  19. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.pre-commit-config.yaml +0 -0
  20. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.stylelintrc.json +0 -0
  21. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.vale/styles/boost/Terminology.yml +0 -0
  22. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  23. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/.vale.ini +0 -0
  24. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/CLAUDE.md +0 -0
  25. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/CODE_OF_CONDUCT.md +0 -0
  26. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/LICENSE +0 -0
  28. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/Makefile +0 -0
  30. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/README.md +0 -0
  31. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/SECURITY.md +0 -0
  32. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost +0 -0
  33. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/__init__.py +0 -0
  34. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/__main__.py +0 -0
  35. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/cli.py +0 -0
  36. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/cliparse.py +0 -0
  37. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/__init__.py +0 -0
  38. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/_common.py +0 -0
  39. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/bmad.py +0 -0
  40. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/configuration.py +0 -0
  41. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/discovery.py +0 -0
  42. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/hooks.py +0 -0
  43. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/info.py +0 -0
  44. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/intelligence.py +0 -0
  45. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/pkg.py +0 -0
  46. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/quality.py +0 -0
  47. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/run.py +0 -0
  48. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/safety.py +0 -0
  49. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/taps.py +0 -0
  50. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/commands/team.py +0 -0
  51. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/__init__.py +0 -0
  52. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/adapters.py +0 -0
  53. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/agents.py +0 -0
  54. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/ai.py +0 -0
  55. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/bmad.py +0 -0
  56. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/bootstrap.py +0 -0
  57. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/builtin.py +0 -0
  58. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/capabilities.py +0 -0
  59. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/catalog.py +0 -0
  60. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/chat.py +0 -0
  61. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/claude_settings.py +0 -0
  62. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/complete.py +0 -0
  63. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/config.py +0 -0
  64. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/ed25519.py +0 -0
  65. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/embed.py +0 -0
  66. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/faithfulness.py +0 -0
  67. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/frontmatter.py +0 -0
  68. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/gitutil.py +0 -0
  69. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/imperative.py +0 -0
  70. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/injectscan.py +0 -0
  71. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/installscan.py +0 -0
  72. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/integrity.py +0 -0
  73. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/journal.py +0 -0
  74. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/localembed.py +0 -0
  75. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/lockfile.py +0 -0
  76. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/logs.py +0 -0
  77. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/mcp.py +0 -0
  78. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/mcpdecl.py +0 -0
  79. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/mcphost.py +0 -0
  80. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/minisign.py +0 -0
  81. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/nethttp.py +0 -0
  82. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/output.py +0 -0
  83. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/paths.py +0 -0
  84. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/policy.py +0 -0
  85. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/projectlock.py +0 -0
  86. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/provenance.py +0 -0
  87. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/rag.py +0 -0
  88. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/registry.py +0 -0
  89. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/resolve.py +0 -0
  90. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/rules.py +0 -0
  91. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/scopes.py +0 -0
  92. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/secretscan.py +0 -0
  93. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/selfupdate.py +0 -0
  94. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/serve.py +0 -0
  95. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/stackprobe.py +0 -0
  96. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/staleness.py +0 -0
  97. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/store.py +0 -0
  98. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/trustaudit.py +0 -0
  99. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/typosquat.py +0 -0
  100. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/updatediff.py +0 -0
  101. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/util.py +0 -0
  102. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/core/workflows.py +0 -0
  103. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/data/registries.json +0 -0
  104. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/data/rules/boost-first.mdc +0 -0
  105. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/errors.py +0 -0
  106. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_cli/spin.py +0 -0
  107. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_langchain/__init__.py +0 -0
  108. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_langchain/_compat.py +0 -0
  109. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_langchain/graph.py +0 -0
  110. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_langchain/loader.py +0 -0
  111. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_langchain/py.typed +0 -0
  112. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_langchain/retriever.py +0 -0
  113. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  114. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  115. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/requires.txt +0 -0
  116. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/top_level.txt +0 -0
  117. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/codecov.yml +0 -0
  118. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/.claude/settings.local.json +0 -0
  119. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/DEBUGGING.md +0 -0
  120. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/adapters.html +0 -0
  121. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/architecture/README.md +0 -0
  122. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/architecture/c4-components-core.md +0 -0
  123. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/architecture/c4-containers.md +0 -0
  124. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/architecture/c4-context.md +0 -0
  125. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/architecture/c4-dynamic-install.md +0 -0
  126. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/distill.gif +0 -0
  127. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/doctor.gif +0 -0
  128. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/explain.gif +0 -0
  129. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/hooks.gif +0 -0
  130. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/install.gif +0 -0
  131. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/pulse.gif +0 -0
  132. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/search.gif +0 -0
  133. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/gifs/tap.gif +0 -0
  134. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/distill.tape +0 -0
  135. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/doctor.tape +0 -0
  136. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/explain.tape +0 -0
  137. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/hooks.tape +0 -0
  138. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/install.tape +0 -0
  139. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/pulse.tape +0 -0
  140. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/search.tape +0 -0
  141. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel/tapes/tap.tape +0 -0
  142. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/carousel.html +0 -0
  143. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/chat.html +0 -0
  144. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/commands.html +0 -0
  145. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/demo-index.json +0 -0
  146. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/demo.gif +0 -0
  147. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/demo.html +0 -0
  148. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/demo.tape +0 -0
  149. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/design-roadmap.html +0 -0
  150. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/eval-latest.json +0 -0
  151. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/eval.html +0 -0
  152. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/index.html +0 -0
  153. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/langchain.html +0 -0
  154. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/mcp-hub.html +0 -0
  155. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/rag-architecture.md +0 -0
  156. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D01.md +0 -0
  157. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D02.md +0 -0
  158. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D03.md +0 -0
  159. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D04.md +0 -0
  160. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D05.md +0 -0
  161. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D06.md +0 -0
  162. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D07.md +0 -0
  163. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D08.md +0 -0
  164. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D09.md +0 -0
  165. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D10.md +0 -0
  166. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D11.md +0 -0
  167. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D12.md +0 -0
  168. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D13.md +0 -0
  169. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D14.md +0 -0
  170. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D15.md +0 -0
  171. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D16.md +0 -0
  172. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D17.md +0 -0
  173. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D18.md +0 -0
  174. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D19.md +0 -0
  175. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D20.md +0 -0
  176. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D21.md +0 -0
  177. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D22.md +0 -0
  178. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D23.md +0 -0
  179. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D24.md +0 -0
  180. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D25.md +0 -0
  181. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D26.md +0 -0
  182. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  183. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  184. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  185. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  186. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  187. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  188. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  189. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  190. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  191. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  192. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  193. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  194. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  195. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-first-rule.md +0 -0
  196. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  197. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  198. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  199. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  200. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  201. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  202. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  203. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  204. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  205. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  206. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  207. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  208. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  209. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  210. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  211. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  212. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/command-carousel-page.md +0 -0
  213. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  214. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  215. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  216. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  217. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  218. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  219. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  220. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  221. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  222. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  223. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  224. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  225. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  226. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  227. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  228. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  229. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  230. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  231. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  232. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  233. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  234. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  235. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  236. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  237. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  238. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  239. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  240. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  241. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  242. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  243. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  244. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  245. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  246. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  247. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  248. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  249. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  250. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  251. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  252. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  253. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  254. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  255. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  256. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  257. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/github-community-health-files.md +0 -0
  258. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  259. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  260. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  261. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  262. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  263. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  264. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  265. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  266. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  267. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  268. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  269. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  270. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  271. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  272. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  273. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  274. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  275. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  276. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  277. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  278. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  279. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  280. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  281. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  282. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  283. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  284. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  285. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  286. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  287. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  288. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  289. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  290. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  291. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  292. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  293. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  294. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  295. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  296. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  297. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  298. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  299. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  300. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  301. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  302. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  303. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  304. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  305. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  306. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  307. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  308. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  309. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  310. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  311. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  312. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  313. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  314. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  315. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  316. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  317. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  318. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  319. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  320. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  321. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  322. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  323. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  324. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  325. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  326. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  327. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  328. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  329. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  330. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  331. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  332. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  333. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  334. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  335. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  336. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  337. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  338. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  339. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  340. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  341. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  342. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  343. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  344. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  345. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  346. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  347. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  348. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  349. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  350. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  351. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  352. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  353. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  354. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  355. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  356. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  357. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  358. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  359. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  360. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  361. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  362. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  363. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  364. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  365. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  366. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  367. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  368. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  369. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  370. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  371. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  372. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  373. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  374. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  375. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  376. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  377. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  378. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  379. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  380. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  381. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  382. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  383. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  384. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  385. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  386. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  387. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  388. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  389. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  390. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  391. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  392. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  393. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  394. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  395. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  396. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  397. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  398. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  399. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  400. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  401. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  402. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  403. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  404. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  405. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  406. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  407. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  408. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  409. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  410. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  411. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  412. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  413. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  414. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  415. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  416. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  417. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  418. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  419. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  420. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  421. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/workspace-scope-install.md +0 -0
  422. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/zip-strict-audit.md +0 -0
  423. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  424. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  425. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/eslint.config.mjs +0 -0
  426. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/README.md +0 -0
  427. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/__init__.py +0 -0
  428. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/baseline.json +0 -0
  429. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/faithfulness.py +0 -0
  430. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/golden_set.json +0 -0
  431. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/make_corpus.py +0 -0
  432. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/make_golden.py +0 -0
  433. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/metrics.py +0 -0
  434. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/publish_golden_dataset.py +0 -0
  435. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/evals/run_evals.py +0 -0
  436. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/examples/README.md +0 -0
  437. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/examples/adapt-demo.sh +0 -0
  438. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/examples/boost-run-prototype.sh +0 -0
  439. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/index.html +0 -0
  440. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/noxfile.py +0 -0
  441. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/pyproject.toml +0 -0
  442. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/coverage-tools.in +0 -0
  443. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/coverage-tools.txt +0 -0
  444. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/lint-tools.in +0 -0
  445. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/lint-tools.txt +0 -0
  446. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/mutation-tools.in +0 -0
  447. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/mutation-tools.txt +0 -0
  448. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/platform-pins.lock +0 -0
  449. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/release-tools.in +0 -0
  450. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/release-tools.txt +0 -0
  451. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/test-tools.in +0 -0
  452. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/requirements/test-tools.txt +0 -0
  453. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/a11y_check.py +0 -0
  454. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/bench_cli.sh +0 -0
  455. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/build_command_reference.py +0 -0
  456. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/build_demo_index.py +0 -0
  457. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/build_registries.py +0 -0
  458. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/build_roadmap.py +0 -0
  459. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/build_scale_corpus.py +0 -0
  460. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/check_anchors.py +0 -0
  461. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/check_licenses.py +0 -0
  462. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/check_required_checks.py +0 -0
  463. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/ensure_eval_corpus.sh +0 -0
  464. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/eval_explain.py +0 -0
  465. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/eval_gate.py +0 -0
  466. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/eval_recommend.py +0 -0
  467. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/eval_retrieval.py +0 -0
  468. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/eval_stats_summary.py +0 -0
  469. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/import_budget.py +0 -0
  470. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/lock_toolchain.py +0 -0
  471. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/measure_registry.py +0 -0
  472. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/mutation_gate.py +0 -0
  473. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/mutation_shards.py +0 -0
  474. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/mutation_weights.json +0 -0
  475. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/page_budget.py +0 -0
  476. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/perf_gate.py +0 -0
  477. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/post_deploy_smoke.py +0 -0
  478. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/publish_eval_json.py +0 -0
  479. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/release_guard.py +0 -0
  480. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/release_preflight.py +0 -0
  481. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/scripts/serve_docs.py +0 -0
  482. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/setup.cfg +0 -0
  483. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/sonar-project.properties +0 -0
  484. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/style/README.md +0 -0
  485. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/style/boost.css +0 -0
  486. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/style/boost.js +0 -0
  487. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/style/demo.html +0 -0
  488. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/adapt.feature +0 -0
  489. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/browse.feature +0 -0
  490. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/count.feature +0 -0
  491. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/discover.feature +0 -0
  492. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/doctor.feature +0 -0
  493. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/environment.py +0 -0
  494. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/explain.feature +0 -0
  495. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/index.feature +0 -0
  496. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/install.feature +0 -0
  497. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/list.feature +0 -0
  498. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/mcp.feature +0 -0
  499. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/search.feature +0 -0
  500. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/cli_steps.py +0 -0
  501. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/discovery_steps.py +0 -0
  502. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/mcp_steps.py +0 -0
  503. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/quality_steps.py +0 -0
  504. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/conftest.py +0 -0
  505. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/baseline.json +0 -0
  506. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/explain.jsonl +0 -0
  507. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/golden-natural.jsonl +0 -0
  508. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/golden.jsonl +0 -0
  509. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/recommend.jsonl +0 -0
  510. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/taps-scale.txt +0 -0
  511. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/eval/taps.txt +0 -0
  512. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_capabilities_policy.py +0 -0
  513. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_adapt.py +0 -0
  514. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_bmad.py +0 -0
  515. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_chat.py +0 -0
  516. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_configuration.py +0 -0
  517. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_discovery.py +0 -0
  518. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_hooks.py +0 -0
  519. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_info.py +0 -0
  520. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_intelligence.py +0 -0
  521. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_pkg.py +0 -0
  522. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_quality.py +0 -0
  523. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_taps.py +0 -0
  524. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_cli_team.py +0 -0
  525. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_everyday_loop.py +0 -0
  526. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_integrity_enforce.py +0 -0
  527. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_kind_conformance.py +0 -0
  528. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_property_parsers.py +0 -0
  529. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_run.py +0 -0
  530. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_tap_signing.py +0 -0
  531. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/functional/test_workspace_scope.py +0 -0
  532. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/README.md +0 -0
  533. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  534. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  535. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  536. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  537. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  538. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  539. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  540. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  541. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  542. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  543. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  544. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  545. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  546. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  547. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  548. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  549. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  550. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  551. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  552. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  553. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/fuzz_frontmatter.py +0 -0
  554. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/fuzz/fuzz_registry.py +0 -0
  555. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/langchain/conftest.py +0 -0
  556. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/langchain/test_graph.py +0 -0
  557. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/langchain/test_loader.py +0 -0
  558. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/langchain/test_retriever.py +0 -0
  559. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/make_fixture.py +0 -0
  560. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/perf/test_benchmarks.py +0 -0
  561. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/smoke.sh +0 -0
  562. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_a11y_check.py +0 -0
  563. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_action_pin_lockstep.py +0 -0
  564. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_adapters.py +0 -0
  565. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_adapters_multi.py +0 -0
  566. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_adapters_runner.py +0 -0
  567. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_agents.py +0 -0
  568. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_ai.py +0 -0
  569. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_bmad_core.py +0 -0
  570. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_boost_first_offer.py +0 -0
  571. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_bootstrap.py +0 -0
  572. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_builtin.py +0 -0
  573. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_capabilities.py +0 -0
  574. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_catalog.py +0 -0
  575. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_chat.py +0 -0
  576. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_check_anchors.py +0 -0
  577. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_check_licenses.py +0 -0
  578. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_claude_settings.py +0 -0
  579. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_cliparse.py +0 -0
  580. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_codeql_analysis_key.py +0 -0
  581. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_command_reference_fresh.py +0 -0
  582. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_community_health_files.py +0 -0
  583. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_complete.py +0 -0
  584. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_config.py +0 -0
  585. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_content_dedupe.py +0 -0
  586. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dedup_trust.py +0 -0
  587. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_demo_index.py +0 -0
  588. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dense.py +0 -0
  589. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dense_fallback.py +0 -0
  590. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dense_fix_hint.py +0 -0
  591. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dense_shards.py +0 -0
  592. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dense_status.py +0 -0
  593. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_dependabot_config.py +0 -0
  594. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_docs_pages_linked.py +0 -0
  595. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_docsite_chrome.py +0 -0
  596. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_ed25519.py +0 -0
  597. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_embed.py +0 -0
  598. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_embed_local.py +0 -0
  599. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_entry_key.py +0 -0
  600. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_errors_and_cli_table.py +0 -0
  601. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_baseline.py +0 -0
  602. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_corpus.py +0 -0
  603. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_faithfulness.py +0 -0
  604. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_gate.py +0 -0
  605. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_grading.py +0 -0
  606. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_metrics.py +0 -0
  607. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_eval_stats_summary.py +0 -0
  608. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  609. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_faithfulness.py +0 -0
  610. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_frontmatter.py +0 -0
  611. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_fuzz_targets.py +0 -0
  612. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  613. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_gitleaks_config.py +0 -0
  614. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_gitutil.py +0 -0
  615. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_gitutil_lfs.py +0 -0
  616. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_imperative.py +0 -0
  617. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_import_budget.py +0 -0
  618. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_injectscan.py +0 -0
  619. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_installscan.py +0 -0
  620. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_integrity.py +0 -0
  621. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_journal.py +0 -0
  622. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_langchain_packaging.py +0 -0
  623. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_link_ownership.py +0 -0
  624. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_localembed.py +0 -0
  625. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_localembed_e2e.py +0 -0
  626. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_lockfile.py +0 -0
  627. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_logs.py +0 -0
  628. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_marketing_counts.py +0 -0
  629. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mcp.py +0 -0
  630. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mcp_install_scan.py +0 -0
  631. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mcpdecl.py +0 -0
  632. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mcphost.py +0 -0
  633. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_measure_registry.py +0 -0
  634. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_minisign.py +0 -0
  635. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mutation_hardening.py +0 -0
  636. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mutation_shards.py +0 -0
  637. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mutation_subfile_shards.py +0 -0
  638. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_mutmut_source_paths.py +0 -0
  639. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_nethttp.py +0 -0
  640. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_output.py +0 -0
  641. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_page_budget.py +0 -0
  642. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_paths.py +0 -0
  643. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_perf_gate.py +0 -0
  644. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_pkg_confusions.py +0 -0
  645. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_pkg_injection.py +0 -0
  646. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_pkg_secrets.py +0 -0
  647. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_platform_pins.py +0 -0
  648. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_policy.py +0 -0
  649. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_post_deploy_smoke.py +0 -0
  650. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_project_mcp_sidecar.py +0 -0
  651. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_projectlock.py +0 -0
  652. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_provenance.py +0 -0
  653. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_publish_golden_dataset.py +0 -0
  654. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_rag.py +0 -0
  655. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_rag_fusion.py +0 -0
  656. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_registries_fresh.py +0 -0
  657. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_registry.py +0 -0
  658. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_registry_categories.py +0 -0
  659. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_registry_control_chars.py +0 -0
  660. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_release_guard.py +0 -0
  661. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_release_preflight.py +0 -0
  662. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_required_checks.py +0 -0
  663. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_resolve.py +0 -0
  664. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_roadmap_fresh.py +0 -0
  665. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_rules.py +0 -0
  666. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_scale_corpus.py +0 -0
  667. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_scopes.py +0 -0
  668. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_secretscan.py +0 -0
  669. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_selfupdate.py +0 -0
  670. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_serve.py +0 -0
  671. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_serve_docs.py +0 -0
  672. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_smoke_covers_every_command.py +0 -0
  673. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_spin.py +0 -0
  674. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_stackprobe.py +0 -0
  675. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_staleness.py +0 -0
  676. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_store.py +0 -0
  677. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  678. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_token_parity.py +0 -0
  679. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_toolchain_lock.py +0 -0
  680. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_trustaudit.py +0 -0
  681. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_typosquat.py +0 -0
  682. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_updatediff.py +0 -0
  683. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_util.py +0 -0
  684. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_version.py +0 -0
  685. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_concurrency.py +0 -0
  686. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  687. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  688. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_timeouts.py +0 -0
  689. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_workflows.py +0 -0
  690. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  691. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/visual/a11y_check.mjs +0 -0
  692. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/visual/console_check.mjs +0 -0
  693. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/visual/package-lock.json +0 -0
  694. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/tests/visual/package.json +0 -0
  695. {boost_skill_cli-1.0.447 → boost_skill_cli-1.0.448}/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.447
3
+ Version: 1.0.448
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.447'
22
- __version_tuple__ = version_tuple = (1, 0, 447)
21
+ __version__ = version = '1.0.448'
22
+ __version_tuple__ = version_tuple = (1, 0, 448)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -17,6 +17,7 @@ import json
17
17
  import sqlite3
18
18
  from pathlib import Path
19
19
 
20
+ from ..errors import BoostError
20
21
  from . import catalog, embed, paths
21
22
  from .rag import Hit, chunk, entry_key, read_body
22
23
 
@@ -385,29 +386,57 @@ def export_shard(tap: str) -> dict:
385
386
  the embedding space that produced them, so provider/model/dim have to travel
386
387
  with the rows, and the registry commit has to travel too or a stale shard
387
388
  would be indistinguishable from a current one.
389
+
390
+ Raises :class:`BoostError` when the rows are present and unreadable, which is
391
+ a different problem from having none — see below.
388
392
  """
389
- # Plain sqlite3, NOT _connect: exporting reads `chunks`, `meta` and the
390
- # stored embedding blobs, all ordinary tables. Routing through _connect
391
- # would make export impossible without the sqlite-vec extension — the same
392
- # trap `_recorded_meta` documents — and a machine that built vectors and
393
- # then dropped the extra is exactly the one whose shard is worth having.
394
393
  if not db_path().exists():
395
394
  return {"tap": tap, "chunks": []}
396
- try:
397
- con = sqlite3.connect(str(db_path()))
398
- except sqlite3.Error:
399
- return {"tap": tap, "chunks": []}
395
+ # `vec_chunks` is a vec0 VIRTUAL table, so reading an embedding needs the
396
+ # extension loaded: on a plain connection the join below raises `no such
397
+ # module: vec0`, every time, for every tap. An earlier revision opened
398
+ # plainly on the theory that export "reads ordinary tables" — true of
399
+ # `chunks` and `meta`, false of the one relation holding the vectors — and
400
+ # the resulting failure was swallowed into an empty shard. That is why no
401
+ # scheduled `shards` run has ever produced an artifact. Fall back to a plain
402
+ # connection anyway: it still serves a store whose vectors live in an
403
+ # ordinary table, and it is what makes the distinction below observable
404
+ # rather than an exception from the connect call.
405
+ con = _connect()
406
+ if con is None:
407
+ try:
408
+ con = sqlite3.connect(str(db_path()))
409
+ except sqlite3.Error:
410
+ return {"tap": tap, "chunks": []}
400
411
  try:
401
412
  meta = _read_meta(con)
402
413
  commits = meta.get("commits")
403
414
  commit = ""
404
415
  if isinstance(commits, dict):
405
416
  commit = str(commits.get(tap.replace("/", "__")) or "")
417
+ # `chunks` alone, first, because it is an ordinary table and therefore
418
+ # always readable. It answers the question the caller's error message
419
+ # depends on: are there rows for this tap at all?
420
+ expected = _tap_chunk_count(con, tap)
406
421
  chunks = []
407
- for row in con.execute(
422
+ try:
423
+ rows = con.execute(
408
424
  "SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding "
409
425
  "FROM chunks c JOIN vec_chunks v ON v.rowid = c.id "
410
- "WHERE c.tap = ? ORDER BY c.id", (tap,)):
426
+ "WHERE c.tap = ? ORDER BY c.id", (tap,)).fetchall()
427
+ except sqlite3.Error as exc:
428
+ # Only a tap that HAS chunks can have unreadable ones. With none,
429
+ # the vector relation not resolving says nothing about this tap —
430
+ # it is the ordinary "nothing built here" case, and the caller's
431
+ # "build them first" is the right answer.
432
+ if not expected:
433
+ return {"tap": tap, "chunks": []}
434
+ raise _unreadable_vectors(tap, expected, exc) from exc
435
+ if expected and not rows:
436
+ # The join resolved but produced nothing for a tap that has chunks:
437
+ # the vector rows are gone or unlinked. Still not "never built".
438
+ raise _unreadable_vectors(tap, expected, None)
439
+ for row in rows:
411
440
  name, ctap, path, kind, cix, snip, emb = row
412
441
  chunks.append({
413
442
  "name": name, "tap": ctap, "path": path, "kind": kind,
@@ -420,12 +449,43 @@ def export_shard(tap: str) -> dict:
420
449
  "provider": meta.get("provider"), "model": meta.get("model"),
421
450
  "dim": meta.get("dim"), "version": INDEX_VERSION,
422
451
  "chunks": chunks}
423
- except sqlite3.Error:
424
- return {"tap": tap, "chunks": []}
425
452
  finally:
426
453
  con.close()
427
454
 
428
455
 
456
+ def _tap_chunk_count(con: sqlite3.Connection, tap: str) -> int:
457
+ """How many chunk rows this tap has, or 0 when `chunks` is unreadable.
458
+
459
+ Deliberately forgiving: a store with no `chunks` table has nothing built,
460
+ which is the ordinary empty case rather than the corrupt one.
461
+ """
462
+ try:
463
+ row = con.execute("SELECT COUNT(*) FROM chunks WHERE tap = ?",
464
+ (tap,)).fetchone()
465
+ except sqlite3.Error:
466
+ return 0
467
+ return int(row[0]) if row else 0
468
+
469
+
470
+ def _unreadable_vectors(tap: str, expected: int,
471
+ exc: sqlite3.Error | None) -> BoostError:
472
+ """The error for "the rows are there, and this process cannot read them".
473
+
474
+ Kept apart from the empty case on purpose. Both used to surface as `no
475
+ vectors for <tap>` with the hint `build them first with reindex --dense` —
476
+ advice that is correct for an unbuilt store and a dead end for this one,
477
+ because `reindex --dense` is what wrote the rows the message says are
478
+ missing. Two scheduled `shards` runs died against that loop.
479
+ """
480
+ detail = ": %s" % exc if exc is not None else ""
481
+ return BoostError(
482
+ "%s has %d embedded chunk%s but its vectors cannot be read%s"
483
+ % (tap, expected, "" if expected == 1 else "s", detail),
484
+ hint="reading vectors needs the sqlite-vec extension — install the "
485
+ "`rag` extra (`pip install 'boost-skill-cli[rag]'`); the rows "
486
+ "themselves are intact, so no re-embedding is required")
487
+
488
+
429
489
  def import_shard(shard: dict, commit: str) -> tuple[bool, str]:
430
490
  """Merge a prebuilt shard into this machine's store. ``(ok, reason)``.
431
491
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.447
3
+ Version: 1.0.448
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -385,6 +385,7 @@ docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md
385
385
  docs/roadmap/items/serve-404-reflected-the-request.md
386
386
  docs/roadmap/items/serve-is-a-searchable-catalogue.md
387
387
  docs/roadmap/items/serve-py-traversal-guards-untested.md
388
+ docs/roadmap/items/shards-pipeline-never-produced-a-shard.md
388
389
  docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
389
390
  docs/roadmap/items/single-imperative-rule-extractor.md
390
391
  docs/roadmap/items/single-tech-stack-prober.md
@@ -583,6 +584,8 @@ tests/unit/test_demo_index.py
583
584
  tests/unit/test_dense.py
584
585
  tests/unit/test_dense_fallback.py
585
586
  tests/unit/test_dense_fix_hint.py
587
+ tests/unit/test_dense_shard_real_schema.py
588
+ tests/unit/test_dense_shard_unreadable_vectors.py
586
589
  tests/unit/test_dense_shards.py
587
590
  tests/unit/test_dense_status.py
588
591
  tests/unit/test_dependabot_config.py
@@ -664,6 +667,7 @@ tests/unit/test_secretscan.py
664
667
  tests/unit/test_selfupdate.py
665
668
  tests/unit/test_serve.py
666
669
  tests/unit/test_serve_docs.py
670
+ tests/unit/test_shards_matrix.py
667
671
  tests/unit/test_smoke_covers_every_command.py
668
672
  tests/unit/test_spin.py
669
673
  tests/unit/test_stackprobe.py
@@ -0,0 +1,78 @@
1
+ ---
2
+ id: shards-pipeline-never-produced-a-shard
3
+ board: code
4
+ section: internals
5
+ status: shipped
6
+ category: Build · Bug
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: two scheduled runs, 0 artifacts — 40 of 60 jobs tapped a bare SHA, and the other 20 hit an export that cannot work
11
+ order: 105
12
+ owner: fix/shards-pipeline
13
+ pr:
14
+ title: The shards workflow has never once produced a shard
15
+ ---
16
+ <code>shards.yml</code> publishes prebuilt dense-vector shards so a keyless user gets semantic search
17
+ without paying to embed the catalogue — measured at <b>~1.2&nbsp;s/chunk</b> on CPU, 74 minutes for
18
+ 743 entries, which is what makes step 2 of the keyless epic a requirement rather than an
19
+ optimisation. It has run twice on its weekly schedule, <b>2026-08-02</b> and <b>2026-08-09</b>, and
20
+ uploaded <b>nothing</b> either time. Two independent bugs, one in the workflow and one in the engine,
21
+ and a scheduled job is exactly where two of those can sit unnoticed: nobody is waiting on a cron.
22
+
23
+ <b>First bug — the matrix is fields, not rows.</b> A <code>tests/eval/taps.txt</code> row is
24
+ <code>owner/repo &lt;40-char sha&gt; &lt;entry count&gt;</code>, and the plan step built its matrix
25
+ with <code>grep -v '^#' tests/eval/taps.txt | tr '\n' ' '</code> and then split on whitespace. That
26
+ does not split the file into rows, it splits it into <b>fields</b>: twenty registries became a
27
+ <b>sixty</b>-entry matrix — twenty repos, twenty bare SHAs and twenty integers, each dispatched to a
28
+ job that ran <code>boost tap</code> on it. The run is full of <code>build (18)</code>,
29
+ <code>build (1616)</code> and
30
+ <code>build (b29e7cf65e5cb78a5ac33d582270551bc74a14eb)</code>. Two thirds of the fleet could never
31
+ do anything but fail.
32
+
33
+ <code>scripts/eval_corpus.parse_taps</code> already parses this format correctly and is already
34
+ tested — the workflow had reimplemented it in one line of shell and got it wrong. It now calls
35
+ <code>--list-repos</code>, a new flag that prints one name per line, so the row/field distinction is
36
+ made once in tested Python instead of re-decided in <code>bash</code>. Deliberately <i>not</i>
37
+ <code>--list</code>, which also prints the SHA and count: a caller that splits <i>that</i> on
38
+ whitespace reproduces the bug exactly.
39
+
40
+ <b>Second bug — the export cannot succeed, on any machine.</b> The twenty real registries got past
41
+ <code>tap and embed</code> and died in <code>export the shard</code> with
42
+ <code>no vectors for 'anthropics/skills'</code>, whose hint reads <i>build them first with
43
+ <code>boost reindex --dense</code></i> — the step that had just run, green, in the line above.
44
+ <code>dense.export_shard</code> opened the store with a <b>plain</b> <code>sqlite3</code> connection
45
+ on the stated theory that it "reads <code>chunks</code>, <code>meta</code> and the stored blobs, all
46
+ ordinary tables". True of the first two; false of the third. <code>vec_chunks</code> is a
47
+ <b><code>vec0</code> virtual table</b>, so the join raises <code>no such module: vec0</code> — always,
48
+ every tap — and <code>except sqlite3.Error</code> turned that into <code>chunks: []</code>.
49
+
50
+ Proven rather than reasoned: build a store through the real path, reopen it plainly, and the join
51
+ raises <code>OperationalError: no such module: vec0</code>. The comment was an accurate description
52
+ of an intention and an inaccurate one of the code.
53
+
54
+ <b>Why the test suite was no help — the fixture disagreed with production in the one way that
55
+ mattered.</b> Every shard test hand-builds its store with <code>CREATE TABLE vec_chunks</code>, an
56
+ <i>ordinary</i> table, and <code>with_backend</code> patches <code>_connect</code> to a plain
57
+ connection. Both are fair shortcuts for tests about validation. Together they mean no test in that
58
+ file ever met a virtual table, so <b>twenty passing tests coexisted with a feature that had never
59
+ worked</b>. There is even a class named <code>TestWorksWithoutTheExtension</code> asserting the
60
+ false claim — written, its docstring says, after an earlier version shipped broken the opposite way.
61
+ That is the shape to remember: the first fix traded a failure that was loud for one that was silent,
62
+ and the fixture blessed it.
63
+
64
+ <b>Fixed by separating two states the old code collapsed.</b> <code>chunks</code> is an ordinary
65
+ table and always readable, so it can answer "are there rows for this tap at all?" before the join is
66
+ attempted. No rows means the shard is empty and <i>"build them first"</i> is right. Rows present but
67
+ unreadable is a different problem with a different fix, and now says so, naming the
68
+ <code>sqlite-vec</code> extension and stating that <b>no re-embedding is required</b> — the rows are
69
+ intact. Sending someone back to a 74-minute embed to solve a missing dependency is the part that
70
+ cost two runs.
71
+
72
+ <b>Both halves are pinned, and one of them runs without the extra.</b>
73
+ <code>test_dense_shard_real_schema.py</code> builds through <code>_ensure_schema</code> and the real
74
+ <code>vec0</code> table — the only test here that failed before the fix — but it <i>skips</i> without
75
+ <code>sqlite-vec</code>, which would leave a bare runner blind.
76
+ <code>test_dense_shard_unreadable_vectors.py</code> pins the same contract with nothing installed, by
77
+ presenting the store as a plain connection sees it: ordinary tables readable, vector relation not
78
+ resolving. Both were run against the pre-fix code and both go red, so neither is decorative.
@@ -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>243</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>244</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -3791,6 +3791,81 @@ looking is worse than no guard, because the green tick still appears.</p></detai
3791
3791
  </div>
3792
3792
  </article>
3793
3793
 
3794
+ <article class="cap rcard" id="shards-pipeline-never-produced-a-shard">
3795
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Build · Bug</span></div>
3796
+ <h3>The shards workflow has never once produced a shard</h3>
3797
+ <details class="cardbody"><summary>Write-up</summary>
3798
+ <p><code>shards.yml</code> publishes prebuilt dense-vector shards so a keyless user gets semantic search
3799
+ without paying to embed the catalogue — measured at <b>~1.2&nbsp;s/chunk</b> on CPU, 74 minutes for
3800
+ 743 entries, which is what makes step 2 of the keyless epic a requirement rather than an
3801
+ optimisation. It has run twice on its weekly schedule, <b>2026-08-02</b> and <b>2026-08-09</b>, and
3802
+ uploaded <b>nothing</b> either time. Two independent bugs, one in the workflow and one in the engine,
3803
+ and a scheduled job is exactly where two of those can sit unnoticed: nobody is waiting on a cron.
3804
+
3805
+ <b>First bug — the matrix is fields, not rows.</b> A <code>tests/eval/taps.txt</code> row is
3806
+ <code>owner/repo &lt;40-char sha&gt; &lt;entry count&gt;</code>, and the plan step built its matrix
3807
+ with <code>grep -v '^#' tests/eval/taps.txt | tr '\n' ' '</code> and then split on whitespace. That
3808
+ does not split the file into rows, it splits it into <b>fields</b>: twenty registries became a
3809
+ <b>sixty</b>-entry matrix — twenty repos, twenty bare SHAs and twenty integers, each dispatched to a
3810
+ job that ran <code>boost tap</code> on it. The run is full of <code>build (18)</code>,
3811
+ <code>build (1616)</code> and
3812
+ <code>build (b29e7cf65e5cb78a5ac33d582270551bc74a14eb)</code>. Two thirds of the fleet could never
3813
+ do anything but fail.
3814
+
3815
+ <code>scripts/eval_corpus.parse_taps</code> already parses this format correctly and is already
3816
+ tested — the workflow had reimplemented it in one line of shell and got it wrong. It now calls
3817
+ <code>--list-repos</code>, a new flag that prints one name per line, so the row/field distinction is
3818
+ made once in tested Python instead of re-decided in <code>bash</code>. Deliberately <i>not</i>
3819
+ <code>--list</code>, which also prints the SHA and count: a caller that splits <i>that</i> on
3820
+ whitespace reproduces the bug exactly.
3821
+
3822
+ <b>Second bug — the export cannot succeed, on any machine.</b> The twenty real registries got past
3823
+ <code>tap and embed</code> and died in <code>export the shard</code> with
3824
+ <code>no vectors for 'anthropics/skills'</code>, whose hint reads <i>build them first with
3825
+ <code>boost reindex --dense</code></i> — the step that had just run, green, in the line above.
3826
+ <code>dense.export_shard</code> opened the store with a <b>plain</b> <code>sqlite3</code> connection
3827
+ on the stated theory that it "reads <code>chunks</code>, <code>meta</code> and the stored blobs, all
3828
+ ordinary tables". True of the first two; false of the third. <code>vec_chunks</code> is a
3829
+ <b><code>vec0</code> virtual table</b>, so the join raises <code>no such module: vec0</code> — always,
3830
+ every tap — and <code>except sqlite3.Error</code> turned that into <code>chunks: []</code>.
3831
+
3832
+ Proven rather than reasoned: build a store through the real path, reopen it plainly, and the join
3833
+ raises <code>OperationalError: no such module: vec0</code>. The comment was an accurate description
3834
+ of an intention and an inaccurate one of the code.
3835
+
3836
+ <b>Why the test suite was no help — the fixture disagreed with production in the one way that
3837
+ mattered.</b> Every shard test hand-builds its store with <code>CREATE TABLE vec_chunks</code>, an
3838
+ <i>ordinary</i> table, and <code>with_backend</code> patches <code>_connect</code> to a plain
3839
+ connection. Both are fair shortcuts for tests about validation. Together they mean no test in that
3840
+ file ever met a virtual table, so <b>twenty passing tests coexisted with a feature that had never
3841
+ worked</b>. There is even a class named <code>TestWorksWithoutTheExtension</code> asserting the
3842
+ false claim — written, its docstring says, after an earlier version shipped broken the opposite way.
3843
+ That is the shape to remember: the first fix traded a failure that was loud for one that was silent,
3844
+ and the fixture blessed it.
3845
+
3846
+ <b>Fixed by separating two states the old code collapsed.</b> <code>chunks</code> is an ordinary
3847
+ table and always readable, so it can answer "are there rows for this tap at all?" before the join is
3848
+ attempted. No rows means the shard is empty and <i>"build them first"</i> is right. Rows present but
3849
+ unreadable is a different problem with a different fix, and now says so, naming the
3850
+ <code>sqlite-vec</code> extension and stating that <b>no re-embedding is required</b> — the rows are
3851
+ intact. Sending someone back to a 74-minute embed to solve a missing dependency is the part that
3852
+ cost two runs.
3853
+
3854
+ <b>Both halves are pinned, and one of them runs without the extra.</b>
3855
+ <code>test_dense_shard_real_schema.py</code> builds through <code>_ensure_schema</code> and the real
3856
+ <code>vec0</code> table — the only test here that failed before the fix — but it <i>skips</i> without
3857
+ <code>sqlite-vec</code>, which would leave a bare runner blind.
3858
+ <code>test_dense_shard_unreadable_vectors.py</code> pins the same contract with nothing installed, by
3859
+ presenting the store as a plain connection sees it: ordinary tables readable, vector relation not
3860
+ resolving. Both were run against the pre-fix code and both go red, so neither is decorative.</p></details>
3861
+ <div class="meta">
3862
+ <span class="m">Complexity <b>M</b></span>
3863
+ <span class="m hi">Impact <b>High</b></span>
3864
+ <span class="m">Wow <b class="wow">★★★★</b></span>
3865
+ <span class="m">two scheduled runs, 0 artifacts — 40 of 60 jobs tapped a bare SHA, and the other 20 hit an export that cannot work</span>
3866
+ </div>
3867
+ </article>
3868
+
3794
3869
  <article class="cap rcard" id="sync-could-not-repair-a-gutted-skill">
3795
3870
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
3796
3871
  <h3>The repair command could not repair the thing two commands sent you to it for</h3>
@@ -548,6 +548,9 @@ def main(argv: list[str] | None = None) -> int:
548
548
  help="static concentration/count checks, no network")
549
549
  p.add_argument("--list", action="store_true",
550
550
  help="print the parsed rows and exit")
551
+ p.add_argument("--list-repos", action="store_true",
552
+ help="print one owner/repo per line and exit (a matrix "
553
+ "source that cannot be field-split by mistake)")
551
554
  p.add_argument("--taps", metavar="PATH", default=str(DEFAULT_TAPS),
552
555
  help="corpus list to act on (default the required corpus; "
553
556
  "%s is the scale tier)" % SCALE_TAPS.name)
@@ -555,6 +558,14 @@ def main(argv: list[str] | None = None) -> int:
555
558
  taps = Path(args.taps)
556
559
  if not taps.is_file():
557
560
  raise SystemExit("no such corpus list: %s" % taps)
561
+ if args.list_repos:
562
+ # Names only, one per line. `--list` prints the SHA and count too, and
563
+ # a caller that splits THAT on whitespace gets three matrix entries per
564
+ # row — which is exactly how shards.yml ended up dispatching 60 jobs
565
+ # for 20 registries, two thirds of them tapping a bare SHA or integer.
566
+ for repo, _sha, _count in parse_taps(taps.read_text(encoding="utf-8")):
567
+ print(repo)
568
+ return 0
558
569
  if args.list:
559
570
  for repo, sha, count in parse_taps(taps.read_text(encoding="utf-8")):
560
571
  print("%s %s %s" % (repo, sha or "", "" if count is None else count))
@@ -567,7 +578,8 @@ def main(argv: list[str] | None = None) -> int:
567
578
  return _ensure(taps, relock=True)
568
579
  if args.ensure:
569
580
  return _ensure(taps)
570
- p.error("provide --ensure, --relock, --refresh, --audit or --list")
581
+ p.error("provide --ensure, --relock, --refresh, --audit, --list "
582
+ "or --list-repos")
571
583
  return 2
572
584
 
573
585
 
@@ -0,0 +1,155 @@
1
+ """Unit tests: export a shard from the schema production actually writes.
2
+
3
+ Every other shard test builds its fixture by hand, and every one of them makes
4
+ ``vec_chunks`` an **ordinary** table. That is a fair shortcut for tests about
5
+ validation, and it is also why the shard feature could ship broken twice: the
6
+ real :func:`dense._ensure_schema` writes
7
+
8
+ CREATE VIRTUAL TABLE vec_chunks USING vec0(embedding float[N] ...)
9
+
10
+ and a virtual table is exactly the thing a hand-rolled ``CREATE TABLE`` fixture
11
+ cannot stand in for. Against the fixture a plain connection reads the join
12
+ happily; against the real store it raises ``no such module: vec0``.
13
+
14
+ So this file refuses to hand-build anything. It creates the store through
15
+ ``dense._connect`` and ``dense._ensure_schema`` — the production path — and then
16
+ asks for a shard. It is the only test here that would have failed before the
17
+ fix, and the only one that will fail if the storage layer moves again.
18
+
19
+ It **skips without ``sqlite-vec``**, which is the honest cost of testing the real
20
+ schema and the reason it is not the whole defence:
21
+ ``test_dense_shard_unreadable_vectors.py`` pins the same contract with no extra
22
+ installed, so a runner that skips this file is still not blind. Do not "fix" the
23
+ skip by faking the extension — a fake vec0 is the fixture that hid the bug.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import json
28
+
29
+ import pytest
30
+
31
+ from boost_cli.core import dense, paths
32
+
33
+ sqlite_vec = pytest.importorskip(
34
+ "sqlite_vec",
35
+ reason="the real vec0 schema needs the [rag] extra; the contract is also "
36
+ "pinned extension-free in test_dense_shard_unreadable_vectors.py")
37
+
38
+
39
+ def _extension_loadable() -> bool:
40
+ """True when this interpreter can actually create a vec0 table.
41
+
42
+ Importing ``sqlite_vec`` is NOT enough, and assuming it was reddened all
43
+ three macOS legs of PR #503 with ``sqlite-vec imported but _connect returned
44
+ None``. Loading an extension needs
45
+ ``sqlite3.Connection.enable_load_extension``, which CPython only exposes
46
+ when its bundled SQLite was built with extension support — macOS builds
47
+ routinely are not. So the package imports, ``dense._load()`` returns it, and
48
+ ``dense._connect()`` still returns ``None``.
49
+
50
+ Probe the capability rather than a proxy for it: build the thing these tests
51
+ need and see whether it works. Exactly the mistake this file exists to
52
+ correct, one level up — a fixture that stood in for the real schema is what
53
+ hid the bug, and an import that stood in for the real capability is what
54
+ broke the fix.
55
+ """
56
+ import sqlite3
57
+ con = sqlite3.connect(":memory:")
58
+ try:
59
+ con.enable_load_extension(True)
60
+ sqlite_vec.load(con)
61
+ con.execute("CREATE VIRTUAL TABLE t USING vec0(embedding float[2])")
62
+ return True
63
+ except (AttributeError, sqlite3.Error):
64
+ return False
65
+ finally:
66
+ con.close()
67
+
68
+
69
+ pytestmark = pytest.mark.skipif(
70
+ not _extension_loadable(),
71
+ reason="this interpreter cannot load sqlite extensions (macOS CPython is "
72
+ "commonly built without support), so the real vec0 schema is "
73
+ "unreachable — the extension-free half of the contract still runs "
74
+ "in test_dense_shard_unreadable_vectors.py")
75
+
76
+ DIM = 4
77
+
78
+
79
+ def _production_store(tap: str = "acme/skills", rows: int = 2):
80
+ """A store built the way `dense.build` builds one — vec0 and all."""
81
+ paths.ensure_dirs()
82
+ con = dense._connect()
83
+ # The module-level skipif already proved the extension loads here, so a
84
+ # None now is a real regression in _connect rather than a missing extra.
85
+ assert con is not None, \
86
+ "_connect returned None although vec0 loads on this interpreter"
87
+ try:
88
+ dense._ensure_schema(con, DIM)
89
+ for i in range(rows):
90
+ cur = con.execute(
91
+ "INSERT INTO chunks (name, tap, path, kind, cix, snip) "
92
+ "VALUES (?, ?, ?, ?, ?, ?)",
93
+ ("skill-%d" % i, tap, "skill-%d/SKILL.md" % i, "skill", 0,
94
+ "snippet %d" % i))
95
+ con.execute(
96
+ "INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
97
+ (cur.lastrowid,
98
+ sqlite_vec.serialize_float32([0.1 * (i + 1)] * DIM)))
99
+ meta = {"version": dense.INDEX_VERSION, "provider": "local",
100
+ "model": "bge-small-en-v1.5", "dim": DIM,
101
+ "commits": {tap.replace("/", "__"): "c0ffee"}}
102
+ con.executemany("INSERT OR REPLACE INTO meta (k, v) VALUES (?, ?)",
103
+ [(k, json.dumps(v)) for k, v in meta.items()])
104
+ con.commit()
105
+ finally:
106
+ con.close()
107
+
108
+
109
+ class TestExportAgainstTheRealSchema:
110
+ """The regression. Before the fix every assertion here failed."""
111
+
112
+ def test_a_shard_carries_the_rows(self, sandbox):
113
+ _production_store(rows=2)
114
+ assert len(dense.export_shard("acme/skills")["chunks"]) == 2
115
+
116
+ def test_a_shard_carries_its_provenance(self, sandbox):
117
+ # shards.yml asserts on exactly these four before it uploads, so an
118
+ # export that returns rows without them still fails the workflow.
119
+ _production_store()
120
+ shard = dense.export_shard("acme/skills")
121
+ for field in ("provider", "model", "dim", "commit"):
122
+ assert shard.get(field), "%s missing from %r" % (field, shard)
123
+
124
+ def test_the_embeddings_survive_the_round_trip(self, sandbox):
125
+ import base64
126
+ _production_store(rows=1)
127
+ blob = dense.export_shard("acme/skills")["chunks"][0]["embedding"]
128
+ assert len(base64.b64decode(blob)) == 4 * DIM
129
+
130
+ def test_the_shard_is_json_serialisable(self, sandbox):
131
+ # It is written to a file by `reindex --export-shard` and uploaded.
132
+ _production_store()
133
+ json.dumps(dense.export_shard("acme/skills"))
134
+
135
+ def test_a_tap_with_no_rows_is_empty_not_an_error(self, sandbox):
136
+ # Same degradation as everywhere else, now confirmed on the real
137
+ # schema rather than inferred from the stand-in.
138
+ _production_store()
139
+ assert dense.export_shard("nobody/nothing")["chunks"] == []
140
+
141
+
142
+ class TestExportedShardImportsBack:
143
+ """End-to-end on the real schema: what CI publishes, a user can consume."""
144
+
145
+ def test_a_real_shard_is_accepted_by_import(self, sandbox):
146
+ _production_store(rows=2)
147
+ shard = dense.export_shard("acme/skills")
148
+ ok, reason = dense.import_shard(shard, commit="c0ffee")
149
+ assert ok, reason
150
+
151
+ def test_the_imported_rows_come_back_out_again(self, sandbox):
152
+ _production_store(rows=2)
153
+ shard = dense.export_shard("acme/skills")
154
+ dense.import_shard(shard, commit="c0ffee")
155
+ assert len(dense.export_shard("acme/skills")["chunks"]) == 2
@@ -0,0 +1,109 @@
1
+ """Unit tests: exporting a shard must not report "no vectors" when there are.
2
+
3
+ ``vec_chunks`` is a **vec0 virtual table**. A plain :mod:`sqlite3` connection has
4
+ no such module, so any statement touching it raises
5
+ ``OperationalError: no such module: vec0`` — and :func:`dense.export_shard` used
6
+ to catch ``sqlite3.Error`` and return ``{"chunks": []}``, which the command layer
7
+ turns into::
8
+
9
+ no vectors for 'anthropics/skills'
10
+ hint: build them first with `boost reindex --dense`
11
+
12
+ The hint names the step that had *just* run. Every scheduled ``shards`` run has
13
+ died there — 2026-08-02 and 2026-08-09, 20 of 20 registries, "tap and embed"
14
+ green and "export the shard" red — so the prebuilt-shard feature has never once
15
+ produced an artifact.
16
+
17
+ The existing suite could not see it. ``test_dense_shards._store`` builds
18
+ ``vec_chunks`` with ``CREATE TABLE`` — an ordinary table a plain connection reads
19
+ happily — and its ``with_backend`` fixture patches ``_connect`` to a plain
20
+ connection. Both are reasonable shortcuts for tests about *validation*, and
21
+ together they mean no test in that file exercises the schema production actually
22
+ writes. This file covers the gap from the other side, without needing the
23
+ extension installed: from a plain connection's point of view a vec0 table is
24
+ precisely "a relation I cannot read", which is what is simulated here.
25
+
26
+ The distinction being pinned is between two states the old code collapsed:
27
+
28
+ * the tap genuinely has no rows — empty shard, and "run reindex" is right;
29
+ * the rows are there and cannot be read — a different problem with a different
30
+ fix, and answering it with "run reindex" sends the reader back round a loop
31
+ they have already completed.
32
+ """
33
+ from __future__ import annotations
34
+
35
+ import json
36
+ import sqlite3
37
+
38
+ import pytest
39
+
40
+ from boost_cli.core import dense, paths
41
+ from boost_cli.errors import BoostError
42
+
43
+
44
+ def _store_with_unreadable_vectors(rows=(("a", "acme/skills"),), dim=3):
45
+ """``chunks`` populated, ``vec_chunks`` absent.
46
+
47
+ Stands in for the real store as a plain connection sees it: the ordinary
48
+ tables read fine and the vector relation does not resolve. Whether that is
49
+ ``no such module: vec0`` (production) or ``no such table`` (here) is the
50
+ same ``sqlite3.OperationalError`` reaching the same handler.
51
+ """
52
+ paths.ensure_dirs()
53
+ con = sqlite3.connect(str(dense.db_path()))
54
+ try:
55
+ con.execute("CREATE TABLE IF NOT EXISTS chunks ("
56
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, tap TEXT,"
57
+ " path TEXT, kind TEXT, cix INTEGER, snip TEXT)")
58
+ con.execute("CREATE TABLE IF NOT EXISTS meta (k TEXT PRIMARY KEY, v TEXT)")
59
+ for name, tap in rows:
60
+ con.execute(
61
+ "INSERT INTO chunks (name, tap, path, kind, cix, snip) "
62
+ "VALUES (?, ?, ?, ?, 0, ?)",
63
+ (name, tap, "%s/SKILL.md" % name, "skill", "snip"))
64
+ meta = {"version": dense.INDEX_VERSION, "provider": "local",
65
+ "model": "bge", "dim": dim, "commits": {"acme__skills": "c1"}}
66
+ con.executemany("INSERT OR REPLACE INTO meta (k, v) VALUES (?, ?)",
67
+ [(k, json.dumps(v)) for k, v in meta.items()])
68
+ con.commit()
69
+ finally:
70
+ con.close()
71
+
72
+
73
+ class TestUnreadableVectorsAreReportedNotSwallowed:
74
+ def test_export_raises_instead_of_returning_an_empty_shard(self, sandbox):
75
+ _store_with_unreadable_vectors()
76
+ with pytest.raises(BoostError):
77
+ dense.export_shard("acme/skills")
78
+
79
+ def test_the_message_does_not_tell_the_user_to_reindex(self, sandbox):
80
+ # THE WHOLE POINT. `reindex --dense` is what produced these rows; being
81
+ # sent back to it is what made the CI failure unreadable for two runs.
82
+ _store_with_unreadable_vectors()
83
+ with pytest.raises(BoostError) as caught:
84
+ dense.export_shard("acme/skills")
85
+ advice = "%s %s" % (caught.value, getattr(caught.value, "hint", "") or "")
86
+ assert "reindex" not in advice.lower(), advice
87
+
88
+ def test_the_message_names_the_vector_backend(self, sandbox):
89
+ # The actual fix is the sqlite-vec extension, so the text has to point
90
+ # there — a bare "cannot read" would leave the reader nowhere.
91
+ _store_with_unreadable_vectors()
92
+ with pytest.raises(BoostError) as caught:
93
+ dense.export_shard("acme/skills")
94
+ advice = ("%s %s" % (caught.value,
95
+ getattr(caught.value, "hint", "") or "")).lower()
96
+ assert "sqlite-vec" in advice or "rag" in advice, advice
97
+
98
+
99
+ class TestTheGenuinelyEmptyCasesStillDegrade:
100
+ """Only the unreadable case became an error. The rest must not regress."""
101
+
102
+ def test_no_store_at_all_is_still_an_empty_shard(self, sandbox):
103
+ assert dense.export_shard("acme/skills")["chunks"] == []
104
+
105
+ def test_a_tap_with_no_rows_is_still_an_empty_shard(self, sandbox):
106
+ # `chunks` is readable and simply has nothing for this tap. Here
107
+ # "build them first" IS the right advice, so this must not raise.
108
+ _store_with_unreadable_vectors(rows=(("a", "acme/skills"),))
109
+ assert dense.export_shard("nobody/nothing")["chunks"] == []