boost-skill-cli 1.2.2__tar.gz → 1.2.4__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 (723) hide show
  1. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.vale/styles/config/vocabularies/boost/accept.txt +3 -0
  2. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/CLAUDE.md +19 -0
  3. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/browse.py +27 -6
  6. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/catalog.py +110 -9
  7. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/dense.py +38 -14
  8. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/rag.py +7 -3
  9. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  10. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
  11. boost_skill_cli-1.2.4/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +56 -0
  12. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap.html +54 -1
  13. boost_skill_cli-1.2.4/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +172 -0
  14. boost_skill_cli-1.2.4/tests/unit/test_content_identity.py +437 -0
  15. boost_skill_cli-1.2.4/tests/unit/test_dense_embed_dedupe.py +216 -0
  16. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.gitattributes +0 -0
  17. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.gitignore +0 -0
  18. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.gitleaks.toml +0 -0
  19. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.htmlvalidate.json +0 -0
  20. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.lighthouserc.json +0 -0
  21. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.lycheeignore +0 -0
  22. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.markdownlint-cli2.jsonc +0 -0
  23. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.pre-commit-config.yaml +0 -0
  24. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.stylelintrc.json +0 -0
  25. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.vale/styles/boost/Terminology.yml +0 -0
  26. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/.vale.ini +0 -0
  27. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/CODE_OF_CONDUCT.md +0 -0
  28. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/CONTRIBUTING.md +0 -0
  29. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/LICENSE +0 -0
  30. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/MANIFEST.in +0 -0
  31. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/Makefile +0 -0
  32. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/README.md +0 -0
  33. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/SECURITY.md +0 -0
  34. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost +0 -0
  35. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/__init__.py +0 -0
  36. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/__main__.py +0 -0
  37. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/cli.py +0 -0
  38. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/cliparse.py +0 -0
  39. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/__init__.py +0 -0
  40. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/_common.py +0 -0
  41. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/bmad.py +0 -0
  42. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/configuration.py +0 -0
  43. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/discovery.py +0 -0
  44. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/hooks.py +0 -0
  45. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/info.py +0 -0
  46. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/intelligence.py +0 -0
  47. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/pkg.py +0 -0
  48. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/quality.py +0 -0
  49. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/run.py +0 -0
  50. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/safety.py +0 -0
  51. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/taps.py +0 -0
  52. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/commands/team.py +0 -0
  53. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/__init__.py +0 -0
  54. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/adapters.py +0 -0
  55. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/agents.py +0 -0
  56. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/ai.py +0 -0
  57. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/bmad.py +0 -0
  58. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/bootstrap.py +0 -0
  59. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/builtin.py +0 -0
  60. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/capabilities.py +0 -0
  61. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/catalogbundle.py +0 -0
  62. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/chat.py +0 -0
  63. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/claude_settings.py +0 -0
  64. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/complete.py +0 -0
  65. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/config.py +0 -0
  66. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/ed25519.py +0 -0
  67. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/embed.py +0 -0
  68. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/faithfulness.py +0 -0
  69. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/frontmatter.py +0 -0
  70. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/gitutil.py +0 -0
  71. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/imperative.py +0 -0
  72. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/injectscan.py +0 -0
  73. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/installscan.py +0 -0
  74. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/integrity.py +0 -0
  75. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/journal.py +0 -0
  76. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/localembed.py +0 -0
  77. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/lockfile.py +0 -0
  78. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/logs.py +0 -0
  79. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/mcp.py +0 -0
  80. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/mcpdecl.py +0 -0
  81. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/mcphost.py +0 -0
  82. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/minisign.py +0 -0
  83. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/nethttp.py +0 -0
  84. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/output.py +0 -0
  85. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/paths.py +0 -0
  86. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/policy.py +0 -0
  87. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/projectlock.py +0 -0
  88. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/provenance.py +0 -0
  89. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/registry.py +0 -0
  90. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/resolve.py +0 -0
  91. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/rules.py +0 -0
  92. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/scopes.py +0 -0
  93. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/secretscan.py +0 -0
  94. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/selfupdate.py +0 -0
  95. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/serve.py +0 -0
  96. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/stackprobe.py +0 -0
  97. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/staleness.py +0 -0
  98. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/store.py +0 -0
  99. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/trustaudit.py +0 -0
  100. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/typosquat.py +0 -0
  101. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/updatediff.py +0 -0
  102. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/util.py +0 -0
  103. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/core/workflows.py +0 -0
  104. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/data/registries.json +0 -0
  105. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/data/rules/boost-first.mdc +0 -0
  106. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/errors.py +0 -0
  107. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_cli/spin.py +0 -0
  108. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_langchain/__init__.py +0 -0
  109. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_langchain/_compat.py +0 -0
  110. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_langchain/graph.py +0 -0
  111. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_langchain/loader.py +0 -0
  112. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_langchain/py.typed +0 -0
  113. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_langchain/retriever.py +0 -0
  114. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  115. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  116. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/requires.txt +0 -0
  117. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/top_level.txt +0 -0
  118. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/codecov.yml +0 -0
  119. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/.claude/settings.local.json +0 -0
  120. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/DEBUGGING.md +0 -0
  121. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/adapters.html +0 -0
  122. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/architecture/README.md +0 -0
  123. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/architecture/c4-components-core.md +0 -0
  124. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/architecture/c4-containers.md +0 -0
  125. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/architecture/c4-context.md +0 -0
  126. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/architecture/c4-dynamic-install.md +0 -0
  127. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/distill.gif +0 -0
  128. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/doctor.gif +0 -0
  129. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/explain.gif +0 -0
  130. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/hooks.gif +0 -0
  131. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/install.gif +0 -0
  132. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/pulse.gif +0 -0
  133. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/search.gif +0 -0
  134. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/gifs/tap.gif +0 -0
  135. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/distill.tape +0 -0
  136. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/doctor.tape +0 -0
  137. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/explain.tape +0 -0
  138. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/hooks.tape +0 -0
  139. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/install.tape +0 -0
  140. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/pulse.tape +0 -0
  141. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/search.tape +0 -0
  142. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel/tapes/tap.tape +0 -0
  143. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/carousel.html +0 -0
  144. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/chat.html +0 -0
  145. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/commands.html +0 -0
  146. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/demo-index.json +0 -0
  147. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/demo.gif +0 -0
  148. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/demo.html +0 -0
  149. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/demo.tape +0 -0
  150. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/design-roadmap.html +0 -0
  151. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/eval-latest.json +0 -0
  152. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/eval.html +0 -0
  153. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/index.html +0 -0
  154. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/langchain.html +0 -0
  155. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/mcp-hub.html +0 -0
  156. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/rag-architecture.md +0 -0
  157. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D01.md +0 -0
  158. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D02.md +0 -0
  159. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D03.md +0 -0
  160. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D04.md +0 -0
  161. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D05.md +0 -0
  162. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D06.md +0 -0
  163. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D07.md +0 -0
  164. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D08.md +0 -0
  165. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D09.md +0 -0
  166. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D10.md +0 -0
  167. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D11.md +0 -0
  168. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D12.md +0 -0
  169. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D13.md +0 -0
  170. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D14.md +0 -0
  171. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D15.md +0 -0
  172. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D16.md +0 -0
  173. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D17.md +0 -0
  174. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D18.md +0 -0
  175. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D19.md +0 -0
  176. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D20.md +0 -0
  177. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D21.md +0 -0
  178. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D22.md +0 -0
  179. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D23.md +0 -0
  180. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D24.md +0 -0
  181. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D25.md +0 -0
  182. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D26.md +0 -0
  183. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  184. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  185. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  186. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  187. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  188. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  189. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  190. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  191. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  192. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  193. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  194. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  195. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  196. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-first-rule.md +0 -0
  197. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  198. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  199. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  200. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  201. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  202. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  203. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  204. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  205. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  206. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  207. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  208. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  209. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  210. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  211. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  212. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  213. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  214. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/command-carousel-page.md +0 -0
  215. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  216. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  217. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  218. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  219. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  220. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  221. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  222. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  223. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  224. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  225. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  226. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  227. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  228. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  229. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  230. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  231. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  232. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  233. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  234. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  235. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  236. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  237. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  238. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  239. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  240. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  241. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  242. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  243. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  244. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  245. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  246. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  247. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  248. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  249. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  250. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  251. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  252. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  253. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  254. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  255. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  256. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  257. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  258. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  259. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  260. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  261. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/github-community-health-files.md +0 -0
  262. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  263. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  264. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  265. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  266. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  267. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  268. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  269. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  270. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  271. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  272. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  273. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  274. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  275. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  276. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  277. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  278. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  279. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  280. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  281. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  282. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  283. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  284. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  285. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  286. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  287. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  288. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  289. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  290. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  291. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  292. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  293. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  294. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  295. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  296. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  297. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  298. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  299. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  300. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  301. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  302. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  303. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  304. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  305. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  306. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  307. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  308. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  309. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  310. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  311. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  312. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  313. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  314. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  315. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  316. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  317. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  318. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  319. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  320. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  321. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  322. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  323. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  324. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  325. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  326. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  327. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  328. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  329. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  330. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  331. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  332. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  333. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  334. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  335. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  336. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  337. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  338. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  339. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  340. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  341. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  342. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  343. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  344. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  345. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  346. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  347. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  348. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  349. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  350. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  351. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  352. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  353. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  354. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  355. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  356. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  357. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  358. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  359. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  360. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  361. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  362. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  363. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  364. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  365. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  366. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  367. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  368. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  369. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  370. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  371. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  372. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  373. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  374. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  375. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  376. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  377. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  378. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  379. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  380. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  381. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  382. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  383. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  384. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  385. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  386. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  387. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  388. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  389. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  390. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  391. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  392. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  393. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  394. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  395. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  396. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  397. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  398. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  399. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  400. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  401. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  402. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  403. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  404. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  405. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  406. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  407. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  408. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  409. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  410. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  411. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  412. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  413. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  414. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  415. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  416. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  417. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  418. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  419. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  420. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  421. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  422. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  423. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  424. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  425. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  426. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  427. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  428. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  429. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  430. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  431. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  432. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/workspace-scope-install.md +0 -0
  433. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/zip-strict-audit.md +0 -0
  434. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  435. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  436. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/eslint.config.mjs +0 -0
  437. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/README.md +0 -0
  438. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/__init__.py +0 -0
  439. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/baseline.json +0 -0
  440. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/faithfulness.py +0 -0
  441. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/golden_set.json +0 -0
  442. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/make_corpus.py +0 -0
  443. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/make_golden.py +0 -0
  444. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/metrics.py +0 -0
  445. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/publish_golden_dataset.py +0 -0
  446. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/evals/run_evals.py +0 -0
  447. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/examples/README.md +0 -0
  448. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/examples/adapt-demo.sh +0 -0
  449. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/examples/boost-run-prototype.sh +0 -0
  450. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/index.html +0 -0
  451. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/noxfile.py +0 -0
  452. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/pyproject.toml +0 -0
  453. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/coverage-tools.in +0 -0
  454. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/coverage-tools.txt +0 -0
  455. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/lint-tools.in +0 -0
  456. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/lint-tools.txt +0 -0
  457. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/mutation-tools.in +0 -0
  458. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/mutation-tools.txt +0 -0
  459. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/platform-pins.lock +0 -0
  460. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/release-tools.in +0 -0
  461. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/release-tools.txt +0 -0
  462. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/test-tools.in +0 -0
  463. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/requirements/test-tools.txt +0 -0
  464. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/a11y_check.py +0 -0
  465. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/bench_cli.sh +0 -0
  466. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/build_command_reference.py +0 -0
  467. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/build_demo_index.py +0 -0
  468. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/build_registries.py +0 -0
  469. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/build_roadmap.py +0 -0
  470. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/build_scale_corpus.py +0 -0
  471. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/check_anchors.py +0 -0
  472. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/check_licenses.py +0 -0
  473. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/check_required_checks.py +0 -0
  474. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/ensure_eval_corpus.sh +0 -0
  475. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/eval_corpus.py +0 -0
  476. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/eval_explain.py +0 -0
  477. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/eval_gate.py +0 -0
  478. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/eval_recommend.py +0 -0
  479. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/eval_retrieval.py +0 -0
  480. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/eval_stats_summary.py +0 -0
  481. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/import_budget.py +0 -0
  482. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/lock_toolchain.py +0 -0
  483. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/measure_registry.py +0 -0
  484. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/mutation_gate.py +0 -0
  485. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/mutation_shards.py +0 -0
  486. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/mutation_weights.json +0 -0
  487. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/page_budget.py +0 -0
  488. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/perf_gate.py +0 -0
  489. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/post_deploy_smoke.py +0 -0
  490. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/publish_eval_json.py +0 -0
  491. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/release_guard.py +0 -0
  492. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/release_preflight.py +0 -0
  493. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/scripts/serve_docs.py +0 -0
  494. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/setup.cfg +0 -0
  495. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/sonar-project.properties +0 -0
  496. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/style/README.md +0 -0
  497. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/style/boost.css +0 -0
  498. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/style/boost.js +0 -0
  499. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/style/demo.html +0 -0
  500. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/adapt.feature +0 -0
  501. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/browse.feature +0 -0
  502. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/count.feature +0 -0
  503. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/discover.feature +0 -0
  504. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/doctor.feature +0 -0
  505. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/environment.py +0 -0
  506. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/explain.feature +0 -0
  507. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/index.feature +0 -0
  508. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/install.feature +0 -0
  509. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/list.feature +0 -0
  510. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/mcp.feature +0 -0
  511. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/search.feature +0 -0
  512. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/cli_steps.py +0 -0
  513. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/discovery_steps.py +0 -0
  514. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/mcp_steps.py +0 -0
  515. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/quality_steps.py +0 -0
  516. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/conftest.py +0 -0
  517. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/baseline.json +0 -0
  518. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/explain.jsonl +0 -0
  519. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/golden-natural.jsonl +0 -0
  520. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/golden.jsonl +0 -0
  521. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/recommend.jsonl +0 -0
  522. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/taps-scale.txt +0 -0
  523. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/eval/taps.txt +0 -0
  524. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_capabilities_policy.py +0 -0
  525. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_adapt.py +0 -0
  526. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_bmad.py +0 -0
  527. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_catalog.py +0 -0
  528. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_chat.py +0 -0
  529. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_configuration.py +0 -0
  530. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_discovery.py +0 -0
  531. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_hooks.py +0 -0
  532. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_info.py +0 -0
  533. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_intelligence.py +0 -0
  534. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_pkg.py +0 -0
  535. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_quality.py +0 -0
  536. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_taps.py +0 -0
  537. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_cli_team.py +0 -0
  538. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_everyday_loop.py +0 -0
  539. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_integrity_enforce.py +0 -0
  540. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_kind_conformance.py +0 -0
  541. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_property_parsers.py +0 -0
  542. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_run.py +0 -0
  543. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_tap_signing.py +0 -0
  544. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/functional/test_workspace_scope.py +0 -0
  545. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/README.md +0 -0
  546. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  547. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  548. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  549. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  550. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  551. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  552. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  553. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  554. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  555. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  556. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  557. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  558. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  559. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  560. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  561. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  562. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  563. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  564. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  565. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  566. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/fuzz_frontmatter.py +0 -0
  567. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/fuzz/fuzz_registry.py +0 -0
  568. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/langchain/conftest.py +0 -0
  569. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/langchain/test_graph.py +0 -0
  570. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/langchain/test_loader.py +0 -0
  571. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/langchain/test_retriever.py +0 -0
  572. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/make_fixture.py +0 -0
  573. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/perf/test_benchmarks.py +0 -0
  574. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/smoke.sh +0 -0
  575. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_a11y_check.py +0 -0
  576. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_action_pin_lockstep.py +0 -0
  577. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_adapters.py +0 -0
  578. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_adapters_multi.py +0 -0
  579. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_adapters_runner.py +0 -0
  580. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_agents.py +0 -0
  581. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_ai.py +0 -0
  582. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_bmad_core.py +0 -0
  583. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_boost_first_offer.py +0 -0
  584. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_bootstrap.py +0 -0
  585. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_browse.py +0 -0
  586. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_builtin.py +0 -0
  587. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_capabilities.py +0 -0
  588. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_catalog.py +0 -0
  589. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_catalogbundle.py +0 -0
  590. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_chat.py +0 -0
  591. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_check_anchors.py +0 -0
  592. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_check_licenses.py +0 -0
  593. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_claude_settings.py +0 -0
  594. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_clean_internal_cache.py +0 -0
  595. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_cliparse.py +0 -0
  596. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_codeql_analysis_key.py +0 -0
  597. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_command_reference_fresh.py +0 -0
  598. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_community_health_files.py +0 -0
  599. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_compact.py +0 -0
  600. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_complete.py +0 -0
  601. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_complete_rc_block.py +0 -0
  602. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_config.py +0 -0
  603. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_content_dedupe.py +0 -0
  604. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_crash_redaction.py +0 -0
  605. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dedup_trust.py +0 -0
  606. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_demo_index.py +0 -0
  607. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense.py +0 -0
  608. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense_fallback.py +0 -0
  609. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense_fix_hint.py +0 -0
  610. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense_shard_real_schema.py +0 -0
  611. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  612. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense_shards.py +0 -0
  613. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dense_status.py +0 -0
  614. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_dependabot_config.py +0 -0
  615. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_docs_pages_linked.py +0 -0
  616. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_docsite_chrome.py +0 -0
  617. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_ed25519.py +0 -0
  618. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_embed.py +0 -0
  619. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_embed_local.py +0 -0
  620. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_embed_truncated_response.py +0 -0
  621. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_entry_key.py +0 -0
  622. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_errors_and_cli_table.py +0 -0
  623. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_baseline.py +0 -0
  624. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_corpus.py +0 -0
  625. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_faithfulness.py +0 -0
  626. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_gate.py +0 -0
  627. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_grading.py +0 -0
  628. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_metrics.py +0 -0
  629. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_eval_stats_summary.py +0 -0
  630. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  631. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_faithfulness.py +0 -0
  632. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_frontmatter.py +0 -0
  633. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_fuzz_targets.py +0 -0
  634. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  635. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_gitleaks_config.py +0 -0
  636. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_gitutil.py +0 -0
  637. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_gitutil_lfs.py +0 -0
  638. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_gitutil_sparse.py +0 -0
  639. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_imperative.py +0 -0
  640. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_import_budget.py +0 -0
  641. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_injectscan.py +0 -0
  642. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_install_permission_error.py +0 -0
  643. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_installscan.py +0 -0
  644. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_integrity.py +0 -0
  645. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_journal.py +0 -0
  646. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_langchain_packaging.py +0 -0
  647. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_link_ownership.py +0 -0
  648. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_localembed.py +0 -0
  649. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_localembed_e2e.py +0 -0
  650. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_lockfile.py +0 -0
  651. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_logs.py +0 -0
  652. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_marketing_counts.py +0 -0
  653. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mcp.py +0 -0
  654. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mcp_install_scan.py +0 -0
  655. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mcpdecl.py +0 -0
  656. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mcphost.py +0 -0
  657. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_measure_registry.py +0 -0
  658. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_minisign.py +0 -0
  659. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mutation_hardening.py +0 -0
  660. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mutation_shards.py +0 -0
  661. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mutation_subfile_shards.py +0 -0
  662. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_mutmut_source_paths.py +0 -0
  663. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_nethttp.py +0 -0
  664. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_output.py +0 -0
  665. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_page_budget.py +0 -0
  666. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_paths.py +0 -0
  667. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_perf_gate.py +0 -0
  668. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_pkg_confusions.py +0 -0
  669. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_pkg_injection.py +0 -0
  670. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_pkg_secrets.py +0 -0
  671. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_platform_pins.py +0 -0
  672. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_policy.py +0 -0
  673. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_post_deploy_smoke.py +0 -0
  674. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_project_mcp_sidecar.py +0 -0
  675. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_projectlock.py +0 -0
  676. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_provenance.py +0 -0
  677. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_publish_golden_dataset.py +0 -0
  678. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_rag.py +0 -0
  679. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_rag_fusion.py +0 -0
  680. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_registries_fresh.py +0 -0
  681. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_registry.py +0 -0
  682. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_registry_categories.py +0 -0
  683. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_registry_control_chars.py +0 -0
  684. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_release_guard.py +0 -0
  685. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_release_preflight.py +0 -0
  686. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_required_checks.py +0 -0
  687. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_resolve.py +0 -0
  688. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_roadmap_fresh.py +0 -0
  689. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_rules.py +0 -0
  690. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_scale_corpus.py +0 -0
  691. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_scopes.py +0 -0
  692. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_secretscan.py +0 -0
  693. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_selfupdate.py +0 -0
  694. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_serve.py +0 -0
  695. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_serve_docs.py +0 -0
  696. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_shards_matrix.py +0 -0
  697. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_smoke_covers_every_command.py +0 -0
  698. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_spin.py +0 -0
  699. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_stackprobe.py +0 -0
  700. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_staleness.py +0 -0
  701. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_store.py +0 -0
  702. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_store_materialize.py +0 -0
  703. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_sync_blocked_links.py +0 -0
  704. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  705. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_token_parity.py +0 -0
  706. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_toolchain_lock.py +0 -0
  707. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_trustaudit.py +0 -0
  708. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_typosquat.py +0 -0
  709. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_updatediff.py +0 -0
  710. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_util.py +0 -0
  711. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_version.py +0 -0
  712. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_visual_harness_flags.py +0 -0
  713. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_concurrency.py +0 -0
  714. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  715. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  716. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_timeouts.py +0 -0
  717. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_workflows.py +0 -0
  718. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  719. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/visual/a11y_check.mjs +0 -0
  720. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/visual/console_check.mjs +0 -0
  721. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/visual/package-lock.json +0 -0
  722. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/visual/package.json +0 -0
  723. {boost_skill_cli-1.2.2 → boost_skill_cli-1.2.4}/tests/visual/visual_check.mjs +0 -0
