boost-skill-cli 1.0.319__tar.gz → 1.0.321__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 (575) hide show
  1. {boost_skill_cli-1.0.319/boost_skill_cli.egg-info → boost_skill_cli-1.0.321}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/rag.py +40 -16
  4. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. boost_skill_cli-1.0.321/docs/roadmap/items/bm25-index-is-one-json-blob.md +101 -0
  6. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +13 -0
  7. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap.html +73 -3
  8. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/baseline.json +8 -8
  9. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_rag.py +22 -5
  10. boost_skill_cli-1.0.319/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -45
  11. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.gitattributes +0 -0
  12. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.gitignore +0 -0
  13. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.gitleaks.toml +0 -0
  14. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.htmlvalidate.json +0 -0
  15. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.lighthouserc.json +0 -0
  16. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.lycheeignore +0 -0
  17. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.markdownlint-cli2.jsonc +0 -0
  18. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.pre-commit-config.yaml +0 -0
  19. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.stylelintrc.json +0 -0
  20. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.vale/styles/boost/Terminology.yml +0 -0
  21. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  22. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.vale.ini +0 -0
  23. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/CLAUDE.md +0 -0
  24. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/CODE_OF_CONDUCT.md +0 -0
  25. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/CONTRIBUTING.md +0 -0
  26. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/LICENSE +0 -0
  27. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/MANIFEST.in +0 -0
  28. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/Makefile +0 -0
  29. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/README.md +0 -0
  30. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/SECURITY.md +0 -0
  31. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost +0 -0
  32. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/__init__.py +0 -0
  33. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/__main__.py +0 -0
  34. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/cli.py +0 -0
  35. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/cliparse.py +0 -0
  36. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/__init__.py +0 -0
  37. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/_common.py +0 -0
  38. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/bmad.py +0 -0
  39. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/configuration.py +0 -0
  40. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/discovery.py +0 -0
  41. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/hooks.py +0 -0
  42. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/info.py +0 -0
  43. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/intelligence.py +0 -0
  44. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/pkg.py +0 -0
  45. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/quality.py +0 -0
  46. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/run.py +0 -0
  47. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/safety.py +0 -0
  48. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/capabilities.py +0 -0
  55. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/catalog.py +0 -0
  56. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/claude_settings.py +0 -0
  57. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/config.py +0 -0
  58. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/dense.py +0 -0
  59. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/ed25519.py +0 -0
  60. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/embed.py +0 -0
  61. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/faithfulness.py +0 -0
  62. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/frontmatter.py +0 -0
  63. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/gitutil.py +0 -0
  64. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/imperative.py +0 -0
  65. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/injectscan.py +0 -0
  66. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/installscan.py +0 -0
  67. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/integrity.py +0 -0
  68. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/journal.py +0 -0
  69. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/localembed.py +0 -0
  70. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/lockfile.py +0 -0
  71. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/logs.py +0 -0
  72. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/mcp.py +0 -0
  73. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/mcpdecl.py +0 -0
  74. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/mcphost.py +0 -0
  75. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/minisign.py +0 -0
  76. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/nethttp.py +0 -0
  77. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/output.py +0 -0
  78. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/paths.py +0 -0
  79. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/policy.py +0 -0
  80. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/projectlock.py +0 -0
  81. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/provenance.py +0 -0
  82. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/registry.py +0 -0
  83. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/resolve.py +0 -0
  84. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/rules.py +0 -0
  85. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/scopes.py +0 -0
  86. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/secretscan.py +0 -0
  87. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/selfupdate.py +0 -0
  88. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/serve.py +0 -0
  89. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/stackprobe.py +0 -0
  90. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/staleness.py +0 -0
  91. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/store.py +0 -0
  92. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/trustaudit.py +0 -0
  93. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/typosquat.py +0 -0
  94. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/updatediff.py +0 -0
  95. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/util.py +0 -0
  96. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/workflows.py +0 -0
  97. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/data/registries.json +0 -0
  98. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/errors.py +0 -0
  99. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/spin.py +0 -0
  100. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  101. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  102. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  103. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/requires.txt +0 -0
  104. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/top_level.txt +0 -0
  105. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/codecov.yml +0 -0
  106. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/.claude/settings.local.json +0 -0
  107. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/DEBUGGING.md +0 -0
  108. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/adapters.html +0 -0
  109. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/README.md +0 -0
  110. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-components-core.md +0 -0
  111. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-containers.md +0 -0
  112. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-context.md +0 -0
  113. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-dynamic-install.md +0 -0
  114. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/distill.gif +0 -0
  115. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/doctor.gif +0 -0
  116. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/explain.gif +0 -0
  117. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/hooks.gif +0 -0
  118. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/install.gif +0 -0
  119. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/pulse.gif +0 -0
  120. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/search.gif +0 -0
  121. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/tap.gif +0 -0
  122. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/distill.tape +0 -0
  123. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/doctor.tape +0 -0
  124. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/explain.tape +0 -0
  125. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/hooks.tape +0 -0
  126. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/install.tape +0 -0
  127. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/pulse.tape +0 -0
  128. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/search.tape +0 -0
  129. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/tap.tape +0 -0
  130. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel.html +0 -0
  131. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/commands.html +0 -0
  132. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/demo.gif +0 -0
  133. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/demo.tape +0 -0
  134. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/design-roadmap.html +0 -0
  135. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/eval.html +0 -0
  136. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/index.html +0 -0
  137. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/mcp-hub.html +0 -0
  138. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/rag-architecture.md +0 -0
  139. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D01.md +0 -0
  140. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D02.md +0 -0
  141. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D03.md +0 -0
  142. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D04.md +0 -0
  143. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D05.md +0 -0
  144. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D06.md +0 -0
  145. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D07.md +0 -0
  146. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D08.md +0 -0
  147. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D09.md +0 -0
  148. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D10.md +0 -0
  149. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D11.md +0 -0
  150. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D12.md +0 -0
  151. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D13.md +0 -0
  152. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D14.md +0 -0
  153. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D15.md +0 -0
  154. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D16.md +0 -0
  155. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D17.md +0 -0
  156. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D18.md +0 -0
  157. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D19.md +0 -0
  158. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D20.md +0 -0
  159. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D21.md +0 -0
  160. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D22.md +0 -0
  161. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D23.md +0 -0
  162. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D24.md +0 -0
  163. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D25.md +0 -0
  164. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D26.md +0 -0
  165. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  166. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  167. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  168. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  169. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  170. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  171. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  172. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  173. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  174. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  175. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  176. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  177. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  178. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  179. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  180. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  181. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  182. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  183. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  184. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  185. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  186. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/command-carousel-page.md +0 -0
  187. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  188. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  189. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  190. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  191. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  192. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  193. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  194. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  195. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  196. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  197. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  198. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  199. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  200. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  201. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  202. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  203. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  204. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  205. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  206. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  207. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  208. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  209. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  210. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  211. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  212. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  213. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  214. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  215. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  216. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/github-community-health-files.md +0 -0
  217. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  218. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  219. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  220. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  221. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  222. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  223. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  224. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  225. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  226. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  227. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  228. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  229. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  230. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  231. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  232. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  233. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  234. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  235. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  236. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  237. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  238. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  239. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  240. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  241. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  242. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  243. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  244. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  245. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  246. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  247. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  248. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  249. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  250. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  251. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  252. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  253. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  254. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  255. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  256. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  257. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  258. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  259. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  260. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  261. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  262. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  263. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  264. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  265. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  266. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  267. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  268. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  269. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  270. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  271. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  272. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  273. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  274. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  275. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  276. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  277. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  278. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  279. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  280. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  281. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  282. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  283. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  284. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  285. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  286. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  287. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  288. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  289. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  290. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  291. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  292. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  293. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  294. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  295. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  296. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  297. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  298. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  299. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  300. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  301. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  302. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  303. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  304. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  305. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  306. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  307. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  308. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  309. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  310. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  311. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  312. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  313. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  314. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  315. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  316. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  317. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  318. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  319. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  320. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  321. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  322. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  323. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  324. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  325. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  326. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  327. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  328. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  329. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  330. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  331. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  332. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  333. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  334. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  335. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  336. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  337. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  338. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  339. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  340. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  341. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  342. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  343. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  344. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  345. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  346. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  347. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  348. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  349. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workspace-scope-install.md +0 -0
  350. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  351. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/eslint.config.mjs +0 -0
  352. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/README.md +0 -0
  353. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/__init__.py +0 -0
  354. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/baseline.json +0 -0
  355. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/faithfulness.py +0 -0
  356. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/golden_set.json +0 -0
  357. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/make_corpus.py +0 -0
  358. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/make_golden.py +0 -0
  359. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/metrics.py +0 -0
  360. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/run_evals.py +0 -0
  361. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/examples/README.md +0 -0
  362. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/examples/adapt-demo.sh +0 -0
  363. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/examples/boost-run-prototype.sh +0 -0
  364. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/index.html +0 -0
  365. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/noxfile.py +0 -0
  366. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/pyproject.toml +0 -0
  367. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/coverage-tools.in +0 -0
  368. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/coverage-tools.txt +0 -0
  369. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/lint-tools.in +0 -0
  370. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/lint-tools.txt +0 -0
  371. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/mutation-tools.in +0 -0
  372. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/mutation-tools.txt +0 -0
  373. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/platform-pins.lock +0 -0
  374. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/release-tools.in +0 -0
  375. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/release-tools.txt +0 -0
  376. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/test-tools.in +0 -0
  377. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/test-tools.txt +0 -0
  378. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/a11y_check.py +0 -0
  379. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/bench_cli.sh +0 -0
  380. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/build_command_reference.py +0 -0
  381. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/build_registries.py +0 -0
  382. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/build_roadmap.py +0 -0
  383. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/check_anchors.py +0 -0
  384. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/check_licenses.py +0 -0
  385. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/check_required_checks.py +0 -0
  386. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/ensure_eval_corpus.sh +0 -0
  387. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_explain.py +0 -0
  388. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_gate.py +0 -0
  389. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_recommend.py +0 -0
  390. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_retrieval.py +0 -0
  391. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_stats_summary.py +0 -0
  392. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/import_budget.py +0 -0
  393. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/lock_toolchain.py +0 -0
  394. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/mutation_gate.py +0 -0
  395. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/mutation_shards.py +0 -0
  396. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/mutation_weights.json +0 -0
  397. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/perf_gate.py +0 -0
  398. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/post_deploy_smoke.py +0 -0
  399. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/release_guard.py +0 -0
  400. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/release_preflight.py +0 -0
  401. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/setup.cfg +0 -0
  402. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/sonar-project.properties +0 -0
  403. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/README.md +0 -0
  404. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/boost.css +0 -0
  405. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/boost.js +0 -0
  406. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/demo.html +0 -0
  407. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/adapt.feature +0 -0
  408. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/browse.feature +0 -0
  409. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/count.feature +0 -0
  410. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/discover.feature +0 -0
  411. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/doctor.feature +0 -0
  412. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/environment.py +0 -0
  413. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/explain.feature +0 -0
  414. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/index.feature +0 -0
  415. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/install.feature +0 -0
  416. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/list.feature +0 -0
  417. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/mcp.feature +0 -0
  418. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/search.feature +0 -0
  419. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/cli_steps.py +0 -0
  420. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/discovery_steps.py +0 -0
  421. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/mcp_steps.py +0 -0
  422. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/quality_steps.py +0 -0
  423. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/conftest.py +0 -0
  424. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/explain.jsonl +0 -0
  425. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/golden-natural.jsonl +0 -0
  426. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/golden.jsonl +0 -0
  427. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/recommend.jsonl +0 -0
  428. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/taps.txt +0 -0
  429. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_capabilities_policy.py +0 -0
  430. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_adapt.py +0 -0
  431. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_bmad.py +0 -0
  432. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_configuration.py +0 -0
  433. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_discovery.py +0 -0
  434. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_hooks.py +0 -0
  435. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_info.py +0 -0
  436. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_intelligence.py +0 -0
  437. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_pkg.py +0 -0
  438. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_quality.py +0 -0
  439. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_taps.py +0 -0
  440. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_team.py +0 -0
  441. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_everyday_loop.py +0 -0
  442. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_integrity_enforce.py +0 -0
  443. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_property_parsers.py +0 -0
  444. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_run.py +0 -0
  445. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_tap_signing.py +0 -0
  446. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_workspace_scope.py +0 -0
  447. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/README.md +0 -0
  448. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  449. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  450. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  451. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  452. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  453. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  454. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  455. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  456. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  457. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  458. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  459. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  460. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  461. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  462. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  463. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  464. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  465. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  466. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  467. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  468. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/fuzz_frontmatter.py +0 -0
  469. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/fuzz_registry.py +0 -0
  470. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/make_fixture.py +0 -0
  471. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/perf/test_benchmarks.py +0 -0
  472. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/smoke.sh +0 -0
  473. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_a11y_check.py +0 -0
  474. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_adapters.py +0 -0
  475. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_adapters_multi.py +0 -0
  476. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_adapters_runner.py +0 -0
  477. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_agents.py +0 -0
  478. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_ai.py +0 -0
  479. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_capabilities.py +0 -0
  480. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_catalog.py +0 -0
  481. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_check_anchors.py +0 -0
  482. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_check_licenses.py +0 -0
  483. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_claude_settings.py +0 -0
  484. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_cliparse.py +0 -0
  485. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_codeql_analysis_key.py +0 -0
  486. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_command_reference_fresh.py +0 -0
  487. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_community_health_files.py +0 -0
  488. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_config.py +0 -0
  489. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense.py +0 -0
  490. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense_fallback.py +0 -0
  491. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense_fix_hint.py +0 -0
  492. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense_status.py +0 -0
  493. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dependabot_config.py +0 -0
  494. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_docs_pages_linked.py +0 -0
  495. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_docsite_chrome.py +0 -0
  496. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_ed25519.py +0 -0
  497. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_embed.py +0 -0
  498. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_embed_local.py +0 -0
  499. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_entry_key.py +0 -0
  500. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_errors_and_cli_table.py +0 -0
  501. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_baseline.py +0 -0
  502. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_faithfulness.py +0 -0
  503. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_gate.py +0 -0
  504. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_metrics.py +0 -0
  505. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_stats_summary.py +0 -0
  506. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_faithfulness.py +0 -0
  507. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_frontmatter.py +0 -0
  508. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_fuzz_targets.py +0 -0
  509. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_gitleaks_config.py +0 -0
  510. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_gitutil.py +0 -0
  511. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_imperative.py +0 -0
  512. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_import_budget.py +0 -0
  513. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_injectscan.py +0 -0
  514. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_installscan.py +0 -0
  515. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_integrity.py +0 -0
  516. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_journal.py +0 -0
  517. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_localembed.py +0 -0
  518. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_lockfile.py +0 -0
  519. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_logs.py +0 -0
  520. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_marketing_counts.py +0 -0
  521. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcp.py +0 -0
  522. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcp_install_scan.py +0 -0
  523. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcpdecl.py +0 -0
  524. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcphost.py +0 -0
  525. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_minisign.py +0 -0
  526. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutation_hardening.py +0 -0
  527. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutation_shards.py +0 -0
  528. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutation_subfile_shards.py +0 -0
  529. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutmut_source_paths.py +0 -0
  530. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_nethttp.py +0 -0
  531. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_output.py +0 -0
  532. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_paths.py +0 -0
  533. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_perf_gate.py +0 -0
  534. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_pkg_confusions.py +0 -0
  535. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_pkg_injection.py +0 -0
  536. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_pkg_secrets.py +0 -0
  537. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_platform_pins.py +0 -0
  538. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_policy.py +0 -0
  539. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_post_deploy_smoke.py +0 -0
  540. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_project_mcp_sidecar.py +0 -0
  541. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_projectlock.py +0 -0
  542. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_provenance.py +0 -0
  543. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_rag_fusion.py +0 -0
  544. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_registries_fresh.py +0 -0
  545. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_registry.py +0 -0
  546. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_registry_categories.py +0 -0
  547. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_release_guard.py +0 -0
  548. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_release_preflight.py +0 -0
  549. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_required_checks.py +0 -0
  550. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_resolve.py +0 -0
  551. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_roadmap_fresh.py +0 -0
  552. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_rules.py +0 -0
  553. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_scopes.py +0 -0
  554. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_secretscan.py +0 -0
  555. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_selfupdate.py +0 -0
  556. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_serve.py +0 -0
  557. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_spin.py +0 -0
  558. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_stackprobe.py +0 -0
  559. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_staleness.py +0 -0
  560. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_store.py +0 -0
  561. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_token_parity.py +0 -0
  562. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_toolchain_lock.py +0 -0
  563. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_trustaudit.py +0 -0
  564. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_typosquat.py +0 -0
  565. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_updatediff.py +0 -0
  566. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_util.py +0 -0
  567. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_version.py +0 -0
  568. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_workflow_concurrency.py +0 -0
  569. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_workflow_timeouts.py +0 -0
  570. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_workflows.py +0 -0
  571. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/a11y_check.mjs +0 -0
  572. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/console_check.mjs +0 -0
  573. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/package-lock.json +0 -0
  574. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/package.json +0 -0
  575. {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/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.319
3
+ Version: 1.0.321
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.319'
22
- __version_tuple__ = version_tuple = (1, 0, 319)
21
+ __version__ = version = '1.0.321'
22
+ __version_tuple__ = version_tuple = (1, 0, 321)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -33,7 +33,7 @@ from . import ai, catalog, frontmatter, gitutil, paths, registry, util
33
33
  # v2: `snip` stores a larger head of the matched chunk (not just SNIP_WIDTH
34
34
  # chars) so `retrieve` can window it onto the query terms; bump forces a
35
35
  # one-time reindex.
36
- INDEX_VERSION = 3
36
+ INDEX_VERSION = 4
37
37
  ENGINE = "bm25"
38
38
 
39
39
  # Chunking defaults (documented in docs/rag-architecture.md §4).
@@ -162,25 +162,49 @@ def index_path() -> Path:
162
162
  return paths.cache_dir() / "rag_index.json"
163
163
 
164
164
 
165
+ def surface(entry: dict) -> str:
166
+ """The item's own identifying text, indexed alongside its body.
167
+
168
+ A chunked index got name matching for free: the name sat in whichever chunk
169
+ happened to contain it. One document per entry has to state it, and the
170
+ de-hyphenated form matters because `tokenize` does not split on hyphens —
171
+ without it the query "code reviewer" cannot match the item `code-reviewer`.
172
+ """
173
+ name = entry.get("name", "")
174
+ return " ".join([name, name.replace("-", " ").replace("_", " "),
175
+ entry.get("description") or ""])
176
+
177
+
165
178
  def _make_docs(entries: List[dict], tap_paths: Dict[str, Path]) -> List[dict]:
166
- """Chunk + tokenize every entry into scored documents (one per chunk)."""
179
+ """Tokenize every entry into ONE scored document.
180
+
181
+ Chunking cost far more than it bought. Each 1000-char window carried its own
182
+ copy of the shared per-doc fields and its own `snip`, which is how a 743-entry
183
+ corpus became 3,740 documents and how the roadmap item measured a real
184
+ 83-tap install at 132 MB and 8-13 s of `json.loads` on *every cold search* —
185
+ against 31-70 ms of actual BM25 scoring.
186
+
187
+ The one thing chunking genuinely provided was locality: a term only had to
188
+ beat the length normalisation of its own window, not of an entire long
189
+ document. BM25's `b` parameter already handles that, and `retrieve` was
190
+ collapsing chunks back to one hit per entry anyway (max score across
191
+ chunks), so the extra documents were discarded at query time.
192
+ """
167
193
  docs: List[dict] = []
168
194
  for e in entries:
169
195
  body = read_body(e, tap_paths)
170
- pieces = chunk(body) or [body]
171
- for ci, piece in enumerate(pieces):
172
- tf: Dict[str, int] = defaultdict(int)
173
- for tok in tokenize(piece):
174
- tf[tok] += 1
175
- if not tf:
176
- continue
177
- docs.append({
178
- "n": e["name"], "t": e["tap"], "f": e["skill_md"],
179
- "k": e.get("kind", "skill"),
180
- "c": ci, "l": sum(tf.values()),
181
- "snip": piece[:SNIP_STORE].strip(), # windowed at retrieve time
182
- "tf": dict(tf), # noqa: FURB123 tf is a defaultdict; .copy() would keep the factory
183
- })
196
+ tf: Dict[str, int] = defaultdict(int)
197
+ for tok in tokenize(surface(e) + "\n" + body):
198
+ tf[tok] += 1
199
+ if not tf:
200
+ continue
201
+ docs.append({
202
+ "n": e["name"], "t": e["tap"], "f": e["skill_md"],
203
+ "k": e.get("kind", "skill"),
204
+ "c": 0, "l": sum(tf.values()),
205
+ "snip": body[:SNIP_STORE].strip(), # windowed at retrieve time
206
+ "tf": dict(tf), # noqa: FURB123 tf is a defaultdict; .copy() would keep the factory
207
+ })
184
208
  return docs
185
209
 
186
210
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.319
3
+ Version: 1.0.321
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -0,0 +1,101 @@
1
+ ---
2
+ id: bm25-index-is-one-json-blob
3
+ board: code
4
+ section: pipeline
5
+ status: inflight
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: loop/unchunked-bm25-index
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.
46
+
47
+ <b>Win (1) is shipped, and the &ldquo;better on every metric&rdquo; claim did not survive
48
+ re-measurement.</b> On the pinned 6-tap corpus unchunking is a <em>trade</em>, not a free win, and
49
+ which way it falls depends entirely on the shape of the query.
50
+
51
+ On the keyword golden set &mdash; which grades items by <b>name</b> &mdash; recall@10 fell
52
+ 1.000 &rarr; <b>0.978</b> and nDCG 0.895 &rarr; 0.882, while hit@1 rose 0.780 &rarr; <b>0.791</b>.
53
+ On the 50 natural-language queries in <code>golden-natural.jsonl</code>, over identical data, every
54
+ metric improved and not marginally: recall 0.690 &rarr; <b>0.750</b>, hit@1 0.240 &rarr; <b>0.340</b>,
55
+ MRR 0.382 &rarr; 0.474, nDCG 0.446 &rarr; 0.524. That +0.100 hit@1 is 5 of 50 queries, which is at
56
+ the edge of what 50 queries can resolve &mdash; worth stating rather than rounding up.
57
+
58
+ Index cost on the same corpus: <b>5.3 MB &rarr; 2.1 MB</b> and 3,740 documents &rarr; 743, one per
59
+ entry, with load time 0.032 s &rarr; 0.015 s. The card's headline figures are from an 83-tap install
60
+ where the constant factors are far larger; this is the small-scale confirmation of the same shape,
61
+ not a substitute for it.
62
+
63
+ Chunking's one real contribution was locality &mdash; a term only had to beat the length
64
+ normalisation of its own 1000-char window. BM25's <code>b</code> already does that, and
65
+ <code>retrieve</code> collapsed chunks back to one hit per entry regardless, so the extra documents
66
+ were built, stored, re-parsed on every cold search and then discarded. What chunking <em>did</em>
67
+ provide for free was name matching, since the name sat in whichever chunk contained it; one document
68
+ per entry has to state the surface explicitly, so <code>rag.surface</code> indexes the name, its
69
+ de-hyphenated form (<code>tokenize</code> does not split hyphens, so &ldquo;code reviewer&rdquo;
70
+ would otherwise never match <code>code-reviewer</code>) and the description alongside the body.
71
+
72
+ <b>Still open:</b> win (2), getting postings out of JSON &mdash; the FTS5 probe and the mmap-able
73
+ binary format are both untouched, as is moving <code>snip</code> text off the hot path. So is
74
+ <code>build()</code>'s O(entire-corpus) incremental path, which still inverts every posting to
75
+ reindex one changed file.
76
+
77
+ <b>Where the bytes are now, measured after win (1).</b> This card sends win (2) after two targets:
78
+ postings, and <code>snip</code> text (&ldquo;46.7 MB of the 132 MB&rdquo;, ~35%). That split was a
79
+ property of the <em>chunked</em> index, where every 1000-char window carried its own snippet. With
80
+ one document per entry the balance moves sharply, measured on the pinned 6-tap corpus at 2.05 MB
81
+ total: <b>postings 1.31 MB (64%)</b>, doc metadata 0.46 MB (22%), <b>snips 0.29 MB (14%)</b>, over
82
+ 743 documents and 15,639 distinct terms.
83
+
84
+ So unchunking already collected most of the snippet win, and <b>postings are now the dominant lever
85
+ by a wide margin</b>. Anyone picking up win (2) should size it against 64%, not chase snip at an
86
+ assumed 35%.
87
+
88
+ <b>FTS5 probe result.</b> Confirmed present on both interpreters available here &mdash; CPython 3.14
89
+ (bundled SQLite 3.53.4) and the macOS system Python 3.9 (SQLite 3.54.0). That supports the card's
90
+ design instruction rather than replacing it: it is still a per-build property, so the runtime probe
91
+ stays required. A distro CPython compiled without <code>ENABLE_FTS5</code> is the case the probe
92
+ exists for.
93
+
94
+ <b>On the incremental path.</b> The O(entire-corpus) reindex noted above is not separable from win
95
+ (2). <code>_kept_docs</code> calls <code>_postings_to_doc_tf</code> because per-document term
96
+ frequencies exist <em>only</em> inside the postings on disk, so recovering them for the unchanged
97
+ taps means scanning every posting whatever the filter. Narrowing the inversion to kept doc ids saves
98
+ memory but not the scan, and in the common case (one tap of many changed) nearly every document is
99
+ kept, so it saves little of that either. Denormalising <code>tf</code> back into the documents would
100
+ fix it directly but roughly duplicates the 64% that postings already occupy. The real fix is the
101
+ storage format, which is win (2) &mdash; worth treating them as one item rather than two.
@@ -260,3 +260,16 @@ The set is deliberately <b>not</b> wired into <code>make eval</code> or the requ
260
260
  the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
261
261
  flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.
262
262
 
263
+
264
+ <b>Step 4 is shipped too.</b> <code>rag.rrf_fuse</code> landed in <code>#360</code> with
265
+ <code>RRF_K = 60</code>, fusing on ranks exactly as described above, and
266
+ <code>retrieve_any</code> reports <code>hybrid RRF</code> when both engines are built. Recording it
267
+ here because this card still read as though only step 1 were done, and the next loop scanning for
268
+ work would have rebuilt it. The step's own instruction &mdash; &ldquo;ship the k=60 default, benchmark
269
+ it, and tune only if the eval says so&rdquo; &mdash; was followed: the benchmark is
270
+ <code>tests/eval/golden-natural.jsonl</code>, and k=60 is untouched.
271
+
272
+ <b>Steps 2, 3, 5 and 6 remain open.</b> Note that step 6 (publish the eval) is now partly answered by
273
+ the gate work in <code>#365</code>, which floors four metrics instead of recall alone and keys
274
+ baselines to their query set, so BM25-vs-dense-vs-hybrid comparisons are at least falsifiable. What
275
+ step 6 still wants is the published write-up rather than the instrument.
@@ -846,7 +846,21 @@ before concluding the local model is enough.
846
846
 
847
847
  The set is deliberately <b>not</b> wired into <code>make eval</code> or the required gate: it needs
848
848
  the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
849
- flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.</p>
849
+ flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.
850
+
851
+
852
+ <b>Step 4 is shipped too.</b> <code>rag.rrf_fuse</code> landed in <code>#360</code> with
853
+ <code>RRF_K = 60</code>, fusing on ranks exactly as described above, and
854
+ <code>retrieve_any</code> reports <code>hybrid RRF</code> when both engines are built. Recording it
855
+ here because this card still read as though only step 1 were done, and the next loop scanning for
856
+ work would have rebuilt it. The step's own instruction &mdash; &ldquo;ship the k=60 default, benchmark
857
+ it, and tune only if the eval says so&rdquo; &mdash; was followed: the benchmark is
858
+ <code>tests/eval/golden-natural.jsonl</code>, and k=60 is untouched.
859
+
860
+ <b>Steps 2, 3, 5 and 6 remain open.</b> Note that step 6 (publish the eval) is now partly answered by
861
+ the gate work in <code>#365</code>, which floors four metrics instead of recall alone and keys
862
+ baselines to their query set, so BM25-vs-dense-vs-hybrid comparisons are at least falsifiable. What
863
+ step 6 still wants is the published write-up rather than the instrument.</p>
850
864
  <div class="meta">
851
865
  <span class="m">Complexity <b>L</b></span>
852
866
  <span class="m hi">Impact <b>High</b></span>
@@ -3436,7 +3450,7 @@ that were never the same from being merged by accident.</p>
3436
3450
  </article>
3437
3451
 
3438
3452
  <article class="cap rcard" id="bm25-index-is-one-json-blob">
3439
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Search · Index</span></div>
3453
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Index</span></div>
3440
3454
  <h3>The BM25 index is one JSON blob, and it stops working between 10k and 50k items</h3>
3441
3455
  <p><code>rag.py</code> persists the whole index as a single JSON file and
3442
3456
  <code>json.loads</code> it on every invocation. <code>_CACHE</code>
@@ -3467,7 +3481,63 @@ out of the hot path.
3467
3481
  Also note <code>build()</code>'s incremental path is O(entire corpus): reusing
3468
3482
  unchanged taps runs <code>_kept_docs</code> → <code>_postings_to_doc_tf</code>,
3469
3483
  which inverts every posting in the index — measured 35 s and 1.72 GB RSS at
3470
- 11.1k entries to reindex a single changed file.</p>
3484
+ 11.1k entries to reindex a single changed file.
3485
+
3486
+ <b>Win (1) is shipped, and the &ldquo;better on every metric&rdquo; claim did not survive
3487
+ re-measurement.</b> On the pinned 6-tap corpus unchunking is a <em>trade</em>, not a free win, and
3488
+ which way it falls depends entirely on the shape of the query.
3489
+
3490
+ On the keyword golden set &mdash; which grades items by <b>name</b> &mdash; recall@10 fell
3491
+ 1.000 &rarr; <b>0.978</b> and nDCG 0.895 &rarr; 0.882, while hit@1 rose 0.780 &rarr; <b>0.791</b>.
3492
+ On the 50 natural-language queries in <code>golden-natural.jsonl</code>, over identical data, every
3493
+ metric improved and not marginally: recall 0.690 &rarr; <b>0.750</b>, hit@1 0.240 &rarr; <b>0.340</b>,
3494
+ MRR 0.382 &rarr; 0.474, nDCG 0.446 &rarr; 0.524. That +0.100 hit@1 is 5 of 50 queries, which is at
3495
+ the edge of what 50 queries can resolve &mdash; worth stating rather than rounding up.
3496
+
3497
+ Index cost on the same corpus: <b>5.3 MB &rarr; 2.1 MB</b> and 3,740 documents &rarr; 743, one per
3498
+ entry, with load time 0.032 s &rarr; 0.015 s. The card's headline figures are from an 83-tap install
3499
+ where the constant factors are far larger; this is the small-scale confirmation of the same shape,
3500
+ not a substitute for it.
3501
+
3502
+ Chunking's one real contribution was locality &mdash; a term only had to beat the length
3503
+ normalisation of its own 1000-char window. BM25's <code>b</code> already does that, and
3504
+ <code>retrieve</code> collapsed chunks back to one hit per entry regardless, so the extra documents
3505
+ were built, stored, re-parsed on every cold search and then discarded. What chunking <em>did</em>
3506
+ provide for free was name matching, since the name sat in whichever chunk contained it; one document
3507
+ per entry has to state the surface explicitly, so <code>rag.surface</code> indexes the name, its
3508
+ de-hyphenated form (<code>tokenize</code> does not split hyphens, so &ldquo;code reviewer&rdquo;
3509
+ would otherwise never match <code>code-reviewer</code>) and the description alongside the body.
3510
+
3511
+ <b>Still open:</b> win (2), getting postings out of JSON &mdash; the FTS5 probe and the mmap-able
3512
+ binary format are both untouched, as is moving <code>snip</code> text off the hot path. So is
3513
+ <code>build()</code>'s O(entire-corpus) incremental path, which still inverts every posting to
3514
+ reindex one changed file.
3515
+
3516
+ <b>Where the bytes are now, measured after win (1).</b> This card sends win (2) after two targets:
3517
+ postings, and <code>snip</code> text (&ldquo;46.7 MB of the 132 MB&rdquo;, ~35%). That split was a
3518
+ property of the <em>chunked</em> index, where every 1000-char window carried its own snippet. With
3519
+ one document per entry the balance moves sharply, measured on the pinned 6-tap corpus at 2.05 MB
3520
+ total: <b>postings 1.31 MB (64%)</b>, doc metadata 0.46 MB (22%), <b>snips 0.29 MB (14%)</b>, over
3521
+ 743 documents and 15,639 distinct terms.
3522
+
3523
+ So unchunking already collected most of the snippet win, and <b>postings are now the dominant lever
3524
+ by a wide margin</b>. Anyone picking up win (2) should size it against 64%, not chase snip at an
3525
+ assumed 35%.
3526
+
3527
+ <b>FTS5 probe result.</b> Confirmed present on both interpreters available here &mdash; CPython 3.14
3528
+ (bundled SQLite 3.53.4) and the macOS system Python 3.9 (SQLite 3.54.0). That supports the card's
3529
+ design instruction rather than replacing it: it is still a per-build property, so the runtime probe
3530
+ stays required. A distro CPython compiled without <code>ENABLE_FTS5</code> is the case the probe
3531
+ exists for.
3532
+
3533
+ <b>On the incremental path.</b> The O(entire-corpus) reindex noted above is not separable from win
3534
+ (2). <code>_kept_docs</code> calls <code>_postings_to_doc_tf</code> because per-document term
3535
+ frequencies exist <em>only</em> inside the postings on disk, so recovering them for the unchanged
3536
+ taps means scanning every posting whatever the filter. Narrowing the inversion to kept doc ids saves
3537
+ memory but not the scan, and in the common case (one tap of many changed) nearly every document is
3538
+ kept, so it saves little of that either. Denormalising <code>tf</code> back into the documents would
3539
+ fix it directly but roughly duplicates the 64% that postings already occupy. The real fix is the
3540
+ storage format, which is win (2) &mdash; worth treating them as one item rather than two.</p>
3471
3541
  <div class="meta">
3472
3542
  <span class="m">Complexity <b>L</b></span>
3473
3543
  <span class="m hi">Impact <b>High</b></span>
@@ -11,10 +11,10 @@
11
11
  "nDCG@k": 0.8098096631332409
12
12
  },
