boost-skill-cli 1.0.329__tar.gz → 1.0.331__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 (577) hide show
  1. {boost_skill_cli-1.0.329/boost_skill_cli.egg-info → boost_skill_cli-1.0.331}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/rag.py +48 -3
  4. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  6. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +17 -1
  7. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +12 -1
  8. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +24 -1
  9. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +23 -0
  10. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +16 -0
  11. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap.html +99 -8
  12. boost_skill_cli-1.0.331/tests/unit/test_dedup_trust.py +117 -0
  13. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_embed.py +15 -1
  14. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.gitattributes +0 -0
  15. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.gitignore +0 -0
  16. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.gitleaks.toml +0 -0
  17. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.htmlvalidate.json +0 -0
  18. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.lighthouserc.json +0 -0
  19. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.lycheeignore +0 -0
  20. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.markdownlint-cli2.jsonc +0 -0
  21. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.pre-commit-config.yaml +0 -0
  22. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.stylelintrc.json +0 -0
  23. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.vale/styles/boost/Terminology.yml +0 -0
  24. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  25. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.vale.ini +0 -0
  26. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/CLAUDE.md +0 -0
  27. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/CODE_OF_CONDUCT.md +0 -0
  28. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/CONTRIBUTING.md +0 -0
  29. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/LICENSE +0 -0
  30. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/MANIFEST.in +0 -0
  31. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/Makefile +0 -0
  32. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/README.md +0 -0
  33. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/SECURITY.md +0 -0
  34. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost +0 -0
  35. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/__init__.py +0 -0
  36. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/__main__.py +0 -0
  37. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/cli.py +0 -0
  38. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/cliparse.py +0 -0
  39. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/__init__.py +0 -0
  40. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/_common.py +0 -0
  41. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/bmad.py +0 -0
  42. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/configuration.py +0 -0
  43. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/discovery.py +0 -0
  44. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/hooks.py +0 -0
  45. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/info.py +0 -0
  46. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/intelligence.py +0 -0
  47. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/pkg.py +0 -0
  48. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/quality.py +0 -0
  49. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/run.py +0 -0
  50. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/safety.py +0 -0
  51. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/taps.py +0 -0
  52. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/team.py +0 -0
  53. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/__init__.py +0 -0
  54. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/adapters.py +0 -0
  55. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/agents.py +0 -0
  56. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/ai.py +0 -0
  57. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/capabilities.py +0 -0
  58. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/catalog.py +0 -0
  59. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/claude_settings.py +0 -0
  60. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/config.py +0 -0
  61. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/dense.py +0 -0
  62. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/ed25519.py +0 -0
  63. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/embed.py +0 -0
  64. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/faithfulness.py +0 -0
  65. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/frontmatter.py +0 -0
  66. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/gitutil.py +0 -0
  67. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/imperative.py +0 -0
  68. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/injectscan.py +0 -0
  69. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/installscan.py +0 -0
  70. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/integrity.py +0 -0
  71. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/journal.py +0 -0
  72. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/localembed.py +0 -0
  73. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/lockfile.py +0 -0
  74. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/logs.py +0 -0
  75. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/mcp.py +0 -0
  76. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/mcpdecl.py +0 -0
  77. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/mcphost.py +0 -0
  78. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/minisign.py +0 -0
  79. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/nethttp.py +0 -0
  80. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/output.py +0 -0
  81. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/paths.py +0 -0
  82. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/policy.py +0 -0
  83. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/projectlock.py +0 -0
  84. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/provenance.py +0 -0
  85. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/registry.py +0 -0
  86. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/resolve.py +0 -0
  87. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/rules.py +0 -0
  88. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/scopes.py +0 -0
  89. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/secretscan.py +0 -0
  90. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/selfupdate.py +0 -0
  91. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/serve.py +0 -0
  92. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/stackprobe.py +0 -0
  93. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/staleness.py +0 -0
  94. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/store.py +0 -0
  95. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/trustaudit.py +0 -0
  96. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/typosquat.py +0 -0
  97. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/updatediff.py +0 -0
  98. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/util.py +0 -0
  99. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/workflows.py +0 -0
  100. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/data/registries.json +0 -0
  101. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/errors.py +0 -0
  102. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/spin.py +0 -0
  103. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  104. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  105. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/requires.txt +0 -0
  106. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/top_level.txt +0 -0
  107. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/codecov.yml +0 -0
  108. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/.claude/settings.local.json +0 -0
  109. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/DEBUGGING.md +0 -0
  110. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/adapters.html +0 -0
  111. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/README.md +0 -0
  112. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-components-core.md +0 -0
  113. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-containers.md +0 -0
  114. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-context.md +0 -0
  115. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-dynamic-install.md +0 -0
  116. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/distill.gif +0 -0
  117. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/doctor.gif +0 -0
  118. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/explain.gif +0 -0
  119. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/hooks.gif +0 -0
  120. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/install.gif +0 -0
  121. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/pulse.gif +0 -0
  122. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/search.gif +0 -0
  123. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/tap.gif +0 -0
  124. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/distill.tape +0 -0
  125. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/doctor.tape +0 -0
  126. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/explain.tape +0 -0
  127. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/hooks.tape +0 -0
  128. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/install.tape +0 -0
  129. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/pulse.tape +0 -0
  130. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/search.tape +0 -0
  131. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/tap.tape +0 -0
  132. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel.html +0 -0
  133. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/commands.html +0 -0
  134. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/demo.gif +0 -0
  135. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/demo.tape +0 -0
  136. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/design-roadmap.html +0 -0
  137. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/eval.html +0 -0
  138. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/index.html +0 -0
  139. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/mcp-hub.html +0 -0
  140. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/rag-architecture.md +0 -0
  141. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D01.md +0 -0
  142. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D02.md +0 -0
  143. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D03.md +0 -0
  144. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D04.md +0 -0
  145. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D05.md +0 -0
  146. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D06.md +0 -0
  147. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D07.md +0 -0
  148. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D08.md +0 -0
  149. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D09.md +0 -0
  150. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D10.md +0 -0
  151. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D11.md +0 -0
  152. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D12.md +0 -0
  153. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D13.md +0 -0
  154. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D14.md +0 -0
  155. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D15.md +0 -0
  156. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D16.md +0 -0
  157. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D17.md +0 -0
  158. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D18.md +0 -0
  159. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D19.md +0 -0
  160. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D20.md +0 -0
  161. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D21.md +0 -0
  162. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D22.md +0 -0
  163. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D23.md +0 -0
  164. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D24.md +0 -0
  165. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D25.md +0 -0
  166. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D26.md +0 -0
  167. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  168. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  169. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  170. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  171. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  172. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  173. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  174. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  175. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  176. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  177. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  178. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  179. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  180. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  181. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  182. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  183. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  184. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  185. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  186. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  187. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  188. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  189. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/command-carousel-page.md +0 -0
  190. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  191. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  192. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  193. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  194. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  195. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  196. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  197. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  198. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  199. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  200. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  201. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  202. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  203. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  204. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  205. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  206. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  207. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  208. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  209. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  210. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  211. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  212. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  213. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  214. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  215. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  216. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  217. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  218. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/github-community-health-files.md +0 -0
  219. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  220. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  221. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  222. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  223. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  224. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  225. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  226. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  227. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  228. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  229. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  230. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  231. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  232. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  233. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  234. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  235. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  236. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  237. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  238. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  239. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  240. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  241. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  242. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  243. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  244. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  245. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  246. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  247. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  248. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  249. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  250. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  251. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  252. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  253. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  254. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  255. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  256. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  257. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  258. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  259. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  260. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  261. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  262. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  263. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  264. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  265. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  266. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  267. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  268. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  269. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  270. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  271. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  272. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  273. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  274. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  275. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  276. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  277. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  278. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  279. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  280. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  281. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  282. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  283. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  284. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  285. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  286. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  287. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  288. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  289. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  290. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  291. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  292. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  293. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  294. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  295. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  296. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  297. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  298. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  299. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  300. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  301. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  302. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  303. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  304. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  305. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  306. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  307. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  308. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  309. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  310. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  311. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  312. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  313. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  314. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  315. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  316. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  317. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  318. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  319. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  320. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  321. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  322. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  323. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  324. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  325. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  326. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  327. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  328. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  329. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  330. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  331. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  332. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  333. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  334. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  335. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  336. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  337. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  338. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  339. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  340. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  341. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  342. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  343. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  344. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  345. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  346. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  347. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  348. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  349. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workspace-scope-install.md +0 -0
  350. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  351. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/eslint.config.mjs +0 -0
  352. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/README.md +0 -0
  353. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/__init__.py +0 -0
  354. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/baseline.json +0 -0
  355. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/faithfulness.py +0 -0
  356. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/golden_set.json +0 -0
  357. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/make_corpus.py +0 -0
  358. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/make_golden.py +0 -0
  359. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/metrics.py +0 -0
  360. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/run_evals.py +0 -0
  361. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/examples/README.md +0 -0
  362. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/examples/adapt-demo.sh +0 -0
  363. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/examples/boost-run-prototype.sh +0 -0
  364. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/index.html +0 -0
  365. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/noxfile.py +0 -0
  366. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/pyproject.toml +0 -0
  367. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/coverage-tools.in +0 -0
  368. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/coverage-tools.txt +0 -0
  369. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/lint-tools.in +0 -0
  370. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/lint-tools.txt +0 -0
  371. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/mutation-tools.in +0 -0
  372. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/mutation-tools.txt +0 -0
  373. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/platform-pins.lock +0 -0
  374. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/release-tools.in +0 -0
  375. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/release-tools.txt +0 -0
  376. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/test-tools.in +0 -0
  377. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/test-tools.txt +0 -0
  378. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/a11y_check.py +0 -0
  379. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/bench_cli.sh +0 -0
  380. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/build_command_reference.py +0 -0
  381. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/build_registries.py +0 -0
  382. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/build_roadmap.py +0 -0
  383. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/check_anchors.py +0 -0
  384. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/check_licenses.py +0 -0
  385. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/check_required_checks.py +0 -0
  386. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/ensure_eval_corpus.sh +0 -0
  387. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_explain.py +0 -0
  388. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_gate.py +0 -0
  389. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_recommend.py +0 -0
  390. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_retrieval.py +0 -0
  391. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_stats_summary.py +0 -0
  392. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/import_budget.py +0 -0
  393. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/lock_toolchain.py +0 -0
  394. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/mutation_gate.py +0 -0
  395. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/mutation_shards.py +0 -0
  396. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/mutation_weights.json +0 -0
  397. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/perf_gate.py +0 -0
  398. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/post_deploy_smoke.py +0 -0
  399. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/release_guard.py +0 -0
  400. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/release_preflight.py +0 -0
  401. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/setup.cfg +0 -0
  402. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/sonar-project.properties +0 -0
  403. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/README.md +0 -0
  404. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/boost.css +0 -0
  405. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/boost.js +0 -0
  406. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/demo.html +0 -0
  407. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/adapt.feature +0 -0
  408. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/browse.feature +0 -0
  409. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/count.feature +0 -0
  410. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/discover.feature +0 -0
  411. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/doctor.feature +0 -0
  412. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/environment.py +0 -0
  413. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/explain.feature +0 -0
  414. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/index.feature +0 -0
  415. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/install.feature +0 -0
  416. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/list.feature +0 -0
  417. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/mcp.feature +0 -0
  418. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/search.feature +0 -0
  419. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/cli_steps.py +0 -0
  420. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/discovery_steps.py +0 -0
  421. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/mcp_steps.py +0 -0
  422. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/quality_steps.py +0 -0
  423. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/conftest.py +0 -0
  424. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/baseline.json +0 -0
  425. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/explain.jsonl +0 -0
  426. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/golden-natural.jsonl +0 -0
  427. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/golden.jsonl +0 -0
  428. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/recommend.jsonl +0 -0
  429. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/taps.txt +0 -0
  430. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_capabilities_policy.py +0 -0
  431. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_adapt.py +0 -0
  432. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_bmad.py +0 -0
  433. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_configuration.py +0 -0
  434. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_discovery.py +0 -0
  435. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_hooks.py +0 -0
  436. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_info.py +0 -0
  437. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_intelligence.py +0 -0
  438. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_pkg.py +0 -0
  439. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_quality.py +0 -0
  440. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_taps.py +0 -0
  441. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_team.py +0 -0
  442. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_everyday_loop.py +0 -0
  443. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_integrity_enforce.py +0 -0
  444. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_property_parsers.py +0 -0
  445. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_run.py +0 -0
  446. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_tap_signing.py +0 -0
  447. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_workspace_scope.py +0 -0
  448. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/README.md +0 -0
  449. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  450. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  451. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  452. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  453. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  454. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  455. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  456. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  457. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  458. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  459. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  460. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  461. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  462. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  463. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  464. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  465. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  466. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  467. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  468. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  469. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/fuzz_frontmatter.py +0 -0
  470. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/fuzz_registry.py +0 -0
  471. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/make_fixture.py +0 -0
  472. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/perf/test_benchmarks.py +0 -0
  473. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/smoke.sh +0 -0
  474. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_a11y_check.py +0 -0
  475. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_adapters.py +0 -0
  476. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_adapters_multi.py +0 -0
  477. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_adapters_runner.py +0 -0
  478. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_agents.py +0 -0
  479. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_ai.py +0 -0
  480. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_capabilities.py +0 -0
  481. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_catalog.py +0 -0
  482. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_check_anchors.py +0 -0
  483. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_check_licenses.py +0 -0
  484. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_claude_settings.py +0 -0
  485. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_cliparse.py +0 -0
  486. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_codeql_analysis_key.py +0 -0
  487. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_command_reference_fresh.py +0 -0
  488. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_community_health_files.py +0 -0
  489. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_config.py +0 -0
  490. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_content_dedupe.py +0 -0
  491. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense.py +0 -0
  492. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense_fallback.py +0 -0
  493. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense_fix_hint.py +0 -0
  494. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense_status.py +0 -0
  495. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dependabot_config.py +0 -0
  496. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_docs_pages_linked.py +0 -0
  497. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_docsite_chrome.py +0 -0
  498. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_ed25519.py +0 -0
  499. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_embed_local.py +0 -0
  500. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_entry_key.py +0 -0
  501. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_errors_and_cli_table.py +0 -0
  502. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_baseline.py +0 -0
  503. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_faithfulness.py +0 -0
  504. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_gate.py +0 -0
  505. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_metrics.py +0 -0
  506. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_stats_summary.py +0 -0
  507. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_faithfulness.py +0 -0
  508. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_frontmatter.py +0 -0
  509. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_fuzz_targets.py +0 -0
  510. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_gitleaks_config.py +0 -0
  511. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_gitutil.py +0 -0
  512. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_imperative.py +0 -0
  513. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_import_budget.py +0 -0
  514. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_injectscan.py +0 -0
  515. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_installscan.py +0 -0
  516. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_integrity.py +0 -0
  517. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_journal.py +0 -0
  518. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_localembed.py +0 -0
  519. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_lockfile.py +0 -0
  520. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_logs.py +0 -0
  521. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_marketing_counts.py +0 -0
  522. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcp.py +0 -0
  523. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcp_install_scan.py +0 -0
  524. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcpdecl.py +0 -0
  525. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcphost.py +0 -0
  526. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_minisign.py +0 -0
  527. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutation_hardening.py +0 -0
  528. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutation_shards.py +0 -0
  529. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutation_subfile_shards.py +0 -0
  530. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutmut_source_paths.py +0 -0
  531. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_nethttp.py +0 -0
  532. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_output.py +0 -0
  533. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_paths.py +0 -0
  534. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_perf_gate.py +0 -0
  535. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_pkg_confusions.py +0 -0
  536. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_pkg_injection.py +0 -0
  537. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_pkg_secrets.py +0 -0
  538. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_platform_pins.py +0 -0
  539. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_policy.py +0 -0
  540. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_post_deploy_smoke.py +0 -0
  541. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_project_mcp_sidecar.py +0 -0
  542. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_projectlock.py +0 -0
  543. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_provenance.py +0 -0
  544. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_rag.py +0 -0
  545. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_rag_fusion.py +0 -0
  546. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_registries_fresh.py +0 -0
  547. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_registry.py +0 -0
  548. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_registry_categories.py +0 -0
  549. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_release_guard.py +0 -0
  550. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_release_preflight.py +0 -0
  551. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_required_checks.py +0 -0
  552. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_resolve.py +0 -0
  553. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_roadmap_fresh.py +0 -0
  554. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_rules.py +0 -0
  555. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_scopes.py +0 -0
  556. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_secretscan.py +0 -0
  557. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_selfupdate.py +0 -0
  558. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_serve.py +0 -0
  559. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_spin.py +0 -0
  560. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_stackprobe.py +0 -0
  561. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_staleness.py +0 -0
  562. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_store.py +0 -0
  563. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_token_parity.py +0 -0
  564. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_toolchain_lock.py +0 -0
  565. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_trustaudit.py +0 -0
  566. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_typosquat.py +0 -0
  567. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_updatediff.py +0 -0
  568. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_util.py +0 -0
  569. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_version.py +0 -0
  570. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_workflow_concurrency.py +0 -0
  571. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_workflow_timeouts.py +0 -0
  572. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_workflows.py +0 -0
  573. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/a11y_check.mjs +0 -0
  574. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/console_check.mjs +0 -0
  575. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/package-lock.json +0 -0
  576. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/package.json +0 -0
  577. {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.329
3
+ Version: 1.0.331
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.329'
22
- __version_tuple__ = version_tuple = (1, 0, 329)
21
+ __version__ = version = '1.0.331'
22
+ __version_tuple__ = version_tuple = (1, 0, 331)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -23,6 +23,7 @@ import re
23
23
  import sqlite3
24
24
  from collections import defaultdict
25
25
  from collections.abc import Sequence
26
+ from functools import lru_cache
26
27
  from pathlib import Path
27
28
  from typing import Dict, List, Optional, Tuple, cast
28
29
 
@@ -31,7 +32,7 @@ try: # TypedDict lives in typing on 3.9+, kept optional for safety
31
32
  except ImportError: # pragma: no cover - 3.9+ always has it
32
33
  TypedDict = None # type: ignore
33
34
 
34
- from . import ai, catalog, frontmatter, gitutil, paths, registry, util
35
+ from . import ai, catalog, config, frontmatter, gitutil, paths, registry, util
35
36
 
36
37
  # v2: `snip` stores a larger head of the matched chunk (not just SNIP_WIDTH
37
38
  # chars) so `retrieve` can window it onto the query terms; bump forces a
@@ -527,6 +528,50 @@ def entry_key(entry: dict) -> Tuple[str, str]:
527
528
  return (entry["tap"], entry["skill_md"])
528
529
 
529
530
 
531
+ @lru_cache(maxsize=1)
532
+ def _confidence_map() -> Dict[str, str]:
533
+ """``tap name -> confidence`` from the shipped registry catalog.
534
+
535
+ Cached because dedup asks per hit and the catalog is 466 rows; parsing it
536
+ inside a search loop would be a real cost for a value that cannot change
537
+ while the process runs.
538
+ """
539
+ out: Dict[str, str] = {}
540
+ for row in config.load_registry_catalog():
541
+ name = row.get("name")
542
+ conf = row.get("confidence")
543
+ if name and conf:
544
+ out[str(name)] = str(conf)
545
+ return out
546
+
547
+
548
+ def registry_confidence(tap: str) -> Optional[str]:
549
+ """The shipped confidence for a tap, or None if it is not catalogued."""
550
+ return _confidence_map().get(tap)
551
+
552
+
553
+ # Lower sorts better. Unknown registries rank below every known one rather than
554
+ # above, so an uncatalogued tap never outranks a vetted one by default.
555
+ _CONFIDENCE_ORDER = {"high": 0, "med": 1, "low": 2}
556
+
557
+
558
+ def source_rank(entry: dict) -> Tuple[int, int]:
559
+ """How much this copy's *source* is worth, for choosing between identical bodies.
560
+
561
+ Only ever used inside a content cluster, where every candidate has the same
562
+ body — so this decides where the user installs from, not what they find.
563
+
564
+ The user's own ``curated`` flag comes first and the shipped ``confidence``
565
+ second, deliberately: a maintainer opinion baked into the package should
566
+ never override a decision the machine's owner made with `boost tap
567
+ --curated`.
568
+ """
569
+ curated = 0 if entry.get("curated") else 1
570
+ conf = _CONFIDENCE_ORDER.get(registry_confidence(entry.get("tap", "")) or "",
571
+ len(_CONFIDENCE_ORDER))
572
+ return (curated, conf)
573
+
574
+
530
575
  def dedupe_by_content(hits: List[Hit], limit: int) -> List[Hit]:
531
576
  """Collapse byte-identical copies, then take ``limit``.
532
577
 
@@ -562,9 +607,9 @@ def dedupe_by_content(hits: List[Hit], limit: int) -> List[Hit]:
562
607
  best[digest] = len(out)
563
608
  out.append(hit)
564
609
  continue
565
- # Same body already shown. Keep its rank, but prefer a curated source.
610
+ # Same body already shown. Keep its rank, but prefer a better source.
566
611
  kept = out[seen]
567
- if hit["entry"].get("curated") and not kept["entry"].get("curated"):
612
+ if source_rank(hit["entry"]) < source_rank(kept["entry"]):
568
613
  # cast, not a literal annotation: `Hit` is total=False for the
569
614
  # optional `content` key, and NotRequired needs 3.11 while boost
570
615
  # targets 3.9.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.329
3
+ Version: 1.0.331
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -485,6 +485,7 @@ tests/unit/test_command_reference_fresh.py
485
485
  tests/unit/test_community_health_files.py
486
486
  tests/unit/test_config.py
487
487
  tests/unit/test_content_dedupe.py
488
+ tests/unit/test_dedup_trust.py
488
489
  tests/unit/test_dense.py
489
490
  tests/unit/test_dense_fallback.py
490
491
  tests/unit/test_dense_fix_hint.py
@@ -2,7 +2,7 @@
2
2
  id: code-scanning-rule-can-be-restored
3
3
  board: code
4
4
  section: trust
5
- status: planned
5
+ status: shipped
6
6
  category: Release safety
7
7
  complexity: S
8
8
  impact: Med
@@ -45,3 +45,19 @@ path filters and runs on <code>push</code>, <code>pull_request</code> and
45
45
  repo has hit twice. And it catches something the status check does not &mdash;
46
46
  <code>codeql-analyze</code> passes when the <em>job</em> succeeds, including when it succeeds
47
47
  having found error-severity alerts.
48
+
49
+ <b>Done &mdash; the rule is back, and scoped exactly as this card prescribed.</b> Read from the live
50
+ <code>main</code> ruleset (id <code>19130332</code>): it carries a <code>code_scanning</code> rule
51
+ whose <code>code_scanning_tools</code> list is <b><code>CodeQL</code> alone</b>, at
52
+ <code>security_alerts_threshold: high_or_higher</code> and <code>alerts_threshold: errors</code>.
53
+ Scorecard is not in the list, which is the single decision this card exists to get right.
54
+
55
+ The safety precondition still holds and was re-checked rather than assumed: <b>CodeQL has 0 open
56
+ alerts</b>, while Scorecard has <b>4 open</b> (down from the 7 recorded above), every one still a
57
+ posture metric that must not be dismissed. Had Scorecard been added to that tool list, those four
58
+ would block every merge in the repository immediately &mdash; the failure mode this card correctly
59
+ identifies as the reason the work looked blocked.
60
+
61
+ No change was needed. Recording it as shipped so the board stops advertising work that is already
62
+ in place, and so the tool-list constraint stays written down: anyone re-editing this rule through the
63
+ GitHub UI will be offered Scorecard right next to CodeQL in the picker.
@@ -2,7 +2,7 @@
2
2
  id: demo-cannot-open-its-own-pr
3
3
  board: code
4
4
  section: pipeline
5
- status: planned
5
+ status: shipped
6
6
  category: CI reporting
7
7
  complexity: S
8
8
  impact: Med
@@ -61,3 +61,14 @@ that job cannot open a pull request either. So this toggle now gates two items r
61
61
  the second is a supply-chain freshness gap rather than a docs asset. That does not make the
62
62
  decision automatic, but it does change what is on each side of it.
63
63
 
64
+
65
+ <b>Unblocked, and already working &mdash; the setting was flipped.</b> This card's blocker is
66
+ <code>can_approve_pull_request_reviews: false</code>. The API now reports it as <b><code>true</code></b>,
67
+ and the effect is visible rather than theoretical: <code>demo.yml</code>'s recent runs are green, and
68
+ <b>PR <code>#353</code> was opened by <code>github-actions[bot]</code></b> &mdash; the exact action
69
+ this card says is impossible.
70
+
71
+ Nothing in the tree needed changing. Recording it as shipped rather than deleting it, because the
72
+ card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
73
+ <code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
74
+ could fix a repository-level setting is what stopped that from being a long false lead.
@@ -2,7 +2,7 @@
2
2
  id: merged-loop-branches-are-never-pruned
3
3
  board: code
4
4
  section: pipeline
5
- status: planned
5
+ status: shipped
6
6
  category: Hygiene · DX
7
7
  complexity: S
8
8
  impact: Low
@@ -45,3 +45,26 @@ Low impact and near-zero risk to fix &mdash; flip <code>delete_branch_on_merge</
45
45
  the backlog can be pruned by listing merged PR head refs. The reason it is worth doing at all is
46
46
  that CLAUDE.md tells every agent to run <code>git worktree list</code> and inspect branch state
47
47
  before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.
48
+
49
+ <b>Shipped &mdash; and the premise had gone stale, which is why it was worth re-checking rather than
50
+ assuming.</b> This card's core claim is that <code>delete_branch_on_merge</code> is <code>false</code>.
51
+ It is now <b><code>true</code></b>, and the backlog it describes is gone: against the card's
52
+ <b>77 branches, 70 of them <code>loop/*</code></b>, the repository today carries <b>5 branches, 2
53
+ <code>loop/*</code></b>.
54
+
55
+ Two stragglers predating the setting change were still present and are now deleted:
56
+ <code>evals-harness</code> (PR <code>#317</code>, merged) and <code>mcp-task-entrance</code>
57
+ (PR <code>#318</code>, merged). Both were classified the way this card insists on &mdash; by
58
+ <b>pull-request state</b>, not commit reachability &mdash; because the squash-merge point above is
59
+ real: <code>compare(main...branch).ahead_by</code> reports every merged branch as permanently ahead,
60
+ so reachability would have reported 0 of them deletable.
61
+
62
+ Three branches remain and are deliberately <em>not</em> deleted: <code>bot/demo-gif</code> has an
63
+ open PR (<code>#353</code>), and <code>badges</code>, <code>loop/keyless-card-dedupe</code> and
64
+ <code>loop/sbom-in-release-job</code> have <b>no PR on record</b>. A branch with no PR cannot be shown
65
+ to be merged, and deleting it could destroy unmerged work &mdash; so the safe rule is to leave it for
66
+ a human, which is also why no automated pruner is proposed here.
67
+
68
+ <b>No automation was added.</b> The repository setting does the job going forward; a workflow that
69
+ deleted branches on a schedule would add a way to lose work in exchange for tidying a list that is
70
+ now five entries long.
@@ -164,3 +164,26 @@ bodies. Both are refinements &mdash; the byte-identical case is 78.3% of the pro
164
164
  quality prior than <code>curated</code> and near-identical (rather than byte-identical) clustering.
165
165
  Unowned and ready for anyone &mdash; the byte-identical case was 78.3% of the problem, so the
166
166
  remainder is refinement rather than the bulk.
167
+
168
+ <b>The quality prior is now richer than the <code>curated</code> flag alone.</b> Inside a cluster
169
+ every copy is byte-identical, so which one survives is not a relevance question &mdash; it decides
170
+ where the user installs from. Two signals exist and they are not the same thing: the entry's own
171
+ <code>curated</code> flag, which is a decision this machine's owner made with
172
+ <code>boost tap --curated</code>, and <code>confidence</code> in the shipped
173
+ <code>registries.json</code> (high / med / low across 466 registries, currently 268 / 153 / 45).
174
+
175
+ <code>rag.source_rank</code> orders on the user's flag <em>first</em> and the shipped confidence
176
+ second, deliberately: a maintainer opinion baked into the package should never override a choice made
177
+ on the user's own machine. An uncatalogued registry ranks below every catalogued one rather than
178
+ above, so an unknown tap never wins by default, and equal trust falls back to ranking order so the
179
+ result stays deterministic when there is no signal at all. The catalog is read once
180
+ (<code>lru_cache</code>) because dedup asks per hit and parsing 466 rows inside a search loop would
181
+ be a real cost for a value that cannot change while the process runs.
182
+
183
+ Retrieval quality is untouched by construction &mdash; the gate reads 0.863 / 0.473 / 0.607 / 0.662
184
+ before and after, because the prior only chooses between copies that are already identical.
185
+
186
+ <b>Still open:</b> near-identical rather than byte-identical clustering, where
187
+ <code>core/typosquat.py</code>'s confusion machinery would apply. Stars and recency, which the card
188
+ also names, have no shipped data source today &mdash; adding one is its own piece of work rather than
189
+ a tweak to this.
@@ -71,3 +71,19 @@ normal PR gate once a human opens it.
71
71
  Either way the freshness gap this item exists to close narrows from "nobody is watching" to "a
72
72
  human clicks a button", which is the honest available improvement while the setting stands.
73
73
 
74
+
75
+ <b>The blocker is gone.</b> This card is gated on the same repository setting as
76
+ <code>demo-cannot-open-its-own-pr</code>, and the API now reports
77
+ <code>can_approve_pull_request_reviews: <b>true</b></code>. Confirmed working rather than merely
78
+ configured: <code>#353</code> was opened by <code>github-actions[bot]</code>.
79
+
80
+ So the &ldquo;honest available improvement while the setting stands&rdquo; compromise described above
81
+ &mdash; a workflow that only reports drift and waits for a human to click a button &mdash; is no
82
+ longer the ceiling. A scheduled job can now regenerate the lock and open its own PR, which is what
83
+ this card originally asked for.
84
+
85
+ Deliberately left unimplemented here. It needs a real decision about cadence and about what happens
86
+ when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runner, and shipping an
87
+ untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
88
+ The value of this note is that the next person picking it up starts from &ldquo;build it&rdquo;
89
+ rather than from &ldquo;it cannot be built&rdquo;.
@@ -1681,7 +1681,24 @@ than a description of them, and <code>lock_toolchain.py --audit</code> then runs
1681
1681
  normal PR gate once a human opens it.
1682
1682
 
1683
1683
  Either way the freshness gap this item exists to close narrows from "nobody is watching" to "a
1684
- human clicks a button", which is the honest available improvement while the setting stands.</p>
1684
+ human clicks a button", which is the honest available improvement while the setting stands.
1685
+
1686
+
1687
+ <b>The blocker is gone.</b> This card is gated on the same repository setting as
1688
+ <code>demo-cannot-open-its-own-pr</code>, and the API now reports
1689
+ <code>can_approve_pull_request_reviews: <b>true</b></code>. Confirmed working rather than merely
1690
+ configured: <code>#353</code> was opened by <code>github-actions[bot]</code>.
1691
+
1692
+ So the &ldquo;honest available improvement while the setting stands&rdquo; compromise described above
1693
+ &mdash; a workflow that only reports drift and waits for a human to click a button &mdash; is no
1694
+ longer the ceiling. A scheduled job can now regenerate the lock and open its own PR, which is what
1695
+ this card originally asked for.
1696
+
1697
+ Deliberately left unimplemented here. It needs a real decision about cadence and about what happens
1698
+ when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runner, and shipping an
1699
+ untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
1700
+ The value of this note is that the next person picking it up starts from &ldquo;build it&rdquo;
1701
+ rather than from &ldquo;it cannot be built&rdquo;.</p>
1685
1702
  <div class="meta">
1686
1703
  <span class="m">Complexity <b>M</b></span>
1687
1704
  <span class="m">Impact <b>Med</b></span>
@@ -3318,7 +3335,7 @@ concrete proof that the original recommendation would have blocked every release
3318
3335
  </article>
3319
3336
 
3320
3337
  <article class="cap rcard" id="demo-cannot-open-its-own-pr">
3321
- <div class="head"><span class="pill planned">Planned</span><span class="cat">CI reporting</span></div>
3338
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI reporting</span></div>
3322
3339
  <h3><code>demo.yml</code> still fails on every push &mdash; and the fix is not in the workflow</h3>
3323
3340
  <p><code>demo-gif-workflow-has-never-succeeded</code> (shipped, PR&nbsp;294) fixed the recorder:
3324
3341
  <code>charmbracelet/vhs-action</code>'s broken ffmpeg installer was replaced with apt plus
@@ -3366,7 +3383,19 @@ permission: since <code>#349</code> switched off Dependabot's version updates fo
3366
3383
  toolchain, the replacement is a scheduled job that regenerates the lock and proposes it &mdash; and
3367
3384
  that job cannot open a pull request either. So this toggle now gates two items rather than one, and
3368
3385
  the second is a supply-chain freshness gap rather than a docs asset. That does not make the
3369
- decision automatic, but it does change what is on each side of it.</p>
3386
+ decision automatic, but it does change what is on each side of it.
3387
+
3388
+
3389
+ <b>Unblocked, and already working &mdash; the setting was flipped.</b> This card's blocker is
3390
+ <code>can_approve_pull_request_reviews: false</code>. The API now reports it as <b><code>true</code></b>,
3391
+ and the effect is visible rather than theoretical: <code>demo.yml</code>'s recent runs are green, and
3392
+ <b>PR <code>#353</code> was opened by <code>github-actions[bot]</code></b> &mdash; the exact action
3393
+ this card says is impossible.
3394
+
3395
+ Nothing in the tree needed changing. Recording it as shipped rather than deleting it, because the
3396
+ card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
3397
+ <code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
3398
+ could fix a repository-level setting is what stopped that from being a long false lead.</p>
3370
3399
  <div class="meta">
3371
3400
  <span class="m">Complexity <b>S</b></span>
3372
3401
  <span class="m">Impact <b>Med</b></span>
@@ -3376,7 +3405,7 @@ decision automatic, but it does change what is on each side of it.</p>
3376
3405
  </article>
3377
3406
 
3378
3407
  <article class="cap rcard" id="merged-loop-branches-are-never-pruned">
3379
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Hygiene · DX</span></div>
3408
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Hygiene · DX</span></div>
3380
3409
  <h3>68 of the repo's 77 branches are merged <code>loop/*</code> branches nobody deletes</h3>
3381
3410
  <p>The repository carries <b>77 branches, 70 of them <code>loop/*</code></b>. Classifying each by the
3382
3411
  state of its pull request: <b>68 have a merged PR</b> and are safe to delete, <b>1</b> has an open
@@ -3409,7 +3438,30 @@ manually.
3409
3438
  Low impact and near-zero risk to fix &mdash; flip <code>delete_branch_on_merge</code> to true and
3410
3439
  the backlog can be pruned by listing merged PR head refs. The reason it is worth doing at all is
3411
3440
  that CLAUDE.md tells every agent to run <code>git worktree list</code> and inspect branch state
3412
- before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.</p>
3441
+ before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.
3442
+
3443
+ <b>Shipped &mdash; and the premise had gone stale, which is why it was worth re-checking rather than
3444
+ assuming.</b> This card's core claim is that <code>delete_branch_on_merge</code> is <code>false</code>.
3445
+ It is now <b><code>true</code></b>, and the backlog it describes is gone: against the card's
3446
+ <b>77 branches, 70 of them <code>loop/*</code></b>, the repository today carries <b>5 branches, 2
3447
+ <code>loop/*</code></b>.
3448
+
3449
+ Two stragglers predating the setting change were still present and are now deleted:
3450
+ <code>evals-harness</code> (PR <code>#317</code>, merged) and <code>mcp-task-entrance</code>
3451
+ (PR <code>#318</code>, merged). Both were classified the way this card insists on &mdash; by
3452
+ <b>pull-request state</b>, not commit reachability &mdash; because the squash-merge point above is
3453
+ real: <code>compare(main...branch).ahead_by</code> reports every merged branch as permanently ahead,
3454
+ so reachability would have reported 0 of them deletable.
3455
+
3456
+ Three branches remain and are deliberately <em>not</em> deleted: <code>bot/demo-gif</code> has an
3457
+ open PR (<code>#353</code>), and <code>badges</code>, <code>loop/keyless-card-dedupe</code> and
3458
+ <code>loop/sbom-in-release-job</code> have <b>no PR on record</b>. A branch with no PR cannot be shown
3459
+ to be merged, and deleting it could destroy unmerged work &mdash; so the safe rule is to leave it for
3460
+ a human, which is also why no automated pruner is proposed here.
3461
+
3462
+ <b>No automation was added.</b> The repository setting does the job going forward; a workflow that
3463
+ deleted branches on a schedule would add a way to lose work in exchange for tidying a list that is
3464
+ now five entries long.</p>
3413
3465
  <div class="meta">
3414
3466
  <span class="m">Complexity <b>S</b></span>
3415
3467
  <span class="m">Impact <b>Low</b></span>
@@ -3635,7 +3687,30 @@ bodies. Both are refinements &mdash; the byte-identical case is 78.3% of the pro
3635
3687
  <b>Claim released.</b> The key fix and content-hash dedup have merged; what is left is a richer
3636
3688
  quality prior than <code>curated</code> and near-identical (rather than byte-identical) clustering.
3637
3689
  Unowned and ready for anyone &mdash; the byte-identical case was 78.3% of the problem, so the
3638
- remainder is refinement rather than the bulk.</p>
3690
+ remainder is refinement rather than the bulk.
3691
+
3692
+ <b>The quality prior is now richer than the <code>curated</code> flag alone.</b> Inside a cluster
3693
+ every copy is byte-identical, so which one survives is not a relevance question &mdash; it decides
3694
+ where the user installs from. Two signals exist and they are not the same thing: the entry's own
3695
+ <code>curated</code> flag, which is a decision this machine's owner made with
3696
+ <code>boost tap --curated</code>, and <code>confidence</code> in the shipped
3697
+ <code>registries.json</code> (high / med / low across 466 registries, currently 268 / 153 / 45).
3698
+
3699
+ <code>rag.source_rank</code> orders on the user's flag <em>first</em> and the shipped confidence
3700
+ second, deliberately: a maintainer opinion baked into the package should never override a choice made
3701
+ on the user's own machine. An uncatalogued registry ranks below every catalogued one rather than
3702
+ above, so an unknown tap never wins by default, and equal trust falls back to ranking order so the
3703
+ result stays deterministic when there is no signal at all. The catalog is read once
3704
+ (<code>lru_cache</code>) because dedup asks per hit and parsing 466 rows inside a search loop would
3705
+ be a real cost for a value that cannot change while the process runs.
3706
+
3707
+ Retrieval quality is untouched by construction &mdash; the gate reads 0.863 / 0.473 / 0.607 / 0.662
3708
+ before and after, because the prior only chooses between copies that are already identical.
3709
+
3710
+ <b>Still open:</b> near-identical rather than byte-identical clustering, where
3711
+ <code>core/typosquat.py</code>'s confusion machinery would apply. Stars and recency, which the card
3712
+ also names, have no shipped data source today &mdash; adding one is its own piece of work rather than
3713
+ a tweak to this.</p>
3639
3714
  <div class="meta">
3640
3715
  <span class="m">Complexity <b>M</b></span>
3641
3716
  <span class="m hi">Impact <b>High</b></span>
@@ -5746,7 +5821,7 @@ same-repo PRs and red CI.</p>
5746
5821
  </article>
5747
5822
 
5748
5823
  <article class="cap rcard" id="code-scanning-rule-can-be-restored">
5749
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Release safety</span></div>
5824
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Release safety</span></div>
5750
5825
  <h3>The <code>code_scanning</code> ruleset rule can go back on &mdash; but only scoped to CodeQL</h3>
5751
5826
  <p>Repairing the <code>main</code> ruleset dropped its <code>code_scanning</code> rule in favour of
5752
5827
  <code>codeql-analyze</code> as a required status check (see
@@ -5779,7 +5854,23 @@ path filters and runs on <code>push</code>, <code>pull_request</code> and
5779
5854
  <code>merge_group</code>, so it always reports and cannot produce the never-reports deadlock this
5780
5855
  repo has hit twice. And it catches something the status check does not &mdash;
5781
5856
  <code>codeql-analyze</code> passes when the <em>job</em> succeeds, including when it succeeds
5782
- having found error-severity alerts.</p>
5857
+ having found error-severity alerts.
5858
+
5859
+ <b>Done &mdash; the rule is back, and scoped exactly as this card prescribed.</b> Read from the live
5860
+ <code>main</code> ruleset (id <code>19130332</code>): it carries a <code>code_scanning</code> rule
5861
+ whose <code>code_scanning_tools</code> list is <b><code>CodeQL</code> alone</b>, at
5862
+ <code>security_alerts_threshold: high_or_higher</code> and <code>alerts_threshold: errors</code>.
5863
+ Scorecard is not in the list, which is the single decision this card exists to get right.
5864
+
5865
+ The safety precondition still holds and was re-checked rather than assumed: <b>CodeQL has 0 open
5866
+ alerts</b>, while Scorecard has <b>4 open</b> (down from the 7 recorded above), every one still a
5867
+ posture metric that must not be dismissed. Had Scorecard been added to that tool list, those four
5868
+ would block every merge in the repository immediately &mdash; the failure mode this card correctly
5869
+ identifies as the reason the work looked blocked.
5870
+
5871
+ No change was needed. Recording it as shipped so the board stops advertising work that is already
5872
+ in place, and so the tool-list constraint stays written down: anyone re-editing this rule through the
5873
+ GitHub UI will be offered Scorecard right next to CodeQL in the picker.</p>
5783
5874
  <div class="meta">
5784
5875
  <span class="m">Complexity <b>S</b></span>
5785
5876
  <span class="m">Impact <b>Med</b></span>
@@ -0,0 +1,117 @@
1
+ """Which copy survives dedup, when every copy is byte-identical.
2
+
3
+ Content-hash dedup collapses a cluster to one result. Because the bodies are
4
+ identical, *which* one survives is not a relevance question at all — it decides
5
+ where the user installs from. The roadmap card asks for "a quality prior —
6
+ source trust, stars, recency, maintenance".
7
+
8
+ Two signals exist today and they are not the same thing:
9
+
10
+ * the entry's own ``curated`` flag — the user tapped that registry with
11
+ ``--curated``, i.e. a decision this machine's owner made;
12
+ * ``confidence`` in the shipped ``registries.json`` — high / med / low, a
13
+ maintainer judgement about the registry, covering 466 registries.
14
+
15
+ The user's own flag outranks the shipped default deliberately: a shipped
16
+ opinion should never override a decision the user made on their own machine.
17
+ Below both, ranking order breaks the tie, so the behaviour stays deterministic
18
+ when there is no trust signal at all.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ from boost_cli.core import rag
23
+
24
+
25
+ def _hit(name, tap, score, content, curated=False):
26
+ return {"entry": {"name": name, "tap": tap, "curated": curated,
27
+ "skill_md": "%s/SKILL.md" % name, "kind": "skill",
28
+ "description": ""},
29
+ "score": score, "snippet": "", "content": content}
30
+
31
+
32
+ class TestTrustRank:
33
+ """`source_rank` orders candidates; lower sorts first."""
34
+
35
+ def test_a_curated_tap_beats_an_uncurated_one(self, monkeypatch):
36
+ monkeypatch.setattr(rag, "registry_confidence", lambda tap: None)
37
+ assert rag.source_rank({"tap": "a/x", "curated": True}) < \
38
+ rag.source_rank({"tap": "b/y", "curated": False})
39
+
40
+ def test_high_confidence_beats_low(self, monkeypatch):
41
+ conf = {"a/x": "high", "b/y": "low"}
42
+ monkeypatch.setattr(rag, "registry_confidence", conf.get)
43
+ assert rag.source_rank({"tap": "a/x"}) < rag.source_rank({"tap": "b/y"})
44
+
45
+ def test_high_beats_med_beats_low(self, monkeypatch):
46
+ conf = {"h": "high", "m": "med", "l": "low"}
47
+ monkeypatch.setattr(rag, "registry_confidence", conf.get)
48
+ ranks = [rag.source_rank({"tap": t}) for t in ("h", "m", "l")]
49
+ assert ranks == sorted(ranks) and len(set(ranks)) == 3
50
+
51
+ def test_the_users_own_flag_outranks_a_shipped_high(self, monkeypatch):
52
+ # A shipped opinion must not override a decision made on this machine.
53
+ conf = {"rando": None, "shipped": "high"}
54
+ monkeypatch.setattr(rag, "registry_confidence", conf.get)
55
+ assert rag.source_rank({"tap": "rando", "curated": True}) < \
56
+ rag.source_rank({"tap": "shipped", "curated": False})
57
+
58
+ def test_an_unknown_registry_ranks_below_a_known_one(self, monkeypatch):
59
+ monkeypatch.setattr(rag, "registry_confidence",
60
+ {"known": "low"}.get)
61
+ assert rag.source_rank({"tap": "known"}) < \
62
+ rag.source_rank({"tap": "never-heard-of-it"})
63
+
64
+
65
+ class TestDedupUsesIt:
66
+ """The prior only matters inside a cluster of identical bodies."""
67
+
68
+ def test_a_trusted_copy_wins_over_a_better_ranked_one(self, monkeypatch):
69
+ monkeypatch.setattr(rag, "registry_confidence",
70
+ {"rando/x": "low", "solid/y": "high"}.get)
71
+ hits = [_hit("rule", "rando/x", 3.0, "same"),
72
+ _hit("rule", "solid/y", 2.0, "same")]
73
+ assert rag.dedupe_by_content(hits, 10)[0]["entry"]["tap"] == "solid/y"
74
+
75
+ def test_the_cluster_keeps_its_best_score(self, monkeypatch):
76
+ monkeypatch.setattr(rag, "registry_confidence",
77
+ {"rando/x": "low", "solid/y": "high"}.get)
78
+ hits = [_hit("rule", "rando/x", 3.0, "same"),
79
+ _hit("rule", "solid/y", 2.0, "same")]
80
+ assert rag.dedupe_by_content(hits, 10)[0]["score"] == 3.0
81
+
82
+ def test_equal_trust_falls_back_to_rank(self, monkeypatch):
83
+ monkeypatch.setattr(rag, "registry_confidence",
84
+ {"a/x": "high", "b/y": "high"}.get)
85
+ hits = [_hit("rule", "a/x", 3.0, "same"), _hit("rule", "b/y", 2.0, "same")]
86
+ assert rag.dedupe_by_content(hits, 10)[0]["entry"]["tap"] == "a/x"
87
+
88
+ def test_trust_never_merges_distinct_bodies(self, monkeypatch):
89
+ # The prior decides *which* copy, never *whether* to collapse.
90
+ monkeypatch.setattr(rag, "registry_confidence",
91
+ {"a/x": "high", "b/y": "low"}.get)
92
+ hits = [_hit("rule", "a/x", 3.0, "one body"),
93
+ _hit("rule", "b/y", 2.0, "a different body")]
94
+ assert len(rag.dedupe_by_content(hits, 10)) == 2
95
+
96
+
97
+ class TestConfidenceLookup:
98
+ """Reading the shipped catalog, without paying for it on every call."""
99
+
100
+ def test_a_shipped_registry_resolves(self):
101
+ # Picked from registries.json; asserted as a real value, not just truthy.
102
+ assert rag.registry_confidence("Aaronontheweb/dotnet-cursor-rules") == "med"
103
+
104
+ def test_an_unknown_registry_is_none(self):
105
+ assert rag.registry_confidence("nobody/nothing") is None
106
+
107
+ def test_the_catalog_is_read_once(self, monkeypatch):
108
+ # 466 registries parsed per hit would be a real cost in a search loop.
109
+ calls = []
110
+ rag._confidence_map.cache_clear()
111
+ real = rag.config.load_registry_catalog
112
+ monkeypatch.setattr(rag.config, "load_registry_catalog",
113
+ lambda: calls.append(1) or real())
114
+ rag.registry_confidence("a")
115
+ rag.registry_confidence("b")
116
+ rag.registry_confidence("c")
117
+ assert len(calls) == 1
@@ -120,9 +120,23 @@ class TestProviderSelection:
120
120
 
121
121
 
122
122
  class TestEmbed:
123
- def test_none_without_provider(self, sandbox):
123
+ def test_none_without_provider(self, sandbox, monkeypatch):
124
+ # `local_available` is forced off for the same reason as the tests in
125
+ # TestProviderSelection: since the [rag] extra bundles a local model,
126
+ # "no key" no longer implies "no provider", and `embed` returns real
127
+ # vectors rather than None once anything has warmed that backend. Left
128
+ # ambient this passed or failed depending on test ORDER, which made it
129
+ # a latent flake rather than an assertion about the code.
130
+ monkeypatch.setattr(embed, "local_available", lambda: False)
124
131
  assert embed.embed(["hi"]) is None
125
132
 
133
+ def test_the_local_backend_alone_still_embeds(self, sandbox, monkeypatch):
134
+ # The other half: with no key but the extra present, embedding works.
135
+ # That is the keyless tier, and nothing else in this file covers it.
136
+ monkeypatch.setattr(embed, "local_available", lambda: True)
137
+ monkeypatch.setattr(embed, "_embed_local", lambda texts, **kw: [[0.1]])
138
+ assert embed.embed(["hi"]) == [[0.1]]
139
+
126
140
  def test_empty_batch_is_empty_list(self, sandbox, monkeypatch):
127
141
  monkeypatch.setenv("OPENAI_API_KEY", "o")
128
142
  assert embed.embed([]) == []