boost-skill-cli 1.2.33__tar.gz → 1.2.34__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 (783) hide show
  1. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/configuration.py +21 -1
  4. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/quality.py +20 -2
  5. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/safety.py +7 -1
  6. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/store.py +12 -1
  7. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  8. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/SOURCES.txt +6 -0
  9. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/openssf-badge.md +6 -9
  10. boost_skill_cli-1.2.34/docs/roadmap/items/cli-command-audit.md +72 -0
  11. boost_skill_cli-1.2.34/docs/roadmap/items/reproducible-release-artifacts.md +62 -0
  12. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap.html +130 -2
  13. boost_skill_cli-1.2.34/docs/verifying-releases.md +214 -0
  14. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/pyproject.toml +13 -1
  15. boost_skill_cli-1.2.34/scripts/check_reproducible.py +181 -0
  16. boost_skill_cli-1.2.34/scripts/normalize_sdist.py +158 -0
  17. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_catalog.py +24 -1
  18. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_configuration.py +26 -0
  19. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_quality.py +43 -0
  20. boost_skill_cli-1.2.34/tests/unit/test_check_reproducible.py +192 -0
  21. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_link_ownership.py +35 -0
  22. boost_skill_cli-1.2.34/tests/unit/test_normalize_sdist.py +216 -0
  23. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_store.py +33 -0
  24. boost_skill_cli-1.2.33/docs/verifying-releases.md +0 -146
  25. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.gitattributes +0 -0
  26. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.gitignore +0 -0
  27. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.gitleaks.toml +0 -0
  28. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.htmlvalidate.json +0 -0
  29. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.lighthouserc.json +0 -0
  30. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.lycheeignore +0 -0
  31. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.markdownlint-cli2.jsonc +0 -0
  32. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.pre-commit-config.yaml +0 -0
  33. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.stylelintrc.json +0 -0
  34. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale/styles/boost/AIWriting.yml +0 -0
  35. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale/styles/boost/Terminology.yml +0 -0
  36. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  37. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale.ini +0 -0
  38. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/CLAUDE.md +0 -0
  39. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/CODE_OF_CONDUCT.md +0 -0
  40. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/CONTRIBUTING.md +0 -0
  41. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/DCO +0 -0
  42. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/GOVERNANCE.md +0 -0
  43. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/LICENSE +0 -0
  44. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/MAINTAINERS.md +0 -0
  45. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/MANIFEST.in +0 -0
  46. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/Makefile +0 -0
  47. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/README.md +0 -0
  48. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/SECURITY.md +0 -0
  49. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/SUPPORT.md +0 -0
  50. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost +0 -0
  51. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/__init__.py +0 -0
  52. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/__main__.py +0 -0
  53. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/cli.py +0 -0
  54. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/cliparse.py +0 -0
  55. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/__init__.py +0 -0
  56. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/_common.py +0 -0
  57. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/bmad.py +0 -0
  58. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/discovery.py +0 -0
  59. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/hooks.py +0 -0
  60. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/info.py +0 -0
  61. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/intelligence.py +0 -0
  62. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/pkg.py +0 -0
  63. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/run.py +0 -0
  64. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/taps.py +0 -0
  65. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/team.py +0 -0
  66. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/__init__.py +0 -0
  67. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/adapters.py +0 -0
  68. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/agents.py +0 -0
  69. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/ai.py +0 -0
  70. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/bmad.py +0 -0
  71. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/bootstrap.py +0 -0
  72. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/browse.py +0 -0
  73. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/builtin.py +0 -0
  74. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/capabilities.py +0 -0
  75. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/catalog.py +0 -0
  76. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/catalogbundle.py +0 -0
  77. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/chat.py +0 -0
  78. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/claude_settings.py +0 -0
  79. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/complete.py +0 -0
  80. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/config.py +0 -0
  81. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/dense.py +0 -0
  82. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/ed25519.py +0 -0
  83. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/embed.py +0 -0
  84. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/faithfulness.py +0 -0
  85. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/frontmatter.py +0 -0
  86. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/gitutil.py +0 -0
  87. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/hookhost.py +0 -0
  88. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/imperative.py +0 -0
  89. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/injectscan.py +0 -0
  90. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/installscan.py +0 -0
  91. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/integrity.py +0 -0
  92. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/journal.py +0 -0
  93. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/localembed.py +0 -0
  94. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/lockfile.py +0 -0
  95. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/logs.py +0 -0
  96. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/mcp.py +0 -0
  97. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/mcpdecl.py +0 -0
  98. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/mcphost.py +0 -0
  99. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/minisign.py +0 -0
  100. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/nethttp.py +0 -0
  101. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/output.py +0 -0
  102. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/paths.py +0 -0
  103. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/policy.py +0 -0
  104. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/projectlock.py +0 -0
  105. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/provenance.py +0 -0
  106. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/rag.py +0 -0
  107. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/registry.py +0 -0
  108. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/resolve.py +0 -0
  109. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/rules.py +0 -0
  110. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/scopes.py +0 -0
  111. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/secretscan.py +0 -0
  112. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/selfupdate.py +0 -0
  113. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/serve.py +0 -0
  114. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/stackprobe.py +0 -0
  115. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/staleness.py +0 -0
  116. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/trustaudit.py +0 -0
  117. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/typosquat.py +0 -0
  118. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/updatediff.py +0 -0
  119. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/util.py +0 -0
  120. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/workflows.py +0 -0
  121. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/data/registries.json +0 -0
  122. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/data/rules/boost-first.mdc +0 -0
  123. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/errors.py +0 -0
  124. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/spin.py +0 -0
  125. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/__init__.py +0 -0
  126. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/_compat.py +0 -0
  127. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/graph.py +0 -0
  128. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/loader.py +0 -0
  129. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/py.typed +0 -0
  130. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/retriever.py +0 -0
  131. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  132. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  133. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/requires.txt +0 -0
  134. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/top_level.txt +0 -0
  135. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/codecov.yml +0 -0
  136. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/.claude/settings.local.json +0 -0
  137. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/DEBUGGING.md +0 -0
  138. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/adapters.html +0 -0
  139. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/README.md +0 -0
  140. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-components-core.md +0 -0
  141. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-containers.md +0 -0
  142. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-context.md +0 -0
  143. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-dynamic-install.md +0 -0
  144. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/bmad.md +0 -0
  145. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/distill.gif +0 -0
  146. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/doctor.gif +0 -0
  147. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/explain.gif +0 -0
  148. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/hooks.gif +0 -0
  149. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/install.gif +0 -0
  150. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/pulse.gif +0 -0
  151. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/search.gif +0 -0
  152. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/tap.gif +0 -0
  153. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/distill.tape +0 -0
  154. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/doctor.tape +0 -0
  155. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/explain.tape +0 -0
  156. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/hooks.tape +0 -0
  157. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/install.tape +0 -0
  158. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/pulse.tape +0 -0
  159. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/search.tape +0 -0
  160. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/tap.tape +0 -0
  161. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel.html +0 -0
  162. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/chat.html +0 -0
  163. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/code-review.md +0 -0
  164. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/commands.html +0 -0
  165. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/commit-audit.md +0 -0
  166. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo-index.json +0 -0
  167. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo.gif +0 -0
  168. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo.html +0 -0
  169. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo.tape +0 -0
  170. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/dependencies.md +0 -0
  171. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/design-roadmap.html +0 -0
  172. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/eval-latest.json +0 -0
  173. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/eval.html +0 -0
  174. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/index.html +0 -0
  175. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/langchain.html +0 -0
  176. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/mcp-hub.html +0 -0
  177. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/openssf-playbook.md +0 -0
  178. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/rag-architecture.md +0 -0
  179. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D01.md +0 -0
  180. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D02.md +0 -0
  181. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D03.md +0 -0
  182. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D04.md +0 -0
  183. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D05.md +0 -0
  184. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D06.md +0 -0
  185. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D07.md +0 -0
  186. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D08.md +0 -0
  187. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D09.md +0 -0
  188. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D10.md +0 -0
  189. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D11.md +0 -0
  190. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D12.md +0 -0
  191. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D13.md +0 -0
  192. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D14.md +0 -0
  193. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D15.md +0 -0
  194. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D16.md +0 -0
  195. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D17.md +0 -0
  196. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D18.md +0 -0
  197. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D19.md +0 -0
  198. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D20.md +0 -0
  199. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D21.md +0 -0
  200. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D22.md +0 -0
  201. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D23.md +0 -0
  202. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D24.md +0 -0
  203. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D25.md +0 -0
  204. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D26.md +0 -0
  205. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  206. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  207. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  208. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  209. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  210. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  211. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  212. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  213. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  214. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  215. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  216. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  217. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  218. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  219. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-first-rule.md +0 -0
  220. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  221. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  222. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  223. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  224. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  225. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  226. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  227. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  228. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  229. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  230. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  231. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  232. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  233. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  234. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  235. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  236. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  237. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  238. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  239. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  240. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/command-carousel-page.md +0 -0
  241. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  242. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  243. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  244. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  245. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  246. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  247. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  248. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  249. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  250. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  251. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  252. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  253. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  254. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  255. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  256. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  257. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  258. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  259. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  260. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  261. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  262. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  263. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  264. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  265. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  266. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  267. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  268. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  269. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  270. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  271. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  272. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  273. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  274. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  275. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  276. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  277. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  278. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  279. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  280. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  281. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  282. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  283. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  284. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  285. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  286. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  287. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  288. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  289. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  290. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  291. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/github-community-health-files.md +0 -0
  292. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  293. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  294. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  295. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  296. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  297. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  298. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  299. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  300. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  301. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  302. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  303. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  304. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  305. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  306. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  307. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  308. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  309. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  310. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  311. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  312. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  313. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  314. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  315. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  316. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  317. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  318. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  319. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  320. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  321. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  322. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  323. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  324. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  325. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  326. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  327. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  328. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  329. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  330. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  331. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  332. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  333. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  334. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  335. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  336. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  337. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  338. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  339. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  340. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  341. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  342. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  343. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  344. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  345. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  346. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  347. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  348. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  349. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  350. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  351. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  352. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  353. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  354. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  355. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  356. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  357. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  358. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  359. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  360. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  361. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  362. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  363. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  364. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  365. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  366. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  367. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-playbook.md +0 -0
  368. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-silver.md +0 -0
  369. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  370. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  371. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  372. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  373. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  374. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  375. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  376. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  377. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  378. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  379. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  380. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  381. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  382. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  383. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  384. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  385. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  386. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  387. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  388. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  389. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  390. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  391. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  392. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  393. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  394. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  395. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  396. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  397. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  398. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  399. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  400. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  401. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  402. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  403. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  404. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  405. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  406. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  407. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  408. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  409. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  410. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  411. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  412. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  413. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  414. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  415. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  416. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  417. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  418. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  419. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  420. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  421. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  422. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  423. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  424. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  425. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  426. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  427. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  428. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  429. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  430. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  431. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  432. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  433. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  434. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  435. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  436. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  437. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  438. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  439. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  440. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  441. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  442. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  443. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  444. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  445. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  446. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  447. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  448. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  449. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  450. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  451. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  452. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  453. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  454. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  455. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  456. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  457. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  458. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  459. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  460. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  461. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  462. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  463. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  464. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  465. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  466. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  467. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  468. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  469. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  470. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  471. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  472. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  473. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  474. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  475. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  476. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  477. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workspace-scope-install.md +0 -0
  478. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/zip-strict-audit.md +0 -0
  479. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  480. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  481. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/security-design.md +0 -0
  482. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/semantic-search.md +0 -0
  483. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  484. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/eslint.config.mjs +0 -0
  485. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/README.md +0 -0
  486. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/__init__.py +0 -0
  487. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/baseline.json +0 -0
  488. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/faithfulness.py +0 -0
  489. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/golden_set.json +0 -0
  490. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/make_corpus.py +0 -0
  491. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/make_golden.py +0 -0
  492. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/metrics.py +0 -0
  493. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/publish_golden_dataset.py +0 -0
  494. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/run_evals.py +0 -0
  495. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/examples/README.md +0 -0
  496. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/examples/adapt-demo.sh +0 -0
  497. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/examples/boost-run-prototype.sh +0 -0
  498. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/index.html +0 -0
  499. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/noxfile.py +0 -0
  500. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/coverage-tools.in +0 -0
  501. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/coverage-tools.txt +0 -0
  502. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/lint-tools.in +0 -0
  503. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/lint-tools.txt +0 -0
  504. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/mutation-tools.in +0 -0
  505. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/mutation-tools.txt +0 -0
  506. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/platform-pins.lock +0 -0
  507. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/release-tools.in +0 -0
  508. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/release-tools.txt +0 -0
  509. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/test-tools.in +0 -0
  510. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/test-tools.txt +0 -0
  511. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/a11y_check.py +0 -0
  512. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/add_spdx_headers.py +0 -0
  513. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/bench_cli.sh +0 -0
  514. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_command_reference.py +0 -0
  515. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_demo_index.py +0 -0
  516. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_registries.py +0 -0
  517. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_roadmap.py +0 -0
  518. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_scale_corpus.py +0 -0
  519. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_anchors.py +0 -0
  520. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_dco.py +0 -0
  521. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_licenses.py +0 -0
  522. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_required_checks.py +0 -0
  523. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/ensure_eval_corpus.sh +0 -0
  524. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_corpus.py +0 -0
  525. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_explain.py +0 -0
  526. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_gate.py +0 -0
  527. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_recommend.py +0 -0
  528. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_retrieval.py +0 -0
  529. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_stats_summary.py +0 -0
  530. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/import_budget.py +0 -0
  531. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/lock_toolchain.py +0 -0
  532. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/measure_registry.py +0 -0
  533. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/mutation_gate.py +0 -0
  534. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/mutation_shards.py +0 -0
  535. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/mutation_weights.json +0 -0
  536. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/page_budget.py +0 -0
  537. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/perf_gate.py +0 -0
  538. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/post_deploy_smoke.py +0 -0
  539. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/publish_eval_json.py +0 -0
  540. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/release_guard.py +0 -0
  541. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/release_preflight.py +0 -0
  542. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/serve_docs.py +0 -0
  543. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/setup.cfg +0 -0
  544. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/sonar-project.properties +0 -0
  545. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/README.md +0 -0
  546. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/boost.css +0 -0
  547. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/boost.js +0 -0
  548. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/demo.html +0 -0
  549. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/adapt.feature +0 -0
  550. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/browse.feature +0 -0
  551. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/count.feature +0 -0
  552. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/discover.feature +0 -0
  553. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/doctor.feature +0 -0
  554. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/environment.py +0 -0
  555. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/explain.feature +0 -0
  556. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/index.feature +0 -0
  557. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/install.feature +0 -0
  558. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/list.feature +0 -0
  559. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/mcp.feature +0 -0
  560. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/search.feature +0 -0
  561. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/cli_steps.py +0 -0
  562. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/discovery_steps.py +0 -0
  563. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/mcp_steps.py +0 -0
  564. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/quality_steps.py +0 -0
  565. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/conftest.py +0 -0
  566. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/baseline.json +0 -0
  567. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/explain.jsonl +0 -0
  568. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/golden-natural.jsonl +0 -0
  569. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/golden.jsonl +0 -0
  570. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/recommend.jsonl +0 -0
  571. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/taps-scale.txt +0 -0
  572. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/taps.txt +0 -0
  573. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_capabilities_policy.py +0 -0
  574. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_adapt.py +0 -0
  575. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_bmad.py +0 -0
  576. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_chat.py +0 -0
  577. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_discovery.py +0 -0
  578. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_hooks.py +0 -0
  579. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_hooks_gemini.py +0 -0
  580. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_info.py +0 -0
  581. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_intelligence.py +0 -0
  582. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_pane_width.py +0 -0
  583. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_pkg.py +0 -0
  584. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_taps.py +0 -0
  585. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_team.py +0 -0
  586. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_everyday_loop.py +0 -0
  587. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_integrity_enforce.py +0 -0
  588. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_kind_conformance.py +0 -0
  589. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_property_parsers.py +0 -0
  590. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_run.py +0 -0
  591. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_tap_signing.py +0 -0
  592. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_workspace_scope.py +0 -0
  593. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/README.md +0 -0
  594. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  595. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  596. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  597. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  598. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  599. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  600. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  601. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  602. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  603. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  604. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  605. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  606. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  607. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  608. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  609. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  610. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  611. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  612. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  613. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  614. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  615. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  616. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  617. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/fuzz_frontmatter.py +0 -0
  618. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/fuzz_registry.py +0 -0
  619. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/conftest.py +0 -0
  620. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/test_graph.py +0 -0
  621. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/test_loader.py +0 -0
  622. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/test_retriever.py +0 -0
  623. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/make_fixture.py +0 -0
  624. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/perf/test_benchmarks.py +0 -0
  625. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/smoke.sh +0 -0
  626. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_a11y_check.py +0 -0
  627. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_action_pin_lockstep.py +0 -0
  628. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_adapters.py +0 -0
  629. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_adapters_multi.py +0 -0
  630. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_adapters_runner.py +0 -0
  631. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_agents.py +0 -0
  632. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_ai.py +0 -0
  633. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_bmad_core.py +0 -0
  634. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_boost_first_offer.py +0 -0
  635. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_bootstrap.py +0 -0
  636. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_browse.py +0 -0
  637. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_builtin.py +0 -0
  638. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_capabilities.py +0 -0
  639. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_catalog.py +0 -0
  640. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_catalogbundle.py +0 -0
  641. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_chat.py +0 -0
  642. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_check_anchors.py +0 -0
  643. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_check_dco.py +0 -0
  644. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_check_licenses.py +0 -0
  645. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_claude_settings.py +0 -0
  646. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_clean_internal_cache.py +0 -0
  647. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_cliparse.py +0 -0
  648. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_codeql_analysis_key.py +0 -0
  649. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_command_reference_fresh.py +0 -0
  650. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_community_health_files.py +0 -0
  651. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_compact.py +0 -0
  652. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_complete.py +0 -0
  653. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_complete_rc_block.py +0 -0
  654. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_config.py +0 -0
  655. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_content_dedupe.py +0 -0
  656. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_content_identity.py +0 -0
  657. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_crash_redaction.py +0 -0
  658. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dedup_trust.py +0 -0
  659. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_demo_index.py +0 -0
  660. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense.py +0 -0
  661. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_embed_dedupe.py +0 -0
  662. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_fallback.py +0 -0
  663. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_fix_hint.py +0 -0
  664. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_quantized.py +0 -0
  665. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_ready_order.py +0 -0
  666. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_shard_real_schema.py +0 -0
  667. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  668. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_shards.py +0 -0
  669. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_status.py +0 -0
  670. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_status_cheap.py +0 -0
  671. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dependabot_config.py +0 -0
  672. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_docs_pages_linked.py +0 -0
  673. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_docsite_chrome.py +0 -0
  674. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_ed25519.py +0 -0
  675. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_embed.py +0 -0
  676. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_embed_local.py +0 -0
  677. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_embed_truncated_response.py +0 -0
  678. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_entry_key.py +0 -0
  679. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_errors_and_cli_table.py +0 -0
  680. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_baseline.py +0 -0
  681. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_corpus.py +0 -0
  682. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_faithfulness.py +0 -0
  683. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_gate.py +0 -0
  684. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_grading.py +0 -0
  685. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_metrics.py +0 -0
  686. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_stats_summary.py +0 -0
  687. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  688. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_faithfulness.py +0 -0
  689. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_frontmatter.py +0 -0
  690. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_fuzz_targets.py +0 -0
  691. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  692. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitleaks_config.py +0 -0
  693. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitutil.py +0 -0
  694. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitutil_lfs.py +0 -0
  695. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitutil_sparse.py +0 -0
  696. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_hook_settings_hosts.py +0 -0
  697. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_hookhost.py +0 -0
  698. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_imperative.py +0 -0
  699. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_import_budget.py +0 -0
  700. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_injectscan.py +0 -0
  701. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_install_permission_error.py +0 -0
  702. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_installscan.py +0 -0
  703. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_integrity.py +0 -0
  704. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_journal.py +0 -0
  705. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_langchain_packaging.py +0 -0
  706. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_localembed.py +0 -0
  707. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_localembed_e2e.py +0 -0
  708. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_lockfile.py +0 -0
  709. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_logs.py +0 -0
  710. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_marketing_counts.py +0 -0
  711. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcp.py +0 -0
  712. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcp_install_scan.py +0 -0
  713. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcpdecl.py +0 -0
  714. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcphost.py +0 -0
  715. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_measure_registry.py +0 -0
  716. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_minisign.py +0 -0
  717. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutation_hardening.py +0 -0
  718. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutation_shards.py +0 -0
  719. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutation_subfile_shards.py +0 -0
  720. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutmut_source_paths.py +0 -0
  721. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_nethttp.py +0 -0
  722. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_output.py +0 -0
  723. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_page_budget.py +0 -0
  724. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_paths.py +0 -0
  725. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_perf_gate.py +0 -0
  726. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_pkg_confusions.py +0 -0
  727. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_pkg_injection.py +0 -0
  728. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_pkg_secrets.py +0 -0
  729. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_platform_pins.py +0 -0
  730. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_policy.py +0 -0
  731. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_post_deploy_smoke.py +0 -0
  732. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_project_mcp_sidecar.py +0 -0
  733. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_projectlock.py +0 -0
  734. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_provenance.py +0 -0
  735. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_publish_golden_dataset.py +0 -0
  736. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rag.py +0 -0
  737. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rag_fastpath.py +0 -0
  738. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rag_fusion.py +0 -0
  739. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registries_fresh.py +0 -0
  740. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registry.py +0 -0
  741. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registry_categories.py +0 -0
  742. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registry_control_chars.py +0 -0
  743. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_release_guard.py +0 -0
  744. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_release_preflight.py +0 -0
  745. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_required_checks.py +0 -0
  746. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rerank_cache.py +0 -0
  747. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_resolve.py +0 -0
  748. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_roadmap_fresh.py +0 -0
  749. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rules.py +0 -0
  750. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_scale_corpus.py +0 -0
  751. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_scopes.py +0 -0
  752. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_secretscan.py +0 -0
  753. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_selfupdate.py +0 -0
  754. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_serve.py +0 -0
  755. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_serve_docs.py +0 -0
  756. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_shards_matrix.py +0 -0
  757. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_smoke_covers_every_command.py +0 -0
  758. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_spdx_headers.py +0 -0
  759. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_spin.py +0 -0
  760. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_stackprobe.py +0 -0
  761. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_staleness.py +0 -0
  762. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_store_materialize.py +0 -0
  763. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_sync_blocked_links.py +0 -0
  764. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  765. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_token_parity.py +0 -0
  766. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_toolchain_lock.py +0 -0
  767. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_trustaudit.py +0 -0
  768. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_typosquat.py +0 -0
  769. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_updatediff.py +0 -0
  770. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_util.py +0 -0
  771. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_version.py +0 -0
  772. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_visual_harness_flags.py +0 -0
  773. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_concurrency.py +0 -0
  774. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  775. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  776. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_timeouts.py +0 -0
  777. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflows.py +0 -0
  778. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  779. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/a11y_check.mjs +0 -0
  780. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/console_check.mjs +0 -0
  781. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/package-lock.json +0 -0
  782. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/package.json +0 -0
  783. {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/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.2.33
3
+ Version: 1.2.34
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.2.33'
22
- __version_tuple__ = version_tuple = (1, 2, 33)
21
+ __version__ = version = '1.2.34'
22
+ __version_tuple__ = version_tuple = (1, 2, 34)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -570,6 +570,26 @@ def _write_onboard_file(dest: Path, content: str, force: bool) -> bool:
570
570
  return True
571
571
 
572
572
 
573
+ def _telemetry_created(dest: Path) -> str:
574
+ """The existing file's ``created`` timestamp, or now for a fresh write.
575
+
576
+ ``_write_onboard_file`` treats a byte-identical re-run as a no-op — but
577
+ stamping a fresh ``util.now_iso()`` into telemetry.json on every
578
+ invocation meant the comparison could only match by wall-clock luck (two
579
+ invocations landing in the same second), defeating the "re-running
580
+ onboard regenerates the workflow byte-for-byte" guarantee documented
581
+ above for the one file whose content is otherwise fully deterministic.
582
+ """
583
+ try:
584
+ data = json.loads(dest.read_text(encoding="utf-8"))
585
+ created = data.get("created")
586
+ if isinstance(created, str) and created:
587
+ return created
588
+ except (OSError, UnicodeDecodeError, json.JSONDecodeError):
589
+ pass
590
+ return util.now_iso()
591
+
592
+
573
593
  def cmd_onboard(argv) -> int:
574
594
  """boost onboard [--repo DIR] [--pr] [--dry-run] [--force]"""
575
595
  p = cliparse.parser(
@@ -593,7 +613,7 @@ def cmd_onboard(argv) -> int:
593
613
  telemetry = json.dumps({
594
614
  "enabled": True,
595
615
  "share_pulse": True,
596
- "created": util.now_iso(),
616
+ "created": _telemetry_created(repo / _TELEMETRY_REL),
597
617
  "by": util.user(),
598
618
  }, indent=2) + "\n"
599
619
  files = [(_TELEMETRY_REL, telemetry), (_WORKFLOW_REL, _WORKFLOW_YML)]
@@ -94,7 +94,12 @@ def _resolve_as_far_as_it_exists(path: Path) -> Path:
94
94
  while cur != cur.parent and not cur.exists():
95
95
  tail.append(cur.name)
96
96
  cur = cur.parent
97
- with suppress(OSError):
97
+ # RuntimeError is not redundant with OSError here: Python 3.12's
98
+ # `Path.resolve()` raises RuntimeError("Symlink loop from ...") for a
99
+ # cycle even in non-strict mode, and RuntimeError is NOT an OSError
100
+ # subclass — 3.13+ raises OSError for the same input. See
101
+ # store.resolves_into_store for the identical split, caught the same way.
102
+ with suppress(OSError, RuntimeError):
98
103
  cur = cur.resolve()
99
104
  return cur.joinpath(*reversed(tail))
100
105
 
@@ -907,10 +912,18 @@ def cmd_heal(argv):
907
912
 
908
913
  plan = store.sync_plan()
909
914
  if dry:
915
+ # `ours` above is exactly what a real run unlinks before computing
916
+ # this plan, so `sync_plan`'s stale-link sweep never sees those paths
917
+ # on a real run — only here, where nothing was unlinked yet. Skip
918
+ # them so a preview doesn't report the same path twice under two
919
+ # different actions.
920
+ already_reported = {str(link) for link in ours}
910
921
  for name, agent in plan["missing_links"]:
911
922
  out.info("would link %s → %s" % (name, agent))
912
923
  actions.append("link %s" % name)
913
924
  for p in plan["stale_links"]:
925
+ if p in already_reported:
926
+ continue
914
927
  out.info("would remove stale link %s" % _tilde(p))
915
928
  actions.append("stale %s" % p)
916
929
  for name in plan["missing_store"]:
@@ -988,7 +1001,12 @@ def cmd_conflict(argv):
988
1001
  ap.add_argument("--json", action="store_true")
989
1002
  args = ap.parse_args(argv)
990
1003
 
991
- installed = _iter_installed()
1004
+ # Quarantine removes a skill's active links/materialization on purpose
1005
+ # (see _drift_status_materialized's docstring) — a quarantined skill has
1006
+ # nothing live to be contradicted by, so it is excluded from both sides
1007
+ # of conflict detection rather than surfacing a conflict finding no
1008
+ # `boost quarantine` can ever clear.
1009
+ installed = [(n, e) for n, e in _iter_installed() if not e.get("quarantined")]
992
1010
  rules: list[tuple[str, str, str, set]] = [] # skill, line, polarity, stems
993
1011
  declared: list[tuple[str, str]] = [] # skill, conflicting skill
994
1012
  installed_names = {n for n, _e in installed}
@@ -268,7 +268,13 @@ def _trust_audit(as_json: bool) -> int:
268
268
  """`boost audit --skills` — one trust-health answer for the installed set."""
269
269
  installed = dict(_iter_installed())
270
270
  peers: dict = {}
271
- for name, peer in trustaudit.conflict_pairs(list(installed),
271
+ # Quarantine removes a skill's active links on purpose — pairing it as a
272
+ # conflict source or target would report a finding `boost quarantine`
273
+ # (its own documented remedy) can never clear. Non-quarantined skills are
274
+ # still checked against a quarantined peer's *declared* conflicts via
275
+ # `_installed_conflicts`, so only the pairing set is trimmed here.
276
+ active_names = [n for n, lk in installed.items() if not lk.get("quarantined")]
277
+ for name, peer in trustaudit.conflict_pairs(active_names,
272
278
  _installed_conflicts(installed)):
273
279
  peers.setdefault(name, []).append(peer)
274
280
 
@@ -80,7 +80,16 @@ def installed() -> dict:
80
80
  def source_dir_for(entry: dict) -> Path:
81
81
  """Absolute path of a catalog entry's skill dir inside its tap clone.
82
82
 
83
- Materializes the directory first. Taps check out Markdown only, so a skill
83
+ Clones the tap first if it is only *registered* and not yet cloned — the
84
+ state `boost catalog --import` deliberately leaves a tap in (a bundle
85
+ ships the catalogue, not the repo, precisely so the receiver can search
86
+ before paying for any clone). `catalog --import`'s own hint promises
87
+ "`boost install` clones just the one registry it needs"; without this, a
88
+ tap that was imported rather than tapped raised "source vanished from
89
+ tap" — a message that implies the source *used to* exist, when really it
90
+ was never fetched.
91
+
92
+ Materializes the directory next. Taps check out Markdown only, so a skill
84
93
  that ships `scripts/` or `assets/` has them in the index and not on disk;
85
94
  `_copy_skill` is a copytree, and handed a partial directory it copies what
86
95
  is there and reports success. Every consumer of a tap's real files — both
@@ -88,6 +97,8 @@ def source_dir_for(entry: dict) -> Path:
88
97
  the one place that has to get it right.
89
98
  """
90
99
  tap = registry.get(entry["tap"])
100
+ if not tap.is_cloned:
101
+ gitutil.clone_shallow(tap.url, tap.path)
91
102
  src = tap.path if entry["rel_dir"] == "." else tap.path / entry["rel_dir"]
92
103
  gitutil.materialize(tap.path, entry["rel_dir"])
93
104
  if not (src / "SKILL.md").exists():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.33
3
+ Version: 1.2.34
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -227,6 +227,7 @@ docs/roadmap/items/ci-job-timeout-minutes.md
227
227
  docs/roadmap/items/ci-summary-step-fails-itself.md
228
228
  docs/roadmap/items/ci-time-is-now-runner-queueing.md
229
229
  docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
230
+ docs/roadmap/items/cli-command-audit.md
230
231
  docs/roadmap/items/cli-output-ignored-the-terminal.md
231
232
  docs/roadmap/items/code-scanning-rule-can-be-restored.md
232
233
  docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
@@ -391,6 +392,7 @@ docs/roadmap/items/reconcile-the-theme-drift.md
391
392
  docs/roadmap/items/refresh-the-marketing-surface.md
392
393
  docs/roadmap/items/rel-time-tests-race-the-wall-clock.md
393
394
  docs/roadmap/items/release-verifies-the-wrong-commit.md
395
+ docs/roadmap/items/reproducible-release-artifacts.md
394
396
  docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md
395
397
  docs/roadmap/items/required-checks-config-drift.md
396
398
  docs/roadmap/items/resolve-vendored-duplicate-copies.md
@@ -508,6 +510,7 @@ scripts/build_scale_corpus.py
508
510
  scripts/check_anchors.py
509
511
  scripts/check_dco.py
510
512
  scripts/check_licenses.py
513
+ scripts/check_reproducible.py
511
514
  scripts/check_required_checks.py
512
515
  scripts/ensure_eval_corpus.sh
513
516
  scripts/eval_corpus.py
@@ -522,6 +525,7 @@ scripts/measure_registry.py
522
525
  scripts/mutation_gate.py
523
526
  scripts/mutation_shards.py
524
527
  scripts/mutation_weights.json
528
+ scripts/normalize_sdist.py
525
529
  scripts/page_budget.py
526
530
  scripts/perf_gate.py
527
531
  scripts/post_deploy_smoke.py
@@ -632,6 +636,7 @@ tests/unit/test_chat.py
632
636
  tests/unit/test_check_anchors.py
633
637
  tests/unit/test_check_dco.py
634
638
  tests/unit/test_check_licenses.py
639
+ tests/unit/test_check_reproducible.py
635
640
  tests/unit/test_claude_settings.py
636
641
  tests/unit/test_clean_internal_cache.py
637
642
  tests/unit/test_cliparse.py
@@ -710,6 +715,7 @@ tests/unit/test_mutation_shards.py
710
715
  tests/unit/test_mutation_subfile_shards.py
711
716
  tests/unit/test_mutmut_source_paths.py
712
717
  tests/unit/test_nethttp.py
718
+ tests/unit/test_normalize_sdist.py
713
719
  tests/unit/test_output.py
714
720
  tests/unit/test_page_budget.py
715
721
  tests/unit/test_paths.py
@@ -213,8 +213,8 @@ of the security-design document for the full account.
213
213
 
214
214
  ## Gold
215
215
 
216
- Gold is **23** criteria on top of silver. Sixteen are Met, two are N/A and
217
- five are Unmet. Three of the five are about how many people work on boost
216
+ Gold is **23** criteria on top of silver. Seventeen are Met, two are N/A and
217
+ four are Unmet. Three of the four are about how many people work on boost
218
218
  rather than about the code, so no pull request can close them.
219
219
 
220
220
  That count is worth a note, because an earlier version of this section said 21
@@ -225,10 +225,9 @@ like a plausible total, so nothing flagged it; the gap only appeared on the
225
225
  submission form, where 23 rows were waiting. A count that looks reasonable is
226
226
  not a checked count.
227
227
 
228
- Read this section as the honest ceiling. Eighteen of twenty-three is where
229
- boost stops on its own: of the five that remain, two are engineering (a
230
- reproducible sdist, a host that sets response headers) and three are a
231
- recruiting problem.
228
+ Read this section as the honest ceiling. Nineteen of twenty-three is where
229
+ boost stops on its own: of the four that remain, one is engineering (a host
230
+ that sets response headers) and three are a recruiting problem.
232
231
 
233
232
  ### Prerequisites and project oversight
234
233
 
@@ -265,7 +264,7 @@ recruiting problem.
265
264
 
266
265
  | Criterion | Cat. | Answer | Evidence |
267
266
  |---|---|---|---|
268
- | `build_reproducible` | MUST | **Unmet** | Measured, not assumed: with `SOURCE_DATE_EPOCH` set, two builds of one commit produce a **bit-identical wheel** and a **differing sdist**. `setuptools` writes each tar member's real mtime plus the builder's `uid`/`gid`/user name into the sdist, so 54 members differ between builds two seconds apart. Two things are missing — the release workflow installs its build tooling unpinned, and the sdist's timestamps and ownership need normalising. The full measurement and the commands to reproduce it are in [docs/verifying-releases.md](https://github.com/jonnyeclectic/boost/blob/main/docs/verifying-releases.md#can-you-rebuild-it-yourself-partly--the-measurement). N/A would be wrong: boost ships wheels. |
267
+ | `build_reproducible` | MUST | **Met** | Measured, not assumed: `scripts/check_reproducible.py` builds the project twice with `SOURCE_DATE_EPOCH` pinned to the same value both times and diffs the results — both the **wheel and the sdist are now bit-identical**. They were not: `setuptools` writes each sdist tar member's real mtime plus the builder's `uid`/`gid`/user name with no override, so 54 members differed between builds two seconds apart ([pypa/setuptools#2133](https://github.com/pypa/setuptools/issues/2133), open since 2020). `scripts/normalize_sdist.py` now clamps that in `publish.yml`, between the build and `twine check`, and the release toolchain that produces the artifacts is hash-pinned (`requirements/release-tools.txt`) with `pyproject.toml`'s `[build-system].requires` exact-pinned rather than left as a floor. The full measurement and the commands to reproduce it are in [docs/verifying-releases.md](https://github.com/jonnyeclectic/boost/blob/main/docs/verifying-releases.md#can-you-rebuild-it-yourself-yes--the-measurement). N/A would be wrong: boost ships wheels. |
269
268
 
270
269
  ### Test invocation and coverage
271
270
 
@@ -303,8 +302,6 @@ recruiting problem.
303
302
  - `bus_factor`, `contributors_unassociated`, `two_person_review` — **a second
304
303
  person**, sustained. Not a document, not a check, and not something to
305
304
  simulate with a second account.
306
- - `build_reproducible` — pin the release build toolchain, then normalise the
307
- sdist tarball.
308
305
  - `hardened_site` — host the documentation somewhere that lets you set
309
306
  response headers.
310
307
 
@@ -0,0 +1,72 @@
1
+ ---
2
+ id: cli-command-audit
3
+ board: code
4
+ section: shipped
5
+ status: shipped
6
+ category: Quality · CLI
7
+ complexity: M
8
+ impact: Med
9
+ wow: 3
10
+ note: audited all 80 COMMANDS entries against a disposable HOME; 4 real defects fixed with tests
11
+ order: 128
12
+ owner: loop/verify
13
+ pr:
14
+ title: All 80 <code>boost</code> commands audited against a disposable HOME &mdash; four defects fixed
15
+ ---
16
+ Every command in <code>boost_cli/cli.py</code>'s <code>COMMANDS</code> table (not memory of
17
+ what the CLI does) was exercised for real: <code>--help</code> against its actual
18
+ <code>argparse</code> definition, the happy path against its one-line summary and
19
+ <code>docs/commands.html</code>, exit codes on success/error/empty-store/nonexistent-name,
20
+ and &mdash; for anything that mutates state &mdash; the real lock file, symlinks and cache on
21
+ disk, not just stdout. Four parallel audits split the ~80 commands by
22
+ <code>COMMANDS</code>'s own groups (pkg+find, info+tap+ai, quality/safety, cfg+team) so
23
+ every command got adversarial testing (tampered store content, corrupted lock JSON,
24
+ deleted store dirs, real signed/tampered minisign manifests) rather than a clean-state
25
+ smoke pass.
26
+
27
+ The known failure modes this codebase has shipped before were hunted deliberately: a
28
+ command reporting success without doing the thing, a raw read that misses a tap's sparse
29
+ checkout, <code>Path.resolve(strict=True)</code>'s <code>RuntimeError</code>/<code>OSError</code>
30
+ split between Python 3.12 and 3.13+, and a dry-run that silently no-ops or over-reports.
31
+ <code>boost trust add</code> &mdash; the one command with a documented history of exactly the
32
+ first failure mode (a merged autofix once deleted its fingerprint line) &mdash; was
33
+ re-verified against real Ed25519 signatures and tampering and held up.
34
+
35
+ Four real defects, each fixed with a failing-then-passing test. <code>boost conflict</code>
36
+ and <code>boost audit --skills</code> kept reporting a MED conflict finding against a skill
37
+ after it was quarantined &mdash; quarantine's own documented purpose ("isolate a problematic
38
+ skill") gave no relief from the one command whose entire job is to report that condition;
39
+ both now exclude quarantined skills from conflict pairing. <code>boost catalog
40
+ --import</code> tells the receiver "<code>boost install</code> clones just the one registry
41
+ it needs", but <code>install</code> performed no lazy clone &mdash; the one end-to-end path the
42
+ command advertises (import &rarr; search &rarr; install) failed with a misleading "source
43
+ vanished from tap" error; <code>store.source_dir_for</code> now clones a
44
+ registered-but-uncloned tap on demand, the single choke point every consumer of tap content
45
+ already goes through. <code>boost onboard</code>'s own docstring promises a byte-for-byte
46
+ no-op on an unchanged re-run, but <code>.boost/telemetry.json</code> stamped a fresh
47
+ timestamp on every invocation, so the comparison could only pass by wall-clock luck &mdash; a
48
+ scripted <code>boost onboard --pr</code> on an already-onboarded repo would open a PR
49
+ containing only a timestamp bump, forever; it now preserves the existing file's
50
+ <code>created</code> field. <code>boost heal --dry-run</code> double-reported the same
51
+ broken symlink under two different messages ("would remove broken link" and "would remove
52
+ stale link") because the real run unlinks before computing <code>sync_plan()</code> while
53
+ dry-run never unlinks anything &mdash; a preview overstating what running <code>heal</code> for
54
+ real actually does.
55
+
56
+ A fifth, latent-only finding was fixed alongside them: <code>quality.py</code>'s
57
+ <code>_resolve_as_far_as_it_exists</code> caught only <code>OSError</code> around a
58
+ non-strict <code>Path.resolve()</code>, the same symlink-loop gap
59
+ <code>store.resolves_into_store</code> had already been fixed for. Verified empirically
60
+ (not just read) on both interpreters: <code>Path.resolve(strict=False)</code> on a
61
+ symlink-loop path returns silently on 3.14 and raises <code>RuntimeError</code> on 3.12 &mdash;
62
+ confirmed with a live symlink cycle on both, and the full affected test suite reran green
63
+ on a real Python 3.12 venv.
64
+
65
+ Two findings were investigated and deliberately left alone after checking the existing
66
+ test suite rather than trusting the audit's framing: <code>boost drift</code> always
67
+ exiting 0 is pinned as intentional by <code>tests/functional/test_cli_quality.py</code>'s
68
+ own comment ("rc stays 0: drift only reports"), and <code>boost who</code>'s aggregate view
69
+ counting every journal subject (not just install/edit/evolve/distill/tag actions) toward
70
+ "skill expertise" is pinned the same way by an existing test asserting a tap name in the
71
+ skills set. Flipping either would contradict a deliberately written existing test, not fix
72
+ an oversight.
@@ -0,0 +1,62 @@
1
+ ---
2
+ id: reproducible-release-artifacts
3
+ board: code
4
+ section: pipeline
5
+ status: shipped
6
+ category: Security · Reproducibility
7
+ complexity: M
8
+ impact: Med
9
+ wow: 3
10
+ note: wheel + sdist now bit-identical; setuptools#2133 has no native fix
11
+ order: 128
12
+ owner: loop/repro
13
+ pr:
14
+ title: Reproducible release builds — the sdist half nobody's setuptools does for you
15
+ ---
16
+ <code>build_reproducible</code> was Unmet on measurement: with <code>SOURCE_DATE_EPOCH</code> set,
17
+ two builds of the same commit produced a <b>bit-identical wheel</b> and a <b>differing
18
+ sdist</b>. <code>setuptools</code> writes each tar member's real build-time mtime, and the
19
+ builder's <code>uid</code>/<code>gid</code>/user name, into the sdist with no environment
20
+ variable to override either &mdash; 54 members differed between builds two seconds apart on the
21
+ same machine, and a build on another machine would have differed in the ownership fields too.
22
+
23
+ <b>The upstream knob doesn't exist.</b> <a href="https://github.com/pypa/setuptools/issues/2133">
24
+ pypa/setuptools#2133</a> has asked for <code>SOURCE_DATE_EPOCH</code> support in sdist since 2020;
25
+ it is still open, with no fix in the version this project pins. The one PyPI package that already
26
+ patches it, <code>setuptools-reproducible</code>, does so by replacing
27
+ <code>build-backend</code> entirely &mdash; and its dependency closure could not be hash-pinned
28
+ the way the rest of boost's toolchain is, because <code>[build-system].requires</code> is a bare
29
+ PEP&nbsp;508 requirement string with no hash field. So the fix is a small, stdlib-only
30
+ post-processing step instead: <code>scripts/normalize_sdist.py</code> clamps every member's
31
+ mtime, zeroes uid/gid, blanks uname/gname, and resets the gzip container's own header
32
+ timestamp, run in <code>publish.yml</code> between <code>python -m build</code> and
33
+ <code>twine check</code> &mdash; so nothing is ever attested un-normalized.
34
+
35
+ <b>The wheel had a real gap too, not just the sdist.</b> <code>publish.yml</code> never set
36
+ <code>SOURCE_DATE_EPOCH</code> at all before this &mdash; the "bit-identical wheel" measurement
37
+ only held in a controlled local test where the variable was exported by hand. The actual release
38
+ pipeline was building an unreproducible wheel as well, and nothing had noticed.
39
+
40
+ <b>The toolchain that determines the bytes is now pinned twice.</b>
41
+ <code>requirements/release-tools.txt</code> hash-pins the outer <code>build</code>/
42
+ <code>twine</code> install (<code>publish.yml</code> used to run
43
+ <code>pip install build twine</code> unpinned, so last month's toolchain was not recoverable
44
+ from the repository). But <code>python -m build</code> resolves <code>setuptools</code> and
45
+ <code>setuptools-scm</code> fresh into an isolated build environment regardless of what the
46
+ outer install has &mdash; that's the part that actually produces the artifact bytes &mdash; so
47
+ <code>pyproject.toml</code>'s <code>[build-system].requires</code> is now exact-pinned
48
+ (<code>setuptools==83.0.0</code>, <code>setuptools-scm==10.2.1</code>) rather than left as
49
+ <code>&gt;=64</code>/<code>&gt;=8</code>. No hash field exists at that layer; exact-pinning is
50
+ the strongest promise PEP 508 allows there.
51
+
52
+ <b>Falsifiable, not asserted.</b> <code>scripts/check_reproducible.py</code> builds the project
53
+ twice with the same <code>SOURCE_DATE_EPOCH</code>, runs the same sdist fix the release pipeline
54
+ runs, and diffs the results by sha256 &mdash; <code>--skip-normalize</code> reruns without the fix
55
+ to show the gap it closes. Degrades to exit&nbsp;2 ("could not check") rather than exit&nbsp;0
56
+ when <code>build</code> isn't installed, matching how boost's own CI controls have failed
57
+ silently before: a check that can't run must never read as a pass.
58
+
59
+ <code>docs/openssf-badge.md</code>'s <code>build_reproducible</code> row now reads <b>Met</b>;
60
+ <code>docs/verifying-releases.md</code> carries the re-run measurement and how to rebuild from a
61
+ git tag (the sdist itself carries no <code>.git</code> history, so <code>SOURCE_DATE_EPOCH</code>
62
+ has to come from a checkout, not the tarball).
@@ -130,10 +130,10 @@
130
130
  <section class="block reveal">
131
131
  <div class="stats">
132
132
  <!-- ROADMAP:stats -->
133
- <div class="stat"><b>16</b><span>Shipped</span></div>
133
+ <div class="stat"><b>17</b><span>Shipped</span></div>
134
134
  <div class="stat"><b>1</b><span>Next up</span></div>
135
135
  <div class="stat"><b>7</b><span>Planned</span></div>
136
- <div class="stat"><b>276</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>278</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -448,6 +448,75 @@ message, so routing it through the helper would change user-facing errors.</p></
448
448
  <span class="m">helper dedup + double-parse removed</span>
449
449
  </div>
450
450
  </article>
451
+
452
+ <article class="cap rcard" id="cli-command-audit">
453
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Quality · CLI</span></div>
454
+ <h3>All 80 <code>boost</code> commands audited against a disposable HOME &mdash; four defects fixed</h3>
455
+ <details class="cardbody"><summary>Write-up</summary>
456
+ <p>Every command in <code>boost_cli/cli.py</code>'s <code>COMMANDS</code> table (not memory of
457
+ what the CLI does) was exercised for real: <code>--help</code> against its actual
458
+ <code>argparse</code> definition, the happy path against its one-line summary and
459
+ <code>docs/commands.html</code>, exit codes on success/error/empty-store/nonexistent-name,
460
+ and &mdash; for anything that mutates state &mdash; the real lock file, symlinks and cache on
461
+ disk, not just stdout. Four parallel audits split the ~80 commands by
462
+ <code>COMMANDS</code>'s own groups (pkg+find, info+tap+ai, quality/safety, cfg+team) so
463
+ every command got adversarial testing (tampered store content, corrupted lock JSON,
464
+ deleted store dirs, real signed/tampered minisign manifests) rather than a clean-state
465
+ smoke pass.
466
+
467
+ The known failure modes this codebase has shipped before were hunted deliberately: a
468
+ command reporting success without doing the thing, a raw read that misses a tap's sparse
469
+ checkout, <code>Path.resolve(strict=True)</code>'s <code>RuntimeError</code>/<code>OSError</code>
470
+ split between Python 3.12 and 3.13+, and a dry-run that silently no-ops or over-reports.
471
+ <code>boost trust add</code> &mdash; the one command with a documented history of exactly the
472
+ first failure mode (a merged autofix once deleted its fingerprint line) &mdash; was
473
+ re-verified against real Ed25519 signatures and tampering and held up.
474
+
475
+ Four real defects, each fixed with a failing-then-passing test. <code>boost conflict</code>
476
+ and <code>boost audit --skills</code> kept reporting a MED conflict finding against a skill
477
+ after it was quarantined &mdash; quarantine's own documented purpose ("isolate a problematic
478
+ skill") gave no relief from the one command whose entire job is to report that condition;
479
+ both now exclude quarantined skills from conflict pairing. <code>boost catalog
480
+ --import</code> tells the receiver "<code>boost install</code> clones just the one registry
481
+ it needs", but <code>install</code> performed no lazy clone &mdash; the one end-to-end path the
482
+ command advertises (import &rarr; search &rarr; install) failed with a misleading "source
483
+ vanished from tap" error; <code>store.source_dir_for</code> now clones a
484
+ registered-but-uncloned tap on demand, the single choke point every consumer of tap content
485
+ already goes through. <code>boost onboard</code>'s own docstring promises a byte-for-byte
486
+ no-op on an unchanged re-run, but <code>.boost/telemetry.json</code> stamped a fresh
487
+ timestamp on every invocation, so the comparison could only pass by wall-clock luck &mdash; a
488
+ scripted <code>boost onboard --pr</code> on an already-onboarded repo would open a PR
489
+ containing only a timestamp bump, forever; it now preserves the existing file's
490
+ <code>created</code> field. <code>boost heal --dry-run</code> double-reported the same
491
+ broken symlink under two different messages ("would remove broken link" and "would remove
492
+ stale link") because the real run unlinks before computing <code>sync_plan()</code> while
493
+ dry-run never unlinks anything &mdash; a preview overstating what running <code>heal</code> for
494
+ real actually does.
495
+
496
+ A fifth, latent-only finding was fixed alongside them: <code>quality.py</code>'s
497
+ <code>_resolve_as_far_as_it_exists</code> caught only <code>OSError</code> around a
498
+ non-strict <code>Path.resolve()</code>, the same symlink-loop gap
499
+ <code>store.resolves_into_store</code> had already been fixed for. Verified empirically
500
+ (not just read) on both interpreters: <code>Path.resolve(strict=False)</code> on a
501
+ symlink-loop path returns silently on 3.14 and raises <code>RuntimeError</code> on 3.12 &mdash;
502
+ confirmed with a live symlink cycle on both, and the full affected test suite reran green
503
+ on a real Python 3.12 venv.
504
+
505
+ Two findings were investigated and deliberately left alone after checking the existing
506
+ test suite rather than trusting the audit's framing: <code>boost drift</code> always
507
+ exiting 0 is pinned as intentional by <code>tests/functional/test_cli_quality.py</code>'s
508
+ own comment ("rc stays 0: drift only reports"), and <code>boost who</code>'s aggregate view
509
+ counting every journal subject (not just install/edit/evolve/distill/tag actions) toward
510
+ "skill expertise" is pinned the same way by an existing test asserting a tap name in the
511
+ skills set. Flipping either would contradict a deliberately written existing test, not fix
512
+ an oversight.</p></details>
513
+ <div class="meta">
514
+ <span class="m">Complexity <b>M</b></span>
515
+ <span class="m">Impact <b>Med</b></span>
516
+ <span class="m">Wow <b class="wow">★★★</b></span>
517
+ <span class="m">audited all 80 COMMANDS entries against a disposable HOME; 4 real defects fixed with tests</span>
518
+ </div>
519
+ </article>
451
520
  <!-- /ROADMAP:cards -->
452
521
 
453
522
  </div>
@@ -7389,6 +7458,65 @@ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.</
7389
7458
  <span class="m">a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still</span>
7390
7459
  </div>
7391
7460
  </article>
7461
+
7462
+ <article class="cap rcard" id="reproducible-release-artifacts">
7463
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Security · Reproducibility</span></div>
7464
+ <h3>Reproducible release builds — the sdist half nobody's setuptools does for you</h3>
7465
+ <details class="cardbody"><summary>Write-up</summary>
7466
+ <p><code>build_reproducible</code> was Unmet on measurement: with <code>SOURCE_DATE_EPOCH</code> set,
7467
+ two builds of the same commit produced a <b>bit-identical wheel</b> and a <b>differing
7468
+ sdist</b>. <code>setuptools</code> writes each tar member's real build-time mtime, and the
7469
+ builder's <code>uid</code>/<code>gid</code>/user name, into the sdist with no environment
7470
+ variable to override either &mdash; 54 members differed between builds two seconds apart on the
7471
+ same machine, and a build on another machine would have differed in the ownership fields too.
7472
+
7473
+ <b>The upstream knob doesn't exist.</b> <a href="https://github.com/pypa/setuptools/issues/2133">
7474
+ pypa/setuptools#2133</a> has asked for <code>SOURCE_DATE_EPOCH</code> support in sdist since 2020;
7475
+ it is still open, with no fix in the version this project pins. The one PyPI package that already
7476
+ patches it, <code>setuptools-reproducible</code>, does so by replacing
7477
+ <code>build-backend</code> entirely &mdash; and its dependency closure could not be hash-pinned
7478
+ the way the rest of boost's toolchain is, because <code>[build-system].requires</code> is a bare
7479
+ PEP&nbsp;508 requirement string with no hash field. So the fix is a small, stdlib-only
7480
+ post-processing step instead: <code>scripts/normalize_sdist.py</code> clamps every member's
7481
+ mtime, zeroes uid/gid, blanks uname/gname, and resets the gzip container's own header
7482
+ timestamp, run in <code>publish.yml</code> between <code>python -m build</code> and
7483
+ <code>twine check</code> &mdash; so nothing is ever attested un-normalized.
7484
+
7485
+ <b>The wheel had a real gap too, not just the sdist.</b> <code>publish.yml</code> never set
7486
+ <code>SOURCE_DATE_EPOCH</code> at all before this &mdash; the "bit-identical wheel" measurement
7487
+ only held in a controlled local test where the variable was exported by hand. The actual release
7488
+ pipeline was building an unreproducible wheel as well, and nothing had noticed.
7489
+
7490
+ <b>The toolchain that determines the bytes is now pinned twice.</b>
7491
+ <code>requirements/release-tools.txt</code> hash-pins the outer <code>build</code>/
7492
+ <code>twine</code> install (<code>publish.yml</code> used to run
7493
+ <code>pip install build twine</code> unpinned, so last month's toolchain was not recoverable
7494
+ from the repository). But <code>python -m build</code> resolves <code>setuptools</code> and
7495
+ <code>setuptools-scm</code> fresh into an isolated build environment regardless of what the
7496
+ outer install has &mdash; that's the part that actually produces the artifact bytes &mdash; so
7497
+ <code>pyproject.toml</code>'s <code>[build-system].requires</code> is now exact-pinned
7498
+ (<code>setuptools==83.0.0</code>, <code>setuptools-scm==10.2.1</code>) rather than left as
7499
+ <code>&gt;=64</code>/<code>&gt;=8</code>. No hash field exists at that layer; exact-pinning is
7500
+ the strongest promise PEP 508 allows there.
7501
+
7502
+ <b>Falsifiable, not asserted.</b> <code>scripts/check_reproducible.py</code> builds the project
7503
+ twice with the same <code>SOURCE_DATE_EPOCH</code>, runs the same sdist fix the release pipeline
7504
+ runs, and diffs the results by sha256 &mdash; <code>--skip-normalize</code> reruns without the fix
7505
+ to show the gap it closes. Degrades to exit&nbsp;2 ("could not check") rather than exit&nbsp;0
7506
+ when <code>build</code> isn't installed, matching how boost's own CI controls have failed
7507
+ silently before: a check that can't run must never read as a pass.
7508
+
7509
+ <code>docs/openssf-badge.md</code>'s <code>build_reproducible</code> row now reads <b>Met</b>;
7510
+ <code>docs/verifying-releases.md</code> carries the re-run measurement and how to rebuild from a
7511
+ git tag (the sdist itself carries no <code>.git</code> history, so <code>SOURCE_DATE_EPOCH</code>
7512
+ has to come from a checkout, not the tarball).</p></details>
7513
+ <div class="meta">
7514
+ <span class="m">Complexity <b>M</b></span>
7515
+ <span class="m">Impact <b>Med</b></span>
7516
+ <span class="m">Wow <b class="wow">★★★</b></span>
7517
+ <span class="m">wheel + sdist now bit-identical; setuptools#2133 has no native fix</span>
7518
+ </div>
7519
+ </article>
7392
7520
  <!-- /ROADMAP:cards -->
7393
7521
 
7394
7522
  </div>