boost-skill-cli 1.0.307__tar.gz → 1.0.308__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 (565) hide show
  1. {boost_skill_cli-1.0.307/boost_skill_cli.egg-info → boost_skill_cli-1.0.308}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/quality.py +70 -1
  4. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/dense.py +100 -0
  5. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  6. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/SOURCES.txt +6 -0
  7. boost_skill_cli-1.0.308/docs/roadmap/items/bm25-index-is-one-json-blob.md +45 -0
  8. boost_skill_cli-1.0.308/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +42 -0
  9. boost_skill_cli-1.0.308/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +58 -0
  10. boost_skill_cli-1.0.308/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +40 -0
  11. boost_skill_cli-1.0.308/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +41 -0
  12. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap.html +207 -1
  13. boost_skill_cli-1.0.308/tests/unit/test_dense_status.py +314 -0
  14. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.gitattributes +0 -0
  15. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.gitignore +0 -0
  16. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.gitleaks.toml +0 -0
  17. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.htmlvalidate.json +0 -0
  18. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.lighthouserc.json +0 -0
  19. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.lycheeignore +0 -0
  20. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.markdownlint-cli2.jsonc +0 -0
  21. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.pre-commit-config.yaml +0 -0
  22. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.stylelintrc.json +0 -0
  23. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.vale/styles/boost/Terminology.yml +0 -0
  24. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  25. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/.vale.ini +0 -0
  26. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/CLAUDE.md +0 -0
  27. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/CODE_OF_CONDUCT.md +0 -0
  28. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/CONTRIBUTING.md +0 -0
  29. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/LICENSE +0 -0
  30. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/MANIFEST.in +0 -0
  31. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/Makefile +0 -0
  32. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/README.md +0 -0
  33. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/SECURITY.md +0 -0
  34. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost +0 -0
  35. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/__init__.py +0 -0
  36. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/__main__.py +0 -0
  37. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/cli.py +0 -0
  38. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/cliparse.py +0 -0
  39. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/__init__.py +0 -0
  40. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/_common.py +0 -0
  41. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/bmad.py +0 -0
  42. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/configuration.py +0 -0
  43. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/discovery.py +0 -0
  44. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/hooks.py +0 -0
  45. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/info.py +0 -0
  46. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/intelligence.py +0 -0
  47. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/pkg.py +0 -0
  48. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/run.py +0 -0
  49. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/safety.py +0 -0
  50. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/taps.py +0 -0
  51. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/commands/team.py +0 -0
  52. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/__init__.py +0 -0
  53. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/adapters.py +0 -0
  54. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/agents.py +0 -0
  55. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/ai.py +0 -0
  56. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/capabilities.py +0 -0
  57. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/catalog.py +0 -0
  58. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/claude_settings.py +0 -0
  59. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/config.py +0 -0
  60. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/ed25519.py +0 -0
  61. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/embed.py +0 -0
  62. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/faithfulness.py +0 -0
  63. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/frontmatter.py +0 -0
  64. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/gitutil.py +0 -0
  65. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/imperative.py +0 -0
  66. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/injectscan.py +0 -0
  67. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/installscan.py +0 -0
  68. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/integrity.py +0 -0
  69. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/journal.py +0 -0
  70. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/lockfile.py +0 -0
  71. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/logs.py +0 -0
  72. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/mcp.py +0 -0
  73. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/mcpdecl.py +0 -0
  74. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/mcphost.py +0 -0
  75. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/minisign.py +0 -0
  76. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/nethttp.py +0 -0
  77. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/output.py +0 -0
  78. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/paths.py +0 -0
  79. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/policy.py +0 -0
  80. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/projectlock.py +0 -0
  81. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/provenance.py +0 -0
  82. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/rag.py +0 -0
  83. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/registry.py +0 -0
  84. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/resolve.py +0 -0
  85. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/rules.py +0 -0
  86. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/scopes.py +0 -0
  87. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/secretscan.py +0 -0
  88. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/selfupdate.py +0 -0
  89. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/serve.py +0 -0
  90. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/stackprobe.py +0 -0
  91. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/staleness.py +0 -0
  92. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/store.py +0 -0
  93. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/trustaudit.py +0 -0
  94. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/typosquat.py +0 -0
  95. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/updatediff.py +0 -0
  96. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/util.py +0 -0
  97. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/core/workflows.py +0 -0
  98. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/data/registries.json +0 -0
  99. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/errors.py +0 -0
  100. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_cli/spin.py +0 -0
  101. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  102. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  103. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/requires.txt +0 -0
  104. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/top_level.txt +0 -0
  105. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/codecov.yml +0 -0
  106. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/.claude/settings.local.json +0 -0
  107. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/DEBUGGING.md +0 -0
  108. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/adapters.html +0 -0
  109. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/architecture/README.md +0 -0
  110. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/architecture/c4-components-core.md +0 -0
  111. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/architecture/c4-containers.md +0 -0
  112. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/architecture/c4-context.md +0 -0
  113. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/architecture/c4-dynamic-install.md +0 -0
  114. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/distill.gif +0 -0
  115. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/doctor.gif +0 -0
  116. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/explain.gif +0 -0
  117. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/hooks.gif +0 -0
  118. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/install.gif +0 -0
  119. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/pulse.gif +0 -0
  120. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/search.gif +0 -0
  121. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/gifs/tap.gif +0 -0
  122. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/distill.tape +0 -0
  123. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/doctor.tape +0 -0
  124. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/explain.tape +0 -0
  125. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/hooks.tape +0 -0
  126. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/install.tape +0 -0
  127. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/pulse.tape +0 -0
  128. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/search.tape +0 -0
  129. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel/tapes/tap.tape +0 -0
  130. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/carousel.html +0 -0
  131. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/commands.html +0 -0
  132. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/demo.gif +0 -0
  133. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/demo.tape +0 -0
  134. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/design-roadmap.html +0 -0
  135. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/eval.html +0 -0
  136. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/index.html +0 -0
  137. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/mcp-hub.html +0 -0
  138. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/rag-architecture.md +0 -0
  139. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D01.md +0 -0
  140. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D02.md +0 -0
  141. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D03.md +0 -0
  142. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D04.md +0 -0
  143. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D05.md +0 -0
  144. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D06.md +0 -0
  145. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D07.md +0 -0
  146. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D08.md +0 -0
  147. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D09.md +0 -0
  148. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D10.md +0 -0
  149. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D11.md +0 -0
  150. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D12.md +0 -0
  151. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D13.md +0 -0
  152. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D14.md +0 -0
  153. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D15.md +0 -0
  154. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D16.md +0 -0
  155. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D17.md +0 -0
  156. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D18.md +0 -0
  157. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D19.md +0 -0
  158. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D20.md +0 -0
  159. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D21.md +0 -0
  160. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D22.md +0 -0
  161. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D23.md +0 -0
  162. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D24.md +0 -0
  163. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D25.md +0 -0
  164. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D26.md +0 -0
  165. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  166. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  167. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  168. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  169. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  170. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  171. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  172. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  173. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  174. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  175. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  176. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  177. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  178. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  179. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  180. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  181. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  182. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  183. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  184. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  185. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  186. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/command-carousel-page.md +0 -0
  187. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  188. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  189. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  190. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  191. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  192. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  193. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  194. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  195. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  196. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  197. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  198. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  199. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  200. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  201. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  202. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  203. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  204. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  205. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  206. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  207. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  208. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  209. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  210. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  211. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  212. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  213. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  214. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  215. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/github-community-health-files.md +0 -0
  216. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  217. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  218. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  219. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  220. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  221. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  222. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  223. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  224. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  225. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  226. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  227. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  228. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  229. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/keyless-item.md +0 -0
  230. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  231. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  232. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  233. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  234. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  235. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  236. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  237. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  238. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  239. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  240. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  241. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  242. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  243. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  244. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  245. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  246. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  247. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  248. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  249. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  250. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  251. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  252. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  253. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  254. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  255. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  256. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  257. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  258. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  259. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  260. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  261. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  262. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  263. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  264. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  265. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  266. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  267. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  268. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  269. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  270. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  271. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  272. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  273. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  274. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  275. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  276. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  277. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  278. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  279. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  280. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  281. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  282. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  283. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  284. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  285. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  286. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  287. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  288. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  289. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  290. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  291. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  292. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  293. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  294. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  295. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  296. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  297. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  298. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  299. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  300. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  301. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  302. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  303. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  304. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  305. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  306. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  307. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  308. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  309. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  310. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  311. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  312. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  313. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  314. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  315. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  316. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  317. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  318. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  319. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  320. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  321. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  322. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  323. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  324. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  325. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  326. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  327. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  328. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  329. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  330. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  331. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  332. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  333. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  334. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  335. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  336. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  337. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  338. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  339. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  340. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  341. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  342. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  343. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  344. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  345. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/workspace-scope-install.md +0 -0
  346. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  347. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/eslint.config.mjs +0 -0
  348. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/README.md +0 -0
  349. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/__init__.py +0 -0
  350. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/baseline.json +0 -0
  351. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/faithfulness.py +0 -0
  352. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/golden_set.json +0 -0
  353. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/make_corpus.py +0 -0
  354. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/make_golden.py +0 -0
  355. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/metrics.py +0 -0
  356. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/evals/run_evals.py +0 -0
  357. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/examples/README.md +0 -0
  358. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/examples/adapt-demo.sh +0 -0
  359. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/examples/boost-run-prototype.sh +0 -0
  360. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/index.html +0 -0
  361. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/noxfile.py +0 -0
  362. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/pyproject.toml +0 -0
  363. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/coverage-tools.in +0 -0
  364. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/coverage-tools.txt +0 -0
  365. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/lint-tools.in +0 -0
  366. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/lint-tools.txt +0 -0
  367. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/mutation-tools.in +0 -0
  368. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/mutation-tools.txt +0 -0
  369. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/platform-pins.lock +0 -0
  370. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/release-tools.in +0 -0
  371. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/release-tools.txt +0 -0
  372. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/test-tools.in +0 -0
  373. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/requirements/test-tools.txt +0 -0
  374. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/a11y_check.py +0 -0
  375. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/bench_cli.sh +0 -0
  376. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/build_command_reference.py +0 -0
  377. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/build_registries.py +0 -0
  378. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/build_roadmap.py +0 -0
  379. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/check_anchors.py +0 -0
  380. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/check_licenses.py +0 -0
  381. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/check_required_checks.py +0 -0
  382. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/ensure_eval_corpus.sh +0 -0
  383. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/eval_explain.py +0 -0
  384. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/eval_gate.py +0 -0
  385. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/eval_recommend.py +0 -0
  386. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/eval_retrieval.py +0 -0
  387. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/eval_stats_summary.py +0 -0
  388. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/import_budget.py +0 -0
  389. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/lock_toolchain.py +0 -0
  390. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/mutation_gate.py +0 -0
  391. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/mutation_shards.py +0 -0
  392. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/mutation_weights.json +0 -0
  393. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/perf_gate.py +0 -0
  394. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/post_deploy_smoke.py +0 -0
  395. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/release_guard.py +0 -0
  396. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/scripts/release_preflight.py +0 -0
  397. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/setup.cfg +0 -0
  398. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/sonar-project.properties +0 -0
  399. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/style/README.md +0 -0
  400. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/style/boost.css +0 -0
  401. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/style/boost.js +0 -0
  402. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/style/demo.html +0 -0
  403. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/adapt.feature +0 -0
  404. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/browse.feature +0 -0
  405. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/count.feature +0 -0
  406. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/discover.feature +0 -0
  407. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/doctor.feature +0 -0
  408. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/environment.py +0 -0
  409. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/explain.feature +0 -0
  410. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/index.feature +0 -0
  411. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/install.feature +0 -0
  412. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/list.feature +0 -0
  413. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/mcp.feature +0 -0
  414. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/search.feature +0 -0
  415. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/cli_steps.py +0 -0
  416. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/discovery_steps.py +0 -0
  417. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/mcp_steps.py +0 -0
  418. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/quality_steps.py +0 -0
  419. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/conftest.py +0 -0
  420. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/eval/baseline.json +0 -0
  421. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/eval/explain.jsonl +0 -0
  422. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/eval/golden.jsonl +0 -0
  423. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/eval/recommend.jsonl +0 -0
  424. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/eval/taps.txt +0 -0
  425. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_capabilities_policy.py +0 -0
  426. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_adapt.py +0 -0
  427. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_bmad.py +0 -0
  428. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_configuration.py +0 -0
  429. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_discovery.py +0 -0
  430. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_hooks.py +0 -0
  431. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_info.py +0 -0
  432. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_intelligence.py +0 -0
  433. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_pkg.py +0 -0
  434. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_quality.py +0 -0
  435. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_taps.py +0 -0
  436. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_cli_team.py +0 -0
  437. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_everyday_loop.py +0 -0
  438. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_integrity_enforce.py +0 -0
  439. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_property_parsers.py +0 -0
  440. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_run.py +0 -0
  441. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_tap_signing.py +0 -0
  442. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/functional/test_workspace_scope.py +0 -0
  443. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/README.md +0 -0
  444. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  445. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  446. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  447. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  448. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  449. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  450. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  451. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  452. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  453. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  454. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  455. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  456. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  457. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  458. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  459. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  460. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  461. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  462. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  463. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  464. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/fuzz_frontmatter.py +0 -0
  465. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/fuzz/fuzz_registry.py +0 -0
  466. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/make_fixture.py +0 -0
  467. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/perf/test_benchmarks.py +0 -0
  468. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/smoke.sh +0 -0
  469. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_a11y_check.py +0 -0
  470. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_adapters.py +0 -0
  471. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_adapters_multi.py +0 -0
  472. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_adapters_runner.py +0 -0
  473. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_agents.py +0 -0
  474. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_ai.py +0 -0
  475. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_capabilities.py +0 -0
  476. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_catalog.py +0 -0
  477. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_check_anchors.py +0 -0
  478. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_check_licenses.py +0 -0
  479. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_claude_settings.py +0 -0
  480. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_cliparse.py +0 -0
  481. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_codeql_analysis_key.py +0 -0
  482. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_command_reference_fresh.py +0 -0
  483. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_community_health_files.py +0 -0
  484. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_config.py +0 -0
  485. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_dense.py +0 -0
  486. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_dense_fallback.py +0 -0
  487. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_dependabot_config.py +0 -0
  488. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_docs_pages_linked.py +0 -0
  489. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_docsite_chrome.py +0 -0
  490. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_ed25519.py +0 -0
  491. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_embed.py +0 -0
  492. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_errors_and_cli_table.py +0 -0
  493. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_eval_faithfulness.py +0 -0
  494. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_eval_gate.py +0 -0
  495. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_eval_metrics.py +0 -0
  496. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_eval_stats_summary.py +0 -0
  497. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_faithfulness.py +0 -0
  498. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_frontmatter.py +0 -0
  499. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_fuzz_targets.py +0 -0
  500. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_gitleaks_config.py +0 -0
  501. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_gitutil.py +0 -0
  502. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_imperative.py +0 -0
  503. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_import_budget.py +0 -0
  504. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_injectscan.py +0 -0
  505. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_installscan.py +0 -0
  506. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_integrity.py +0 -0
  507. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_journal.py +0 -0
  508. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_lockfile.py +0 -0
  509. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_logs.py +0 -0
  510. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_marketing_counts.py +0 -0
  511. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mcp.py +0 -0
  512. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mcp_install_scan.py +0 -0
  513. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mcpdecl.py +0 -0
  514. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mcphost.py +0 -0
  515. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_minisign.py +0 -0
  516. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mutation_hardening.py +0 -0
  517. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mutation_shards.py +0 -0
  518. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mutation_subfile_shards.py +0 -0
  519. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_mutmut_source_paths.py +0 -0
  520. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_nethttp.py +0 -0
  521. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_output.py +0 -0
  522. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_paths.py +0 -0
  523. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_perf_gate.py +0 -0
  524. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_pkg_confusions.py +0 -0
  525. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_pkg_injection.py +0 -0
  526. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_pkg_secrets.py +0 -0
  527. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_platform_pins.py +0 -0
  528. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_policy.py +0 -0
  529. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_post_deploy_smoke.py +0 -0
  530. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_project_mcp_sidecar.py +0 -0
  531. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_projectlock.py +0 -0
  532. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_provenance.py +0 -0
  533. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_rag.py +0 -0
  534. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_registries_fresh.py +0 -0
  535. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_registry.py +0 -0
  536. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_registry_categories.py +0 -0
  537. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_release_guard.py +0 -0
  538. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_release_preflight.py +0 -0
  539. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_required_checks.py +0 -0
  540. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_resolve.py +0 -0
  541. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_roadmap_fresh.py +0 -0
  542. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_rules.py +0 -0
  543. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_scopes.py +0 -0
  544. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_secretscan.py +0 -0
  545. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_selfupdate.py +0 -0
  546. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_serve.py +0 -0
  547. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_spin.py +0 -0
  548. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_stackprobe.py +0 -0
  549. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_staleness.py +0 -0
  550. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_store.py +0 -0
  551. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_token_parity.py +0 -0
  552. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_toolchain_lock.py +0 -0
  553. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_trustaudit.py +0 -0
  554. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_typosquat.py +0 -0
  555. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_updatediff.py +0 -0
  556. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_util.py +0 -0
  557. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_version.py +0 -0
  558. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_workflow_concurrency.py +0 -0
  559. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_workflow_timeouts.py +0 -0
  560. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/unit/test_workflows.py +0 -0
  561. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/visual/a11y_check.mjs +0 -0
  562. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/visual/console_check.mjs +0 -0
  563. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/visual/package-lock.json +0 -0
  564. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/visual/package.json +0 -0
  565. {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.308}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.307