@@ -67,6 +67,9 @@ reindex
67
67
  repo
68
68
  repo's
69
69
  repos
70
+ rescan
71
+ rescanned
72
+ rescans
70
73
  Rerank
71
74
  rerank
72
75
  reranking
@@ -182,6 +182,25 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
182
182
  still ignored, and deliberately: it is an unsafe fix over ~1,000 call sites in
183
183
  `boost_cli` alone. Write new code in the modern style; don't bulk-rewrite old
184
184
  code in an unrelated PR.
185
+ - **A catalog entry has two identities, and they are not interchangeable.**
186
+ *Row* identity is `(tap, skill_md)` (`rag.entry_key`) — which file, in which
187
+ tap. *Content* identity is `entry["content"]`, a truncated sha256 of
188
+ `name + "\n" + description + "\n" + body` stamped by `catalog._content_digest`
189
+ at scan time. Use the row key to address a row and the digest to ask whether
190
+ two rows are the same thing. The digest must stay byte-identical to what
191
+ `rag.read_body` assembles — `tests/unit/test_content_identity.py` pins the
192
+ parity, because a digest that drifts keeps *looking* right while clustering
193
+ nothing. Name-based keys are wrong at both layers: over 60,047 real entries,
194
+ hashing the body alone merges 259 clusters spanning different names, and
195
+ name+description over-collapses 3,383 clusters of genuinely different prose.
196
+ Consumers must degrade cleanly when `content` is absent (a cache written
197
+ before `CACHE_FORMAT`, or a synthesised entry) — and must never treat two
198
+ absences as a match.
199
+ - **The tap cache is versioned; bump `catalog.CACHE_FORMAT` to backfill.** It is
200
+ how a new entry field reaches 460 caches on a real machine without a re-tap:
201
+ `load_tap` rescans a stale cache *when the clone is still there*, and serves
202
+ the stale entries as-is when it is not. Never make a stale cache an error —
203
+ that trades a missing field for a missing catalogue.
185
204
  - **Three item kinds, one scanner.** `core/catalog.scan_dir` indexes `skill`
