boost-skill-cli 1.0.281__tar.gz → 1.0.282__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 (531) hide show
  1. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.gitignore +5 -0
  2. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
  3. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/Makefile +28 -3
  4. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/PKG-INFO +42 -2
  5. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/README.md +41 -1
  6. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/_version.py +2 -2
  7. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/PKG-INFO +42 -2
  8. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/SOURCES.txt +13 -0
  9. boost_skill_cli-1.0.282/evals/README.md +157 -0
  10. boost_skill_cli-1.0.282/evals/__init__.py +6 -0
  11. boost_skill_cli-1.0.282/evals/baseline.json +550 -0
  12. boost_skill_cli-1.0.282/evals/faithfulness.py +382 -0
  13. boost_skill_cli-1.0.282/evals/golden_set.json +372 -0
  14. boost_skill_cli-1.0.282/evals/make_corpus.py +718 -0
  15. boost_skill_cli-1.0.282/evals/make_golden.py +276 -0
  16. boost_skill_cli-1.0.282/evals/metrics.py +198 -0
  17. boost_skill_cli-1.0.282/evals/run_evals.py +346 -0
  18. boost_skill_cli-1.0.282/scripts/eval_gate.py +240 -0
  19. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/setup.cfg +1 -0
  20. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/smoke.sh +6 -1
  21. boost_skill_cli-1.0.282/tests/unit/test_eval_faithfulness.py +259 -0
  22. boost_skill_cli-1.0.282/tests/unit/test_eval_gate.py +194 -0
  23. boost_skill_cli-1.0.282/tests/unit/test_eval_metrics.py +255 -0
  24. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.gitattributes +0 -0
  25. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.gitleaks.toml +0 -0
  26. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.htmlvalidate.json +0 -0
  27. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.lighthouserc.json +0 -0
  28. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.lycheeignore +0 -0
  29. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.markdownlint-cli2.jsonc +0 -0
  30. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.pre-commit-config.yaml +0 -0
  31. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.stylelintrc.json +0 -0
  32. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.vale/styles/boost/Terminology.yml +0 -0
  33. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/.vale.ini +0 -0
  34. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/CLAUDE.md +0 -0
  35. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/CODE_OF_CONDUCT.md +0 -0
  36. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/CONTRIBUTING.md +0 -0
  37. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/LICENSE +0 -0
  38. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/MANIFEST.in +0 -0
  39. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/SECURITY.md +0 -0
  40. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost +0 -0
  41. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/__init__.py +0 -0
  42. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/__main__.py +0 -0
  43. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/cli.py +0 -0
  44. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/cliparse.py +0 -0
  45. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/__init__.py +0 -0
  46. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/_common.py +0 -0
  47. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/bmad.py +0 -0
  48. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/configuration.py +0 -0
  49. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/discovery.py +0 -0
  50. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/hooks.py +0 -0
  51. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/info.py +0 -0
  52. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/intelligence.py +0 -0
  53. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/pkg.py +0 -0
  54. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/quality.py +0 -0
  55. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/run.py +0 -0
  56. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/safety.py +0 -0
  57. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/taps.py +0 -0
  58. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/commands/team.py +0 -0
  59. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/__init__.py +0 -0
  60. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/adapters.py +0 -0
  61. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/agents.py +0 -0
  62. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/ai.py +0 -0
  63. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/capabilities.py +0 -0
  64. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/catalog.py +0 -0
  65. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/claude_settings.py +0 -0
  66. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/config.py +0 -0
  67. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/dense.py +0 -0
  68. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/ed25519.py +0 -0
  69. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/embed.py +0 -0
  70. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/faithfulness.py +0 -0
  71. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/frontmatter.py +0 -0
  72. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/gitutil.py +0 -0
  73. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/imperative.py +0 -0
  74. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/injectscan.py +0 -0
  75. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/integrity.py +0 -0
  76. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/journal.py +0 -0
  77. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/lockfile.py +0 -0
  78. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/logs.py +0 -0
  79. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/mcp.py +0 -0
  80. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/mcpdecl.py +0 -0
  81. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/minisign.py +0 -0
  82. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/nethttp.py +0 -0
  83. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/output.py +0 -0
  84. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/paths.py +0 -0
  85. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/policy.py +0 -0
  86. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/projectlock.py +0 -0
  87. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/provenance.py +0 -0
  88. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/rag.py +0 -0
  89. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/registry.py +0 -0
  90. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/resolve.py +0 -0
  91. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/rules.py +0 -0
  92. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/scopes.py +0 -0
  93. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/secretscan.py +0 -0
  94. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/selfupdate.py +0 -0
  95. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/serve.py +0 -0
  96. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/stackprobe.py +0 -0
  97. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/staleness.py +0 -0
  98. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/store.py +0 -0
  99. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/trustaudit.py +0 -0
  100. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/typosquat.py +0 -0
  101. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/updatediff.py +0 -0
  102. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/util.py +0 -0
  103. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/core/workflows.py +0 -0
  104. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/data/registries.json +0 -0
  105. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/errors.py +0 -0
  106. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_cli/spin.py +0 -0
  107. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  108. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  109. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/requires.txt +0 -0
  110. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/top_level.txt +0 -0
  111. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/codecov.yml +0 -0
  112. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/.claude/settings.local.json +0 -0
  113. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/DEBUGGING.md +0 -0
  114. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/adapters.html +0 -0
  115. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/distill.gif +0 -0
  116. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/doctor.gif +0 -0
  117. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/explain.gif +0 -0
  118. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/hooks.gif +0 -0
  119. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/install.gif +0 -0
  120. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/pulse.gif +0 -0
  121. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/search.gif +0 -0
  122. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/gifs/tap.gif +0 -0
  123. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/distill.tape +0 -0
  124. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/doctor.tape +0 -0
  125. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/explain.tape +0 -0
  126. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/hooks.tape +0 -0
  127. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/install.tape +0 -0
  128. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/pulse.tape +0 -0
  129. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/search.tape +0 -0
  130. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel/tapes/tap.tape +0 -0
  131. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/carousel.html +0 -0
  132. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/commands.html +0 -0
  133. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/demo.gif +0 -0
  134. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/demo.tape +0 -0
  135. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/design-roadmap.html +0 -0
  136. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/eval.html +0 -0
  137. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/index.html +0 -0
  138. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/mcp-hub.html +0 -0
  139. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/rag-architecture.md +0 -0
  140. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D01.md +0 -0
  141. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D02.md +0 -0
  142. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D03.md +0 -0
  143. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D04.md +0 -0
  144. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D05.md +0 -0
  145. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D06.md +0 -0
  146. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D07.md +0 -0
  147. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D08.md +0 -0
  148. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D09.md +0 -0
  149. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D10.md +0 -0
  150. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D11.md +0 -0
  151. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D12.md +0 -0
  152. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D13.md +0 -0
  153. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D14.md +0 -0
  154. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D15.md +0 -0
  155. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D16.md +0 -0
  156. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D17.md +0 -0
  157. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D18.md +0 -0
  158. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D19.md +0 -0
  159. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D20.md +0 -0
  160. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D21.md +0 -0
  161. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D22.md +0 -0
  162. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D23.md +0 -0
  163. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D24.md +0 -0
  164. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D25.md +0 -0
  165. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D26.md +0 -0
  166. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  167. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  168. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  169. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  170. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  171. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  172. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  173. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  174. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  175. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  176. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  177. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  178. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  179. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  180. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  181. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  182. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  183. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  184. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  185. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  186. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/command-carousel-page.md +0 -0
  187. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  188. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  189. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  190. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  191. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  192. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  193. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  194. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  195. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  196. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  197. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  198. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  199. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  200. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  201. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  202. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  203. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  204. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  205. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  206. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  207. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  208. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  209. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  210. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  211. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  212. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  213. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  214. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/github-community-health-files.md +0 -0
  215. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  216. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  217. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  218. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  219. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  220. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  221. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  222. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  223. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  224. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  225. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  226. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  227. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  228. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  229. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  230. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  231. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  232. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  233. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  234. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  235. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  236. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  237. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  238. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  239. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  240. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  241. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  242. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  243. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  244. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  245. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  246. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  247. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  248. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  249. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  250. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  251. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  252. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  253. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  254. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  255. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  256. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  257. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  258. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  259. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  260. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  261. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  262. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  263. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  264. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  265. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  266. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  267. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  268. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  269. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  270. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  271. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  272. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  273. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  274. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  275. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  276. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  277. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  278. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  279. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  280. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  281. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  282. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  283. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  284. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  285. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  286. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  287. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  288. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  289. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  290. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  291. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  292. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  293. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  294. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  295. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  296. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  297. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  298. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  299. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  300. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  301. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  302. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  303. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  304. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  305. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  306. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  307. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  308. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  309. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  310. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  311. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  312. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  313. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  314. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  315. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  316. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  317. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  318. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  319. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  320. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  321. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  322. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  323. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  324. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  325. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  326. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  327. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  328. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  329. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  330. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  331. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  332. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  333. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  334. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  335. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  336. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  337. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/workspace-scope-install.md +0 -0
  338. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  339. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/docs/roadmap.html +0 -0
  340. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/eslint.config.mjs +0 -0
  341. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/examples/README.md +0 -0
  342. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/examples/adapt-demo.sh +0 -0
  343. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/examples/boost-run-prototype.sh +0 -0
  344. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/index.html +0 -0
  345. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/noxfile.py +0 -0
  346. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/pyproject.toml +0 -0
  347. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/coverage-tools.in +0 -0
  348. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/coverage-tools.txt +0 -0
  349. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/lint-tools.in +0 -0
  350. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/lint-tools.txt +0 -0
  351. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/mutation-tools.in +0 -0
  352. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/mutation-tools.txt +0 -0
  353. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/release-tools.in +0 -0
  354. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/release-tools.txt +0 -0
  355. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/test-tools.in +0 -0
  356. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/requirements/test-tools.txt +0 -0
  357. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/a11y_check.py +0 -0
  358. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/bench_cli.sh +0 -0
  359. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/build_command_reference.py +0 -0
  360. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/build_registries.py +0 -0
  361. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/build_roadmap.py +0 -0
  362. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/check_anchors.py +0 -0
  363. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/check_licenses.py +0 -0
  364. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/check_required_checks.py +0 -0
  365. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/ensure_eval_corpus.sh +0 -0
  366. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/eval_explain.py +0 -0
  367. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/eval_recommend.py +0 -0
  368. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/eval_retrieval.py +0 -0
  369. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/eval_stats_summary.py +0 -0
  370. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/import_budget.py +0 -0
  371. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/lock_toolchain.py +0 -0
  372. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/mutation_gate.py +0 -0
  373. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/mutation_shards.py +0 -0
  374. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/mutation_weights.json +0 -0
  375. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/perf_gate.py +0 -0
  376. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/post_deploy_smoke.py +0 -0
  377. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/scripts/release_preflight.py +0 -0
  378. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/sonar-project.properties +0 -0
  379. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/style/README.md +0 -0
  380. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/style/boost.css +0 -0
  381. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/style/boost.js +0 -0
  382. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/style/demo.html +0 -0
  383. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/adapt.feature +0 -0
  384. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/browse.feature +0 -0
  385. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/count.feature +0 -0
  386. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/discover.feature +0 -0
  387. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/doctor.feature +0 -0
  388. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/environment.py +0 -0
  389. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/explain.feature +0 -0
  390. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/index.feature +0 -0
  391. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/install.feature +0 -0
  392. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/list.feature +0 -0
  393. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/mcp.feature +0 -0
  394. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/search.feature +0 -0
  395. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/cli_steps.py +0 -0
  396. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/discovery_steps.py +0 -0
  397. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/mcp_steps.py +0 -0
  398. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/quality_steps.py +0 -0
  399. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/conftest.py +0 -0
  400. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/eval/baseline.json +0 -0
  401. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/eval/explain.jsonl +0 -0
  402. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/eval/golden.jsonl +0 -0
  403. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/eval/recommend.jsonl +0 -0
  404. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/eval/taps.txt +0 -0
  405. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_capabilities_policy.py +0 -0
  406. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_adapt.py +0 -0
  407. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_bmad.py +0 -0
  408. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_configuration.py +0 -0
  409. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_discovery.py +0 -0
  410. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_hooks.py +0 -0
  411. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_info.py +0 -0
  412. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_intelligence.py +0 -0
  413. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_pkg.py +0 -0
  414. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_quality.py +0 -0
  415. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_taps.py +0 -0
  416. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_cli_team.py +0 -0
  417. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_everyday_loop.py +0 -0
  418. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_integrity_enforce.py +0 -0
  419. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_property_parsers.py +0 -0
  420. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_run.py +0 -0
  421. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_tap_signing.py +0 -0
  422. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/functional/test_workspace_scope.py +0 -0
  423. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/README.md +0 -0
  424. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  425. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  426. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  427. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  428. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  429. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  430. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  431. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  432. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  433. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  434. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  435. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  436. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  437. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  438. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  439. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  440. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  441. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  442. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  443. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  444. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/fuzz_frontmatter.py +0 -0
  445. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/fuzz/fuzz_registry.py +0 -0
  446. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/make_fixture.py +0 -0
  447. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/perf/test_benchmarks.py +0 -0
  448. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_a11y_check.py +0 -0
  449. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_adapters.py +0 -0
  450. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_adapters_multi.py +0 -0
  451. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_adapters_runner.py +0 -0
  452. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_agents.py +0 -0
  453. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_ai.py +0 -0
  454. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_capabilities.py +0 -0
  455. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_catalog.py +0 -0
  456. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_check_anchors.py +0 -0
  457. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_check_licenses.py +0 -0
  458. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_claude_settings.py +0 -0
  459. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_cliparse.py +0 -0
  460. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_codeql_analysis_key.py +0 -0
  461. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_command_reference_fresh.py +0 -0
  462. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_community_health_files.py +0 -0
  463. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_config.py +0 -0
  464. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_dense.py +0 -0
  465. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_dense_fallback.py +0 -0
  466. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_dependabot_config.py +0 -0
  467. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_docs_pages_linked.py +0 -0
  468. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_docsite_chrome.py +0 -0
  469. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_ed25519.py +0 -0
  470. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_embed.py +0 -0
  471. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_errors_and_cli_table.py +0 -0
  472. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_eval_stats_summary.py +0 -0
  473. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_faithfulness.py +0 -0
  474. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_frontmatter.py +0 -0
  475. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_fuzz_targets.py +0 -0
  476. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_gitleaks_config.py +0 -0
  477. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_gitutil.py +0 -0
  478. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_imperative.py +0 -0
  479. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_import_budget.py +0 -0
  480. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_injectscan.py +0 -0
  481. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_integrity.py +0 -0
  482. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_journal.py +0 -0
  483. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_lockfile.py +0 -0
  484. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_logs.py +0 -0
  485. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_marketing_counts.py +0 -0
  486. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_mcp.py +0 -0
  487. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_mcpdecl.py +0 -0
  488. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_minisign.py +0 -0
  489. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_mutation_hardening.py +0 -0
  490. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_mutation_shards.py +0 -0
  491. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_mutmut_source_paths.py +0 -0
  492. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_nethttp.py +0 -0
  493. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_output.py +0 -0
  494. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_paths.py +0 -0
  495. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_perf_gate.py +0 -0
  496. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_pkg_confusions.py +0 -0
  497. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_pkg_injection.py +0 -0
  498. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_pkg_secrets.py +0 -0
  499. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_policy.py +0 -0
  500. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_post_deploy_smoke.py +0 -0
  501. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_projectlock.py +0 -0
  502. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_provenance.py +0 -0
  503. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_rag.py +0 -0
  504. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_registries_fresh.py +0 -0
  505. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_registry.py +0 -0
  506. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_release_preflight.py +0 -0
  507. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_required_checks.py +0 -0
  508. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_resolve.py +0 -0
  509. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_roadmap_fresh.py +0 -0
  510. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_rules.py +0 -0
  511. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_scopes.py +0 -0
  512. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_secretscan.py +0 -0
  513. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_selfupdate.py +0 -0
  514. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_serve.py +0 -0
  515. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_spin.py +0 -0
  516. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_stackprobe.py +0 -0
  517. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_staleness.py +0 -0
  518. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_store.py +0 -0
  519. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_token_parity.py +0 -0
  520. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_toolchain_lock.py +0 -0
  521. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_trustaudit.py +0 -0
  522. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_typosquat.py +0 -0
  523. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_updatediff.py +0 -0
  524. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_util.py +0 -0
  525. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_version.py +0 -0
  526. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_workflow_timeouts.py +0 -0
  527. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/unit/test_workflows.py +0 -0
  528. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/visual/a11y_check.mjs +0 -0
  529. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/visual/console_check.mjs +0 -0
  530. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/visual/package.json +0 -0
  531. {boost_skill_cli-1.0.281 → boost_skill_cli-1.0.282}/tests/visual/visual_check.mjs +0 -0