3
+ Version: 1.0.308
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.307'
22
- __version_tuple__ = version_tuple = (1, 0, 307)
21
+ __version__ = version = '1.0.308'
22
+ __version_tuple__ = version_tuple = (1, 0, 308)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -365,9 +365,25 @@ def cmd_doctor(argv):
365
365
  if not rotation:
366
366
  bad("journal is overdue for rotation — run `boost heal`")
367
367
 
368
+ # Which search engine will actually answer a query. Dense retrieval needs
369
+ # three things to line up and every one of them fails silently, so doctor
370
+ # is where the answer belongs — `search` only ever reports the engine that
371
+ # already ran, never that a configured one never got the chance.
372
+ _report_search_engine(bad)
373
+
368
374
  lp = logs.log_path()
369
375
  if lp.exists():
370
- out.ok("diagnostic log at %s" % _tilde(lp))
376
+ # Existence is not health: a log the process cannot open makes every
377
+ # invocation print a PermissionError traceback from the logging module
378
+ # while this check happily reported a ✓ for the same file. Diagnostics
379
+ # are the first thing consulted when something else breaks, so a log
380
+ # that silently accepts nothing has to read as a fault.
381
+ if os.access(str(lp), os.W_OK):
382
+ out.ok("diagnostic log at %s" % _tilde(lp))
383
+ else:
384
+ bad("diagnostic log %s is not writable — every invocation is "
385
+ "failing to record; fix its permissions (chmod u+w)"
386
+ % _tilde(lp))
371
387
  crashes = sorted(paths.logs_dir().glob("crash-*.log")) \