186
205
  (SKILL.md), `rule` (.mdc/.cursorrules/.windsurfrules/.clinerules), and
187
206
  `workflow` (commands/agents/workflows Markdown). **All three install**, and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.2
3
+ Version: 1.2.4
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.2'
22
- __version_tuple__ = version_tuple = (1, 2, 2)
21
+ __version__ = version = '1.2.4'
22
+ __version_tuple__ = version_tuple = (1, 2, 4)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -163,16 +163,35 @@ def highlight_positions(query: str, text: str) -> set[int]:
163
163
  #: (`rule`, 47 distinct) is already the pathological case — a bigger one is a
164
164
  #: registry doing something strange, not a user waiting to be helped.
165
165
  _FUZZY_BUCKET_CAP = 80
166
+ # Bucket name reserved for rows keyed by content digest. A NUL can't occur in a
167
+ # slugified skill name, so a digested row can never share a fuzzy bucket with a
168
+ # real one — and the fuzzy pass skips this bucket outright, because "95% similar"
169
+ # is a question about prose and asking it of two hex digests is meaningless.
170
+ _DIGEST_SIG = "\x00digest"
166
171
 
167
172
 
168
173
  def _sig(entry: dict) -> tuple[str, str]:
169
- """Identity of a row for dedupe: name plus description, normalised.
170
-
171
- The description is what makes this safe. Keying on the name alone would
172
- collapse `code-reviewer` — 75 rows with **42 distinct descriptions** on a
173
- real catalogue — into one, hiding 41 genuinely different skills. Keying on
174
- the pair collapses only rows that say the same thing.
174
+ """Identity of a row for dedupe: the scanner's content digest when it has
175
+ one, else name plus description, normalised.
176
+
177
+ The digest is the right key and the pair is a fallback, not a peer. Keying
178
+ on name+description alone over-collapses: on a real 60,047-entry catalogue
179
+ it merges **3,383 clusters** the digest keeps apart — items that share a
180
+ name and a description while carrying genuinely different prose, one of
181
+ which then becomes unreachable in the browser. It is still the only key
182
+ available for a row from a cache written before `catalog.CACHE_FORMAT`, so
183
+ it stays.
184
+
185
+ Digested and undigested rows can never merge into each other: the two keys
186
+ live in different halves of the tuple, so an unknown is only ever equal to
187
+ another unknown with the same visible metadata.
188
+
189
+ Keying on the name alone was never an option — `code-reviewer` is 75 rows
190
+ with **42 distinct descriptions** on a real catalogue.
175
191
  """
192
+ content = str(entry.get("content", "")).strip()
193
+ if content:
194
+ return (_DIGEST_SIG, content)
176
195
  return (str(entry.get("name", "")).strip().lower(),
177
196
  str(entry.get("description", "")).strip().lower())
178
197
 
@@ -208,6 +227,8 @@ def dedupe(entries, threshold: float = 0.95) -> list[tuple[dict, int]]:
208
227
  # with different names are different skills however similar the prose.
209
228
  by_name: dict[str, list] = {}
210
229
  for sig in order:
230
+ if sig[0] == _DIGEST_SIG:
231
+ continue # exact content already decided; see _DIGEST_SIG
211
232
  by_name.setdefault(sig[0], []).append(sig)
212
233
  absorbed: set[tuple[str, str]] = set()
213
234
  for sigs in by_name.values():
@@ -17,6 +17,7 @@ that ship in the same GitHub registries:
17
17
  """
