boost-skill-cli 1.0.317__tar.gz → 1.0.319__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.317 → boost_skill_cli-1.0.319}/CLAUDE.md +20 -7
  2. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/Makefile +16 -7
  3. {boost_skill_cli-1.0.317/boost_skill_cli.egg-info → boost_skill_cli-1.0.319}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/dense.py +25 -16
  6. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/rag.py +46 -13
  7. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  8. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  9. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +33 -4
  10. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +32 -2
  11. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap.html +65 -5
  12. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_retrieval.py +132 -15
  13. boost_skill_cli-1.0.319/tests/eval/baseline.json +40 -0
  14. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense.py +6 -2
  15. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense_fallback.py +14 -13
  16. boost_skill_cli-1.0.319/tests/unit/test_entry_key.py +103 -0
  17. boost_skill_cli-1.0.319/tests/unit/test_eval_baseline.py +182 -0
  18. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_rag.py +32 -31
  19. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_rag_fusion.py +3 -2
  20. boost_skill_cli-1.0.317/tests/eval/baseline.json +0 -17
  21. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.gitattributes +0 -0
  22. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.gitignore +0 -0
  23. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.gitleaks.toml +0 -0
  24. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.htmlvalidate.json +0 -0
  25. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.lighthouserc.json +0 -0
  26. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.lycheeignore +0 -0
  27. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.markdownlint-cli2.jsonc +0 -0
  28. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.pre-commit-config.yaml +0 -0
  29. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.stylelintrc.json +0 -0
  30. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.vale/styles/boost/Terminology.yml +0 -0
  31. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  32. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.vale.ini +0 -0
  33. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/CODE_OF_CONDUCT.md +0 -0
  34. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/CONTRIBUTING.md +0 -0
  35. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/LICENSE +0 -0
  36. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/MANIFEST.in +0 -0
  37. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/README.md +0 -0
  38. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/SECURITY.md +0 -0
  39. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost +0 -0
  40. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/__init__.py +0 -0
  41. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/__main__.py +0 -0
  42. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/cli.py +0 -0
  43. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/cliparse.py +0 -0
  44. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/__init__.py +0 -0
  45. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/_common.py +0 -0
  46. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/bmad.py +0 -0
  47. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/configuration.py +0 -0
  48. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/discovery.py +0 -0
  49. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/hooks.py +0 -0
  50. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/info.py +0 -0
  51. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/intelligence.py +0 -0
  52. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/pkg.py +0 -0
  53. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/quality.py +0 -0
  54. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/run.py +0 -0
  55. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/safety.py +0 -0
  56. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/taps.py +0 -0
  57. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/team.py +0 -0
  58. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/__init__.py +0 -0
  59. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/adapters.py +0 -0
  60. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/agents.py +0 -0
  61. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/ai.py +0 -0
  62. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/capabilities.py +0 -0
  63. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/catalog.py +0 -0
  64. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/claude_settings.py +0 -0
  65. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/config.py +0 -0
  66. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/ed25519.py +0 -0
  67. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/embed.py +0 -0
  68. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/faithfulness.py +0 -0
  69. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/frontmatter.py +0 -0
  70. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/gitutil.py +0 -0
  71. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/imperative.py +0 -0
  72. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/injectscan.py +0 -0
  73. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/installscan.py +0 -0
  74. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/integrity.py +0 -0
  75. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/journal.py +0 -0
  76. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/localembed.py +0 -0
  77. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/lockfile.py +0 -0
  78. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/logs.py +0 -0
  79. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/mcp.py +0 -0
  80. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/mcpdecl.py +0 -0
  81. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/mcphost.py +0 -0
  82. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/minisign.py +0 -0
  83. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/nethttp.py +0 -0
  84. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/output.py +0 -0
  85. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/paths.py +0 -0
  86. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/policy.py +0 -0
  87. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/projectlock.py +0 -0
  88. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/provenance.py +0 -0
  89. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/registry.py +0 -0
  90. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/resolve.py +0 -0
  91. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/rules.py +0 -0
  92. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/scopes.py +0 -0
  93. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/secretscan.py +0 -0
  94. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/selfupdate.py +0 -0
  95. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/serve.py +0 -0
  96. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/stackprobe.py +0 -0
  97. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/staleness.py +0 -0
  98. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/store.py +0 -0
  99. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/trustaudit.py +0 -0
  100. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/typosquat.py +0 -0
  101. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/updatediff.py +0 -0
  102. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/util.py +0 -0
  103. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/workflows.py +0 -0
  104. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/data/registries.json +0 -0
  105. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/errors.py +0 -0
  106. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/spin.py +0 -0
  107. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  108. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  109. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/requires.txt +0 -0
  110. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/top_level.txt +0 -0
  111. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/codecov.yml +0 -0
  112. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/.claude/settings.local.json +0 -0
  113. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/DEBUGGING.md +0 -0
  114. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/adapters.html +0 -0
  115. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/README.md +0 -0
  116. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-components-core.md +0 -0
  117. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-containers.md +0 -0
  118. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-context.md +0 -0
  119. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-dynamic-install.md +0 -0
  120. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/distill.gif +0 -0
  121. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/doctor.gif +0 -0
  122. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/explain.gif +0 -0
  123. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/hooks.gif +0 -0
  124. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/install.gif +0 -0
  125. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/pulse.gif +0 -0
  126. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/search.gif +0 -0
  127. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/tap.gif +0 -0
  128. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/distill.tape +0 -0
  129. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/doctor.tape +0 -0
  130. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/explain.tape +0 -0
  131. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/hooks.tape +0 -0
  132. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/install.tape +0 -0
  133. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/pulse.tape +0 -0
  134. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/search.tape +0 -0
  135. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/tap.tape +0 -0
  136. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel.html +0 -0
  137. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/commands.html +0 -0
  138. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/demo.gif +0 -0
  139. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/demo.tape +0 -0
  140. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/design-roadmap.html +0 -0
  141. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/eval.html +0 -0
  142. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/index.html +0 -0
  143. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/mcp-hub.html +0 -0
  144. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/rag-architecture.md +0 -0
  145. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D01.md +0 -0
  146. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D02.md +0 -0
  147. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D03.md +0 -0
  148. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D04.md +0 -0
  149. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D05.md +0 -0
  150. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D06.md +0 -0
  151. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D07.md +0 -0
  152. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D08.md +0 -0
  153. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D09.md +0 -0
  154. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D10.md +0 -0
  155. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D11.md +0 -0
  156. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D12.md +0 -0
  157. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D13.md +0 -0
  158. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D14.md +0 -0
  159. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D15.md +0 -0
  160. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D16.md +0 -0
  161. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D17.md +0 -0
  162. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D18.md +0 -0
  163. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D19.md +0 -0
  164. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D20.md +0 -0
  165. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D21.md +0 -0
  166. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D22.md +0 -0
  167. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D23.md +0 -0
  168. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D24.md +0 -0
  169. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D25.md +0 -0
  170. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D26.md +0 -0
  171. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  172. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  173. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  174. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  175. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  176. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  177. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  178. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  179. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  180. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  181. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  182. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  183. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  184. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  185. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  186. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  187. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  188. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  189. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  190. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  191. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  192. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  193. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/command-carousel-page.md +0 -0
  194. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  195. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  196. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  197. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  198. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  199. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  200. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  201. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  202. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  203. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  204. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  205. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  206. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  207. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  208. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  209. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  210. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  211. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  212. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  213. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  214. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  215. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  216. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  217. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  218. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  219. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  220. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  221. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  222. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/github-community-health-files.md +0 -0
  223. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  224. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  225. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  226. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  227. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  228. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  229. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  230. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  231. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  232. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  233. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  234. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  235. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  236. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  237. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  238. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  239. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  240. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  241. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  242. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  243. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  244. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  245. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  246. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  247. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  248. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  249. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  250. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  251. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  252. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  253. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  254. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  255. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  256. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  257. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  258. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  259. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  260. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  261. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  262. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  263. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  264. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  265. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  266. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  267. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  268. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  269. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  270. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  271. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  272. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  273. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  274. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  275. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  276. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  277. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  278. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  279. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  280. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  281. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  282. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  283. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  284. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  285. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  286. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  287. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  288. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  289. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  290. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  291. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  292. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  293. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  294. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  295. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  296. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  297. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  298. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  299. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  300. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  301. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  302. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  303. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  304. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  305. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  306. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  307. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  308. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  309. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  310. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  311. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  312. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  313. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  314. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  315. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  316. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  317. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  318. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  319. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  320. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  321. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  322. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  323. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  324. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  325. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  326. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  327. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  328. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  329. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  330. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  331. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  332. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  333. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  334. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  335. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  336. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  337. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  338. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  339. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  340. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  341. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  342. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  343. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  344. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  345. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  346. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  347. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  348. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  349. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  350. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  351. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  352. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  353. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  354. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  355. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workspace-scope-install.md +0 -0
  356. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  357. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/eslint.config.mjs +0 -0
  358. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/README.md +0 -0
  359. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/__init__.py +0 -0
  360. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/baseline.json +0 -0
  361. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/faithfulness.py +0 -0
  362. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/golden_set.json +0 -0
  363. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/make_corpus.py +0 -0
  364. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/make_golden.py +0 -0
  365. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/metrics.py +0 -0
  366. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/run_evals.py +0 -0
  367. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/examples/README.md +0 -0
  368. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/examples/adapt-demo.sh +0 -0
  369. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/examples/boost-run-prototype.sh +0 -0
  370. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/index.html +0 -0
  371. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/noxfile.py +0 -0
  372. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/pyproject.toml +0 -0
  373. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/coverage-tools.in +0 -0
  374. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/coverage-tools.txt +0 -0
  375. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/lint-tools.in +0 -0
  376. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/lint-tools.txt +0 -0
  377. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/mutation-tools.in +0 -0
  378. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/mutation-tools.txt +0 -0
  379. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/platform-pins.lock +0 -0
  380. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/release-tools.in +0 -0
  381. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/release-tools.txt +0 -0
  382. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/test-tools.in +0 -0
  383. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/test-tools.txt +0 -0
  384. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/a11y_check.py +0 -0
  385. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/bench_cli.sh +0 -0
  386. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/build_command_reference.py +0 -0
  387. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/build_registries.py +0 -0
  388. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/build_roadmap.py +0 -0
  389. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/check_anchors.py +0 -0
  390. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/check_licenses.py +0 -0
  391. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/check_required_checks.py +0 -0
  392. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/ensure_eval_corpus.sh +0 -0
  393. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_explain.py +0 -0
  394. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_gate.py +0 -0
  395. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_recommend.py +0 -0
  396. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_stats_summary.py +0 -0
  397. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/import_budget.py +0 -0
  398. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/lock_toolchain.py +0 -0
  399. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/mutation_gate.py +0 -0
  400. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/mutation_shards.py +0 -0
  401. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/mutation_weights.json +0 -0
  402. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/perf_gate.py +0 -0
  403. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/post_deploy_smoke.py +0 -0
  404. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/release_guard.py +0 -0
  405. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/release_preflight.py +0 -0
  406. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/setup.cfg +0 -0
  407. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/sonar-project.properties +0 -0
  408. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/README.md +0 -0
  409. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/boost.css +0 -0
  410. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/boost.js +0 -0
  411. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/demo.html +0 -0
  412. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/adapt.feature +0 -0
  413. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/browse.feature +0 -0
  414. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/count.feature +0 -0
  415. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/discover.feature +0 -0
  416. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/doctor.feature +0 -0
  417. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/environment.py +0 -0
  418. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/explain.feature +0 -0
  419. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/index.feature +0 -0
  420. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/install.feature +0 -0
  421. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/list.feature +0 -0
  422. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/mcp.feature +0 -0
  423. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/search.feature +0 -0
  424. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/cli_steps.py +0 -0
  425. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/discovery_steps.py +0 -0
  426. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/mcp_steps.py +0 -0
  427. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/quality_steps.py +0 -0
  428. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/conftest.py +0 -0
  429. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/explain.jsonl +0 -0
  430. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/golden-natural.jsonl +0 -0
  431. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/golden.jsonl +0 -0
  432. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/recommend.jsonl +0 -0
  433. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/taps.txt +0 -0
  434. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_capabilities_policy.py +0 -0
  435. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_adapt.py +0 -0
  436. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_bmad.py +0 -0
  437. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_configuration.py +0 -0
  438. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_discovery.py +0 -0
  439. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_hooks.py +0 -0
  440. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_info.py +0 -0
  441. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_intelligence.py +0 -0
  442. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_pkg.py +0 -0
  443. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_quality.py +0 -0
  444. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_taps.py +0 -0
  445. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_team.py +0 -0
  446. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_everyday_loop.py +0 -0
  447. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_integrity_enforce.py +0 -0
  448. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_property_parsers.py +0 -0
  449. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_run.py +0 -0
  450. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_tap_signing.py +0 -0
  451. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_workspace_scope.py +0 -0
  452. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/README.md +0 -0
  453. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  454. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  455. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  456. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  457. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  458. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  459. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  460. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  461. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  462. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  463. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  464. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  465. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  466. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  467. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  468. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  469. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  470. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  471. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  472. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  473. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/fuzz_frontmatter.py +0 -0
  474. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/fuzz_registry.py +0 -0
  475. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/make_fixture.py +0 -0
  476. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/perf/test_benchmarks.py +0 -0
  477. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/smoke.sh +0 -0
  478. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_a11y_check.py +0 -0
  479. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_adapters.py +0 -0
  480. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_adapters_multi.py +0 -0
  481. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_adapters_runner.py +0 -0
  482. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_agents.py +0 -0
  483. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_ai.py +0 -0
  484. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_capabilities.py +0 -0
  485. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_catalog.py +0 -0
  486. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_check_anchors.py +0 -0
  487. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_check_licenses.py +0 -0
  488. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_claude_settings.py +0 -0
  489. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_cliparse.py +0 -0
  490. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_codeql_analysis_key.py +0 -0
  491. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_command_reference_fresh.py +0 -0
  492. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_community_health_files.py +0 -0
  493. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_config.py +0 -0
  494. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense_fix_hint.py +0 -0
  495. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense_status.py +0 -0
  496. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dependabot_config.py +0 -0
  497. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_docs_pages_linked.py +0 -0
  498. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_docsite_chrome.py +0 -0
  499. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_ed25519.py +0 -0
  500. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_embed.py +0 -0
  501. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_embed_local.py +0 -0
  502. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_errors_and_cli_table.py +0 -0
  503. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_faithfulness.py +0 -0
  504. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_gate.py +0 -0
  505. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_metrics.py +0 -0
  506. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_stats_summary.py +0 -0
  507. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_faithfulness.py +0 -0
  508. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_frontmatter.py +0 -0
  509. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_fuzz_targets.py +0 -0
  510. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_gitleaks_config.py +0 -0
  511. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_gitutil.py +0 -0
  512. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_imperative.py +0 -0
  513. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_import_budget.py +0 -0
  514. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_injectscan.py +0 -0
  515. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_installscan.py +0 -0
  516. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_integrity.py +0 -0
  517. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_journal.py +0 -0
  518. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_localembed.py +0 -0
  519. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_lockfile.py +0 -0
  520. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_logs.py +0 -0
  521. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_marketing_counts.py +0 -0
  522. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcp.py +0 -0
  523. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcp_install_scan.py +0 -0
  524. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcpdecl.py +0 -0
  525. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcphost.py +0 -0
  526. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_minisign.py +0 -0
  527. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutation_hardening.py +0 -0
  528. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutation_shards.py +0 -0
  529. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutation_subfile_shards.py +0 -0
  530. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutmut_source_paths.py +0 -0
  531. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_nethttp.py +0 -0
  532. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_output.py +0 -0
  533. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_paths.py +0 -0
  534. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_perf_gate.py +0 -0
  535. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_pkg_confusions.py +0 -0
  536. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_pkg_injection.py +0 -0
  537. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_pkg_secrets.py +0 -0
  538. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_platform_pins.py +0 -0
  539. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_policy.py +0 -0
  540. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_post_deploy_smoke.py +0 -0
  541. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_project_mcp_sidecar.py +0 -0
  542. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_projectlock.py +0 -0
  543. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_provenance.py +0 -0
  544. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_registries_fresh.py +0 -0
  545. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_registry.py +0 -0
  546. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_registry_categories.py +0 -0
  547. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_release_guard.py +0 -0
  548. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_release_preflight.py +0 -0
  549. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_required_checks.py +0 -0
  550. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_resolve.py +0 -0
  551. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_roadmap_fresh.py +0 -0
  552. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_rules.py +0 -0
  553. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_scopes.py +0 -0
  554. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_secretscan.py +0 -0
  555. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_selfupdate.py +0 -0
  556. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_serve.py +0 -0
  557. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_spin.py +0 -0
  558. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_stackprobe.py +0 -0
  559. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_staleness.py +0 -0
  560. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_store.py +0 -0
  561. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_token_parity.py +0 -0
  562. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_toolchain_lock.py +0 -0
  563. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_trustaudit.py +0 -0
  564. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_typosquat.py +0 -0
  565. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_updatediff.py +0 -0
  566. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_util.py +0 -0
  567. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_version.py +0 -0
  568. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_workflow_concurrency.py +0 -0
  569. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_workflow_timeouts.py +0 -0
  570. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_workflows.py +0 -0
  571. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/a11y_check.mjs +0 -0
  572. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/console_check.mjs +0 -0
  573. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/package-lock.json +0 -0
  574. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/package.json +0 -0
  575. {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/visual_check.mjs +0 -0
@@ -47,20 +47,33 @@ It is five gates and **all must pass**:
47
47
  | Gate | Command | Threshold |
48
48
  |------------|------------------------------------------------|-----------|
49
49
  | `lint` | `ruff check boost_cli tests` + `mypy` | zero errors |
50
- | `eval` | `ensure_eval_corpus.sh` + `eval_retrieval.py --build -k 10 --fail-under 0.85` | BM25 recall@k **≥ 0.85** over the pinned corpus |
50
+ | `eval` | `ensure_eval_corpus.sh` + `eval_retrieval.py --build -k 10` with four floors | BM25 recall@k **≥ 0.85**, hit@1 ≥ 0.65, MRR ≥ 0.74, nDCG@k ≥ 0.78 |
51
51
  | `test` | `pytest tests/unit tests/functional --cov` | **80%** coverage (`fail_under = 80`) |
52
52
  | `smoke` | `bash tests/smoke.sh` | 0 failed |
53
53
  | `mutation` | `python3 scripts/mutation_gate.py --run --min 80` | **80%** of `boost_cli/core` mutants killed |
54
54
 
55
55
  The `eval` gate is the Tier 1 retrieval-quality check: it runs boost's RAG
56
- engines over the golden set (`tests/eval/golden.jsonl`) and floors BM25
57
- recall@k. The golden set grades real catalog items **by name**, so it needs a
56
+ engines over the golden set (`tests/eval/golden.jsonl`) and floors **four**
57
+ metrics on BM25 — recall@k, hit@1, MRR and nDCG@k. Flooring recall alone was a
58
+ hole rather than a simplification: a ranker that finds the right answer every
59
+ time and never ranks it first scores recall@10 1.000 with hit@1 0.000, and
60
+ passed. The golden set grades real catalog items **by name**, so it needs a
58
61
  corpus: `scripts/ensure_eval_corpus.sh` first taps the pinned repo list in
59
62
  `tests/eval/taps.txt` (the minimal set covering all golden targets — `boost tap
60
- --defaults` is NOT enough, it omits every rule/workflow repo). Over that corpus
61
- BM25 recall is 1.000, so the 0.85 floor has wide margin; regression-vs-baseline
62
- is relaxed in the gate (`--regression-eps 1`) so upstream repo drift can't flake
63
- it. Edit `taps.txt` → regenerate `tests/eval/baseline.json`. It runs in CI's
63
+ --defaults` is NOT enough, it omits every rule/workflow repo). Measured over
64
+ that corpus BM25 scores 1.000 / 0.780 / 0.860 / 0.895, and each floor sits about
65
+ 0.12 under its measured value — loose enough that upstream drift can't flake the
66
+ build, tight enough to catch a collapse. Regression-vs-baseline stays relaxed
67
+ (`--regression-eps 1`) because the corpus tracks upstream HEAD rather than
68
+ pinned commits, so the absolute floors are the real gate.
69
+
70
+ **Baselines are keyed by query set** (`name@content-digest`), so one file holds
71
+ both `golden.jsonl` and `golden-natural.jsonl` without either overwriting the
72
+ other. Before that, running the natural-language set printed eight confident
73
+ "REGRESSION vs baseline" lines that were only the gap between two different
74
+ question sets. Add `--floor NAME=VALUE` (repeatable) to gate any metric; a
75
+ misspelled metric name is a hard error rather than a silently skipped floor.
76
+ Edit `taps.txt` → regenerate `tests/eval/baseline.json`. It runs in CI's
64
77
  `lint` job (pure-stdlib BM25, no `ANTHROPIC_API_KEY`; needs network to tap). The
65
78
  opt-in evals stay out of `check` and all degrade cleanly:
66
79
 
@@ -98,15 +98,24 @@ dist-check:
98
98
  $(VENV)/bin/check-wheel-contents dist/*.whl
99
99
  $(VENV)/bin/pyroma --min 8 dist/*.tar.gz
100
100
 
101
- # Tier 1 retrieval quality gate: golden-set recall@k over a pinned corpus
102
- # (tests/eval/taps.txt). Part of `check` and required in CI (the lint job).
103
- # Taps the pinned repos into a sandboxed $(EVAL_HOME) first (network on the
104
- # first run; a sentinel skips re-tapping after), then floors BM25 recall@k at
105
- # 0.85. Regression-vs-baseline is relaxed here (drift tolerance); the absolute
106
- # floor is the gate.
101
+ # Tier 1 retrieval quality gate over a pinned corpus (tests/eval/taps.txt).
102
+ # Part of `check` and required in CI (the lint job). Taps the pinned repos into
103
+ # a sandboxed $(EVAL_HOME) first (network on the first run; a sentinel skips
104
+ # re-tapping after), then floors FOUR metrics on BM25, not just recall.
105
+ #
106
+ # recall@k alone could not fail this build for a ranker that found the right
107
+ # answer every time and never ranked it first — recall@10 1.000 with hit@1
108
+ # 0.000 passed. Measured on this corpus BM25 scores 1.000 / 0.780 / 0.860 /
109
+ # 0.895, so each floor sits ~0.12 below its measured value: loose enough that
110
+ # upstream repo drift cannot flake the build, tight enough that a collapse
111
+ # fails it. Regression-vs-baseline stays relaxed (--regression-eps 1) because
112
+ # the corpus tracks upstream HEAD rather than pinned commits; the absolute
113
+ # floors are the real gate, and they are drift-tolerant by construction.
107
114
  eval:
108
115
  PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
109
- BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_retrieval.py --build -k 10 --fail-under 0.85 --regression-eps 1
116
+ BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_retrieval.py --build -k 10 \
117
+ --fail-under 0.85 --floor hit@1=0.65 --floor MRR=0.74 --floor nDCG@k=0.78 \
118
+ --regression-eps 1
110
119
 
111
120
  # Tier 2a: LLM rerank lift over BM25 on the same golden set. Opt-in and
112
121
  # key-gated — needs the `claude` CLI on PATH or ANTHROPIC_API_KEY; skips
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.317
3
+ Version: 1.0.319
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.317'
22
- __version_tuple__ = version_tuple = (1, 0, 317)
21
+ __version__ = version = '1.0.319'
22
+ __version_tuple__ = version_tuple = (1, 0, 319)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -18,9 +18,9 @@ from pathlib import Path
18
18
  from typing import Dict, List, Optional, Tuple
19
19
 
20
20
  from . import catalog, embed, paths
21
- from .rag import Hit, chunk, read_body
21
+ from .rag import Hit, chunk, entry_key, read_body
22
22
 
23
- INDEX_VERSION = 1
23
+ INDEX_VERSION = 2
24
24
  _BATCH = 128 # texts per embedding request
25
25
  _POOL = 8 # chunk over-fetch factor for KNN before per-entry reduce
26
26
 
@@ -64,7 +64,7 @@ def _connect() -> Optional[sqlite3.Connection]:
64
64
  def _ensure_schema(con: sqlite3.Connection, dim: int) -> None:
65
65
  con.execute(
66
66
  "CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY AUTOINCREMENT,"
67
- " name TEXT, tap TEXT, kind TEXT, cix INTEGER, snip TEXT)")
67
+ " name TEXT, tap TEXT, path TEXT, kind TEXT, cix INTEGER, snip TEXT)")
68
68
  con.execute("CREATE INDEX IF NOT EXISTS chunks_tap ON chunks(tap)")
69
69
  con.execute("CREATE TABLE IF NOT EXISTS meta (k TEXT PRIMARY KEY, v TEXT)")
70
70
  con.execute(
@@ -283,7 +283,14 @@ def build(entries: Optional[List[dict]] = None,
283
283
  return None
284
284
  try:
285
285
  meta = _read_meta(con)
286
- same_backend = (meta.get("provider") == prov
286
+ # The stored INDEX_VERSION has to be part of this. `_ensure_schema` uses
287
+ # CREATE TABLE IF NOT EXISTS, so it cannot add a column to a store built
288
+ # by an older boost — leaving the build to fail on the first INSERT with
289
+ # "table chunks has no column named path". `status()` already treated a
290
+ # version change as a reason to rebuild; only the build path did not.
291
+ same_version = meta.get("version") == INDEX_VERSION
292
+ same_backend = (same_version
293
+ and meta.get("provider") == prov
287
294
  and meta.get("model") == mdl
288
295
  and meta.get("dim") == dim)
289
296
  if force or not same_backend:
@@ -323,7 +330,7 @@ def build(entries: Optional[List[dict]] = None,
323
330
  con.commit()
324
331
  total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
325
332
  return {
326
- "entries": len({(e["name"], e["tap"]) for e in entries}),
333
+ "entries": len({entry_key(e) for e in entries}),
327
334
  "chunks": total,
328
335
  "added": added,
329
336
  "taps": len(commits),
@@ -384,10 +391,10 @@ def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
384
391
  continue
385
392
  for (e, ci, text), vec in zip(batch, vecs):
386
393
  cur = con.execute(
387
- "INSERT INTO chunks (name, tap, kind, cix, snip) "
388
- "VALUES (?, ?, ?, ?, ?)",
389
- (e["name"], e["tap"], e.get("kind", "skill"), ci,
390
- text[:200].strip()))
394
+ "INSERT INTO chunks (name, tap, path, kind, cix, snip) "
395
+ "VALUES (?, ?, ?, ?, ?, ?)",
396
+ (e["name"], e["tap"], e["skill_md"],
397
+ e.get("kind", "skill"), ci, text[:200].strip()))
391
398
  con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
392
399
  (cur.lastrowid, mod.serialize_float32(vec)))
393
400
  added += 1
@@ -423,31 +430,33 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
423
430
  if not knn:
424
431
  return []
425
432
  by_id = {r[0]: (r[1], r[2], r[3], r[4]) for r in con.execute(
426
- "SELECT id, name, tap, kind, snip FROM chunks WHERE id IN (%s)" # noqa: S608 interpolates only `?` placeholders; ids are bound params
433
+ "SELECT id, tap, path, kind, snip FROM chunks WHERE id IN (%s)" # noqa: S608 interpolates only `?` placeholders; ids are bound params
427
434
  % ",".join("?" * len(knn)), [rid for rid, _d in knn])}
428
435
  finally:
429
436
  con.close()
430
437
 
431
438
  entries = catalog.all_entries() if entries is None else entries
432
- live = {(e["name"], e["tap"]): e for e in entries}
439
+ live = {entry_key(e): e for e in entries}
433
440
  best: Dict[Tuple[str, str], Tuple[float, str]] = {}
434
441
  for rid, dist in knn:
435
442
  meta = by_id.get(rid)
436
443
  if meta is None:
437
444
  continue
438
- name, tap, ckind, snip = meta
445
+ tap, path, ckind, snip = meta
439
446
  if kind is not None and ckind != kind:
440
447
  continue
441
- key = (name, tap)
448
+ key = (tap, path)
442
449
  if key not in live:
443
450
  continue
444
451
  score = 1.0 - dist # cosine distance -> similarity
445
452
  prev = best.get(key)
446
453
  if prev is None or score > prev[0]:
447
454
  best[key] = (score, snip)
448
- ranked = sorted(best.items(), key=lambda kv: (-kv[1][0], kv[0][0]))
455
+ # Tie-break on the displayed name (see rag.retrieve for why).
456
+ ranked = sorted(best.items(),
457
+ key=lambda kv: (-kv[1][0], live[kv[0]]["name"], kv[0]))
449
458
  hits: List[Hit] = [
450
- {"entry": live[(name, tap)], "score": score,
459
+ {"entry": live[key], "score": score,
451
460
  "snippet": snip} # type: ignore[typeddict-item]
452
- for (name, tap), (score, snip) in ranked[:k]]
461
+ for key, (score, snip) in ranked[:k]]
453
462
  return hits
@@ -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 = 2
36
+ INDEX_VERSION = 3
37
37
  ENGINE = "bm25"
38
38
 
39
39
  # Chunking defaults (documented in docs/rag-architecture.md §4).
@@ -175,7 +175,8 @@ def _make_docs(entries: List[dict], tap_paths: Dict[str, Path]) -> List[dict]:
175
175
  if not tf:
176
176
  continue
177
177
  docs.append({
178
- "n": e["name"], "t": e["tap"], "k": e.get("kind", "skill"),
178
+ "n": e["name"], "t": e["tap"], "f": e["skill_md"],
179
+ "k": e.get("kind", "skill"),
179
180
  "c": ci, "l": sum(tf.values()),
180
181
  "snip": piece[:SNIP_STORE].strip(), # windowed at retrieve time
181
182
  "tf": dict(tf), # noqa: FURB123 tf is a defaultdict; .copy() would keep the factory
@@ -226,7 +227,7 @@ def build(entries: Optional[List[dict]] = None, force: bool = False) -> dict:
226
227
  _save(docs, commits)
227
228
  reindexed = sorted({e["tap"] for e in fresh})
228
229
  return {
229
- "entries": len({(e["name"], e["tap"]) for e in entries}),
230
+ "entries": len({entry_key(e) for e in entries}),
230
231
  "docs": len(docs),
231
232
  "taps": len(commits),
232
233
  "reindexed": reindexed,
@@ -242,7 +243,7 @@ def _save(docs: List[dict], commits: Dict[str, str]) -> None:
242
243
  for term, tf in d["tf"].items():
243
244
  postings[term].append([doc_id, tf])
244
245
  total_len += d["l"]
245
- meta_docs.append({"n": d["n"], "t": d["t"], "k": d["k"],
246
+ meta_docs.append({"n": d["n"], "t": d["t"], "f": d["f"], "k": d["k"],
246
247
  "c": d["c"], "l": d["l"], "snip": d["snip"]})
247
248
  payload = {
248
249
  "version": INDEX_VERSION,
@@ -365,6 +366,34 @@ def _passage(text: str, terms: Sequence[str], width: int = SNIP_WIDTH) -> str:
365
366
  return lead + snip + tail
366
367
 
367
368
 
369
+ def entry_key(entry: dict) -> Tuple[str, str]:
370
+ """Identity of a catalog entry: the tap it came from and its file.
371
+
372
+ NOT ``(name, tap)``, which both engines used and which is not unique. On the
373
+ pinned 6-tap eval corpus 743 entries collapse to 694 such pairs; on a real
374
+ 83-tap install the roadmap item measures 1,557 of 11,147 (14.0%) colliding,
375
+ worst case ``('survivorforge/cursor-rules', 'rule')`` x47. One tap can
376
+ legitimately ship two different files under one name —
377
+
378
+ docs/rules/backend/nodejs/express-mongodb/admin-interface-rule.mdc
379
+ docs/rules/backend/nodejs/fullstack-mern-guide/admin-interface-rule.mdc
380
+
381
+ — and keying on the name made the second shadow the first in a dict
382
+ comprehension, so a query matching the first's body was reported under the
383
+ second's name and description. ``skill_md`` is the tap-relative path, so
384
+ ``(tap, skill_md)`` is 743/743 and 11,147/11,147 distinct respectively.
385
+
386
+ Deliberately strict. An earlier draft fell back to the name when
387
+ ``skill_md`` was missing, on the theory that a malformed row should not
388
+ crash a search. It is the worse failure: the index side and the entry side
389
+ then degrade differently, the keys stop matching, and retrieval silently
390
+ returns *nothing* — which takes far longer to diagnose than a KeyError
391
+ naming the field. Every catalog entry has ``skill_md`` (743/743 on the eval
392
+ corpus), and INDEX_VERSION rejects any index built without it.
393
+ """
394
+ return (entry["tap"], entry["skill_md"])
395
+
396
+
368
397
  def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
369
398
  entries: Optional[List[dict]] = None) -> List[Hit]:
370
399
  """Top-k full-content hits for ``query``. ``[]`` if the index is empty."""
@@ -375,24 +404,28 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
375
404
  if not terms:
376
405
  return []
377
406
  entries = catalog.all_entries() if entries is None else entries
378
- live = {(e["name"], e["tap"]): e for e in entries}
407
+ live = {entry_key(e): e for e in entries}
379
408
  docs = raw["docs"]
380
409
  best: Dict[Tuple[str, str], Tuple[float, str]] = {}
381
410
  for doc_id, score in _bm25(terms, raw).items():
382
411
  d = docs[doc_id]
383
412
  if kind is not None and d["k"] != kind:
384
413
  continue
385
- key = (d["n"], d["t"])
414
+ key = (d["t"], d["f"])
386
415
  if key not in live:
387
416
  continue
388
417
  prev = best.get(key)
389
418
  if prev is None or score > prev[0]:
390
419
  best[key] = (score, d["snip"])
391
- ranked = sorted(best.items(), key=lambda kv: (-kv[1][0], kv[0][0]))
420
+ # Tie-break on the displayed name, not the identity key: the key is now
421
+ # (tap, path), and ordering by it would silently reshuffle equal-scoring
422
+ # results relative to every previous release.
423
+ ranked = sorted(best.items(),
424
+ key=lambda kv: (-kv[1][0], live[kv[0]]["name"], kv[0]))
392
425
  hits: List[Hit] = [
393
- {"entry": live[(name, tap)], "score": score,
426
+ {"entry": live[key], "score": score,
394
427
  "snippet": _passage(snip, terms)} # type: ignore[typeddict-item]
395
- for (name, tap), (score, snip) in ranked[:k]]
428
+ for key, (score, snip) in ranked[:k]]
396
429
  return hits
397
430
 
398
431
 
@@ -435,9 +468,9 @@ def rrf_fuse(rankings: List[List[Hit]], limit: int = 60) -> List[Hit]:
435
468
  calibration step that has to be fitted and re-fitted per corpus; rank
436
469
  fusion sidesteps it entirely and is the respected zero-tuning default.
437
470
 
438
- Entries are identified by ``(name, tap)`` — the same key both engines
439
- already dedupe on — and the first ranking's hit object wins, so the caller
440
- passes BM25 first and keeps its query-term-highlighted snippet for display.
471
+ Entries are identified by ``entry_key`` — the same key both engines dedupe
472
+ on — and the first ranking's hit object wins, so the caller passes BM25
473
+ first and keeps its query-term-highlighted snippet for display.
441
474
 
442
475
  The returned ``score`` is the fused rank score, not a BM25 score: it exists
443
476
  to order these hits against each other, and comparing it to a raw BM25
@@ -448,7 +481,7 @@ def rrf_fuse(rankings: List[List[Hit]], limit: int = 60) -> List[Hit]:
448
481
  for hits in rankings:
449
482
  for rank, hit in enumerate(hits, start=1):
450
483
  entry = hit["entry"]
451
- key = (entry["name"], entry["tap"])
484
+ key = entry_key(entry)
452
485
  scores[key] = scores.get(key, 0.0) + 1.0 / (RRF_K + rank)
453
486
  chosen.setdefault(key, hit)
454
487
  ordered = sorted(scores, key=lambda key: (-scores[key], key[0], key[1]))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.317
3
+ Version: 1.0.319
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -493,7 +493,9 @@ tests/unit/test_docsite_chrome.py
493
493
  tests/unit/test_ed25519.py
494
494
  tests/unit/test_embed.py
495
495
  tests/unit/test_embed_local.py
496
+ tests/unit/test_entry_key.py
496
497
  tests/unit/test_errors_and_cli_table.py
498
+ tests/unit/test_eval_baseline.py
497
499
  tests/unit/test_eval_faithfulness.py
498
500
  tests/unit/test_eval_gate.py
499
501
  tests/unit/test_eval_metrics.py
@@ -2,14 +2,14 @@
2
2
  id: eval-corpus-cannot-see-real-retrieval
3
3
  board: code
4
4
  section: internals
5
- status: planned
5
+ status: inflight
6
6
  category: Quality · Eval
7
7
  complexity: M
8
8
  impact: High
9
9
  wow: 4
10
10
  note: gate reports 1.000 while users get 0.720
11
11
  order: 70
12
- owner:
12
+ owner: loop/eval-corpus-falsifiable
13
13
  pr:
14
14
  title: The eval gate reports a perfect score on a corpus 4× smaller than a real user's
15
15
  ---
@@ -57,6 +57,35 @@ different axes, same conclusion: the number the gate reports is not a number abo
57
57
  What it does <b>not</b> fix is the corpus-size half, which is this card's own finding and remains
58
58
  open &mdash; 50 queries over 6 taps cannot speak to an 83-tap install. The two are complementary
59
59
  rather than overlapping, and combining them (natural-language queries over a realistically sized
60
- corpus) is the instrument this group actually wants. Also unaddressed here: the kind oracle, the
61
- recall-only floor and <code>--regression-eps 1</code> are all still exactly as described above.
60
+ corpus) is the instrument this group actually wants.
61
+
62
+ <b>Two of the three blindnesses are now closed, and the third was never true of the committed
63
+ harness.</b> <b>(1) recall-only flooring</b> is fixed: <code>--floor NAME=VALUE</code> is repeatable
64
+ and gates any metric, and <code>make eval</code> now floors all four &mdash; measured BM25 on the
65
+ pinned corpus is 1.000 / 0.780 / 0.860 / 0.895, with each floor about 0.12 under its measured value
66
+ so upstream drift cannot flake the build. A misspelled metric name is a hard error rather than a
67
+ silently skipped floor, since a floor that never fires is worse than no floor.
68
+
69
+ <b>(3) the kind oracle does not exist in <code>scripts/eval_retrieval.py</code>.</b> Checked
70
+ directly: every ranker &mdash; <code>catalog_ranker</code>, <code>bm25_ranker</code>,
71
+ <code>dense_ranker</code>, <code>hybrid_ranker</code> &mdash; is called with the query alone, and
72
+ there is no <code>kind=</code> argument anywhere in <code>scripts/</code> or <code>evals/</code>,
73
+ before or after <code>#360</code>. The golden set's <code>kind</code> field feeds the per-kind
74
+ <em>reporting</em> slices in <code>_aggregate</code> and nothing else, so the +0.073 figure quoted
75
+ above cannot have come from this harness. Recording it here rather than silently deleting the claim,
76
+ because the number was real in whatever script measured it.
77
+
78
+ <b>A defect the card did not predict:</b> the baseline was not keyed to the query set that produced
79
+ it. Running the natural-language set printed eight confident <code>REGRESSION vs baseline</code>
80
+ lines &mdash; BM25 recall 1.000&rarr;0.690, hit@1 0.780&rarr;0.240 &mdash; which were not
81
+ regressions but the gap between two different question sets, and <code>--save-baseline</code> on the
82
+ natural set would have silently overwritten the keyword set's numbers with them. Baselines are now
83
+ keyed by <code>name@content-digest</code>, so editing a query in place invalidates its baseline
84
+ rather than quietly re-grading against numbers that no longer describe it.
85
+
86
+ <b>Still open:</b> the corpus-size half (23 taps versus a real 83) and
87
+ <code>--regression-eps 1</code>, which is a symptom of the corpus tracking upstream HEAD rather than
88
+ pinned commits. Pinning <code>taps.txt</code> by commit SHA is the change that would make
89
+ regression-vs-baseline meaningful again; the absolute floors added here are drift-tolerant by
90
+ construction and do not depend on it.
62
91
 
@@ -2,14 +2,14 @@
2
2
  id: near-duplicate-items-eat-the-result-slots
3
3
  board: code
4
4
  section: pipeline
5
- status: planned
5
+ status: inflight
6
6
  category: Search · Ranking
7
7
  complexity: M
8
8
  impact: High
9
9
  wow: 4
10
10
  note: 56.3% of entries share a name
11
11
  order: 71
12
- owner:
12
+ owner: loop/entry-key-collision
13
13
  pr:
14
14
  title: Near-duplicate items consume the top-10, and it gets worse with every tap
15
15
  ---
@@ -61,3 +61,33 @@ the fix at deduplication before ranking rather than at the fusion rule.
61
61
  Worth re-measuring on the 83-tap install with the same script (<code>rrf_fuse</code> is public) to
62
62
  turn this bound into a curve.
63
63
 
64
+
65
+ <b>The key half is shipped; the ranking half is not.</b> This card names two things to get right,
66
+ and the second &mdash; <code>(tap, name)</code> is not a unique key &mdash; turned out to be a
67
+ correctness bug rather than a ranking one, so it was fixed first and separately.
68
+
69
+ Both engines built <code>live = {(name, tap): entry}</code> as a dict comprehension, so the last
70
+ entry silently won. Reproduced on the pinned 6-tap corpus: 743 entries collapse to 694 pairs, leaving
71
+ <b>49 entries (6.6%) unreachable</b> &mdash; the card's 14.0% at 83 taps, at small scale. It is not
72
+ only that a copy is hidden: a query matching a shadowed entry's <em>body</em> was reported under the
73
+ surviving entry's name, description and path. The clearest pair, same tap and same name, is two
74
+ genuinely different rules:
75
+ <code>docs/rules/backend/nodejs/express-mongodb/admin-interface-rule.mdc</code> and
76
+ <code>docs/rules/backend/nodejs/fullstack-mern-guide/admin-interface-rule.mdc</code>.
77
+
78
+ <code>rag.entry_key</code> is now the single identity function shared by BM25, dense and RRF, keyed
79
+ on <code>(tap, skill_md)</code> &mdash; 743/743 distinct here and 11,147/11,147 on the 83-tap
80
+ install, exactly as this card predicted. Both index versions are bumped, and <code>dense.build</code>
81
+ now wipes on a version change: it compared only provider/model/dim, and since
82
+ <code>_ensure_schema</code> uses <code>CREATE TABLE IF NOT EXISTS</code> an existing store would have
83
+ crashed on the first insert with &ldquo;no column named path&rdquo;.
84
+
85
+ Measured cost: <b>none</b>. Over the pinned corpus BM25 scores 1.000 / 0.780 / 0.860 / 0.895 both
86
+ before and after, so recovering 49 entries did not disturb ranking. Several fixtures were modelling
87
+ data a real catalog cannot produce &mdash; every entry sharing <code>skill_md="s"</code>, two skills
88
+ at one path &mdash; and were corrected.
89
+
90
+ <b>Still open:</b> the ranking half. Clustering on content hash, picking a winner with a quality
91
+ prior, and the 83-tap re-measurement of the fusion bound are all untouched. Note the two are
92
+ independent: dedup <em>merges</em> copies that are genuinely the same, whereas this fix stops copies
93
+ that were never the same from being merged by accident.
@@ -1707,7 +1707,7 @@ a one-line <code>logger.debug(...)</code> in each except branch.</p>
1707
1707
  </article>
1708
1708
 
1709
1709
  <article class="cap rcard" id="eval-corpus-cannot-see-real-retrieval">
1710
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Quality · Eval</span></div>
1710
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Quality · Eval</span></div>
1711
1711
  <h3>The eval gate reports a perfect score on a corpus 4× smaller than a real user's</h3>
1712
1712
  <p><code>make eval</code> reports BM25 <code>recall@10 = 1.000</code> against the
1713
1713
  pinned 23-tap corpus in <code>tests/eval/taps.txt</code>. Run the same script
@@ -1753,8 +1753,37 @@ different axes, same conclusion: the number the gate reports is not a number abo
1753
1753
  What it does <b>not</b> fix is the corpus-size half, which is this card's own finding and remains
1754
1754
  open &mdash; 50 queries over 6 taps cannot speak to an 83-tap install. The two are complementary
1755
1755
  rather than overlapping, and combining them (natural-language queries over a realistically sized
1756
- corpus) is the instrument this group actually wants. Also unaddressed here: the kind oracle, the
1757
- recall-only floor and <code>--regression-eps 1</code> are all still exactly as described above.</p>
1756
+ corpus) is the instrument this group actually wants.
1757
+
1758
+ <b>Two of the three blindnesses are now closed, and the third was never true of the committed
1759
+ harness.</b> <b>(1) recall-only flooring</b> is fixed: <code>--floor NAME=VALUE</code> is repeatable
1760
+ and gates any metric, and <code>make eval</code> now floors all four &mdash; measured BM25 on the
1761
+ pinned corpus is 1.000 / 0.780 / 0.860 / 0.895, with each floor about 0.12 under its measured value
1762
+ so upstream drift cannot flake the build. A misspelled metric name is a hard error rather than a
1763
+ silently skipped floor, since a floor that never fires is worse than no floor.
1764
+
1765
+ <b>(3) the kind oracle does not exist in <code>scripts/eval_retrieval.py</code>.</b> Checked
1766
+ directly: every ranker &mdash; <code>catalog_ranker</code>, <code>bm25_ranker</code>,
1767
+ <code>dense_ranker</code>, <code>hybrid_ranker</code> &mdash; is called with the query alone, and
1768
+ there is no <code>kind=</code> argument anywhere in <code>scripts/</code> or <code>evals/</code>,
1769
+ before or after <code>#360</code>. The golden set's <code>kind</code> field feeds the per-kind
1770
+ <em>reporting</em> slices in <code>_aggregate</code> and nothing else, so the +0.073 figure quoted
1771
+ above cannot have come from this harness. Recording it here rather than silently deleting the claim,
1772
+ because the number was real in whatever script measured it.
1773
+
1774
+ <b>A defect the card did not predict:</b> the baseline was not keyed to the query set that produced
1775
+ it. Running the natural-language set printed eight confident <code>REGRESSION vs baseline</code>
1776
+ lines &mdash; BM25 recall 1.000&rarr;0.690, hit@1 0.780&rarr;0.240 &mdash; which were not
1777
+ regressions but the gap between two different question sets, and <code>--save-baseline</code> on the
1778
+ natural set would have silently overwritten the keyword set's numbers with them. Baselines are now
1779
+ keyed by <code>name@content-digest</code>, so editing a query in place invalidates its baseline
1780
+ rather than quietly re-grading against numbers that no longer describe it.
1781
+
1782
+ <b>Still open:</b> the corpus-size half (23 taps versus a real 83) and
1783
+ <code>--regression-eps 1</code>, which is a symptom of the corpus tracking upstream HEAD rather than
1784
+ pinned commits. Pinning <code>taps.txt</code> by commit SHA is the change that would make
1785
+ regression-vs-baseline meaningful again; the absolute floors added here are drift-tolerant by
1786
+ construction and do not depend on it.</p>
1758
1787
  <div class="meta">
1759
1788
  <span class="m">Complexity <b>M</b></span>
1760
1789
  <span class="m hi">Impact <b>High</b></span>
@@ -3318,7 +3347,7 @@ deliberate, and idempotence was the piece missing from it.</p>
3318
3347
  </article>
3319
3348
 
3320
3349
  <article class="cap rcard" id="near-duplicate-items-eat-the-result-slots">
3321
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Search · Ranking</span></div>
3350
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Ranking</span></div>
3322
3351
  <h3>Near-duplicate items consume the top-10, and it gets worse with every tap</h3>
3323
3352
  <p>Measured on a real 83-tap install: 11,147 catalog entries carry only 6,997
3324
3353
  unique names — <b>1.593 copies per name, and 56.3% of entries share a name with
@@ -3366,7 +3395,38 @@ multiplies them. If the amplification appears at 83 taps it will be because both
3366
3395
  the fix at deduplication before ranking rather than at the fusion rule.
3367
3396
 
3368
3397
  Worth re-measuring on the 83-tap install with the same script (<code>rrf_fuse</code> is public) to
3369
- turn this bound into a curve.</p>
3398
+ turn this bound into a curve.
3399
+
3400
+
3401
+ <b>The key half is shipped; the ranking half is not.</b> This card names two things to get right,
3402
+ and the second &mdash; <code>(tap, name)</code> is not a unique key &mdash; turned out to be a
3403
+ correctness bug rather than a ranking one, so it was fixed first and separately.
3404
+
3405
+ Both engines built <code>live = {(name, tap): entry}</code> as a dict comprehension, so the last
3406
+ entry silently won. Reproduced on the pinned 6-tap corpus: 743 entries collapse to 694 pairs, leaving
3407
+ <b>49 entries (6.6%) unreachable</b> &mdash; the card's 14.0% at 83 taps, at small scale. It is not
3408
+ only that a copy is hidden: a query matching a shadowed entry's <em>body</em> was reported under the
3409
+ surviving entry's name, description and path. The clearest pair, same tap and same name, is two
3410
+ genuinely different rules:
3411
+ <code>docs/rules/backend/nodejs/express-mongodb/admin-interface-rule.mdc</code> and
3412
+ <code>docs/rules/backend/nodejs/fullstack-mern-guide/admin-interface-rule.mdc</code>.
3413
+
3414
+ <code>rag.entry_key</code> is now the single identity function shared by BM25, dense and RRF, keyed
3415
+ on <code>(tap, skill_md)</code> &mdash; 743/743 distinct here and 11,147/11,147 on the 83-tap
3416
+ install, exactly as this card predicted. Both index versions are bumped, and <code>dense.build</code>
3417
+ now wipes on a version change: it compared only provider/model/dim, and since
3418
+ <code>_ensure_schema</code> uses <code>CREATE TABLE IF NOT EXISTS</code> an existing store would have
3419
+ crashed on the first insert with &ldquo;no column named path&rdquo;.
3420
+
3421
+ Measured cost: <b>none</b>. Over the pinned corpus BM25 scores 1.000 / 0.780 / 0.860 / 0.895 both
3422
+ before and after, so recovering 49 entries did not disturb ranking. Several fixtures were modelling
3423
+ data a real catalog cannot produce &mdash; every entry sharing <code>skill_md="s"</code>, two skills
3424
+ at one path &mdash; and were corrected.
3425
+
3426
+ <b>Still open:</b> the ranking half. Clustering on content hash, picking a winner with a quality
3427
+ prior, and the 83-tap re-measurement of the fusion bound are all untouched. Note the two are
3428
+ independent: dedup <em>merges</em> copies that are genuinely the same, whereas this fix stops copies
3429
+ that were never the same from being merged by accident.</p>
3370
3430
  <div class="meta">
3371
3431
  <span class="m">Complexity <b>M</b></span>
3372
3432
  <span class="m hi">Impact <b>High</b></span>