13
13
  "BM25 full-content": {
14
- "recall@k": 1.0,
15
- "hit@1": 0.7802197802197802,
16
- "MRR": 0.8604395604395604,
17
- "nDCG@k": 0.8945515691995823
14
+ "recall@k": 0.978021978021978,
15
+ "hit@1": 0.7912087912087912,
16
+ "MRR": 0.8542124542124542,
17
+ "nDCG@k": 0.8823506423411086
18
18
  }
19
19
  }
20
20
  },
@@ -29,10 +29,10 @@
29
29
  "nDCG@k": 0.19698368469243419
30
30
  },
31
31
  "BM25 full-content": {
32
- "recall@k": 0.69,
33
- "hit@1": 0.24,
34
- "MRR": 0.3824806870205885,
35
- "nDCG@k": 0.44627899978118957
32
+ "recall@k": 0.75,
33
+ "hit@1": 0.34,
34
+ "MRR": 0.47449253613769743,
35
+ "nDCG@k": 0.5243426877966659
36
36
  }
37
37
  }
38
38
  }
@@ -605,18 +605,35 @@ class TestMakeDocs:
605
605
  docs = rag._make_docs([e], {})
606
606
  assert docs[0]["snip"] == "Q" * rag.SNIP_STORE
607
607
 
608
- def test_long_body_yields_multiple_chunks(self, monkeypatch):
608
+ def test_one_document_per_entry_however_long_the_body(self, monkeypatch):
609
+ # Inverted deliberately. This asserted `len(docs) > 1`, the chunking the
610
+ # index no longer does: each window carried its own copy of the shared
611
+ # fields and its own snippet, and `retrieve` collapsed them back to one
612
+ # hit per entry anyway, so the extra documents were built, stored,
613
+ # re-parsed on every cold search, and then discarded.
609
614
  monkeypatch.setattr(rag, "read_body", lambda e, tp: "widget " * 400)