@@ -230,6 +230,11 @@ mutants/
230
230
 
231
231
  # sandboxed boost home for the Tier 1 eval corpus (`make eval` taps here)
232
232
  .eval-home/
233
+
234
+ # `make evals` output. The generated corpus and index live in the system temp
235
+ # dir (see evals/run_evals.py), so only the per-run scores land here; the
236
+ # committed evals/baseline.json is what regressions are measured against.
237
+ evals/results.json
233
238
  tests/visual/node_modules/
234
239
  tests/visual/out/
235
240
  tests/visual/package-lock.json
@@ -34,6 +34,7 @@ mutmut
34
34
  mypy
35
35
  npm
36
36
  onboards
37
+ overclaiming
37
38
  Pinecone
38
39
  pytest
39
40
  rebased
@@ -10,7 +10,7 @@ PYTEST := $(VENV)/bin/pytest
10
10
  # pinned taps out of the developer's real ~/.boost.
11
11
  EVAL_HOME := $(CURDIR)/.eval-home
12
12
 
13
- .PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo carousel clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check bdd bench bench-cli fuzz post-deploy
13
+ .PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo carousel clean-test eval eval-ai eval-rec eval-stats eval-explain evals evals-baseline evals-golden evals-online audit dist-check bdd bench bench-cli fuzz post-deploy
14
14
 