18
18
  from __future__ import annotations
19
19
 
20
+ import hashlib
20
21
  import json
21
22
  import operator
22
23
  import os
@@ -26,6 +27,14 @@ from pathlib import Path
26
27
  from ..errors import BoostError
27
28
  from . import frontmatter, gitutil, paths, registry, util
28
29
 
30
+ # Bumped whenever a scan starts recording something the previous scan did not,
31
+ # so 460 caches on a real machine invalidate on read instead of needing a
32
+ # re-tap. `catalogbundle.BUNDLE_FORMAT` and `rag.INDEX_VERSION` self-version for
33
+ # the same reason; the tap cache was the one derived artifact that did not, and
34
+ # without it there was no way to ship a new entry field at all.
35
+ # 1 -- entries carry `content` (see `_content_digest`)
36
+ CACHE_FORMAT = 1
37
+
29
38
  KIND_SKILL = "skill"
30
39
  KIND_RULE = "rule"
31
40
  KIND_WORKFLOW = "workflow"
@@ -61,6 +70,36 @@ def _description(meta: dict, body: str) -> str:
61
70
  return ""
62
71
 
63
72
 
73
+ def _content_digest(name: str, description: str, body: str) -> str:
74
+ """Content identity for an item: what it *is*, independent of where it sits.
75
+
76
+ Deliberately not the file bytes and not the body alone. The text hashed here
77
+ is exactly what :func:`rag.read_body` assembles — ``name``, ``description``,
78
+ then the frontmatter-stripped body — because that is the string boost
79
+ already treats as an item's content everywhere it clusters copies, and two
80
+ identity keys that *nearly* agree are worse than one.
81
+
82
+ Measured over a real 460-tap install (60,047 entries), against the two
83
+ alternatives that look reasonable:
84
+
85
+ name+description+body 41,051 clusters 0 span >1 name <- this
86
+ body only 40,372 clusters 259 span >1 name
87
+ name+description 37,668 clusters 2 span >1 name
88
+
89
+ Body-only merges 259 clusters that span different names — the
90
+ ``admin-interface-rule`` collision #366 fixed, where one registry ships two
91
+ unrelated rules under one name. Metadata-only over-collapses in the other
92
+ direction: 3,383 clusters of items that share a name and description while
93
+ carrying genuinely different prose. Including all three separates both.
94
+
95
+ Truncated to 16 hex chars to match the index, which stores one of these per
96
+ document; the full digest doubles the index for collision odds that are
97
+ already negligible at 60k items.
98
+ """
99
+ text = "%s\n%s\n%s" % (name, description, body)
100
+ return hashlib.sha256(text.strip().encode("utf-8", "replace")).hexdigest()[:16]
101
+
102
+
64
103
  def _make_entry(root: Path, defining_file: Path, kind: str, default_name: str,
65
104
  tap_name: str, curated: bool, meta: dict, body: str) -> dict:
