boost-skill-cli 1.2.35__tar.gz → 1.2.36__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 (794) hide show
  1. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/Makefile +2 -0
  2. {boost_skill_cli-1.2.35/boost_skill_cli.egg-info → boost_skill_cli-1.2.36}/PKG-INFO +1 -1
  3. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/SOURCES.txt +9 -0
  6. boost_skill_cli-1.2.36/docs/roadmap/items/vex-openvex-feed.md +39 -0
  7. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap.html +37 -1
  8. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/security-design.md +37 -0
  9. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/verifying-releases.md +9 -0
  10. boost_skill_cli-1.2.36/docs/vex/meta.md +12 -0
  11. boost_skill_cli-1.2.36/docs/vex/openvex.json +61 -0
  12. boost_skill_cli-1.2.36/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +15 -0
  13. boost_skill_cli-1.2.36/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +22 -0
  14. boost_skill_cli-1.2.36/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +17 -0
  15. boost_skill_cli-1.2.36/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +20 -0
  16. boost_skill_cli-1.2.36/scripts/build_vex.py +175 -0
  17. boost_skill_cli-1.2.36/tests/unit/test_vex.py +266 -0
  18. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.gitattributes +0 -0
  19. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.gitignore +0 -0
  20. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.gitleaks.toml +0 -0
  21. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.htmlvalidate.json +0 -0
  22. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.lighthouserc.json +0 -0
  23. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.lycheeignore +0 -0
  24. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.markdownlint-cli2.jsonc +0 -0
  25. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.pre-commit-config.yaml +0 -0
  26. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.stylelintrc.json +0 -0
  27. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale/styles/boost/AIWriting.yml +0 -0
  28. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale/styles/boost/Terminology.yml +0 -0
  29. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  30. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale.ini +0 -0
  31. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/CLAUDE.md +0 -0
  32. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/CODE_OF_CONDUCT.md +0 -0
  33. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/CONTRIBUTING.md +0 -0
  34. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/DCO +0 -0
  35. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/GOVERNANCE.md +0 -0
  36. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/LICENSE +0 -0
  37. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/MAINTAINERS.md +0 -0
  38. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/MANIFEST.in +0 -0
  39. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/README.md +0 -0
  40. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/SECURITY.md +0 -0
  41. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/SUPPORT.md +0 -0
  42. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost +0 -0
  43. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/__init__.py +0 -0
  44. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/__main__.py +0 -0
  45. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/cli.py +0 -0
  46. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/cliparse.py +0 -0
  47. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/__init__.py +0 -0
  48. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/_common.py +0 -0
  49. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/bmad.py +0 -0
  50. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/configuration.py +0 -0
  51. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/discovery.py +0 -0
  52. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/hooks.py +0 -0
  53. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/info.py +0 -0
  54. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/intelligence.py +0 -0
  55. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/pkg.py +0 -0
  56. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/quality.py +0 -0
  57. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/run.py +0 -0
  58. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/safety.py +0 -0
  59. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/taps.py +0 -0
  60. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/team.py +0 -0
  61. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/__init__.py +0 -0
  62. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/adapters.py +0 -0
  63. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/agents.py +0 -0
  64. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/ai.py +0 -0
  65. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/bmad.py +0 -0
  66. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/bootstrap.py +0 -0
  67. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/browse.py +0 -0
  68. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/builtin.py +0 -0
  69. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/capabilities.py +0 -0
  70. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/catalog.py +0 -0
  71. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/catalogbundle.py +0 -0
  72. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/chat.py +0 -0
  73. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/claude_settings.py +0 -0
  74. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/complete.py +0 -0
  75. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/config.py +0 -0
  76. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/dense.py +0 -0
  77. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/ed25519.py +0 -0
  78. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/embed.py +0 -0
  79. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/faithfulness.py +0 -0
  80. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/frontmatter.py +0 -0
  81. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/gitutil.py +0 -0
  82. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/hookhost.py +0 -0
  83. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/imperative.py +0 -0
  84. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/injectscan.py +0 -0
  85. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/installscan.py +0 -0
  86. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/integrity.py +0 -0
  87. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/journal.py +0 -0
  88. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/localembed.py +0 -0
  89. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/lockfile.py +0 -0
  90. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/logs.py +0 -0
  91. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/mcp.py +0 -0
  92. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/mcpdecl.py +0 -0
  93. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/mcphost.py +0 -0
  94. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/minisign.py +0 -0
  95. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/nethttp.py +0 -0
  96. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/output.py +0 -0
  97. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/paths.py +0 -0
  98. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/policy.py +0 -0
  99. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/projectlock.py +0 -0
  100. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/provenance.py +0 -0
  101. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/rag.py +0 -0
  102. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/registry.py +0 -0
  103. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/resolve.py +0 -0
  104. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/rules.py +0 -0
  105. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/scopes.py +0 -0
  106. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/secretscan.py +0 -0
  107. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/selfupdate.py +0 -0
  108. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/serve.py +0 -0
  109. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/stackprobe.py +0 -0
  110. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/staleness.py +0 -0
  111. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/store.py +0 -0
  112. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/trustaudit.py +0 -0
  113. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/typosquat.py +0 -0
  114. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/updatediff.py +0 -0
  115. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/util.py +0 -0
  116. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/workflows.py +0 -0
  117. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/data/registries.json +0 -0
  118. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/data/rules/boost-first.mdc +0 -0
  119. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/errors.py +0 -0
  120. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/spin.py +0 -0
  121. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/__init__.py +0 -0
  122. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/_compat.py +0 -0
  123. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/graph.py +0 -0
  124. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/loader.py +0 -0
  125. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/py.typed +0 -0
  126. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/retriever.py +0 -0
  127. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  128. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  129. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/requires.txt +0 -0
  130. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/top_level.txt +0 -0
  131. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/codecov.yml +0 -0
  132. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/.claude/settings.local.json +0 -0
  133. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/DEBUGGING.md +0 -0
  134. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/adapters.html +0 -0
  135. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/README.md +0 -0
  136. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-components-core.md +0 -0
  137. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-containers.md +0 -0
  138. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-context.md +0 -0
  139. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-dynamic-install.md +0 -0
  140. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/bmad.md +0 -0
  141. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/distill.gif +0 -0
  142. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/doctor.gif +0 -0
  143. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/explain.gif +0 -0
  144. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/hooks.gif +0 -0
  145. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/install.gif +0 -0
  146. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/pulse.gif +0 -0
  147. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/search.gif +0 -0
  148. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/tap.gif +0 -0
  149. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/distill.tape +0 -0
  150. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/doctor.tape +0 -0
  151. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/explain.tape +0 -0
  152. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/hooks.tape +0 -0
  153. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/install.tape +0 -0
  154. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/pulse.tape +0 -0
  155. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/search.tape +0 -0
  156. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/tap.tape +0 -0
  157. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel.html +0 -0
  158. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/chat.html +0 -0
  159. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/code-review.md +0 -0
  160. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/commands.html +0 -0
  161. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/commit-audit.md +0 -0
  162. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo-index.json +0 -0
  163. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo.gif +0 -0
  164. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo.html +0 -0
  165. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo.tape +0 -0
  166. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/dependencies.md +0 -0
  167. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/design-roadmap.html +0 -0
  168. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/eval-latest.json +0 -0
  169. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/eval.html +0 -0
  170. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/index.html +0 -0
  171. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/langchain.html +0 -0
  172. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/mcp-hub.html +0 -0
  173. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/openssf-badge.md +0 -0
  174. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/openssf-playbook.md +0 -0
  175. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/rag-architecture.md +0 -0
  176. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D01.md +0 -0
  177. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D02.md +0 -0
  178. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D03.md +0 -0
  179. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D04.md +0 -0
  180. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D05.md +0 -0
  181. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D06.md +0 -0
  182. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D07.md +0 -0
  183. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D08.md +0 -0
  184. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D09.md +0 -0
  185. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D10.md +0 -0
  186. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D11.md +0 -0
  187. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D12.md +0 -0
  188. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D13.md +0 -0
  189. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D14.md +0 -0
  190. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D15.md +0 -0
  191. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D16.md +0 -0
  192. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D17.md +0 -0
  193. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D18.md +0 -0
  194. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D19.md +0 -0
  195. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D20.md +0 -0
  196. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D21.md +0 -0
  197. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D22.md +0 -0
  198. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D23.md +0 -0
  199. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D24.md +0 -0
  200. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D25.md +0 -0
  201. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D26.md +0 -0
  202. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  203. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  204. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  205. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  206. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  207. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  208. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  209. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  210. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  211. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  212. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  213. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  214. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  215. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  216. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-first-rule.md +0 -0
  217. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  218. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  219. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/branch-current-gate.md +0 -0
  220. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  221. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  222. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  223. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  224. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  225. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  226. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  227. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  228. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  229. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  230. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  231. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  232. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  233. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  234. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cli-command-audit.md +0 -0
  235. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  236. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  237. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  238. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  239. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/command-carousel-page.md +0 -0
  240. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  241. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  242. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  243. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  244. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  245. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  246. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  247. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  248. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  249. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  250. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  251. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  252. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  253. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  254. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  255. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  256. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  257. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  258. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  259. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  260. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  261. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  262. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  263. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  264. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  265. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  266. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  267. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  268. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  269. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  270. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  271. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  272. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  273. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  274. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  275. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  276. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  277. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  278. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  279. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  280. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  281. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  282. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  283. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  284. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  285. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  286. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  287. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  288. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  289. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  290. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/github-community-health-files.md +0 -0
  291. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  292. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  293. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  294. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  295. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  296. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  297. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  298. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  299. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  300. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  301. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  302. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  303. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  304. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  305. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  306. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  307. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  308. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  309. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  310. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  311. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  312. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  313. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  314. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  315. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  316. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  317. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  318. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  319. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  320. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  321. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  322. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  323. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  324. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  325. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  326. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  327. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  328. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  329. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  330. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  331. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  332. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  333. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  334. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  335. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  336. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  337. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  338. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  339. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  340. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  341. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  342. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  343. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  344. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  345. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  346. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  347. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  348. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  349. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  350. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  351. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  352. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  353. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  354. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  355. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  356. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  357. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  358. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  359. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  360. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  361. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  362. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  363. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  364. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  365. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  366. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-playbook.md +0 -0
  367. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-silver.md +0 -0
  368. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  369. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  370. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  371. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  372. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  373. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  374. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  375. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  376. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  377. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  378. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  379. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  380. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  381. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  382. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  383. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  384. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  385. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  386. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  387. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  388. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  389. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  390. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  391. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  392. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  393. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  394. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  395. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  396. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  397. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  398. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  399. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  400. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  401. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  402. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  403. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  404. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  405. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  406. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  407. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  408. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  409. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  410. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  411. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  412. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  413. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  414. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  415. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  416. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  417. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  418. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  419. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  420. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  421. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  422. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  423. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  424. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  425. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  426. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  427. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  428. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  429. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  430. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  431. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  432. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  433. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  434. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  435. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  436. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  437. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  438. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  439. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  440. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  441. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  442. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  443. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  444. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  445. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  446. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  447. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  448. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  449. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  450. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  451. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  452. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  453. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  454. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  455. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  456. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  457. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  458. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  459. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  460. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  461. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  462. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  463. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  464. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  465. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  466. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  467. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  468. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  469. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  470. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  471. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  472. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  473. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  474. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  475. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  476. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  477. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workspace-scope-install.md +0 -0
  478. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/zip-strict-audit.md +0 -0
  479. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  480. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  481. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/semantic-search.md +0 -0
  482. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  483. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/eslint.config.mjs +0 -0
  484. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/README.md +0 -0
  485. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/__init__.py +0 -0
  486. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/baseline.json +0 -0
  487. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/faithfulness.py +0 -0
  488. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/golden_set.json +0 -0
  489. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/make_corpus.py +0 -0
  490. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/make_golden.py +0 -0
  491. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/metrics.py +0 -0
  492. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/publish_golden_dataset.py +0 -0
  493. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/run_evals.py +0 -0
  494. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/examples/README.md +0 -0
  495. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/examples/adapt-demo.sh +0 -0
  496. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/examples/boost-run-prototype.sh +0 -0
  497. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/index.html +0 -0
  498. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/noxfile.py +0 -0
  499. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/pyproject.toml +0 -0
  500. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/coverage-tools.in +0 -0
  501. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/coverage-tools.txt +0 -0
  502. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/lint-tools.in +0 -0
  503. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/lint-tools.txt +0 -0
  504. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/mutation-tools.in +0 -0
  505. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/mutation-tools.txt +0 -0
  506. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/platform-pins.lock +0 -0
  507. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/release-tools.in +0 -0
  508. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/release-tools.txt +0 -0
  509. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/test-tools.in +0 -0
  510. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/test-tools.txt +0 -0
  511. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/a11y_check.py +0 -0
  512. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/add_spdx_headers.py +0 -0
  513. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/bench_cli.sh +0 -0
  514. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_command_reference.py +0 -0
  515. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_demo_index.py +0 -0
  516. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_registries.py +0 -0
  517. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_roadmap.py +0 -0
  518. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_scale_corpus.py +0 -0
  519. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_anchors.py +0 -0
  520. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_branch_current.py +0 -0
  521. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_dco.py +0 -0
  522. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_licenses.py +0 -0
  523. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_reproducible.py +0 -0
  524. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_required_checks.py +0 -0
  525. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/ensure_eval_corpus.sh +0 -0
  526. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_corpus.py +0 -0
  527. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_explain.py +0 -0
  528. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_gate.py +0 -0
  529. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_recommend.py +0 -0
  530. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_retrieval.py +0 -0
  531. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_stats_summary.py +0 -0
  532. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/import_budget.py +0 -0
  533. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/lock_toolchain.py +0 -0
  534. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/measure_registry.py +0 -0
  535. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/mutation_gate.py +0 -0
  536. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/mutation_shards.py +0 -0
  537. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/mutation_weights.json +0 -0
  538. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/normalize_sdist.py +0 -0
  539. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/page_budget.py +0 -0
  540. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/perf_gate.py +0 -0
  541. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/post_deploy_smoke.py +0 -0
  542. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/publish_eval_json.py +0 -0
  543. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/release_guard.py +0 -0
  544. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/release_preflight.py +0 -0
  545. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/serve_docs.py +0 -0
  546. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/setup.cfg +0 -0
  547. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/sonar-project.properties +0 -0
  548. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/README.md +0 -0
  549. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/boost.css +0 -0
  550. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/boost.js +0 -0
  551. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/demo.html +0 -0
  552. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/adapt.feature +0 -0
  553. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/browse.feature +0 -0
  554. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/count.feature +0 -0
  555. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/discover.feature +0 -0
  556. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/doctor.feature +0 -0
  557. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/environment.py +0 -0
  558. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/explain.feature +0 -0
  559. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/index.feature +0 -0
  560. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/install.feature +0 -0
  561. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/list.feature +0 -0
  562. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/mcp.feature +0 -0
  563. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/search.feature +0 -0
  564. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/cli_steps.py +0 -0
  565. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/discovery_steps.py +0 -0
  566. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/mcp_steps.py +0 -0
  567. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/quality_steps.py +0 -0
  568. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/conftest.py +0 -0
  569. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/baseline.json +0 -0
  570. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/explain.jsonl +0 -0
  571. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/golden-natural.jsonl +0 -0
  572. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/golden.jsonl +0 -0
  573. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/recommend.jsonl +0 -0
  574. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/taps-scale.txt +0 -0
  575. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/taps.txt +0 -0
  576. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_capabilities_policy.py +0 -0
  577. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_adapt.py +0 -0
  578. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_bmad.py +0 -0
  579. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_catalog.py +0 -0
  580. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_chat.py +0 -0
  581. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_configuration.py +0 -0
  582. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_discovery.py +0 -0
  583. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_hooks.py +0 -0
  584. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_hooks_gemini.py +0 -0
  585. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_info.py +0 -0
  586. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_intelligence.py +0 -0
  587. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_pane_width.py +0 -0
  588. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_pkg.py +0 -0
  589. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_quality.py +0 -0
  590. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_taps.py +0 -0
  591. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_team.py +0 -0
  592. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_everyday_loop.py +0 -0
  593. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_integrity_enforce.py +0 -0
  594. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_kind_conformance.py +0 -0
  595. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_property_parsers.py +0 -0
  596. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_run.py +0 -0
  597. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_tap_signing.py +0 -0
  598. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_workspace_scope.py +0 -0
  599. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/README.md +0 -0
  600. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  601. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  602. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  603. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  604. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  605. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  606. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  607. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  608. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  609. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  610. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  611. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  612. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  613. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  614. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  615. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  616. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  617. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  618. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  619. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  620. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  621. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  622. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  623. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/fuzz_frontmatter.py +0 -0
  624. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/fuzz_registry.py +0 -0
  625. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/conftest.py +0 -0
  626. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/test_graph.py +0 -0
  627. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/test_loader.py +0 -0
  628. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/test_retriever.py +0 -0
  629. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/make_fixture.py +0 -0
  630. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/perf/test_benchmarks.py +0 -0
  631. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/smoke.sh +0 -0
  632. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_a11y_check.py +0 -0
  633. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_action_pin_lockstep.py +0 -0
  634. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_adapters.py +0 -0
  635. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_adapters_multi.py +0 -0
  636. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_adapters_runner.py +0 -0
  637. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_agents.py +0 -0
  638. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_ai.py +0 -0
  639. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_bmad_core.py +0 -0
  640. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_boost_first_offer.py +0 -0
  641. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_bootstrap.py +0 -0
  642. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_branch_current.py +0 -0
  643. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_browse.py +0 -0
  644. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_builtin.py +0 -0
  645. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_capabilities.py +0 -0
  646. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_catalog.py +0 -0
  647. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_catalogbundle.py +0 -0
  648. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_chat.py +0 -0
  649. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_anchors.py +0 -0
  650. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_dco.py +0 -0
  651. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_licenses.py +0 -0
  652. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_reproducible.py +0 -0
  653. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_claude_settings.py +0 -0
  654. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_clean_internal_cache.py +0 -0
  655. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_cliparse.py +0 -0
  656. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_codeql_analysis_key.py +0 -0
  657. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_command_reference_fresh.py +0 -0
  658. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_community_health_files.py +0 -0
  659. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_compact.py +0 -0
  660. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_complete.py +0 -0
  661. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_complete_rc_block.py +0 -0
  662. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_config.py +0 -0
  663. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_content_dedupe.py +0 -0
  664. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_content_identity.py +0 -0
  665. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_crash_redaction.py +0 -0
  666. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dedup_trust.py +0 -0
  667. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_demo_index.py +0 -0
  668. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense.py +0 -0
  669. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_embed_dedupe.py +0 -0
  670. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_fallback.py +0 -0
  671. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_fix_hint.py +0 -0
  672. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_quantized.py +0 -0
  673. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_ready_order.py +0 -0
  674. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_shard_real_schema.py +0 -0
  675. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  676. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_shards.py +0 -0
  677. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_status.py +0 -0
  678. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_status_cheap.py +0 -0
  679. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dependabot_config.py +0 -0
  680. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_docs_pages_linked.py +0 -0
  681. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_docsite_chrome.py +0 -0
  682. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_ed25519.py +0 -0
  683. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_embed.py +0 -0
  684. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_embed_local.py +0 -0
  685. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_embed_truncated_response.py +0 -0
  686. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_entry_key.py +0 -0
  687. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_errors_and_cli_table.py +0 -0
  688. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_baseline.py +0 -0
  689. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_corpus.py +0 -0
  690. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_faithfulness.py +0 -0
  691. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_gate.py +0 -0
  692. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_grading.py +0 -0
  693. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_metrics.py +0 -0
  694. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_stats_summary.py +0 -0
  695. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  696. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_faithfulness.py +0 -0
  697. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_frontmatter.py +0 -0
  698. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_fuzz_targets.py +0 -0
  699. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  700. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitleaks_config.py +0 -0
  701. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitutil.py +0 -0
  702. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitutil_lfs.py +0 -0
  703. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitutil_sparse.py +0 -0
  704. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_hook_settings_hosts.py +0 -0
  705. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_hookhost.py +0 -0
  706. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_imperative.py +0 -0
  707. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_import_budget.py +0 -0
  708. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_injectscan.py +0 -0
  709. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_install_permission_error.py +0 -0
  710. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_installscan.py +0 -0
  711. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_integrity.py +0 -0
  712. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_journal.py +0 -0
  713. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_langchain_packaging.py +0 -0
  714. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_link_ownership.py +0 -0
  715. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_localembed.py +0 -0
  716. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_localembed_e2e.py +0 -0
  717. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_lockfile.py +0 -0
  718. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_logs.py +0 -0
  719. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_marketing_counts.py +0 -0
  720. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcp.py +0 -0
  721. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcp_install_scan.py +0 -0
  722. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcpdecl.py +0 -0
  723. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcphost.py +0 -0
  724. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_measure_registry.py +0 -0
  725. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_minisign.py +0 -0
  726. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutation_hardening.py +0 -0
  727. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutation_shards.py +0 -0
  728. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutation_subfile_shards.py +0 -0
  729. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutmut_source_paths.py +0 -0
  730. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_nethttp.py +0 -0
  731. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_normalize_sdist.py +0 -0
  732. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_output.py +0 -0
  733. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_page_budget.py +0 -0
  734. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_paths.py +0 -0
  735. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_perf_gate.py +0 -0
  736. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_pkg_confusions.py +0 -0
  737. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_pkg_injection.py +0 -0
  738. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_pkg_secrets.py +0 -0
  739. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_platform_pins.py +0 -0
  740. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_policy.py +0 -0
  741. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_post_deploy_smoke.py +0 -0
  742. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_project_mcp_sidecar.py +0 -0
  743. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_projectlock.py +0 -0
  744. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_provenance.py +0 -0
  745. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_publish_golden_dataset.py +0 -0
  746. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rag.py +0 -0
  747. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rag_fastpath.py +0 -0
  748. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rag_fusion.py +0 -0
  749. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registries_fresh.py +0 -0
  750. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registry.py +0 -0
  751. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registry_categories.py +0 -0
  752. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registry_control_chars.py +0 -0
  753. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_release_guard.py +0 -0
  754. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_release_preflight.py +0 -0
  755. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_required_checks.py +0 -0
  756. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rerank_cache.py +0 -0
  757. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_resolve.py +0 -0
  758. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_roadmap_fresh.py +0 -0
  759. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rules.py +0 -0
  760. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_scale_corpus.py +0 -0
  761. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_scopes.py +0 -0
  762. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_secretscan.py +0 -0
  763. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_selfupdate.py +0 -0
  764. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_serve.py +0 -0
  765. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_serve_docs.py +0 -0
  766. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_shards_matrix.py +0 -0
  767. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_smoke_covers_every_command.py +0 -0
  768. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_spdx_headers.py +0 -0
  769. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_spin.py +0 -0
  770. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_stackprobe.py +0 -0
  771. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_staleness.py +0 -0
  772. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_store.py +0 -0
  773. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_store_materialize.py +0 -0
  774. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_sync_blocked_links.py +0 -0
  775. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  776. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_token_parity.py +0 -0
  777. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_toolchain_lock.py +0 -0
  778. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_trustaudit.py +0 -0
  779. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_typosquat.py +0 -0
  780. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_updatediff.py +0 -0
  781. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_util.py +0 -0
  782. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_version.py +0 -0
  783. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_visual_harness_flags.py +0 -0
  784. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_concurrency.py +0 -0
  785. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  786. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  787. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_timeouts.py +0 -0
  788. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflows.py +0 -0
  789. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  790. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/a11y_check.mjs +0 -0
  791. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/console_check.mjs +0 -0
  792. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/package-lock.json +0 -0
  793. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/package.json +0 -0
  794. {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/visual_check.mjs +0 -0
@@ -88,6 +88,7 @@ lint:
88
88
  $(PY) scripts/build_registries.py --check
89
89
  $(PY) scripts/build_roadmap.py --check
90
90
  $(PY) scripts/build_command_reference.py --check
91
+ $(PY) scripts/build_vex.py --check
91
92
  $(PY) scripts/lock_toolchain.py --check
92
93
  $(PY) scripts/a11y_check.py
93
94
  $(PY) scripts/page_budget.py
@@ -237,6 +238,7 @@ generate:
237
238
  $(PY) scripts/build_registries.py
238
239
  $(PY) scripts/build_roadmap.py
239
240
  $(PY) scripts/build_command_reference.py
241
+ $(PY) scripts/build_vex.py
240
242
 
241
243
  # regenerate docs/demo.gif (brew install vhs)
242
244
  demo:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.35
3
+ Version: 1.2.36
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.35'
22
- __version_tuple__ = version_tuple = (1, 2, 35)
21
+ __version__ = version = '1.2.36'
22
+ __version_tuple__ = version_tuple = (1, 2, 36)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.35
3
+ Version: 1.2.36
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -464,6 +464,7 @@ docs/roadmap/items/update-diff-before-apply.md
464
464
  docs/roadmap/items/update-refreshed-rules-without-a-gate.md
465
465
  docs/roadmap/items/update-refreshes-rules-and-workflows.md
466
466
  docs/roadmap/items/update-reinstall-widens-agent-scope.md
467
+ docs/roadmap/items/vex-openvex-feed.md
467
468
  docs/roadmap/items/visual-regression-pass-on-the-guide.md
468
469
  docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md
469
470
  docs/roadmap/items/windows-in-the-ci-matrix.md
@@ -476,6 +477,12 @@ docs/roadmap/items/zip-strict-audit.md
476
477
  docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md
477
478
  docs/roadmap/items/zizmor-pin-is-a-yanked-release.md
478
479
  docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md
480
+ docs/vex/meta.md
481
+ docs/vex/openvex.json
482
+ docs/vex/statements/gitleaks-secretscan-test-fixtures.md
483
+ docs/vex/statements/quality-trust-fingerprint-not-sensitive.md
484
+ docs/vex/statements/zizmor-adhoc-packages-lint-runners.md
485
+ docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md
479
486
  evals/README.md
480
487
  evals/__init__.py
481
488
  evals/baseline.json
@@ -508,6 +515,7 @@ scripts/build_demo_index.py
508
515
  scripts/build_registries.py
509
516
  scripts/build_roadmap.py
510
517
  scripts/build_scale_corpus.py
518
+ scripts/build_vex.py
511
519
  scripts/check_anchors.py
512
520
  scripts/check_branch_current.py
513
521
  scripts/check_dco.py
@@ -770,6 +778,7 @@ tests/unit/test_typosquat.py
770
778
  tests/unit/test_updatediff.py
771
779
  tests/unit/test_util.py
772
780
  tests/unit/test_version.py
781
+ tests/unit/test_vex.py
773
782
  tests/unit/test_visual_harness_flags.py
774
783
  tests/unit/test_workflow_concurrency.py
775
784
  tests/unit/test_workflow_concurrency_groups.py
@@ -0,0 +1,39 @@
1
+ ---
2
+ id: vex-openvex-feed
3
+ board: code
4
+ section: health
5
+ status: shipped
6
+ category: Security · Posture
7
+ complexity: S
8
+ impact: Low
9
+ wow: 2
10
+ note: OSPS-VM-04.02 — 4 statements, zero fabricated CVEs
11
+ order: 45
12
+ owner: loop/vex
13
+ pr:
14
+ title: A machine-readable VEX feed, sourced from findings that already existed
15
+ ---
16
+ <code>OSPS-VM-04.02</code> — a Level 3 Baseline criterion <a
17
+ href="roadmap.html#osps-baseline-levels">the audit</a> hadn't reached — asks for a VEX
18
+ document accounting for vulnerabilities that don't affect the project, with the
19
+ non-exploitability reasoning attached. boost already had that reasoning; it just wasn't in a
20
+ form a consumer could ingest. CodeQL dismissals carry a <code>#
21
+ codeql[rule-id]</code> comment, <code>.gitleaks.toml</code> allowlists boost's own synthetic
22
+ secret-scanner fixtures, and <code>.github/zizmor.yml</code> documents six ignores by reason.
23
+ <a href="https://openvex.dev/">OpenVEX</a> 0.2.0 turns those into
24
+ a published document at <code>docs/vex/openvex.json</code>,
25
+ generated by <code>scripts/build_vex.py</code> from one statement file per finding under
26
+ <code>docs/vex/statements/</code> — the same one-file-per-item convention the roadmap boards
27
+ themselves use, wired into <code>make generate</code> and a <code>--check</code> freshness
28
+ gate in CI.
29
+ <b>Four statements, and every one traces to a real, already-merged suppression</b> — not an
30
+ invented CVE. boost has never had one, so nothing here is named <code>CVE-</code> or
31
+ <code>GHSA-</code>; each statement's vulnerability name is the scanner's own rule id instead
32
+ (<code>codeql:py/clear-text-logging-sensitive-data</code>, <code>gitleaks:...</code>,
33
+ <code>zizmor:dangerous-triggers</code>, <code>zizmor:adhoc-packages</code>).
34
+ <b>This satisfies one criterion, not the level.</b> <code>OSPS-QA-07.01</code> — a non-author
35
+ human approval before merge — is the wall Level 3 hits regardless, and this change does not
36
+ move it; <code>docs/openssf-badge.md</code> tracks the passing-badge criteria only and has no
37
+ Baseline rows to flip, so the record lives here and in
38
+ <code>docs/security-design.md</code>
39
+ instead.
@@ -133,7 +133,7 @@
133
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>279</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>280</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -5287,6 +5287,42 @@ composed into a blind spot, which is the shape most of these have.</p>
5287
5287
  <span class="m">Gemini warned once per skill per session and no boost surface could see it</span>
5288
5288
  </div>
5289
5289
  </article>
5290
+
5291
+ <article class="cap rcard" id="vex-openvex-feed">
5292
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Security · Posture</span></div>
5293
+ <h3>A machine-readable VEX feed, sourced from findings that already existed</h3>
5294
+ <details class="cardbody"><summary>Write-up</summary>
5295
+ <p><code>OSPS-VM-04.02</code> — a Level 3 Baseline criterion <a
5296
+ href="roadmap.html#osps-baseline-levels">the audit</a> hadn't reached — asks for a VEX
5297
+ document accounting for vulnerabilities that don't affect the project, with the
5298
+ non-exploitability reasoning attached. boost already had that reasoning; it just wasn't in a
5299
+ form a consumer could ingest. CodeQL dismissals carry a <code>#
5300
+ codeql[rule-id]</code> comment, <code>.gitleaks.toml</code> allowlists boost's own synthetic
5301
+ secret-scanner fixtures, and <code>.github/zizmor.yml</code> documents six ignores by reason.
5302
+ <a href="https://openvex.dev/">OpenVEX</a> 0.2.0 turns those into
5303
+ a published document at <code>docs/vex/openvex.json</code>,
5304
+ generated by <code>scripts/build_vex.py</code> from one statement file per finding under
5305
+ <code>docs/vex/statements/</code> — the same one-file-per-item convention the roadmap boards
5306
+ themselves use, wired into <code>make generate</code> and a <code>--check</code> freshness
5307
+ gate in CI.
5308
+ <b>Four statements, and every one traces to a real, already-merged suppression</b> — not an
5309
+ invented CVE. boost has never had one, so nothing here is named <code>CVE-</code> or
5310
+ <code>GHSA-</code>; each statement's vulnerability name is the scanner's own rule id instead
5311
+ (<code>codeql:py/clear-text-logging-sensitive-data</code>, <code>gitleaks:...</code>,
5312
+ <code>zizmor:dangerous-triggers</code>, <code>zizmor:adhoc-packages</code>).
5313
+ <b>This satisfies one criterion, not the level.</b> <code>OSPS-QA-07.01</code> — a non-author
5314
+ human approval before merge — is the wall Level 3 hits regardless, and this change does not
5315
+ move it; <code>docs/openssf-badge.md</code> tracks the passing-badge criteria only and has no
5316
+ Baseline rows to flip, so the record lives here and in
5317
+ <code>docs/security-design.md</code>
5318
+ instead.</p></details>
5319
+ <div class="meta">
5320
+ <span class="m">Complexity <b>S</b></span>
5321
+ <span class="m">Impact <b>Low</b></span>
5322
+ <span class="m">Wow <b class="wow">★★</b></span>
5323
+ <span class="m">OSPS-VM-04.02 — 4 statements, zero fabricated CVEs</span>
5324
+ </div>
5325
+ </article>
5290
5326
  <!-- /ROADMAP:cards -->
5291
5327
 
5292
5328
  </div>
@@ -173,6 +173,43 @@ Every one of these gates blocks a merge to `main`.
173
173
  | `import-linter` | the layering that keeps `core/` free of CLI concerns |
174
174
  | SLSA provenance + PyPI Trusted Publishing | a released artifact traces to the commit and workflow that built it |
175
175
 
176
+ ## VEX: accounting for findings that don't affect boost
177
+
178
+ Every tool in the table above finds things it does not fix — a CodeQL query
179
+ firing on a pattern that isn't actually sensitive here, a gitleaks match on a
180
+ string that was never a real credential, a zizmor rule on a trigger that
181
+ carries its own mitigation. Each dismissal already has a written reason living
182
+ next to the code it describes: a `# codeql[rule-id]` suppression comment, a
183
+ `.gitleaks.toml` allowlist entry, an ignore in `.github/zizmor.yml`. None of
184
+ that was a document a consumer could ingest, which is exactly what OSPS
185
+ Baseline's `OSPS-VM-04.02` asks for: *"While active, any vulnerabilities in
186
+ the software components not affecting the project MUST be accounted for in a
187
+ VEX document, augmenting the vulnerability report with non-exploitability
188
+ details."*
189
+
190
+ [`docs/vex/openvex.json`](vex/openvex.json) is that document — an
191
+ [OpenVEX](https://openvex.dev/) 0.2.0 feed, published at
192
+ <https://jonnyeclectic.github.io/boost/vex/openvex.json>. It is generated by
193
+ `scripts/build_vex.py` from one Markdown file per statement under
194
+ [`docs/vex/statements/`](vex/statements/) — the same one-file-per-item
195
+ convention `docs/roadmap/items/*.md` uses, so two people adding two different
196
+ findings edit two different files rather than one shared JSON blob.
197
+ `make generate` regenerates it; `make lint` and CI both run
198
+ `build_vex.py --check` and fail if the committed document has drifted from
199
+ its source files.
200
+
201
+ Every statement in it today is sourced from a real, already-dismissed finding
202
+ in this repository, not an invented one — the print-side CodeQL
203
+ `py/clear-text-logging-sensitive-data` finding on `trust add`'s fingerprint
204
+ line, the gitleaks allowlist entry for `tests/unit/test_secretscan.py`'s
205
+ synthetic fixtures, and the two categories of `zizmor` ignores in
206
+ `.github/zizmor.yml`. **boost has never had a CVE**, so the document names no
207
+ CVE or GHSA identifier — each statement's `vulnerability.name` is the
208
+ scanner's own rule id (`codeql:...`, `gitleaks:...`, `zizmor:...`) instead. An
209
+ empty-but-honest VEX document would have been the right call had none of these
210
+ findings existed to describe; naming a vulnerability that was never reported
211
+ would not have been.
212
+
176
213
  ## Security review record
177
214
 
178
215
  OpenSSF Best Practices `security_review` asks for a review performed within the
@@ -77,6 +77,15 @@ PGP key for boost, they did not come from this project.
77
77
  | Git tag | Points at the commit the release was built from | `git verify-tag` is *not* applicable — tags are unsigned; the provenance attestation is the authority |
78
78
  | Release notes | Assembled from the merged pull requests in that release | [Releases page](https://github.com/jonnyeclectic/boost/releases) |
79
79
 
80
+ ## VEX: findings that do not affect boost
81
+
82
+ The SBOM says what is in a release; a separate, continuously-updated
83
+ [OpenVEX](https://openvex.dev/) document says which known findings against
84
+ those components don't actually affect boost, with the reasoning attached.
85
+ It is not published per release — it is always current at
86
+ [`docs/vex/openvex.json`](vex/openvex.json). See
87
+ [security-design.md](security-design.md#vex-accounting-for-findings-that-dont-affect-boost).
88
+
80
89
  ## Can you rebuild it yourself? Yes — the measurement
81
90
 
82
91
  A reproducible build lets a third party rebuild the artifact from source and
@@ -0,0 +1,12 @@
1
+ ---
2
+ id: openvex
3
+ author: "the boost project (https://github.com/jonnyeclectic/boost)"
4
+ version: 1
5
+ timestamp: "2026-08-28T00:00:00Z"
6
+ ---
7
+ Document-level identity for `docs/vex/openvex.json`, hand-edited the way a
8
+ changelog is: bump `version` and set `timestamp` to the date of the change
9
+ whenever a statement under `statements/` is added, changed, or removed.
10
+ Neither field is computed — `scripts/build_vex.py` deliberately never reads
11
+ the wall clock, so `--check` can compare byte-for-byte. This body is prose
12
+ for humans editing the file; it is not part of the generated document.
@@ -0,0 +1,61 @@
1
+ {
2
+ "@context": "https://openvex.dev/ns/v0.2.0",
3
+ "@id": "https://jonnyeclectic.github.io/boost/vex/openvex.json",
4
+ "author": "the boost project (https://github.com/jonnyeclectic/boost)",
5
+ "timestamp": "2026-08-28T00:00:00Z",
6
+ "version": 1,
7
+ "statements": [
8
+ {
9
+ "vulnerability": {
10
+ "name": "gitleaks:leaked-secret-detection"
11
+ },
12
+ "products": [
13
+ {
14
+ "@id": "pkg:pypi/boost-skill-cli"
15
+ }
16
+ ],
17
+ "status": "not_affected",
18
+ "justification": "vulnerable_code_not_present",
19
+ "impact_statement": "`tests/unit/test_secretscan.py` exists to prove `boost_cli/core/secretscan.py`\nflags private keys and API tokens, so it ships synthetic examples of both by\ndesign — strings shaped exactly like the credentials gitleaks' own ruleset\nlooks for. gitleaks correctly matches the shape; none of the matched strings\nis a real, working credential, was ever live, or grants access to anything.\n`.gitleaks.toml` allowlists only this one file, by exact path, and the\nallowlist's own comment states why: nothing else in the repository is\nexcluded from the scan."
20
+ },
21
+ {
22
+ "vulnerability": {
23
+ "name": "codeql:py/clear-text-logging-sensitive-data"
24
+ },
25
+ "products": [
26
+ {
27
+ "@id": "pkg:pypi/boost-skill-cli"
28
+ }
29
+ ],
30
+ "status": "not_affected",
31
+ "justification": "vulnerable_code_not_present",
32
+ "impact_statement": "CodeQL's `py/clear-text-logging-sensitive-data` query flags\n`boost trust add`'s success line, which prints the trusted key's name and\nminisign fingerprint, because the argument is user-supplied and `fingerprint`\nreads like a credential name. It is not one: the value is a minisign\n**public** key fingerprint, which is meant to be published, and printing it is\nthe entire point of the command — it is how a user checks by eye that the key\nthey just trusted matches the one the publisher advertises. The class of data\nthe query exists to catch (a secret, token, or password) is not present in\nwhat is logged, so the pattern the rule looks for does not apply here. An\nearlier automated fix that replaced this line with a constant string removed\nthe only verification `trust add` offers; the line was restored, the\nsuppression carries this reasoning inline\n(`# codeql[py/clear-text-logging-sensitive-data]`), and\n`tests/functional/test_tap_signing.py` pins the output so it cannot be quietly\ndropped a second time."
33
+ },
34
+ {
35
+ "vulnerability": {
36
+ "name": "zizmor:adhoc-packages"
37
+ },
38
+ "products": [
39
+ {
40
+ "@id": "pkg:pypi/boost-skill-cli"
41
+ }
42
+ ],
43
+ "status": "not_affected",
44
+ "justification": "inline_mitigations_already_exist",
45
+ "impact_statement": "zizmor's `adhoc-packages` rule flags installing packages without a lockfile,\nbecause an unpinned install can resolve to a tampered or unexpectedly newer\npackage. Two workflows do this on purpose: `theme-lint.yml` installs\nmajor-pinned linters with `--no-save` into an empty checkout — boost ships no\n`package.json`, so a lockfile would exist solely for this one step — and\n`visual.yml` installs a pinned `puppeteer-core` from\n`tests/visual/package.json`, also `--no-save`. Both run on an ephemeral\nrunner, hold only `contents: read`, and their output gates nothing but\nthemselves — a compromised lint or screenshot tool in either job cannot reach\na secret or influence a later, privileged job."
46
+ },
47
+ {
48
+ "vulnerability": {
49
+ "name": "zizmor:dangerous-triggers"
50
+ },
51
+ "products": [
52
+ {
53
+ "@id": "pkg:pypi/boost-skill-cli"
54
+ }
55
+ ],
56
+ "status": "not_affected",
57
+ "justification": "inline_mitigations_already_exist",
58
+ "impact_statement": "zizmor's `dangerous-triggers` rule flags `workflow_run`, because the classic\nfailure mode is a privileged run executing pull-request-controlled code. Four\nworkflows use it — `ci-failure-issue.yml`, `publish.yml`, `post-deploy.yml`,\n`sbom.yml` — and each carries the mitigation that makes the pattern safe in\nits specific case, recorded inline in `.github/zizmor.yml`: none of them\nchecks out the triggering run's head SHA (each explicitly checks out `main`,\na release tag, or nothing at all), so no code a fork's pull request could\ninfluence ever runs in the privileged context. `publish.yml`, the one job that\nholds write credentials (PyPI Trusted Publisher OIDC), is additionally scoped\nto `push` events from this repository only — a fork PR opened from a branch\nnamed `main` cannot satisfy that filter. `sbom.yml` is gated on\n`head_repository == this repository` for the same reason. The remaining two\nhold only `contents: read` and no secrets."
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ id: gitleaks-secretscan-test-fixtures
3
+ vulnerability: "gitleaks:leaked-secret-detection"
4
+ status: not_affected
5
+ justification: vulnerable_code_not_present
6
+ source: .gitleaks.toml, tests/unit/test_secretscan.py
7
+ ---
8
+ `tests/unit/test_secretscan.py` exists to prove `boost_cli/core/secretscan.py`
9
+ flags private keys and API tokens, so it ships synthetic examples of both by
10
+ design — strings shaped exactly like the credentials gitleaks' own ruleset
11
+ looks for. gitleaks correctly matches the shape; none of the matched strings
12
+ is a real, working credential, was ever live, or grants access to anything.
13
+ `.gitleaks.toml` allowlists only this one file, by exact path, and the
14
+ allowlist's own comment states why: nothing else in the repository is
15
+ excluded from the scan.
@@ -0,0 +1,22 @@
1
+ ---
2
+ id: quality-trust-fingerprint-not-sensitive
3
+ vulnerability: "codeql:py/clear-text-logging-sensitive-data"
4
+ status: not_affected
5
+ justification: vulnerable_code_not_present
6
+ source: boost_cli/commands/quality.py:1248
7
+ ---
8
+ CodeQL's `py/clear-text-logging-sensitive-data` query flags
9
+ `boost trust add`'s success line, which prints the trusted key's name and
10
+ minisign fingerprint, because the argument is user-supplied and `fingerprint`
11
+ reads like a credential name. It is not one: the value is a minisign
12
+ **public** key fingerprint, which is meant to be published, and printing it is
13
+ the entire point of the command — it is how a user checks by eye that the key
14
+ they just trusted matches the one the publisher advertises. The class of data
15
+ the query exists to catch (a secret, token, or password) is not present in
16
+ what is logged, so the pattern the rule looks for does not apply here. An
17
+ earlier automated fix that replaced this line with a constant string removed
18
+ the only verification `trust add` offers; the line was restored, the
19
+ suppression carries this reasoning inline
20
+ (`# codeql[py/clear-text-logging-sensitive-data]`), and
21
+ `tests/functional/test_tap_signing.py` pins the output so it cannot be quietly
22
+ dropped a second time.
@@ -0,0 +1,17 @@
1
+ ---
2
+ id: zizmor-adhoc-packages-lint-runners
3
+ vulnerability: "zizmor:adhoc-packages"
4
+ status: not_affected
5
+ justification: inline_mitigations_already_exist
6
+ source: .github/zizmor.yml (theme-lint.yml:48, visual.yml:38)
7
+ ---
8
+ zizmor's `adhoc-packages` rule flags installing packages without a lockfile,
9
+ because an unpinned install can resolve to a tampered or unexpectedly newer
10
+ package. Two workflows do this on purpose: `theme-lint.yml` installs
11
+ major-pinned linters with `--no-save` into an empty checkout — boost ships no
12
+ `package.json`, so a lockfile would exist solely for this one step — and
13
+ `visual.yml` installs a pinned `puppeteer-core` from
14
+ `tests/visual/package.json`, also `--no-save`. Both run on an ephemeral
15
+ runner, hold only `contents: read`, and their output gates nothing but
16
+ themselves — a compromised lint or screenshot tool in either job cannot reach
17
+ a secret or influence a later, privileged job.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: zizmor-dangerous-triggers-workflow-run
3
+ vulnerability: "zizmor:dangerous-triggers"
4
+ status: not_affected
5
+ justification: inline_mitigations_already_exist
6
+ source: .github/zizmor.yml (ci-failure-issue.yml:28, publish.yml:19, post-deploy.yml:21, sbom.yml:29)
7
+ ---
8
+ zizmor's `dangerous-triggers` rule flags `workflow_run`, because the classic
9
+ failure mode is a privileged run executing pull-request-controlled code. Four
10
+ workflows use it — `ci-failure-issue.yml`, `publish.yml`, `post-deploy.yml`,
11
+ `sbom.yml` — and each carries the mitigation that makes the pattern safe in
12
+ its specific case, recorded inline in `.github/zizmor.yml`: none of them
13
+ checks out the triggering run's head SHA (each explicitly checks out `main`,
14
+ a release tag, or nothing at all), so no code a fork's pull request could
15
+ influence ever runs in the privileged context. `publish.yml`, the one job that
16
+ holds write credentials (PyPI Trusted Publisher OIDC), is additionally scoped
17
+ to `push` events from this repository only — a fork PR opened from a branch
18
+ named `main` cannot satisfy that filter. `sbom.yml` is gated on
19
+ `head_repository == this repository` for the same reason. The remaining two
20
+ hold only `contents: read` and no secrets.
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright the boost contributors.
3
+ # SPDX-License-Identifier: GPL-3.0-only
4
+ """Render ``docs/vex/openvex.json`` — boost's OpenVEX 0.2.0 feed — from a
5
+ human-edited source of truth.
6
+
7
+ OSPS Baseline ``OSPS-VM-04.02`` asks for exactly this: "While active, any
8
+ vulnerabilities in the software components not affecting the project MUST be
9
+ accounted for in a VEX document, augmenting the vulnerability report with
10
+ non-exploitability details." boost's scanners (CodeQL, gitleaks, zizmor) each
11
+ already carry that reasoning inline — a ``# codeql[rule-id]`` suppression
12
+ comment, a gitleaks allowlist entry, a ``.github/zizmor.yml`` ignore — but none
13
+ of that is a document a consumer can *ingest*. This script is the bridge.
14
+
15
+ Source of truth is ``docs/vex/statements/*.md``, one Markdown-with-frontmatter
16
+ file per VEX statement — the same convention ``scripts/build_roadmap.py`` uses
17
+ for ``docs/roadmap/items/*.md``, for the same reason: two loops adding two
18
+ different findings touch two different files and merge cleanly. Document-level
19
+ identity (author, version, timestamp) lives in the single shared
20
+ ``docs/vex/meta.md``, edited by hand when a statement is added, changed, or
21
+ removed — bump ``version`` and ``timestamp`` together, the same way a package
22
+ changelog does. Nothing here reads the wall clock: the output is a pure
23
+ function of the committed files, so ``--check`` (and the test suite's
24
+ freshness test) can compare it byte-for-byte.
25
+
26
+ Statement frontmatter:
27
+
28
+ ---
29
+ id: quality-trust-fingerprint-not-sensitive # must equal the filename
30
+ vulnerability: "codeql:py/clear-text-logging-sensitive-data"
31
+ status: not_affected # not_affected|affected|fixed|under_investigation
32
+ justification: vulnerable_code_not_present # required when status is not_affected
33
+ products: # optional; defaults to [DEFAULT_PRODUCT]
34
+ - pkg:pypi/boost-skill-cli
35
+ ---
36
+ Free-text impact statement — why this finding does not affect boost. This
37
+ becomes the OpenVEX statement's `impact_statement` field.
38
+
39
+ Run: python3 scripts/build_vex.py # regenerate docs/vex/openvex.json
40
+ Verify: python3 scripts/build_vex.py --check # fail if it has drifted
41
+ """
42
+ from __future__ import annotations
43
+
44
+ import argparse
45
+ import json
46
+ import sys
47
+ from pathlib import Path
48
+
49
+ ROOT = Path(__file__).resolve().parent.parent
50
+ # Reuse the repo's stdlib-only frontmatter parser (no new dependency), the same
51
+ # way scripts/build_roadmap.py does. Importable without an editable install.
52
+ sys.path.insert(0, str(ROOT))
53
+ from boost_cli.core import frontmatter # noqa: E402
54
+
55
+ VEX_DIR = ROOT / "docs" / "vex"
56
+ STATEMENTS_DIR = VEX_DIR / "statements"
57
+ META_FILE = VEX_DIR / "meta.md"
58
+ OUTPUT_FILE = VEX_DIR / "openvex.json"
59
+
60
+ CONTEXT = "https://openvex.dev/ns/v0.2.0"
61
+ # Same canonical Pages URL as Makefile's BOOST_SITE and
62
+ # scripts/post_deploy_smoke.py's DEFAULT_BASE — keep the three in sync.
63
+ SITE_BASE = "https://jonnyeclectic.github.io/boost/"
64
+ DOC_ID = SITE_BASE + "vex/openvex.json"
65
+ DEFAULT_PRODUCT = "pkg:pypi/boost-skill-cli"
66
+
67
+ VALID_STATUS = ("not_affected", "affected", "fixed", "under_investigation")
68
+ # The five OpenVEX justifications for a `not_affected` statement.
69
+ VALID_JUSTIFICATION = (
70
+ "component_not_present",
71
+ "vulnerable_code_not_present",
72
+ "vulnerable_code_not_in_execute_path",
73
+ "vulnerable_code_cannot_be_controlled_by_adversary",
74
+ "inline_mitigations_already_exist",
75
+ )
76
+
77
+
78
+ class VexError(Exception):
79
+ """A statement or the document metadata is malformed."""
80
+
81
+
82
+ def load_meta() -> dict:
83
+ meta, _ = frontmatter.parse(META_FILE.read_text(encoding="utf-8"))
84
+ for field in ("author", "version", "timestamp"):
85
+ if not meta.get(field):
86
+ raise VexError("%s: missing %r" % (META_FILE.name, field))
87
+ return meta
88
+
89
+
90
+ def load_statements() -> list[dict]:
91
+ """Load and validate every statement, sorted by id for a stable order."""
92
+ statements = []
93
+ for path in sorted(STATEMENTS_DIR.glob("*.md")):
94
+ meta, body = frontmatter.parse(path.read_text(encoding="utf-8"))
95
+ meta["_file"] = path.name
96
+ meta["_body"] = body.strip()
97
+ if not meta.get("id"):
98
+ raise VexError("%s: missing 'id'" % path.name)
99
+ if meta["id"] != path.stem:
100
+ raise VexError(
101
+ "%s: id %r does not match filename" % (path.name, meta["id"]))
102
+ if not meta.get("vulnerability"):
103
+ raise VexError("%s: missing 'vulnerability'" % path.name)
104
+ status = meta.get("status")
105
+ if status not in VALID_STATUS:
106
+ raise VexError("%s: bad status %r" % (path.name, status))
107
+ justification = meta.get("justification")
108
+ if status == "not_affected" and justification not in VALID_JUSTIFICATION:
109
+ raise VexError(
110
+ "%s: status 'not_affected' requires a valid 'justification' "
111
+ "(one of %s)" % (path.name, ", ".join(VALID_JUSTIFICATION)))
112
+ if not meta["_body"]:
113
+ raise VexError(
114
+ "%s: empty impact statement — the body is what makes this "
115
+ "finding reviewable, not just machine-readable" % path.name)
116
+ statements.append(meta)
117
+ statements.sort(key=lambda m: str(m["id"]))
118
+ return statements
119
+
120
+
121
+ def render_statement(meta: dict) -> dict:
122
+ products = meta.get("products") or [DEFAULT_PRODUCT]
123
+ stmt = {
124
+ "vulnerability": {"name": meta["vulnerability"]},
125
+ "products": [{"@id": p} for p in products],
126
+ "status": meta["status"],
127
+ }
128
+ if meta.get("justification"):
129
+ stmt["justification"] = meta["justification"]
130
+ stmt["impact_statement"] = meta["_body"]
131
+ return stmt
132
+
133
+
134
+ def build() -> str:
135
+ meta = load_meta()
136
+ statements = [render_statement(s) for s in load_statements()]
137
+ doc = {
138
+ "@context": CONTEXT,
139
+ "@id": DOC_ID,
140
+ "author": meta["author"],
141
+ "timestamp": meta["timestamp"],
142
+ "version": int(meta["version"]),
143
+ "statements": statements,
144
+ }
145
+ return json.dumps(doc, indent=2, ensure_ascii=False) + "\n"
146
+
147
+
148
+ def main(argv: list[str] | None = None) -> int:
149
+ parser = argparse.ArgumentParser(
150
+ description="Regenerate docs/vex/openvex.json from docs/vex/statements/*.md.")
151
+ parser.add_argument(
152
+ "--check", action="store_true",
153
+ help="verify the committed document matches a fresh render; exit 1 on drift.")
154
+ args = parser.parse_args(argv)
155
+
156
+ fresh = build()
157
+ if args.check:
158
+ committed = OUTPUT_FILE.read_text(encoding="utf-8") if OUTPUT_FILE.exists() else None
159
+ if committed != fresh:
160
+ print("ERROR: docs/vex/openvex.json is stale — regenerate with\n"
161
+ " python3 scripts/build_vex.py\n"
162
+ "and commit the result (see CONTRIBUTING.md).", file=sys.stderr)
163
+ print("::error::VEX document is stale — run "
164
+ "`python3 scripts/build_vex.py` and commit", file=sys.stderr)
165
+ return 1
166
+ print("docs/vex/openvex.json is up to date.")
167
+ return 0
168
+
169
+ OUTPUT_FILE.write_text(fresh, encoding="utf-8")
170
+ print("wrote %s" % OUTPUT_FILE)
171
+ return 0
172
+
173
+
174
+ if __name__ == "__main__":
175
+ raise SystemExit(main())