15
15
  # Every tool comes from a hash-pinned requirements/*.txt — the same files CI
16
16
  # installs (see scripts/lock_toolchain.py). pip enforces the hashes, so a dev
@@ -52,7 +52,7 @@ mutation:
52
52
  $(PY) scripts/mutation_gate.py --run --min 80
53
53
 
54
54
  lint:
55
- $(VENV)/bin/ruff check boost_cli tests
55
+ $(VENV)/bin/ruff check boost_cli tests evals
56
56
  $(VENV)/bin/mypy
57
57
  $(VENV)/bin/pyright
58
58
  $(VENV)/bin/lint-imports
@@ -72,6 +72,7 @@ lint:
72
72
  $(PY) scripts/perf_gate.py
73
73
  $(PY) scripts/check_anchors.py
74
74
  $(PY) scripts/check_required_checks.py
75
+ $(PY) evals/make_golden.py --check
75
76
 
76
77
  # Supply-chain CVE gate: fail on a known OSV/PyPI advisory in the project's
77
78
  # dependency closure. Mirrors the pip-audit CI workflow; run before releasing.
@@ -125,6 +126,30 @@ eval-explain:
125
126
  PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
126
127
  BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_explain.py --fail-under 0.80
127
128
 
129
+ # Retrieval-quality gate over the HERMETIC golden set: recall@5/@10, MRR, and
130
+ # nDCG@5/@10 with graded (3/2/1) relevance, plus a paired-bootstrap regression
131
+ # test against the committed evals/baseline.json. Part of `check` and required
132
+ # in CI. Unlike `eval` above it needs no network and no API key: it generates
133
+ # its own corpus and taps it into a disposable BOOST_HOME under the system temp
134
+ # dir, so a metric moving can only mean the ranker moved.
135
+ evals:
136
+ $(PY) scripts/eval_gate.py --run
137
+
138
+ # Re-pin evals/baseline.json to the current scores. Deliberate: it is how you
139
+ # accept a ranking change, so it must be a separate commit that says why.
140
+ evals-baseline:
141
+ $(PY) evals/run_evals.py --save-baseline
142
+
143
+ # Regenerate evals/golden_set.json from evals/make_golden.py after editing the
144
+ # query table (`--check` runs in `lint` and fails on drift).
145
+ evals-golden:
146
+ $(PY) evals/make_golden.py
147
+
148
+ # The same five metrics over the pinned REAL-registry corpus `eval` uses.
149
+ # Needs the network; reported, never gated — mirrors `tests/smoke.sh --online`.
150
+ evals-online:
151
+ $(PY) evals/run_evals.py --online --faithfulness
152
+
128
153
  # Opt-in Gherkin/BDD suite (tests/bdd) — additive to tests/functional, not a