372
388
  if paths.logs_dir().is_dir() else []
373
389
  if crashes:
@@ -391,6 +407,59 @@ def cmd_doctor(argv):
391
407
  return 1 if issues else 0
392
408
 
393
409
 
410
+ # Why dense retrieval isn't serving, keyed by `dense.status()["reason"]`. Each
411
+ # names the ONE next action; the reason order in `status()` guarantees only the
412
+ # first missing link is ever reported, so these never chain.
413
+ _DENSE_FIX = {
414
+ "no-backend": "install the extra: `pip install 'boost-skill-cli[rag]'`",
415
+ "no-key": "set VOYAGE_API_KEY or OPENAI_API_KEY",
416
+ "no-store": "build it: `boost reindex --dense`",
417
+ "version-changed": "rebuild it: `boost reindex --dense --force`",
418
+ "provider-changed": "rebuild it: `boost reindex --dense --force`",
419
+ "model-changed": "rebuild it: `boost reindex --dense --force`",
420
+ "dim-changed": "rebuild it: `boost reindex --dense --force`",
421
+ "empty": "rebuild it: `boost reindex --dense --force`",
422
+ }
423
+
424
+
425
+ def _report_search_engine(bad) -> None:
426
+ """Report the engine `boost search` will use, and why it isn't the best one.
427
+
428
+ Only a *degraded* dense tier counts against doctor's exit code: BM25 is the
429
+ documented default and most users never opt in, so an unconfigured tier is
430
+ healthy. Vectors already on disk that have stopped serving are not.
431
+ """
432
+ # Local import: the dense/embedding engines are opt-in and stay out of
433
+ # startup for every other command (scripts/import_budget.py enforces it).
434
+ from ..core import dense
435
+ st = dense.status()
436
+
437
+ if st["ready"]:
438
+ out.ok("semantic search active — %s %s (%d-d), %d chunk%s across %d tap%s"
439
+ % (st["provider"], st["model"], st["dim"] or 0,
440
+ st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
441
+ return
442
+
443
+ fix = _DENSE_FIX.get(str(st["reason"]), "see `boost reindex --dense`")
444
+ if st["degraded"]:
445
+ # The store was built and is now dead weight: say what it holds, what
446
+ # changed, and that search has silently been on BM25 the whole time.
447
+ built = st["built_model"] or st["built_provider"] or "an older build"
448
+ detail = "built with %s" % built
449
+ if st["reason"] == "model-changed":
450
+ detail += ", live key is %s" % st["model"]
451
+ elif st["reason"] == "provider-changed":
452
+ detail += ", live key is %s" % st["provider"]
453
+ elif st["reason"] == "empty":
454
+ detail += " but holds no vectors"
455
+ bad("semantic search silently off — %d-chunk vector store %s; "
456
+ "searches are using BM25. %s" % (st["chunks"], detail, fix))
457
+ return
458
+
459
+ out.info("semantic search not configured — using the full-content BM25 "
460
+ "engine (%s)" % fix)
461
+
462
+
394
463
  def _print_skipped(skipped: List[dict]) -> None:
395
464
  """Note the rule/workflow entries `lint` passed over (they have no SKILL.md)."""
396
465
  if not skipped:
@@ -102,6 +102,106 @@ def _chunk_texts(entry: dict, tap_paths: Optional[Dict[str, Path]]
102
102
  return chunk(body) or [body]
103
103
 
104
104
 
105
+ def _recorded_meta() -> dict:
106
+ """What an existing store says it was built with, read WITHOUT sqlite-vec.
107
+
108
+ Deliberately not routed through :func:`_connect`, which loads the extension
109
+ and returns ``None`` without it: the most useful diagnostic line ("your
110
+ store was built with voyage-3") would then vanish in exactly the case that
111
+ needs it — a user who dropped the ``[rag]`` extra and wants to know why
112
+ dense went quiet. ``meta`` is a plain table, so plain sqlite3 can read it.
113
+ """
114
+ p = db_path()
115
+ if not p.exists():
116
+ return {}
117
+ try:
118
+ con = sqlite3.connect(str(p))
119
+ except sqlite3.Error:
120
+ return {}
121
+ try:
122
+ meta = _read_meta(con)
123
+ try:
124
+ meta["_chunks"] = con.execute(
125
+ "SELECT COUNT(*) FROM chunks").fetchone()[0]
126
+ except sqlite3.DatabaseError:
127
+ meta["_chunks"] = 0
128
+ return meta
129
+ except sqlite3.DatabaseError:
130
+ # A truncated or non-sqlite file: report "no store", never raise into
131
+ # a health check whose whole job is to survive a broken install.
132
+ return {}
133
+ finally:
134
+ con.close()
135
+
136
+
137
+ def status() -> dict:
138
+ """Why dense retrieval is, or is not, serving queries.
139
+
140
+ Pure inspection — never builds, never embeds, never needs the extra. Three
141
+ independent things must line up (the ``[rag]`` extra, an embeddings key, a
142
+ built store whose space matches the live one) and every one of them fails
143
+ *silently* today, because :func:`rag.retrieve_any` floors to BM25 and
144
+ returns. ``reason`` names which link is missing so a caller can say so.
145
+
146
+ ``degraded`` is the load-bearing distinction: a user who never configured
147
+ dense search is *healthy* (BM25 is the documented default), while a user
148
+ who did all three steps and is still on BM25 has a real problem no other
149
+ surface reports. Only the latter should move an exit code.
150
+ """
151
+ have_be = have_backend()
152
+ prov, mdl, dim = embed.provider(), embed.model(), embed.dimension()
153
+ meta = _recorded_meta()
154
+ b_prov = meta.get("provider")
155
+ b_mdl = meta.get("model")
156
+ b_dim = meta.get("dim")
157
+ b_ver = meta.get("version")
158
+ commits = meta.get("commits")
159
+ chunks = int(meta.get("_chunks") or 0)
160
+ store_exists = bool(meta)
161
+
162
+ # Order matters: report the *first* missing link, so the message names the
163
+ # next action rather than a downstream symptom of the same gap.
164
+ if not have_be:
165
+ reason: Optional[str] = "no-backend"
166
+ elif prov is None:
167
+ reason = "no-key"
168
+ elif not store_exists:
169
+ reason = "no-store"
170
+ elif b_ver != INDEX_VERSION:
171
+ reason = "version-changed"
172
+ elif b_prov != prov:
173
+ reason = "provider-changed"
174
+ elif b_mdl != mdl:
175
+ reason = "model-changed"
176
+ elif b_dim != dim:
177
+ reason = "dim-changed"
178
+ elif chunks <= 0:
179
+ reason = "empty"
180
+ else:
181
+ reason = None
182
+
183
+ # Unconfigured is not degraded; a built-but-unusable store is. Vectors on
184
+ # disk are the proof of intent — the user paid to embed them, so anything
185
+ # that stops them serving (a dropped extra, an unset key, a changed model)
186
+ # is a real fault. Without a store there is nothing to have regressed:
187
+ # "no-store" is an unfinished setup, and it is the one reason that implies
188
+ # store_exists is False, so this single clause covers every case.
189
+ degraded = store_exists and reason is not None
190
+
191
+ return {
192
+ "backend": have_be,
193
+ "provider": prov, "model": mdl, "dim": dim,
194
+ "store_exists": store_exists,
195
+ "built_provider": b_prov, "built_model": b_mdl,
196
+ "built_dim": b_dim, "built_version": b_ver,
197
+ "chunks": chunks,
198
+ "taps": len(commits) if isinstance(commits, dict) else 0,
199
+ "ready": reason is None,
200
+ "reason": reason,
201
+ "degraded": degraded,
202
+ }
203
+
204
+
105
205
  def ready() -> bool:
106
206
  """True when a usable, provider-matched vector index exists on disk."""
107
207
  if not have_backend() or not embed.available() or not db_path().exists():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.307
3
+ Version: 1.0.308
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -169,6 +169,7 @@ docs/roadmap/items/ambiguous-tap-short-name-resolution.md
169
169
  docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
170
170
  docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
171
171
  docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
172
+ docs/roadmap/items/bm25-index-is-one-json-blob.md
172
173
  docs/roadmap/items/boost-run-live-agents.md
173
174
  docs/roadmap/items/bring-commands-under-mutation-testing.md
174
175
  docs/roadmap/items/broken-link-and-anchor-checking-lychee.md
@@ -201,6 +202,7 @@ docs/roadmap/items/docsite-chrome-and-content-audit.md
201
202
  docs/roadmap/items/docstring-coverage-interrogate.md
202
203
  docs/roadmap/items/doctor-checks-rules-and-workflows.md
203
204
  docs/roadmap/items/end-of-options-guard-on-git-commands.md
205
+ docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md
204
206
  docs/roadmap/items/extension-free-tests-core-dense-py.md
205
207
  docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md
206
208
  docs/roadmap/items/finish-mutation-hardening-across-core.md
@@ -225,6 +227,7 @@ docs/roadmap/items/integrity-verification-boost-verify.md
225
227
  docs/roadmap/items/internal-architecture-diagrams.md
226
228
  docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md
227
229
  docs/roadmap/items/journal-rotation-race-and-handle-leak.md
230
+ docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md
228
231
  docs/roadmap/items/keyless-item.md
229
232
  docs/roadmap/items/layering-guard-import-linter.md
230
233
  docs/roadmap/items/license-compliance-scanning.md
@@ -261,6 +264,7 @@ docs/roadmap/items/mutation-hardening-core-gitutil-py.md
261
264
  docs/roadmap/items/mutation-hardening-core-store-py.md
262
265
  docs/roadmap/items/mutation-shard-floor-is-one-file.md
263
266
  docs/roadmap/items/mypy-strict-mode-for-commands.md
267
+ docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md
264
268
  docs/roadmap/items/negative-limit-inverts-log-pulse-output.md
265
269
  docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md
266
270
  docs/roadmap/items/one-command-every-env-nox.md
@@ -274,6 +278,7 @@ docs/roadmap/items/pin-the-lint-toolchain.md
274
278
  docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md
275
279
  docs/roadmap/items/post-deploy-smoke-headless-load-check.md
276
280
  docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md
281
+ docs/roadmap/items/prerequisites-and-semantic-search-setup.md
277
282
  docs/roadmap/items/project-scope-across-every-command.md
278
283
  docs/roadmap/items/project-scope-symlink-escape-on-write.md
279
284
  docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md
@@ -477,6 +482,7 @@ tests/unit/test_community_health_files.py
477
482
  tests/unit/test_config.py
478
483
  tests/unit/test_dense.py
479
484
  tests/unit/test_dense_fallback.py
485
+ tests/unit/test_dense_status.py
480
486
  tests/unit/test_dependabot_config.py
481
487
  tests/unit/test_docs_pages_linked.py
482
488
  tests/unit/test_docsite_chrome.py
@@ -0,0 +1,45 @@
1
+ ---
2
+ id: bm25-index-is-one-json-blob
3
+ board: code
4
+ section: pipeline
5
+ status: planned
6
+ category: Search · Index
7
+ complexity: L
8
+ impact: High
9
+ wow: 5
10
+ note: 2.5 GB RSS per search at 50k items
11
+ order: 72
12
+ owner:
13
+ pr:
14
+ title: The BM25 index is one JSON blob, and it stops working between 10k and 50k items
15
+ ---
16
+ <code>rag.py</code> persists the whole index as a single JSON file and
17
+ <code>json.loads</code> it on every invocation. <code>_CACHE</code>
18
+ (<code>rag.py:275</code>) is process-local, so a long-lived MCP server amortises
19
+ the cost but <b>every cold <code>boost search</code> pays it in full</b>.
20
+ Measured on a synthetic corpus of real repo prose, 10k items &rarr; 50k items:<br>
21
+ index on disk 52.7 MB &rarr; <b>270 MB</b>;<br>
22
+ <code>json.loads</code> per search 2.0&ndash;2.9 s &rarr; <b>12.2&ndash;13.6 s</b>;<br>
23
+ peak RSS 702 MB &rarr; <b>2.49 GB</b>;<br>
24
+ BM25 scoring itself 31 ms &rarr; 70 ms &mdash; cold start dominates by ~200&times;.
25
+ On a real 83-tap install the index is already 132 MB at 11.1k entries. Scaling
26
+ that shape to 50k gives ~594 MB and ~5.7 GB resident. <b>Target RSS, not
27
+ bytes</b>: Python object overhead was measured at a consistent 9.5–9.6× file
28
+ size across three independent runs, which is what OOM-kills an 8 GB machine
29
+ while the disk figure still looks survivable.
30
+ Two cheap wins come first and are worth landing on their own.
31
+ <b>(1) Stop chunking.</b> An unchunked index with the item's surface
32
+ (name + de-hyphenated name + description) counted alongside the body scored
33
+ <code>recall@10 0.742 / hit@1 0.429</code> at <b>41 MB and 0.43 s</b> to load,
34
+ versus the live chunked index's <code>0.720 / 0.407</code> at <b>132 MB and
35
+ 8–13 s</b> — better on every metric, 3.2× smaller, 20× faster to load.
36
+ <b>(2) Get postings out of JSON.</b> FTS5 is compiled into CPython's bundled
37
+ sqlite (verified: 3.53.4, <code>ENABLE_FTS5</code>), so there is a
38
+ zero-dependency path — but probe it at runtime, because that is a per-build
39
+ property, not a guarantee. A compact mmap-able binary postings format is the
40
+ alternative. Either way <code>snip</code> text (46.7 MB of the 132 MB) belongs
41
+ out of the hot path.
42
+ Also note <code>build()</code>'s incremental path is O(entire corpus): reusing
43
+ unchanged taps runs <code>_kept_docs</code> → <code>_postings_to_doc_tf</code>,
44
+ which inverts every posting in the index — measured 35 s and 1.72 GB RSS at
45
+ 11.1k entries to reindex a single changed file.
@@ -0,0 +1,42 @@
1
+ ---
2
+ id: eval-corpus-cannot-see-real-retrieval
3
+ board: code
4
+ section: internals
5
+ status: planned
6
+ category: Quality · Eval
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: gate reports 1.000 while users get 0.720
11
+ order: 70
12
+ owner:
13
+ pr:
14
+ title: The eval gate reports a perfect score on a corpus 4× smaller than a real user's
15
+ ---
16
+ <code>make eval</code> reports BM25 <code>recall@10 = 1.000</code> against the
17
+ pinned 23-tap corpus in <code>tests/eval/taps.txt</code>. Run the same script
18
+ against a real 83-tap install and it reports <b>0.720</b> — below the gate's own
19
+ 0.85 floor — with <code>hit@1 0.407</code>, <code>MRR 0.526</code>,
20
+ <code>nDCG 0.566</code>, and <code>rule</code> the weakest kind at 0.500 recall /
21
+ 0.286 hit@1. The gate has been advertising a perfect score while real-world
22
+ recall sits at 0.72, and it is blind in three separate ways:
23
+ <b>(1) recall-only flooring.</b> <code>--fail-under</code> gates
24
+ <code>recall@k</code> and nothing else, so a total <code>hit@1</code> collapse
25
+ from 0.780 to 0.000 would still pass.
26
+ <b>(2) regression detection is switched off.</b> <code>Makefile</code> passes
27
+ <code>--regression-eps 1</code>, which tolerates any absolute drop up to 1.0.
28
+ <b>(3) a kind oracle.</b> Grading per-row by the golden set's <code>kind</code>
29
+ field tells the retriever whether the answer is a skill, a rule or a workflow —
30
+ which <code>boost search</code> never knows unless the user passes
31
+ <code>--kind</code>. That single filter is worth +0.073 recall and +0.073 hit@1,
32
+ enough to flatter any change measured against it.
33
+ <b>The consequence is that no retrieval work in the repo is currently
34
+ falsifiable</b>, which makes this a hard prerequisite for every other item in
35
+ this group rather than a cleanup. Note the companion gate is in better shape:
36
+ <code>make evals</code> (<code>scripts/eval_gate.py</code>) already floors five
37
+ metrics and runs a paired bootstrap for significance — its limitation is corpus
38
+ size (57 entries, 1 tap), not metric design, so the work is to grow an
39
+ instrument that exists rather than to build one. Also needed: queries that
40
+ <em>only</em> body text can satisfy. The golden set grades items by name, so it
41
+ scores a surface-only index <em>above</em> the full-content one and would
42
+ cheerfully greenlight deleting body indexing altogether.
@@ -0,0 +1,58 @@
1
+ ---
2
+ id: keyless-dense-tier-local-static-embeddings
3
+ board: code
4
+ section: pipeline
5
+ status: planned
6
+ category: Search · Retrieval
7
+ complexity: L
8
+ impact: High
9
+ wow: 5
10
+ note: semantic search with no key, no billing, no deps
11
+ order: 73
12
+ owner:
13
+ pr:
14
+ title: Semantic search for users who will never set an API key
15
+ ---
16
+ Dense retrieval today needs the <code>[rag]</code> extra <em>and</em> a
17
+ <code>VOYAGE_API_KEY</code>/<code>OPENAI_API_KEY</code> <em>and</em> a built
18
+ store. Most users will do none of that, so the default experience is BM25
19
+ forever. The keyless path is a <b>local static embedding model</b> —
20
+ <code>potion-retrieval-32M</code> class, MIT, model2vec family — which is not a
21
+ transformer: the entire weight file is one lookup table, so inference is
22
+ tokenize → gather rows → mean-pool → L2-normalize.
23
+ Measured locally, pure stdlib: <b>~1 ms to embed a query</b> (mmap + bisect over
24
+ sorted keys), 12.8 MB of int8 vectors for 50k items at 256-d, and <b>~20 ms to
25
+ rerank BM25's top-200</b>. No numpy, no <code>sqlite-vec</code>, no ANN index,
26
+ no new runtime dependency. <code>import numpy</code> alone costs 180–390 ms
27
+ cold, which disqualifies it from a one-shot CLI query path; the BM25 prefilter is
28
+ what makes the stdlib version viable, since a full 50k brute-force scan is 1.5 s
29
+ in pure Python. Pool depth is justified by measurement: BM25 recall saturates at
30
+ 0.890 by depth 200 and gains nothing at 400, so reranking the top-200 gives up
31
+ essentially nothing versus scanning everything.
32
+ <b>Why this and not a shipped Voyage index.</b> A precomputed Voyage index is
33
+ inert without a Voyage <em>query</em> vector, and the only keyless way to get one
34
+ is a maintainer-run anonymous embedding endpoint — an unauthenticated free
35
+ embeddings API backed by the maintainer's card, which also ships every user query
36
+ off-machine and breaks offline. A local model is deterministic, so the artifact
37
+ becomes a <em>cache</em> rather than a correctness dependency: a newly tapped
38
+ repo can be embedded on the user's own machine. Doc-side is the asymmetry worth
39
+ shipping for — 29 ms/doc in pure Python is ~24 min for 50k single-core, versus
40
+ seconds in CI with numpy.
41
+ <b>Do not ship this before the eval and dedup items.</b> The headline claim
42
+ (+11.0 recall / +15.9 hit@1) did <em>not</em> survive verification: its baseline
43
+ used the kind oracle the real search path lacks, and both the blend weight
44
+ (<code>w_dense=0.7</code>) and the pool depth were argmax'd on the same 82
45
+ queries they were reported on, by 2-query margins. On a binary metric at n=82
46
+ the smallest net win reaching p&lt;0.05 is 6 queries; <code>hit@1</code> (+13 net
47
+ queries) holds up, recall (+9) sits at the resolution floor. And the structural
48
+ risk is real: the name is only ~10.5% of a mean-pooled surface vector while 106
49
+ description clusters are shared across 270 distinct names, so the lift may
50
+ <em>shrink</em> toward 50k rather than hold. Sequence: fix the gate, dedup, fix
51
+ the index format, then re-measure with McNemar and a held-out blend weight,
52
+ leading with <code>hit@1</code>. Test entry-level dense <em>alone</em> before the
53
+ blend, ship 512-d not 256-d (the whole case for 256-d was one query), keep
54
+ Voyage/OpenAI as the opt-in ceiling, and keep BM25 as the floor. The model table
55
+ cannot go in the default wheel — the shipped runtime is 0.79 MB and every merge
56
+ to main cuts a release, so +17.4 MB × ~24 releases/day exhausts PyPI's 10 GB
57
+ project quota in under a month; it needs a separate, rarely-released data
58
+ package behind an extra.
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: near-duplicate-items-eat-the-result-slots
3
+ board: code
4
+ section: pipeline
5
+ status: planned
6
+ category: Search · Ranking
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: 56.3% of entries share a name
11
+ order: 71
12
+ owner:
13
+ pr:
14
+ title: Near-duplicate items consume the top-10, and it gets worse with every tap
15
+ ---
16
+ Measured on a real 83-tap install: 11,147 catalog entries carry only 6,997
17
+ unique names — <b>1.593 copies per name, and 56.3% of entries share a name with
18
+ another entry</b>. <code>rule</code> appears in 47 taps, <code>code-reviewer</code>
19
+ in 18, <code>prompt-engineer</code> in 15, <code>security-auditor</code> and
20
+ <code>incident-responder</code> in 13 each. Roughly 18% of bodies are
21
+ byte-identical, in clusters of up to 8. Because <code>rag.retrieve</code> keys
22
+ its <code>best</code> map on <code>(name, tap)</code> and then takes
23
+ <code>ranked[:k]</code>, N copies of one item across N registries consume N of
24
+ the ten slots a user sees.
25
+ <b>This is the ranking problem that grows with the catalog</b>, and no retrieval
26
+ engine fixes it: byte-identical bodies produce byte-identical vectors, so a dense
27
+ reranker cannot separate them and reciprocal-rank fusion actively reinforces the
28
+ agreement. Adding distractor taps was measured driving base
29
+ <code>recall@10</code> <em>down</em> 0.902 → 0.872. Dedup is model-free, needs no
30
+ download and no new dependency, and its benefit scales up as the corpus grows
31
+ rather than washing out.
32
+ Two things to get right. First, cluster on content hash (or canonical name)
33
+ rather than name alone, and pick a winner with a quality prior — source trust,
34
+ stars, recency, maintenance — so the surviving copy is the one worth installing;
35
+ <code>core/typosquat.py</code> already has confusion machinery to build on.
36
+ Second, <b><code>(tap, name)</code> is not a unique key</b>: it collides on 1,557
37
+ of 11,147 entries (14.0%), worst case <code>('survivorforge/cursor-rules',
38
+ 'rule')</code> ×47. Anything keyed on it — a cache, a shipped artifact, a lock
39
+ row — silently binds data to the wrong entry. Use <code>(tap, skill_md)</code>,
40
+ which is 11,147/11,147 distinct.
@@ -0,0 +1,41 @@
1
+ ---
2
+ id: prerequisites-and-semantic-search-setup
3
+ board: code
4
+ section: docsite
5
+ status: planned
6
+ category: Docs · Setup
7
+ complexity: M
8
+ impact: High
9
+ wow: 3
10
+ note: silent BM25-only is the default outcome
11
+ order: 58
12
+ owner:
13
+ pr:
14
+ title: Nothing tells a user semantic search is off — not the README, not <code>search</code>, not <code>/mcp</code>
15
+ ---
16
+ Dense retrieval needs three separate things to line up — the <code>[rag]</code>
17
+ extra (<code>sqlite-vec</code>), an embeddings key (<code>VOYAGE_API_KEY</code> or
18
+ <code>OPENAI_API_KEY</code>), <em>and</em> a built vector store
19
+ (<code>boost reindex --dense</code>) — and every one of them fails
20
+ <em>silently</em>: <code>rag.retrieve_any</code> floors to BM25 and returns, so a
21
+ user who installed the extra but never set a key, or set a key but never
22
+ reindexed, has no way to learn that the semantic search they think they enabled
23
+ has never once run. Three gaps to close:
24
+ <b>(1) README.</b> Prerequisites live in half a sentence (&ldquo;Needs Python 3.9+
25
+ and <code>git</code>&rdquo;) and the optional stack is buried in Install prose.
26
+ Give required vs. optional prerequisites a dedicated
27
+ <b>Configuring semantic search</b> section, and automate the optional install the
28
+ way <code>requirements/*.txt</code> already does for the toolchain, so it is one
29
+ command rather than three remembered ones.
30
+ <b>(2) Surfacing.</b> <code>cmd_search</code> prints which engine <em>ran</em> but
31
+ never that a better one is available — <code>embed.fallback_note()</code> exists
32
+ and is only wired into <code>reindex --dense</code>. Say it on search too, and
33
+ put engine state in the MCP <code>initialize</code> response
34
+ (<code>serverInfo</code>/<code>instructions</code>) so an agent reading
35
+ <code>/mcp</code> can see &ldquo;BM25 only — dense not configured&rdquo; instead of
36
+ assuming vector search.
37
+ <b>(3) Stale docs.</b> <code>mcp-hub.html</code> still advertises
38
+ <code>voyage-3</code> (1024-d) in the pipeline diagram and the Phase&nbsp;2
39
+ details block; <code>core/embed.py</code> has pinned <code>voyage-4</code> since
40
+ the complimentary-token change. Same sweep should catch any other drifted model
41
+ or extra names across <code>docs/*.html</code>.