66
105
  name = str(meta.get("name") or "").strip() or default_name
@@ -80,6 +119,11 @@ def _make_entry(root: Path, defining_file: Path, kind: str, default_name: str,
80
119
  "rel_dir": item_dir.relative_to(root).as_posix() if item_dir != root else ".",
81
120
  "skill_md": defining_file.relative_to(root).as_posix(),
82
121
  "meta": meta,
122
+ # Free here and nowhere else: the body is already read, parsed and about
123
+ # to be discarded. `rag` used to re-open all 60k files at index time to
124
+ # recompute exactly this (~14 s on a real install) because the entry did
125
+ # not carry it.
126
+ "content": _content_digest(slug, description, body),
83
127
  # Lowercased substring-search blob, flattened once at index time so
84
128
  # search() never re-walks the frontmatter per query (see _search_blob).
85
129
  "search_blob": _search_blob(slug, description, meta),
@@ -176,6 +220,7 @@ def rebuild_tap(tap: registry.Tap) -> list[dict]:
176
220
  tap.cache_file.write_text(json.dumps({
177
221
  "tap": tap.name,
178
222
  "url": tap.url,
223
+ "format": CACHE_FORMAT,
179
224
  "generated": util.now_iso(),
180
225
  "commit": gitutil.head_commit(tap.path),
181
226
  "skills": entries,
@@ -192,12 +237,21 @@ def rebuild_tap(tap: registry.Tap) -> list[dict]:
192
237
  # the cached list is shared by reference (matching the index cache). Keying on
193
238
  # nanosecond mtime + size catches rewrites a bare second-resolution mtime would
194
239
  # miss.
195
- _ENTRY_CACHE: dict[str, tuple[tuple[int, int], list[dict]]] = {}
240
+ _ENTRY_CACHE: dict[str, tuple[tuple[int, int], list[dict], bool]] = {}
241
+
196
242
 
243
+ def _cached_tap(tap: registry.Tap) -> tuple[list[dict], bool] | None:
244
+ """``(skills, is_current)`` for a tap's cache, or ``None`` to force a
245
+ rebuild (file missing, unreadable, or corrupt JSON).
197
246
 
198
- def _cached_tap(tap: registry.Tap) -> list[dict] | None:
199
- """Memoized ``skills`` for a tap's cache file, or ``None`` to force a
200
- rebuild (file missing, unreadable, or corrupt JSON)."""
247
+ ``is_current`` says whether the cache was written by this scanner. It is
248
+ reported rather than acted on here because the right response depends on
249
+ something this function cannot see: whether the clone is still on disk to
250
+ rescan. A stale cache is not *wrong* — it is missing fields its consumers
251
+ have since learned to want, and every one of them degrades cleanly without
252
+ them — so discarding it unconditionally would trade a missing digest for
253
+ missing entries, which is the worse failure.
254
+ """
201
255
  p = tap.cache_file
202
256
  key = str(p)
203
257
  try:
@@ -208,14 +262,16 @@ def _cached_tap(tap: registry.Tap) -> list[dict] | None:
208
262
  stamp = (st.st_mtime_ns, st.st_size)
209
263
  cached = _ENTRY_CACHE.get(key)
210
264
  if cached is not None and cached[0] == stamp:
211
- return cached[1]
265
+ return cached[1], cached[2]
212
266
  try:
213
- skills = json.loads(p.read_text(encoding="utf-8")).get("skills", [])
267
+ data = json.loads(p.read_text(encoding="utf-8"))
214
268
  except (json.JSONDecodeError, OSError):
215
269
  _ENTRY_CACHE.pop(key, None)
216
270
  return None
217
- _ENTRY_CACHE[key] = (stamp, skills)
218
- return skills
271
+ skills = data.get("skills", [])
272
+ current = data.get("format") == CACHE_FORMAT
273
+ _ENTRY_CACHE[key] = (stamp, skills, current)
274
+ return skills, current
219
275
 
220
276
 
221
277
  def load_tap(tap: registry.Tap, rebuild: bool = False) -> list[dict]:
@@ -223,11 +279,20 @@ def load_tap(tap: registry.Tap, rebuild: bool = False) -> list[dict]:
223
279
 
224
280
  `rebuild=True` or a missing/corrupt cache forces a rescan; an
225
281
  uncloned tap yields `[]`.
282
+
283
+ A cache written by an older scanner is rescanned *when the clone is still
284
+ there to rescan* — that is what backfills a new entry field across every tap
285
+ on a machine (460 of them on a real install) without asking anyone to re-tap.
286
+ When the clone is gone the stale entries are served as they are: consumers
287
+ all degrade cleanly on a missing field, so refusing to answer would cost the
288
+ user their catalogue to buy a digest.
226
289
  """
227
290
  if not rebuild:
228
291
  cached = _cached_tap(tap)
229
292
  if cached is not None:
230
- return cached
293
+ skills, current = cached
294
+ if current or not tap.is_cloned:
295
+ return skills
231
296
  if tap.is_cloned:
232
297
  return rebuild_tap(tap)
233
298
  return []
@@ -487,12 +552,48 @@ def resolve_one(name: str, path: str | None = None) -> dict:
487
552
  % (bare, len(matches), taps[0], paths),
488
553
  hint="that registry ships one name twice — pick one with "
489
554
  "`--path <one of the above>`, and raise it with the tap")
555
+ # Several taps, one thing. Registries mirror each other constantly, so
556
+ # the common cross-tap collision is N byte-identical copies of one
557
+ # skill — and the within-tap branch above already decided that
558
+ # indistinguishable candidates are boost's problem to resolve, not the
559
+ # user's. Applying the same judgement here removes a dead end (a
560
+ # mirrored skill could not be installed unqualified at all) without
561
+ # touching the genuine-ambiguity error, which still fires whenever the
562
+ # copies actually differ.
563
+ best = _same_thing(matches)
564
+ if best is not None:
565
+ return best
490
566
  raise BoostError(
491
567
  "%r exists in multiple taps: %s" % (name, ", ".join(taps)),
492
568
  hint="qualify it, e.g. `%s:%s`" % (taps[0], bare))
493
569
  return matches[0]
494
570
 
495
571
 
572
+ def _same_thing(matches: list[dict]) -> dict | None:
573
+ """The copy to install when every candidate is the same content, else None.
574
+
575
+ Returns None unless *every* candidate carries a digest and they all agree.
576
+ A missing digest is an unknown, never a match: assuming two unknowns equal
577
+ would silently install one skill when the user asked about another, which is
578
+ strictly worse than the error it would be replacing.
579
+
580
+ Ranked by :func:`rag.source_rank` — the user's own ``curated`` flag first,
581
+ the shipped registry confidence second — which exists for exactly this
582
+ decision and is what `dedupe_by_content` already uses to choose between
583
+ identical bodies in search results. Ties break on ``(tap, rel_dir)`` so the
584
+ pick cannot vary between runs.
585
+ """
586
+ digests = {e.get("content") for e in matches}
587
+ if len(digests) != 1 or not next(iter(digests)):
588
+ return None
589
+ # Local import: `rag` imports this module, so the edge only exists at call
590
+ # time. Same shape as `store.install`'s deferred `gitutil` import.
591
+ from . import rag
592
+ return min(matches, key=lambda e: (rag.source_rank(e),
593
+ str(e.get("tap", "")),
594
+ str(e.get("rel_dir", ""))))
595
+
596
+
496
597
  def _meta_text(meta) -> str:
497
598
  """Lowercased, space-joined flatten of a frontmatter dict for substring
498
599
  search. Cheaper than ``json.dumps(meta).lower()`` — which built and threw
@@ -580,23 +580,47 @@ def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
580
580
  for e in entries:
581
581
  for ci, text in enumerate(_chunk_texts(e, tap_paths)):
582
582
  rows.append((e, ci, text))
583
+
584
+ # Embed each DISTINCT text once. Registries mirror each other, so one text
585
+ # arrives many times in a single build: 42.9% of 750,416 chunks on a real
586
+ # 460-tap install are repeats, worst case 1,464 identical copies. The
587
+ # provider is deterministic, so the copies were being bought at full price
588
+ # for a byte-identical vector — and `retrieve_any` runs `dedupe_by_content`
589
+ # on every retrieval path, so they were discarded before reaching a result
590
+ # slot. Insertion below is still per row, because `chunks.tap` is what
591
+ # scopes tap deletion and collapsing rows would strand a tap's vectors.
592
+ order: list[str] = []
593
+ seen: set[str] = set()
594
+ for _e, _ci, text in rows:
595
+ if text not in seen:
596
+ seen.add(text)
597
+ order.append(text)
598
+
599
+ vec_of: dict[str, object] = {}
600
+ for start in range(0, len(order), _BATCH):
601
+ batch = order[start:start + _BATCH]
602
+ vecs = embed.embed(batch, input_type="document")
603
+ if not vecs or len(vecs) != len(batch):
604
+ continue # taps are attributed per row below, not per batch
605
+ vec_of.update(zip(batch, vecs, strict=True))
606
+
583
607
  added = 0
584
608
  failed_taps: set = set()
585
- for start in range(0, len(rows), _BATCH):
586
- batch = rows[start:start + _BATCH]
587
- vecs = embed.embed([t for _e, _c, t in batch], input_type="document")
588
- if not vecs or len(vecs) != len(batch):
589
- failed_taps.update(e["tap"] for e, _c, _t in batch)
609
+ for e, ci, text in rows:
610
+ vec = vec_of.get(text)
611
+ if vec is None:
612
+ # Every tap owning a copy of a text the provider rejected, not just
613
+ # whichever copy happened to sit in the failed batch.
614
+ failed_taps.add(e["tap"])
590
615
  continue
591
- for (e, ci, text), vec in zip(batch, vecs, strict=True):
592
- cur = con.execute(
593
- "INSERT INTO chunks (name, tap, path, kind, cix, snip) "
594
- "VALUES (?, ?, ?, ?, ?, ?)",
595
- (e["name"], e["tap"], e["skill_md"],
596
- e.get("kind", "skill"), ci, text[:200].strip()))
597
- con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
598
- (cur.lastrowid, mod.serialize_float32(vec)))
599
- added += 1
616
+ cur = con.execute(
617
+ "INSERT INTO chunks (name, tap, path, kind, cix, snip) "
618
+ "VALUES (?, ?, ?, ?, ?, ?)",
619
+ (e["name"], e["tap"], e["skill_md"],
620
+ e.get("kind", "skill"), ci, text[:200].strip()))
621
+ con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
622
+ (cur.lastrowid, mod.serialize_float32(vec)))
623
+ added += 1
600
624
  return added, failed_taps
601
625
 
602
626
 
@@ -222,9 +222,13 @@ def _make_docs(entries: list[dict], tap_paths: dict[str, Path]) -> list[dict]:
222
222
  docs: list[dict] = []
223
223
  for e in entries:
224
224
  body = read_body(e, tap_paths)
225
- # Hashed here because the body is already in hand; doing it at query
226
- # time would mean re-reading ~30k files to answer one search.
227
- digest = hashlib.sha256(body.strip().encode("utf-8", "replace")).hexdigest()[:16]
225
+ # The scanner already hashed this exact text (`catalog._content_digest`
226
+ # assembles name + description + body, the same string `read_body`
227
+ # returns), so an entry from a current cache hands the value over. The
228
+ # fallback is not dead code: a cache written before CACHE_FORMAT, or an
229
+ # entry synthesised by a caller rather than scanned, still has to index.
230
+ digest = e.get("content") or hashlib.sha256(
231
+ body.strip().encode("utf-8", "replace")).hexdigest()[:16]
228
232
  tf: dict[str, int] = defaultdict(int)
229
233
  for tok in tokenize(surface(e) + "\n" + body):
230
234
  tf[tok] += 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.2
3
+ Version: 1.2.4
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -204,6 +204,7 @@ docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md
204
204
  docs/roadmap/items/build-provenance-slsa-attestations.md
205
205
  docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md
206
206
  docs/roadmap/items/capability-manifest-and-least-privilege-policy.md
207
+ docs/roadmap/items/catalogue-entries-carry-no-content-identity.md
207
208
  docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md
208
209
  docs/roadmap/items/chat-command-grounded-conversational-search.md
209
210
  docs/roadmap/items/ci-job-timeout-minutes.md
@@ -434,6 +435,7 @@ docs/roadmap/items/workspace-scope-install.md
434
435
  docs/roadmap/items/zip-strict-audit.md
435
436
  docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md
436
437
  docs/roadmap/items/zizmor-pin-is-a-yanked-release.md
438
+ docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md
437
439
  evals/README.md
438
440
  evals/__init__.py
439
441
  evals/baseline.json
@@ -596,10 +598,12 @@ tests/unit/test_complete.py
596
598
  tests/unit/test_complete_rc_block.py
597
599
  tests/unit/test_config.py
598
600
  tests/unit/test_content_dedupe.py
601
+ tests/unit/test_content_identity.py
599
602
  tests/unit/test_crash_redaction.py
600
603
  tests/unit/test_dedup_trust.py
601
604
  tests/unit/test_demo_index.py
602
605
  tests/unit/test_dense.py
606
+ tests/unit/test_dense_embed_dedupe.py
603
607
  tests/unit/test_dense_fallback.py
604
608
  tests/unit/test_dense_fix_hint.py
605
609
  tests/unit/test_dense_shard_real_schema.py
@@ -0,0 +1,56 @@
1
+ ---
2
+ id: catalogue-entries-carry-no-content-identity
3
+ board: code
4
+ section: internals
5
+ status: shipped
6
+ category: Catalog · Correctness
7
+ complexity: M
8
+ impact: High
9
+ wow: 5
10
+ note: 42.9% of 750,416 embedded chunks are duplicates — one was embedded 1,464 times
11
+ order: 116
12
+ owner: feat/catalogue-content-identity
13
+ pr: 526
14
+ title: A catalog entry knew where it came from, never what it was
15
+ ---
16
+ <b>boost collapses duplicate copies at both places a user sees them</b> &mdash;
17
+ <code>rag.dedupe_by_content</code> for search results, <code>resolve_one</code> for install
18
+ resolution &mdash; and at neither place it <em>pays</em> for them. A catalog entry carried
19
+ <code>(tap, skill_md)</code>, which is row identity and deliberately strict, but nothing that said
20
+ <em>this is the same thing as that</em>. Every consumer needing content identity therefore derived
21
+ its own, and they disagreed.
22
+
23
+ <b>The bill was measurable.</b> On a real 460-tap install <code>rag_vectors.sqlite</code> is
24
+ <b>3.2&nbsp;GB</b>, and <b>42.9% of its 750,416 chunks are duplicates</b> &mdash; one chunk was
25
+ embedded <b>1,464 times</b>. Those embeddings cost API credits and buy nothing:
26
+ <code>retrieve_any</code> runs <code>dedupe_by_content</code> on every retrieval path, so each
27
+ redundant vector is computed, stored, billed, then discarded before it can reach a result slot.
28
+
29
+ <b>Three keys were in play, and the comment was wrong about which one shipped.</b>
30
+ <code>dedupe_by_content</code>'s docstring says clustering is &ldquo;on the body, never the name&rdquo;
31
+ and offers as proof that no cluster spans more than one name. Both are artefacts: the code hashes
32
+ <code>read_body()</code>, which <em>prepends</em> name and description, so zero name-spanning clusters
33
+ is guaranteed rather than measured. Over all 60,047 entries:
34
+
35
+ <b>name + description + body</b> keeps 41,051 clusters and spans more than one name <b>zero</b> times
36
+ &middot; <em>body alone</em> keeps 40,372 but spans more than one name <b>259</b> times, which is the
37
+ <code>admin-interface-rule</code> collision again &middot; <em>name + description</em> keeps 37,668,
38
+ over-collapsing <b>3,383</b> clusters of items that share metadata while carrying different prose.
39
+
40
+ <b>So the entry now carries the digest the code already believed in.</b>
41
+ <code>_make_entry</code> hashes name + description + body at scan time, which is free &mdash; the
42
+ body is already read, parsed and about to be discarded, measured at <b>2.04&nbsp;&micro;s per entry,
43
+ 122&nbsp;ms for the whole corpus</b>. It also <em>removes</em> work: <code>rag</code> was re-opening
44
+ all 60k files at index-build time purely to recompute this. Verified against real data by rescanning
45
+ 40 tapped repos and checking all <b>8,564</b> entries against what <code>read_body</code> hashes:
46
+ zero mismatches.
47
+
48
+ <b>Nothing is dropped.</b> Duplicate rows stay in the catalogue, because removing them breaks
49
+ <code>--path</code> disambiguation, typosquat detection, tap-scoped repair in <code>sync_apply</code>,
50
+ the eval harness's exemplar resolution, and the <code>source_rank</code> quality prior. The mark is
51
+ the digest, and it is reversible by rebuilding a cache. The tap cache gained a
52
+ <code>format</code> version to backfill 460 machines' worth of caches on read &mdash; it was the one
53
+ derived artifact that could not self-invalidate, which is why no entry field could ever be added
54
+ before. A stale cache whose clone is gone is still served rather than discarded: consumers all
55
+ degrade cleanly on a missing digest, so refusing to answer would cost a user their catalogue to buy
56
+ a hash.
@@ -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>253</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>254</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -4023,6 +4023,59 @@ storage cleanup.</p>
4023
4023
  <span class="m">458 taps held 12 GB to index 1.9 GB of Markdown</span>
4024
4024
  </div>
4025
4025
  </article>
4026
+
4027
+ <article class="cap rcard" id="catalogue-entries-carry-no-content-identity">
4028
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Catalog · Correctness</span></div>
4029
+ <h3>A catalog entry knew where it came from, never what it was</h3>
4030
+ <details class="cardbody"><summary>Write-up</summary>
4031
+ <p><b>boost collapses duplicate copies at both places a user sees them</b> &mdash;
4032
+ <code>rag.dedupe_by_content</code> for search results, <code>resolve_one</code> for install
4033
+ resolution &mdash; and at neither place it <em>pays</em> for them. A catalog entry carried
4034
+ <code>(tap, skill_md)</code>, which is row identity and deliberately strict, but nothing that said
4035
+ <em>this is the same thing as that</em>. Every consumer needing content identity therefore derived
4036
+ its own, and they disagreed.
4037
+
4038
+ <b>The bill was measurable.</b> On a real 460-tap install <code>rag_vectors.sqlite</code> is
4039
+ <b>3.2&nbsp;GB</b>, and <b>42.9% of its 750,416 chunks are duplicates</b> &mdash; one chunk was
4040
+ embedded <b>1,464 times</b>. Those embeddings cost API credits and buy nothing:
4041
+ <code>retrieve_any</code> runs <code>dedupe_by_content</code> on every retrieval path, so each
4042
+ redundant vector is computed, stored, billed, then discarded before it can reach a result slot.
4043
+
4044
+ <b>Three keys were in play, and the comment was wrong about which one shipped.</b>
4045
+ <code>dedupe_by_content</code>'s docstring says clustering is &ldquo;on the body, never the name&rdquo;
4046
+ and offers as proof that no cluster spans more than one name. Both are artefacts: the code hashes
4047
+ <code>read_body()</code>, which <em>prepends</em> name and description, so zero name-spanning clusters
4048
+ is guaranteed rather than measured. Over all 60,047 entries:
4049
+
4050
+ <b>name + description + body</b> keeps 41,051 clusters and spans more than one name <b>zero</b> times
4051
+ &middot; <em>body alone</em> keeps 40,372 but spans more than one name <b>259</b> times, which is the
4052
+ <code>admin-interface-rule</code> collision again &middot; <em>name + description</em> keeps 37,668,
4053
+ over-collapsing <b>3,383</b> clusters of items that share metadata while carrying different prose.
4054
+
4055
+ <b>So the entry now carries the digest the code already believed in.</b>
4056
+ <code>_make_entry</code> hashes name + description + body at scan time, which is free &mdash; the
4057
+ body is already read, parsed and about to be discarded, measured at <b>2.04&nbsp;&micro;s per entry,
4058
+ 122&nbsp;ms for the whole corpus</b>. It also <em>removes</em> work: <code>rag</code> was re-opening
4059
+ all 60k files at index-build time purely to recompute this. Verified against real data by rescanning
4060
+ 40 tapped repos and checking all <b>8,564</b> entries against what <code>read_body</code> hashes:
4061
+ zero mismatches.
4062
+
4063
+ <b>Nothing is dropped.</b> Duplicate rows stay in the catalogue, because removing them breaks
4064
+ <code>--path</code> disambiguation, typosquat detection, tap-scoped repair in <code>sync_apply</code>,
4065
+ the eval harness's exemplar resolution, and the <code>source_rank</code> quality prior. The mark is
4066
+ the digest, and it is reversible by rebuilding a cache. The tap cache gained a
4067
+ <code>format</code> version to backfill 460 machines' worth of caches on read &mdash; it was the one
4068
+ derived artifact that could not self-invalidate, which is why no entry field could ever be added
4069
+ before. A stale cache whose clone is gone is still served rather than discarded: consumers all
4070
+ degrade cleanly on a missing digest, so refusing to answer would cost a user their catalogue to buy
4071
+ a hash.</p></details>
4072
+ <div class="meta">
4073
+ <span class="m">Complexity <b>M</b></span>
4074
+ <span class="m hi">Impact <b>High</b></span>
4075
+ <span class="m">Wow <b class="wow">★★★★★</b></span>
4076
+ <span class="m">42.9% of 750,416 embedded chunks are duplicates — one was embedded 1,464 times</span>
4077
+ </div>
4078
+ </article>
4026
4079
  <!-- /ROADMAP:cards -->
4027
4080
 
4028
4081
  </div>