129
154
  # replacement. Needs the [bdd] extra (`pip install -e '.[bdd]'`); not part of
130
155
  # `make check`.
@@ -183,7 +208,7 @@ demo:
183
208
  carousel:
184
209
  for t in docs/carousel/tapes/*.tape; do vhs "$$t"; done
185
210
 
186
- check: lint eval test smoke mutation
211
+ check: lint eval evals test smoke mutation
187
212
  @echo "== all gates passed =="
188
213
 
189
214
  clean-test:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.281
3
+ Version: 1.0.282
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -997,16 +997,56 @@ reports, and the free services that monitor the project.
997
997
 
998
998
  ## Test suite
999
999
 
1000
- Three layers, all enforced (`make check` runs the full set; CI runs the same thing):
1000
+ Four layers, all enforced (`make check` runs the full set; CI runs the same thing):
1001
1001
 
1002
1002
  | Layer | What it does | Gate |
1003
1003
  |---|---|---|
1004
1004
  | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
1005
1005
  | `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
1006
1006
  | `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
1007
+ | `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
1007
1008
 
1008
1009
  Dev setup: `make venv` (pulls in pytest, coverage, mutmut — the shipped
1009
1010
  runtime itself stays dependency-free). Every test run uses a throwaway
1010
1011
  `$HOME`, so your actual agent configs are never at risk.
1011
1012
 
1012
1013
  [mutmut]: https://mutmut.readthedocs.io/
1014
+
1015
+ ## Evaluation harness
1016
+
1017
+ Search quality is the one thing the suite above can't assert: every test can
1018
+ pass while the ranker quietly gets worse. `make evals` measures it. The harness
1019
+ is pure stdlib and fully offline — it generates its own corpus of skills, rules,
1020
+ and workflows and taps it into a disposable `BOOST_HOME`, so a metric that moves
1021
+ can only mean the *ranker* moved. See [`evals/README.md`](evals/README.md).
1022
+
1023
+ **Golden set** — [`evals/golden_set.json`](evals/golden_set.json): 36 realistic
1024
+ queries with **graded** relevance (3 perfect · 2 useful · 1 marginal) over the
1025
+ generated corpus. Generated and validated by `evals/make_golden.py`, which
1026
+ refuses a judgment naming a skill the corpus doesn't contain; `--check` fails CI
1027
+ on drift, so the file can never disagree with its source.
1028
+
1029
+ **Five metrics**, all computed by `evals/metrics.py`:
1030
+
1031
+ - **recall@5** / **recall@10** — of everything relevant, what fraction reached the top *k*.
1032
+ - **MRR** — 1/rank of the first relevant hit, averaged; sensitive only to the top of the list, which is where people look.
1033
+ - **nDCG@5** / **nDCG@10** — graded gain (`2^rel − 1`) with the standard `log2(rank + 1)` discount; the only metric that distinguishes the right results in the wrong order from the right order.
1034
+
1035
+ **Significance gating.** A metric dropping isn't automatically a regression —
1036
+ with 36 queries, one unlucky result moves the mean. So `scripts/eval_gate.py`
1037
+ fails a metric only when it falls more than 0.02 below the committed baseline
1038
+ **and** a seeded 10,000-resample paired bootstrap over the per-query deltas puts
1039
+ that drop at `p < 0.05`. Alongside that, each metric has an absolute floor set
1040
+ ~0.05 below its first measured value, which catches the erosion that a
1041
+ compare-to-last-commit check never sees. Accepting a real ranking change is a
1042
+ deliberate `make evals-baseline` commit.
1043
+
1044
+ **Faithfulness.** `boost explain` and `boost distill` generate prose from a
1045
+ `SKILL.md`, and their failure mode is overclaiming. The harness scores that with
1046
+ the Ragas method — split the answer into atomic statements, verify each against
1047
+ the source, score supported/total — and reports it alongside what the runtime
1048
+ grounding guardrail in `boost explain` would do with the same reply. With no
1049
+ `claude` CLI and no `ANTHROPIC_API_KEY` it **skips rather than fails**, and
1050
+ reports a status instead of a number so "couldn't measure" is never mistaken for
1051
+ "scored zero". It's therefore outside `make check`; run it with
1052
+ `make evals-online`.
@@ -281,16 +281,56 @@ reports, and the free services that monitor the project.
281
281
 
282
282
  ## Test suite
283
283
 
284
- Three layers, all enforced (`make check` runs the full set; CI runs the same thing):
284
+ Four layers, all enforced (`make check` runs the full set; CI runs the same thing):
285
285
 
286
286
  | Layer | What it does | Gate |
287
287
  |---|---|---|
288
288
  | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
289
289
  | `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
290
290
  | `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
291
+ | `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
291
292
 
292
293
  Dev setup: `make venv` (pulls in pytest, coverage, mutmut — the shipped
293
294
  runtime itself stays dependency-free). Every test run uses a throwaway
294
295
  `$HOME`, so your actual agent configs are never at risk.
295
296
 
296
297
  [mutmut]: https://mutmut.readthedocs.io/
298
+
299
+ ## Evaluation harness
300
+
301
+ Search quality is the one thing the suite above can't assert: every test can
302
+ pass while the ranker quietly gets worse. `make evals` measures it. The harness
303
+ is pure stdlib and fully offline — it generates its own corpus of skills, rules,
304
+ and workflows and taps it into a disposable `BOOST_HOME`, so a metric that moves
305
+ can only mean the *ranker* moved. See [`evals/README.md`](evals/README.md).
306
+
307
+ **Golden set** — [`evals/golden_set.json`](evals/golden_set.json): 36 realistic
308
+ queries with **graded** relevance (3 perfect · 2 useful · 1 marginal) over the
309
+ generated corpus. Generated and validated by `evals/make_golden.py`, which
310
+ refuses a judgment naming a skill the corpus doesn't contain; `--check` fails CI
311
+ on drift, so the file can never disagree with its source.
312
+
313
+ **Five metrics**, all computed by `evals/metrics.py`:
314
+
315
+ - **recall@5** / **recall@10** — of everything relevant, what fraction reached the top *k*.
316
+ - **MRR** — 1/rank of the first relevant hit, averaged; sensitive only to the top of the list, which is where people look.
317
+ - **nDCG@5** / **nDCG@10** — graded gain (`2^rel − 1`) with the standard `log2(rank + 1)` discount; the only metric that distinguishes the right results in the wrong order from the right order.
318
+
319
+ **Significance gating.** A metric dropping isn't automatically a regression —
320
+ with 36 queries, one unlucky result moves the mean. So `scripts/eval_gate.py`
321
+ fails a metric only when it falls more than 0.02 below the committed baseline
322
+ **and** a seeded 10,000-resample paired bootstrap over the per-query deltas puts
323
+ that drop at `p < 0.05`. Alongside that, each metric has an absolute floor set
324
+ ~0.05 below its first measured value, which catches the erosion that a
325
+ compare-to-last-commit check never sees. Accepting a real ranking change is a
326
+ deliberate `make evals-baseline` commit.
327
+
328
+ **Faithfulness.** `boost explain` and `boost distill` generate prose from a
329
+ `SKILL.md`, and their failure mode is overclaiming. The harness scores that with
330
+ the Ragas method — split the answer into atomic statements, verify each against
331
+ the source, score supported/total — and reports it alongside what the runtime
332
+ grounding guardrail in `boost explain` would do with the same reply. With no
333
+ `claude` CLI and no `ANTHROPIC_API_KEY` it **skips rather than fails**, and
334
+ reports a status instead of a number so "couldn't measure" is never mistaken for
335
+ "scored zero". It's therefore outside `make check`; run it with
336
+ `make evals-online`.
@@ -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.281'
22
- __version_tuple__ = version_tuple = (1, 0, 281)
21
+ __version__ = version = '1.0.282'
22
+ __version_tuple__ = version_tuple = (1, 0, 282)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.281
3
+ Version: 1.0.282
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -997,16 +997,56 @@ reports, and the free services that monitor the project.
997
997
 
998
998
  ## Test suite
999
999
 
1000
- Three layers, all enforced (`make check` runs the full set; CI runs the same thing):
1000
+ Four layers, all enforced (`make check` runs the full set; CI runs the same thing):
1001
1001
 
1002
1002
  | Layer | What it does | Gate |
1003
1003
  |---|---|---|
1004
1004
  | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
1005
1005
  | `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
1006
1006
  | `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
1007
+ | `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
1007
1008
 
1008
1009
  Dev setup: `make venv` (pulls in pytest, coverage, mutmut — the shipped
1009
1010
  runtime itself stays dependency-free). Every test run uses a throwaway
1010
1011
  `$HOME`, so your actual agent configs are never at risk.
1011
1012
 
1012
1013
  [mutmut]: https://mutmut.readthedocs.io/
1014
+
1015
+ ## Evaluation harness
1016
+
1017
+ Search quality is the one thing the suite above can't assert: every test can
1018
+ pass while the ranker quietly gets worse. `make evals` measures it. The harness
1019
+ is pure stdlib and fully offline — it generates its own corpus of skills, rules,
1020
+ and workflows and taps it into a disposable `BOOST_HOME`, so a metric that moves
1021
+ can only mean the *ranker* moved. See [`evals/README.md`](evals/README.md).
1022
+
1023
+ **Golden set** — [`evals/golden_set.json`](evals/golden_set.json): 36 realistic
1024
+ queries with **graded** relevance (3 perfect · 2 useful · 1 marginal) over the
1025
+ generated corpus. Generated and validated by `evals/make_golden.py`, which
1026
+ refuses a judgment naming a skill the corpus doesn't contain; `--check` fails CI
1027
+ on drift, so the file can never disagree with its source.
1028
+
1029
+ **Five metrics**, all computed by `evals/metrics.py`:
1030
+
1031
+ - **recall@5** / **recall@10** — of everything relevant, what fraction reached the top *k*.
1032
+ - **MRR** — 1/rank of the first relevant hit, averaged; sensitive only to the top of the list, which is where people look.
1033
+ - **nDCG@5** / **nDCG@10** — graded gain (`2^rel − 1`) with the standard `log2(rank + 1)` discount; the only metric that distinguishes the right results in the wrong order from the right order.
1034
+
1035
+ **Significance gating.** A metric dropping isn't automatically a regression —
1036
+ with 36 queries, one unlucky result moves the mean. So `scripts/eval_gate.py`
1037
+ fails a metric only when it falls more than 0.02 below the committed baseline
1038
+ **and** a seeded 10,000-resample paired bootstrap over the per-query deltas puts
1039
+ that drop at `p < 0.05`. Alongside that, each metric has an absolute floor set
1040
+ ~0.05 below its first measured value, which catches the erosion that a
1041
+ compare-to-last-commit check never sees. Accepting a real ranking change is a
1042
+ deliberate `make evals-baseline` commit.
1043
+
1044
+ **Faithfulness.** `boost explain` and `boost distill` generate prose from a
1045
+ `SKILL.md`, and their failure mode is overclaiming. The harness scores that with
1046
+ the Ragas method — split the answer into atomic statements, verify each against
1047
+ the source, score supported/total — and reports it alongside what the runtime
1048
+ grounding guardrail in `boost explain` would do with the same reply. With no
1049
+ `claude` CLI and no `ANTHROPIC_API_KEY` it **skips rather than fails**, and
1050
+ reports a status instead of a number so "couldn't measure" is never mistaken for
1051
+ "scored zero". It's therefore outside `make check`; run it with
1052
+ `make evals-online`.
@@ -327,6 +327,15 @@ docs/roadmap/items/workflow-linting-actionlint.md
327
327
  docs/roadmap/items/workflow-sast-zizmor.md
328
328
  docs/roadmap/items/workspace-scope-install.md
329
329
  docs/roadmap/items/zizmor-pin-is-a-yanked-release.md
330
+ evals/README.md
331
+ evals/__init__.py
332
+ evals/baseline.json
333
+ evals/faithfulness.py
334
+ evals/golden_set.json
335
+ evals/make_corpus.py
336
+ evals/make_golden.py
337
+ evals/metrics.py
338
+ evals/run_evals.py
330
339
  examples/README.md
331
340
  examples/adapt-demo.sh
332
341
  examples/boost-run-prototype.sh
@@ -350,6 +359,7 @@ scripts/check_licenses.py
350
359
  scripts/check_required_checks.py
351
360
  scripts/ensure_eval_corpus.sh
352
361
  scripts/eval_explain.py
362
+ scripts/eval_gate.py
353
363
  scripts/eval_recommend.py
354
364
  scripts/eval_retrieval.py
355
365
  scripts/eval_stats_summary.py
@@ -455,6 +465,9 @@ tests/unit/test_docsite_chrome.py
455
465
  tests/unit/test_ed25519.py
456
466
  tests/unit/test_embed.py
457
467
  tests/unit/test_errors_and_cli_table.py
468
+ tests/unit/test_eval_faithfulness.py
469
+ tests/unit/test_eval_gate.py
470
+ tests/unit/test_eval_metrics.py
458
471
  tests/unit/test_eval_stats_summary.py
459
472
  tests/unit/test_faithfulness.py
460
473
  tests/unit/test_frontmatter.py
@@ -0,0 +1,157 @@
1
+ # evals — boost's offline evaluation harness
2
+
3
+ A dev/CI quality gate for the retrieval stack, in the same family as mutation
4
+ testing: `make evals`, never a `boost` subcommand. Pure stdlib, no network, no
5
+ API key.
6
+
7
+ ```bash
8
+ make evals # run the harness and enforce the gate
9
+ make evals-baseline # deliberately re-pin evals/baseline.json
10
+ make evals-golden # regenerate golden_set.json after editing the queries
11
+ make evals-online # + the pinned real-registry corpus and faithfulness
12
+ ```
13
+
14
+ ## Why this exists alongside `make eval`
15
+
16
+ The repo has two retrieval gates and they answer different questions.
17
+
18
+ | | `make eval` | `make evals` |
19
+ |---|---|---|
20
+ | corpus | pinned GitHub repos (`tests/eval/taps.txt`) | generated locally, 57 items* |
21
+ | network | required | none |
22
+ | labels | binary | graded 3 / 2 / 1 |
23
+ | metrics | recall@k, hit@1, MRR, nDCG@k | recall@5/@10, MRR, nDCG@5/@10 |
24
+ | significance | `ranx` t-test, opt-in extra, informational | stdlib paired bootstrap, **gated** |
25
+ | catches | "does a real skill come back for a real question" | "did the ranking get worse" |
26
+
27
+ `eval` grades against the live ecosystem, so it drifts when upstream repos do —
28
+ which is why its regression check is deliberately relaxed. This harness fixes
29
+ the corpus so the only thing that can move a number is the ranker.
30
+
31
+ \* 49 skills across 10 topic clusters, plus 4 rules and 4 workflows as ranking
32
+ pressure. Confirm the total the way boost sees it:
33
+
34
+ ```bash
35
+ BOOST_HOME=$TMPDIR/boost-evals-home boost count # -> available 57 (across 1 tap)
36
+ ```
37
+
38
+ ## Layout
39
+
40
+ | file | what it is |
41
+ |---|---|
42
+ | `metrics.py` | the arithmetic — recall@k, MRR, nDCG@k, paired bootstrap |
43
+ | `make_corpus.py` | generates the corpus; **item table is the source of truth** |
44
+ | `make_golden.py` | generates + validates `golden_set.json`; `--check` for drift |
45
+ | `golden_set.json` | 36 queries, 107 graded judgments (generated — don't hand-edit) |
46
+ | `baseline.json` | pinned per-query scores the bootstrap compares against |
47
+ | `run_evals.py` | sets up the sandbox, scores every arm, writes `results.json` |
48
+ | `faithfulness.py` | Ragas-methodology faithfulness for `explain` / `distill` |
49
+ | `../scripts/eval_gate.py` | reads `results.json`, enforces the thresholds |
50
+
51
+ The corpus and BM25 index are built into a disposable `BOOST_HOME` under the
52
+ system temp dir (`$TMPDIR/boost-evals-home`, override with `BOOST_EVALS_HOME` or
53
+ `--home`) — outside the repo on purpose, because it is itself a git repo and a
54
+ nested one confuses `git status`, coverage discovery, and mutmut's tree copy.
55
+
56
+ ## The five metrics
57
+
58
+ - **recall@5 / recall@10** — of everything graded relevant, what fraction landed
59
+ in the top k. Grades are binarized here (any grade ≥ 1 counts); recall asks
60
+ "did we find it", not "did we order it well".
61
+ - **MRR** — 1/rank of the first relevant hit, averaged. Sensitive to the top of
62
+ the list only, which is where users actually look.
63
+ - **nDCG@5 / nDCG@10** — DCG over ideal DCG, with the standard `log2(rank + 1)`
64
+ discount and exponential graded gains (`2^rel − 1`, so a perfect hit is worth
65
+ 7 and a marginal one 1). This is the only metric that can tell a correct set
66
+ of results in the wrong order from the right order.
67
+
68
+ ## The grading scale
69
+
70
+ | grade | meaning |
71
+ |---|---|
72
+ | 3 | perfect — the skill the query is asking for |
73
+ | 2 | useful — a competent answer, not the best one |
74
+ | 1 | marginal — topically adjacent; better than an unrelated hit |
75
+ | — | absent from the label map, i.e. irrelevant |
76
+
77
+ Grading the tail matters: a query labeled with only its perfect answer teaches
78
+ nDCG nothing about the four results underneath it.
79
+
80
+ ## How the gate works
81
+
82
+ `scripts/eval_gate.py` runs two independent checks and both must pass.
83
+
84
+ 1. **Absolute floors** — each metric must clear a floor calibrated ~0.05 below
85
+ the first measured run. This catches slow erosion across many merges, which a
86
+ compare-to-last-commit check never notices.
87
+ 2. **Significant regression vs the baseline** — a metric fails only when it drops
88
+ by more than `--regression-eps` (0.02) **and** a paired bootstrap over the
89
+ per-query deltas returns `p < 0.05`.
90
+
91
+ Requiring both conditions is the whole design. The two arms answer the same 36
92
+ queries, so pairing cancels out "this query is just hard" and leaves the effect
93
+ of the change; resampling those differences 10,000 times (seeded, so the p-value
94
+ is reproducible) asks how often a different draw of queries would have reversed
95
+ the sign. A drop that is large but not significant is one unlucky query. A drop
96
+ that is significant but tiny is a rounding change nobody should re-baseline for.
97
+ Only a drop that is both is a regression.
98
+
99
+ Accepting a genuine ranking change is `make evals-baseline` — its own commit,
100
+ which says why.
101
+
102
+ ## Faithfulness
103
+
104
+ `explain` and `distill` generate prose from a `SKILL.md`; their shared failure
105
+ mode is overclaiming. Faithfulness measures it with the Ragas procedure —
106
+ decompose the answer into atomic statements, verify each against the source,
107
+ score supported/total — implemented directly on boost's `core.ai` bridge so the
108
+ harness stays dependency-free and grades the same prompts the shipped commands
109
+ use.
110
+
111
+ Two numbers are reported per sample, and the gap between them is the point:
112
+
113
+ | column | what it is |
114
+ |---|---|
115
+ | `judged` | the Ragas score over the **raw** model reply |
116
+ | `runtime guard` | what `boost explain` would actually do with that reply |
117
+
118
+ `boost explain` does not print whatever the model returns — `core/faithfulness.py`
119
+ scores it for grounding and falls back to the deterministic extractive summary
120
+ below a config-tunable threshold. Grading only the raw reply would answer a
121
+ question nobody asks: how faithful is text the user may never see. The guard
122
+ column costs no extra API calls (the sample already exists) and the run reports
123
+ how many generations would have been discarded.
124
+
125
+ The denominator is the number of statements **extracted**, never the number of
126
+ verdicts returned. A judge reply is capped at `max_tokens`, so dividing by the
127
+ verdicts would score 3/3 = 1.0 for an answer where 7 of 10 claims went
128
+ unexamined — the metric would read best exactly when the judge coped worst. A
129
+ short verdict list is a failed judging pass, not a score.
130
+
131
+ It **skips, never fails**, when there is no `claude` CLI and no
132
+ `ANTHROPIC_API_KEY`, and reports a status rather than a bare number so that
133
+ "could not measure" is never mistakable for "scored 0.0". Because it needs a
134
+ model it is not part of `make check`; run it via `make evals-online`.
135
+
136
+ `--faithfulness-scorer ragas` cross-checks the stdlib scorer against the
137
+ reference implementation by **delegating to `scripts/eval_explain.py`**, which
138
+ owns the ragas path (`make eval-explain`, plus its own CI workflow). That script
139
+ stays the ragas eval for the pinned real-registry corpus; this module is the
140
+ hermetic, key-free counterpart that also covers `distill`. Delegating rather
141
+ than copying is deliberate — an earlier draft duplicated its judge setup and
142
+ silently dropped its `RunConfig` timeout.
143
+
144
+ ## Extending the golden set
145
+
146
+ 1. Add a row to `QUERIES` in `make_golden.py` with a fresh id, the query as a
147
+ user would actually type it, and a grade for **every** skill you would accept.
148
+ 2. Run `make evals-golden` and commit both files. `make_golden.py --check` runs
149
+ in `lint` and fails if they disagree.
150
+ 3. Adding queries invalidates the baseline — run `make evals-baseline` in the
151
+ same change and say so in the commit message.
152
+
153
+ Add corpus items the same way, in `make_corpus.py`'s `SKILLS` table. Resist the
154
+ temptation to reword a query because it scores badly: `q29` ("which alerts are
155
+ worth paging someone for") currently misses entirely, because BM25 does not stem
156
+ and the target skill says *alert*, not *alerts*. That is a real property of the
157
+ shipped ranker, and an eval you tune until it looks good has stopped being one.
@@ -0,0 +1,6 @@
1
+ """boost's offline LLM evaluation harness (dev/CI only — never imported by the CLI).
2
+
3
+ Run it with `make evals`, not through a `boost` subcommand: this is a quality
4
+ gate in the same family as mutation testing, not user-facing functionality.
5
+ See evals/README.md for the metric definitions and how to extend the golden set.
6
+ """