610
- e = _entry("n")
611
- docs = rag._make_docs([e], {})
612
- assert len(docs) > 1 # chunk() or [body], not `and`
615
+ docs = rag._make_docs([_entry("n")], {})
616
+ assert len(docs) == 1
617
+ assert docs[0]["tf"]["widget"] == 400
618
+
619
+ def test_the_entry_surface_is_indexed_with_the_body(self, monkeypatch):
620
+ # A chunked index matched names for free — the name sat in whatever
621
+ # chunk contained it. One doc per entry has to state the surface, or
622
+ # searching for an item by its own name stops working.
623
+ monkeypatch.setattr(rag, "read_body", lambda e, tp: "unrelated prose")
624
+ docs = rag._make_docs(
625
+ [_entry("code-reviewer", desc="reviews diffs")], {})
626
+ tf = docs[0]["tf"]
627
+ assert "reviewer" in tf, "the de-hyphenated name must be searchable"
628
+ assert "diffs" in tf, "the description must be searchable"
613
629
 
614
630
  def test_empty_chunk_is_skipped_not_break(self, monkeypatch):
615
631
  body = ("the " * 220) + "\n\n" + ("widget " * 130)
616
632
  monkeypatch.setattr(rag, "read_body", lambda e, tp: body)
617
633
  e = _entry("n")
618
634
  docs = rag._make_docs([e], {})
619
- # first chunk is all stopwords (empty tf) -> `continue`, keep going
635
+ # An all-stopword passage contributes no terms; the entry still yields
636
+ # its one document, carrying the terms from the rest of the body.
620
637
  assert len(docs) == 1
621
638
  assert "widget" in docs[0]["tf"]
622
639
 
@@ -1,45 +0,0 @@
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.