boost-skill-cli 1.0.283__tar.gz → 1.0.285__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 (534) hide show
  1. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/CLAUDE.md +1 -1
  2. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/Makefile +11 -1
  3. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  6. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  7. boost_skill_cli-1.0.285/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +58 -0
  8. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/one-commit-can-cut-two-releases.md +6 -2
  9. boost_skill_cli-1.0.285/docs/roadmap/items/sbom-declares-the-wrong-version.md +54 -0
  10. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap.html +111 -3
  11. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/lint-tools.in +10 -0
  12. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/lint-tools.txt +7 -0
  13. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.gitattributes +0 -0
  14. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.gitignore +0 -0
  15. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.gitleaks.toml +0 -0
  16. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.htmlvalidate.json +0 -0
  17. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.lighthouserc.json +0 -0
  18. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.lycheeignore +0 -0
  19. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.markdownlint-cli2.jsonc +0 -0
  20. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.pre-commit-config.yaml +0 -0
  21. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.stylelintrc.json +0 -0
  22. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.vale/styles/boost/Terminology.yml +0 -0
  23. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  24. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.vale.ini +0 -0
  25. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/CODE_OF_CONDUCT.md +0 -0
  26. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/LICENSE +0 -0
  28. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/README.md +0 -0
  30. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/SECURITY.md +0 -0
  31. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost +0 -0
  32. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/__init__.py +0 -0
  33. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/__main__.py +0 -0
  34. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/cli.py +0 -0
  35. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/cliparse.py +0 -0
  36. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/__init__.py +0 -0
  37. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/_common.py +0 -0
  38. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/bmad.py +0 -0
  39. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/configuration.py +0 -0
  40. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/discovery.py +0 -0
  41. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/hooks.py +0 -0
  42. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/info.py +0 -0
  43. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/intelligence.py +0 -0
  44. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/pkg.py +0 -0
  45. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/quality.py +0 -0
  46. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/run.py +0 -0
  47. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/safety.py +0 -0
  48. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/capabilities.py +0 -0
  55. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/catalog.py +0 -0
  56. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/claude_settings.py +0 -0
  57. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/config.py +0 -0
  58. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/dense.py +0 -0
  59. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/ed25519.py +0 -0
  60. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/embed.py +0 -0
  61. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/faithfulness.py +0 -0
  62. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/frontmatter.py +0 -0
  63. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/gitutil.py +0 -0
  64. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/imperative.py +0 -0
  65. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/injectscan.py +0 -0
  66. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/integrity.py +0 -0
  67. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/journal.py +0 -0
  68. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/lockfile.py +0 -0
  69. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/logs.py +0 -0
  70. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/mcp.py +0 -0
  71. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/mcpdecl.py +0 -0
  72. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/minisign.py +0 -0
  73. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/nethttp.py +0 -0
  74. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/output.py +0 -0
  75. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/paths.py +0 -0
  76. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/policy.py +0 -0
  77. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/projectlock.py +0 -0
  78. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/provenance.py +0 -0
  79. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/rag.py +0 -0
  80. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/registry.py +0 -0
  81. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/resolve.py +0 -0
  82. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/rules.py +0 -0
  83. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/scopes.py +0 -0
  84. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/secretscan.py +0 -0
  85. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/selfupdate.py +0 -0
  86. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/serve.py +0 -0
  87. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/stackprobe.py +0 -0
  88. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/staleness.py +0 -0
  89. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/store.py +0 -0
  90. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/trustaudit.py +0 -0
  91. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/typosquat.py +0 -0
  92. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/updatediff.py +0 -0
  93. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/util.py +0 -0
  94. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/workflows.py +0 -0
  95. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/data/registries.json +0 -0
  96. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/errors.py +0 -0
  97. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/spin.py +0 -0
  98. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  99. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  100. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/requires.txt +0 -0
  101. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/top_level.txt +0 -0
  102. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/codecov.yml +0 -0
  103. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/.claude/settings.local.json +0 -0
  104. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/DEBUGGING.md +0 -0
  105. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/adapters.html +0 -0
  106. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/distill.gif +0 -0
  107. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/doctor.gif +0 -0
  108. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/explain.gif +0 -0
  109. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/hooks.gif +0 -0
  110. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/install.gif +0 -0
  111. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/pulse.gif +0 -0
  112. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/search.gif +0 -0
  113. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/tap.gif +0 -0
  114. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/distill.tape +0 -0
  115. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/doctor.tape +0 -0
  116. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/explain.tape +0 -0
  117. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/hooks.tape +0 -0
  118. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/install.tape +0 -0
  119. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/pulse.tape +0 -0
  120. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/search.tape +0 -0
  121. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/tap.tape +0 -0
  122. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel.html +0 -0
  123. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/commands.html +0 -0
  124. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/demo.gif +0 -0
  125. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/demo.tape +0 -0
  126. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/design-roadmap.html +0 -0
  127. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/eval.html +0 -0
  128. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/index.html +0 -0
  129. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/mcp-hub.html +0 -0
  130. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/rag-architecture.md +0 -0
  131. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D01.md +0 -0
  132. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D02.md +0 -0
  133. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D03.md +0 -0
  134. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D04.md +0 -0
  135. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D05.md +0 -0
  136. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D06.md +0 -0
  137. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D07.md +0 -0
  138. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D08.md +0 -0
  139. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D09.md +0 -0
  140. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D10.md +0 -0
  141. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D11.md +0 -0
  142. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D12.md +0 -0
  143. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D13.md +0 -0
  144. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D14.md +0 -0
  145. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D15.md +0 -0
  146. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D16.md +0 -0
  147. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D17.md +0 -0
  148. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D18.md +0 -0
  149. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D19.md +0 -0
  150. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D20.md +0 -0
  151. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D21.md +0 -0
  152. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D22.md +0 -0
  153. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D23.md +0 -0
  154. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D24.md +0 -0
  155. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D25.md +0 -0
  156. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D26.md +0 -0
  157. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  158. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  159. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  160. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  161. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  162. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  163. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  164. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  165. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  166. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  167. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  168. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  169. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  170. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  171. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  172. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  173. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  174. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  175. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  176. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  177. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/command-carousel-page.md +0 -0
  178. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  179. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  180. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  181. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  182. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  183. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  184. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  185. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  186. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  187. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  188. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  189. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  190. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  191. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  192. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  193. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  194. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  195. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  196. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  197. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  198. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  199. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  200. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  201. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  202. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  203. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  204. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  205. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/github-community-health-files.md +0 -0
  206. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  207. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  208. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  209. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  210. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  211. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  212. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  213. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  214. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  215. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  216. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  217. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  218. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  219. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  220. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  221. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  222. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  223. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  224. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  225. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  226. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  227. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  228. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  229. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  230. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  231. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  232. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  233. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  234. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  235. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  236. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  237. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  238. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  239. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  240. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  241. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  242. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  243. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  244. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  245. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  246. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  247. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  248. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  249. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  250. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  251. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  252. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  253. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  254. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  255. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  256. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  257. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  258. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  259. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  260. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  261. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  262. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  263. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  264. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  265. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  266. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  267. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  268. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  269. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  270. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  271. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  272. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  273. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  274. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  275. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  276. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  277. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  278. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  279. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  280. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  281. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  282. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  283. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  284. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  285. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  286. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  287. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  288. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  289. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  290. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  291. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  292. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  293. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  294. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  295. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  296. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  297. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  298. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  299. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  300. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  301. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  302. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  303. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  304. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  305. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  306. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  307. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  308. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  309. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  310. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  311. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  312. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  313. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  314. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  315. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  316. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  317. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  318. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  319. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  320. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  321. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  322. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  323. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  324. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  325. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  326. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  327. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  328. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workspace-scope-install.md +0 -0
  329. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  330. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/eslint.config.mjs +0 -0
  331. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/README.md +0 -0
  332. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/__init__.py +0 -0
  333. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/baseline.json +0 -0
  334. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/faithfulness.py +0 -0
  335. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/golden_set.json +0 -0
  336. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/make_corpus.py +0 -0
  337. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/make_golden.py +0 -0
  338. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/metrics.py +0 -0
  339. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/run_evals.py +0 -0
  340. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/examples/README.md +0 -0
  341. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/examples/adapt-demo.sh +0 -0
  342. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/examples/boost-run-prototype.sh +0 -0
  343. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/index.html +0 -0
  344. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/noxfile.py +0 -0
  345. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/pyproject.toml +0 -0
  346. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/coverage-tools.in +0 -0
  347. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/coverage-tools.txt +0 -0
  348. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/mutation-tools.in +0 -0
  349. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/mutation-tools.txt +0 -0
  350. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/release-tools.in +0 -0
  351. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/release-tools.txt +0 -0
  352. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/test-tools.in +0 -0
  353. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/test-tools.txt +0 -0
  354. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/a11y_check.py +0 -0
  355. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/bench_cli.sh +0 -0
  356. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/build_command_reference.py +0 -0
  357. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/build_registries.py +0 -0
  358. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/build_roadmap.py +0 -0
  359. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/check_anchors.py +0 -0
  360. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/check_licenses.py +0 -0
  361. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/check_required_checks.py +0 -0
  362. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/ensure_eval_corpus.sh +0 -0
  363. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_explain.py +0 -0
  364. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_gate.py +0 -0
  365. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_recommend.py +0 -0
  366. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_retrieval.py +0 -0
  367. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_stats_summary.py +0 -0
  368. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/import_budget.py +0 -0
  369. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/lock_toolchain.py +0 -0
  370. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/mutation_gate.py +0 -0
  371. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/mutation_shards.py +0 -0
  372. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/mutation_weights.json +0 -0
  373. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/perf_gate.py +0 -0
  374. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/post_deploy_smoke.py +0 -0
  375. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/release_preflight.py +0 -0
  376. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/setup.cfg +0 -0
  377. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/sonar-project.properties +0 -0
  378. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/README.md +0 -0
  379. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/boost.css +0 -0
  380. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/boost.js +0 -0
  381. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/demo.html +0 -0
  382. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/adapt.feature +0 -0
  383. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/browse.feature +0 -0
  384. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/count.feature +0 -0
  385. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/discover.feature +0 -0
  386. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/doctor.feature +0 -0
  387. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/environment.py +0 -0
  388. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/explain.feature +0 -0
  389. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/index.feature +0 -0
  390. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/install.feature +0 -0
  391. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/list.feature +0 -0
  392. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/mcp.feature +0 -0
  393. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/search.feature +0 -0
  394. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/cli_steps.py +0 -0
  395. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/discovery_steps.py +0 -0
  396. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/mcp_steps.py +0 -0
  397. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/quality_steps.py +0 -0
  398. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/conftest.py +0 -0
  399. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/baseline.json +0 -0
  400. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/explain.jsonl +0 -0
  401. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/golden.jsonl +0 -0
  402. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/recommend.jsonl +0 -0
  403. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/taps.txt +0 -0
  404. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_capabilities_policy.py +0 -0
  405. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_adapt.py +0 -0
  406. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_bmad.py +0 -0
  407. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_configuration.py +0 -0
  408. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_discovery.py +0 -0
  409. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_hooks.py +0 -0
  410. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_info.py +0 -0
  411. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_intelligence.py +0 -0
  412. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_pkg.py +0 -0
  413. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_quality.py +0 -0
  414. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_taps.py +0 -0
  415. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_team.py +0 -0
  416. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_everyday_loop.py +0 -0
  417. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_integrity_enforce.py +0 -0
  418. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_property_parsers.py +0 -0
  419. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_run.py +0 -0
  420. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_tap_signing.py +0 -0
  421. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_workspace_scope.py +0 -0
  422. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/README.md +0 -0
  423. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  424. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  425. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  426. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  427. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  428. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  429. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  430. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  431. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  432. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  433. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  434. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  435. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  436. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  437. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  438. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  439. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  440. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  441. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  442. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  443. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/fuzz_frontmatter.py +0 -0
  444. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/fuzz_registry.py +0 -0
  445. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/make_fixture.py +0 -0
  446. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/perf/test_benchmarks.py +0 -0
  447. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/smoke.sh +0 -0
  448. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_a11y_check.py +0 -0
  449. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_adapters.py +0 -0
  450. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_adapters_multi.py +0 -0
  451. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_adapters_runner.py +0 -0
  452. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_agents.py +0 -0
  453. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_ai.py +0 -0
  454. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_capabilities.py +0 -0
  455. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_catalog.py +0 -0
  456. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_check_anchors.py +0 -0
  457. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_check_licenses.py +0 -0
  458. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_claude_settings.py +0 -0
  459. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_cliparse.py +0 -0
  460. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_codeql_analysis_key.py +0 -0
  461. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_command_reference_fresh.py +0 -0
  462. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_community_health_files.py +0 -0
  463. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_config.py +0 -0
  464. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_dense.py +0 -0
  465. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_dense_fallback.py +0 -0
  466. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_dependabot_config.py +0 -0
  467. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_docs_pages_linked.py +0 -0
  468. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_docsite_chrome.py +0 -0
  469. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_ed25519.py +0 -0
  470. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_embed.py +0 -0
  471. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_errors_and_cli_table.py +0 -0
  472. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_faithfulness.py +0 -0
  473. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_gate.py +0 -0
  474. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_metrics.py +0 -0
  475. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_stats_summary.py +0 -0
  476. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_faithfulness.py +0 -0
  477. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_frontmatter.py +0 -0
  478. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_fuzz_targets.py +0 -0
  479. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_gitleaks_config.py +0 -0
  480. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_gitutil.py +0 -0
  481. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_imperative.py +0 -0
  482. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_import_budget.py +0 -0
  483. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_injectscan.py +0 -0
  484. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_integrity.py +0 -0
  485. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_journal.py +0 -0
  486. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_lockfile.py +0 -0
  487. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_logs.py +0 -0
  488. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_marketing_counts.py +0 -0
  489. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mcp.py +0 -0
  490. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mcpdecl.py +0 -0
  491. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_minisign.py +0 -0
  492. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mutation_hardening.py +0 -0
  493. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mutation_shards.py +0 -0
  494. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mutmut_source_paths.py +0 -0
  495. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_nethttp.py +0 -0
  496. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_output.py +0 -0
  497. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_paths.py +0 -0
  498. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_perf_gate.py +0 -0
  499. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_pkg_confusions.py +0 -0
  500. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_pkg_injection.py +0 -0
  501. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_pkg_secrets.py +0 -0
  502. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_policy.py +0 -0
  503. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_post_deploy_smoke.py +0 -0
  504. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_projectlock.py +0 -0
  505. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_provenance.py +0 -0
  506. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_rag.py +0 -0
  507. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_registries_fresh.py +0 -0
  508. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_registry.py +0 -0
  509. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_release_preflight.py +0 -0
  510. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_required_checks.py +0 -0
  511. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_resolve.py +0 -0
  512. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_roadmap_fresh.py +0 -0
  513. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_rules.py +0 -0
  514. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_scopes.py +0 -0
  515. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_secretscan.py +0 -0
  516. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_selfupdate.py +0 -0
  517. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_serve.py +0 -0
  518. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_spin.py +0 -0
  519. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_stackprobe.py +0 -0
  520. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_staleness.py +0 -0
  521. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_store.py +0 -0
  522. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_token_parity.py +0 -0
  523. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_toolchain_lock.py +0 -0
  524. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_trustaudit.py +0 -0
  525. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_typosquat.py +0 -0
  526. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_updatediff.py +0 -0
  527. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_util.py +0 -0
  528. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_version.py +0 -0
  529. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_workflow_timeouts.py +0 -0
  530. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_workflows.py +0 -0
  531. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/a11y_check.mjs +0 -0
  532. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/console_check.mjs +0 -0
  533. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/package.json +0 -0
  534. {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/visual_check.mjs +0 -0
@@ -11,7 +11,7 @@ make venv # .venv from the hash-pinned requ
11
11
  .venv/bin/pytest tests/unit/test_catalog.py -q # one test file
12
12
  .venv/bin/pytest tests/unit/test_catalog.py::test_scan_dir -q # one test
13
13
  .venv/bin/pytest tests/functional -q -k install # functional tests matching "install"
14
- make lint # the whole static tier — see the recipe, it is 18 commands
14
+ make lint # the whole static tier — read the recipe, it is long
15
15
  make test # unit + functional with 80% coverage gate
16
16
  make check # the full required gate — see table below
17
17
 
@@ -61,7 +61,17 @@ lint:
61
61
  $(VENV)/bin/interrogate boost_cli/core
62
62
  $(VENV)/bin/refurb boost_cli
63
63
  $(VENV)/bin/codespell boost_cli docs README.md
64
- @if command -v actionlint >/dev/null 2>&1; then actionlint; \
64
+ @# actionlint does not lint `run:` blocks itself — it shells out to
65
+ @# shellcheck, and if shellcheck is not on PATH it skips them silently and
66
+ @# still exits 0. So `make lint` could report a clean workflow lint having
67
+ @# never looked inside a single script. shellcheck is pinned in
68
+ @# requirements/lint-tools.in for exactly this; put $(VENV)/bin on PATH so
69
+ @# actionlint finds it, and fail loudly rather than run a hollow check.
70
+ @if command -v actionlint >/dev/null 2>&1; then \
71
+ if [ ! -x $(VENV)/bin/shellcheck ]; then \
72
+ echo "shellcheck missing from $(VENV) — actionlint would skip every run: block. Re-run 'make venv'."; exit 1; \
73
+ fi; \
74
+ PATH="$(CURDIR)/$(VENV)/bin:$$PATH" actionlint; \
65
75
  else echo "actionlint not on PATH — skipping (CI enforces it)"; fi
66
76
  $(PY) scripts/build_registries.py --check
67
77
  $(PY) scripts/build_roadmap.py --check
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.283
3
+ Version: 1.0.285
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.283'
22
- __version_tuple__ = version_tuple = (1, 0, 283)
21
+ __version__ = version = '1.0.285'
22
+ __version_tuple__ = version_tuple = (1, 0, 285)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.283
3
+ Version: 1.0.285
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -155,6 +155,7 @@ docs/roadmap/items/BOOST-D24.md
155
155
  docs/roadmap/items/BOOST-D25.md
156
156
  docs/roadmap/items/BOOST-D26.md
157
157
  docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
158
+ docs/roadmap/items/actionlint-skips-shellcheck-silently.md
158
159
  docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md
159
160
  docs/roadmap/items/ai-bridge-silent-failure-logging.md
160
161
  docs/roadmap/items/ambiguous-tap-short-name-resolution.md
@@ -288,6 +289,7 @@ docs/roadmap/items/rule-install-native-materialization.md
288
289
  docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md
289
290
  docs/roadmap/items/runtime-explain-faithfulness-guardrail.md
290
291
  docs/roadmap/items/sbom-aware-scanning-osv-scanner.md
292
+ docs/roadmap/items/sbom-declares-the-wrong-version.md
291
293
  docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md
292
294
  docs/roadmap/items/sbom-release-event-never-fires.md
293
295
  docs/roadmap/items/scan-and-sync-rules-and-workflows.md
@@ -0,0 +1,58 @@
1
+ ---
2
+ id: actionlint-skips-shellcheck-silently
3
+ board: code
4
+ section: dx
5
+ status: shipped
6
+ category: Testing · Bug
7
+ complexity: S
8
+ impact: Med
9
+ wow: 4
10
+ note: fixed — shellcheck is pinned in lint-tools and both gates now assert it is there
11
+ order: 69
12
+ owner: loop/lint-shellcheck
13
+ pr:
14
+ title: The second silent skip &mdash; <code>actionlint</code> runs, and checks no <code>run:</code> block at all
15
+ ---
16
+ <code>make-lint-masks-actionlint-failures</code> fixed the layer everyone can see: <code>make
17
+ lint</code> discarded actionlint's exit status. There is a second layer underneath it, and the
18
+ first fix does not reach it. <b><code>actionlint</code> does not lint <code>run:</code> blocks
19
+ itself.</b> It shells out to <code>shellcheck</code>, and when shellcheck is not on
20
+ <code>PATH</code> it skips every one of them &mdash; no warning, no note, exit 0.
21
+
22
+ Same workflow file, same actionlint binary, only <code>PATH</code> differs:
23
+
24
+ <code>without shellcheck -&gt; (no output) exit=0</code><br>
25
+ <code>with shellcheck -&gt; bad.yml:8:9: shellcheck reported issue in this script: SC2001 &hellip; exit=1</code>
26
+
27
+ So the honest description of the gate before this change was: <code>make lint</code> ran a workflow
28
+ linter that silently declined to look inside any script, and reported success. That is not
29
+ hypothetical either &mdash; it is exactly how an <code>SC2001</code> reached CI from a green local
30
+ gate, in the very change that fixed layer one.
31
+
32
+ <b>CI was not safe, only lucky.</b> Its actionlint step carried the comment "shellcheck is
33
+ preinstalled on the runner, so run: blocks are checked too" &mdash; true today, and an unpinned,
34
+ unversioned, silently revocable dependency on somebody else's base image. If GitHub ever drops it
35
+ from <code>ubuntu-latest</code>, CI degrades to the same hollow check with no signal that anything
36
+ changed. For a repository that hash-pins its entire lint toolchain precisely so an upstream release
37
+ cannot move a gate underneath it, an implicit dependency on a runner image is the same bug in a
38
+ different coat.
39
+
40
+ <b>Shipped.</b> <code>shellcheck-py==0.11.0.1</code> is declared in
41
+ <code>requirements/lint-tools.in</code> and hash-pinned into the generated
42
+ <code>lint-tools.txt</code> like every other tool, which puts it on both sides: CI installs it from
43
+ that lock, and <code>make venv</code> puts it in <code>.venv/bin</code>. <code>make lint</code> now
44
+ prepends <code>.venv/bin</code> to <code>PATH</code> so actionlint can find it, and <b>fails</b> if
45
+ it is missing rather than running a check it knows is hollow; CI asserts <code>command -v
46
+ shellcheck</code> before invoking actionlint. Verified in four states against the real recipe: the
47
+ tool absent (skip message, exit 0), shellcheck missing from the venv (exit 1 with a message naming
48
+ the fix), both present and workflows clean (exit 0), and both present with an <code>SC2001</code> in
49
+ a <code>run:</code> block (exit 1 &mdash; the case that used to pass). The old recipe on that same
50
+ file exits 0.
51
+
52
+ <b>What is deliberately still skipped.</b> If <code>actionlint</code> itself is absent,
53
+ <code>make lint</code> prints a message and continues. Closing that would mean pinning
54
+ <code>actionlint-py</code>, which is sdist-only and fetches the binary from the network at install
55
+ time, and which tracks a different actionlint version than the URL-pinned one CI uses. Trading a
56
+ pinned binary for a build-time download is a worse trade than the skip, so the skip stays and is
57
+ documented rather than quietly tolerated. The wider gap named by the earlier card is also still
58
+ open: <code>zizmor</code> and <code>gitleaks</code> run only in CI and have no Makefile equivalent.
@@ -48,5 +48,9 @@ ci will trigger its own release, but it means some merges never get their own ve
48
48
 
49
49
  <b>Already mitigated:</b> <code>sbom.yml</code> now builds and attaches an SBOM for <em>every</em>
50
50
  tag on the commit rather than only the highest, so a duplicate release no longer produces a release
51
- with no SBOM. Each tag is built separately, because setuptools-scm reads the version from the tag
52
- and one SBOM cannot honestly describe two versions.
51
+ with no SBOM. Each tag is built separately so its SBOM carries its own version.
52
+
53
+ <b>Correction:</b> the claim above originally read "because setuptools-scm reads the version from
54
+ the tag", and that is false — it reads the version from the <em>commit</em>, so separate checkouts
55
+ of two tags on one commit produce the same version. That was a second, quieter consequence of the
56
+ duplicate release, fixed separately in <code>sbom-declares-the-wrong-version</code>.
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: sbom-declares-the-wrong-version
3
+ board: code
4
+ section: trust
5
+ status: shipped
6
+ category: Supply chain · Bug
7
+ complexity: S
8
+ impact: High
9
+ wow: 5
10
+ note: fixed — release v1.0.278's SBOM declared 1.0.277; the version is now pinned to the tag
11
+ order: 68
12
+ owner: loop/sbom-tag-version
13
+ pr:
14
+ title: The SBOM can declare a different version than the release it is attached to
15
+ ---
16
+ <code>sbom.yml</code> builds each released tag separately so that every release gets an SBOM
17
+ describing <em>its own</em> version. It does that by checking the tag out:
18
+ <code>git checkout --detach "refs/tags/$TAG"</code>. The premise is wrong.
19
+ <b>setuptools-scm derives the version from the commit, not from the ref used to reach it</b>, so
20
+ when one commit carries two tags every checkout resolves to the same version — whichever one
21
+ <code>git describe</code> picks, which is not the highest.
22
+
23
+ Measured against the real repository, detached at each tag in turn:
24
+
25
+ <code>checked out v1.0.278 -&gt; setuptools-scm says: 1.0.277</code><br>
26
+ <code>checked out v1.0.277 -&gt; setuptools-scm says: 1.0.277</code>
27
+
28
+ And confirmed in production rather than in a fixture — the published asset on
29
+ <code>v1.0.278</code>, downloaded from the release, contains
30
+ <code>{"name": "boost-skill-cli", "version": "1.0.277"}</code>. <b>The SBOM attached to release
31
+ v1.0.278 describes v1.0.277.</b> A consumer resolving that release's bill of materials gets a
32
+ document for a different version, which is precisely the trust property an SBOM exists to provide.
33
+
34
+ The blast radius is bounded by how often one commit cuts two releases, which
35
+ <code>one-commit-can-cut-two-releases</code> documents happening three times so far
36
+ (<code>246</code>/<code>247</code>, <code>248</code>/<code>249</code>, <code>277</code>/<code>278</code>).
37
+ Every duplicate pair mislabels one of its two SBOMs. It is <em>not</em> latent in
38
+ <code>publish.yml</code>, which builds the PyPI dist: that job checks out before the sibling run's
39
+ tag exists, so it happens to resolve correctly — all 281 PyPI versions are present and correctly
40
+ numbered. The defect is specific to the job that runs <em>after</em> both tags are in place.
41
+
42
+ <b>Shipped.</b> The build now pins the version to the tag it is building
43
+ (<code>SETUPTOOLS_SCM_PRETEND_VERSION_FOR_BOOST_SKILL_CLI="${TAG#v}"</code>) and then asserts the
44
+ wheel it produced carries that version, so a package rename — which would silently unhook the
45
+ scoped variable and restore the bug — fails the job instead of shipping a mislabelled document.
46
+ Verified both ways against the live repository: without the pin, <code>v1.0.278</code> resolves to
47
+ <code>1.0.277</code>; with it, <code>1.0.278</code>.
48
+
49
+ The same exercise settled the other thing this workflow had never proven: the multi-tag loop
50
+ itself. Both <code>run:</code> blocks were extracted verbatim from the YAML and driven against a
51
+ fixture repository with two tags on one commit, with <code>gh</code> and the build toolchain
52
+ stubbed. Resolution returns both tags newest-first, the loop iterates both, and it issues a
53
+ separate <code>upload</code> and a separate post-upload <code>view</code> assertion per tag. That
54
+ path had never executed in production — every commit since it shipped has carried exactly one tag.
@@ -110,7 +110,7 @@
110
110
  <div class="stat"><b>16</b><span>Shipped</span></div>
111
111
  <div class="stat"><b>1</b><span>Next up</span></div>
112
112
  <div class="stat"><b>4</b><span>Planned</span></div>
113
- <div class="stat"><b>174</b><span>Loop finds</span></div>
113
+ <div class="stat"><b>176</b><span>Loop finds</span></div>
114
114
  <!-- /ROADMAP:stats -->
115
115
  </div>
116
116
  </section>
@@ -2707,8 +2707,12 @@ ci will trigger its own release, but it means some merges never get their own ve
2707
2707
 
2708
2708
  <b>Already mitigated:</b> <code>sbom.yml</code> now builds and attaches an SBOM for <em>every</em>
2709
2709
  tag on the commit rather than only the highest, so a duplicate release no longer produces a release
2710
- with no SBOM. Each tag is built separately, because setuptools-scm reads the version from the tag
2711
- and one SBOM cannot honestly describe two versions.</p>
2710
+ with no SBOM. Each tag is built separately so its SBOM carries its own version.
2711
+
2712
+ <b>Correction:</b> the claim above originally read "because setuptools-scm reads the version from
2713
+ the tag", and that is false — it reads the version from the <em>commit</em>, so separate checkouts
2714
+ of two tags on one commit produce the same version. That was a second, quieter consequence of the
2715
+ duplicate release, fixed separately in <code>sbom-declares-the-wrong-version</code>.</p>
2712
2716
  <div class="meta">
2713
2717
  <span class="m">Complexity <b>M</b></span>
2714
2718
  <span class="m">Impact <b>Med</b></span>
@@ -3177,6 +3181,60 @@ regresses.</p>
3177
3181
  <span class="m">agent reflex</span>
3178
3182
  </div>
3179
3183
  </article>
3184
+
3185
+ <article class="cap rcard" id="actionlint-skips-shellcheck-silently">
3186
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Testing · Bug</span></div>
3187
+ <h3>The second silent skip &mdash; <code>actionlint</code> runs, and checks no <code>run:</code> block at all</h3>
3188
+ <p><code>make-lint-masks-actionlint-failures</code> fixed the layer everyone can see: <code>make
3189
+ lint</code> discarded actionlint's exit status. There is a second layer underneath it, and the
3190
+ first fix does not reach it. <b><code>actionlint</code> does not lint <code>run:</code> blocks
3191
+ itself.</b> It shells out to <code>shellcheck</code>, and when shellcheck is not on
3192
+ <code>PATH</code> it skips every one of them &mdash; no warning, no note, exit 0.
3193
+
3194
+ Same workflow file, same actionlint binary, only <code>PATH</code> differs:
3195
+
3196
+ <code>without shellcheck -&gt; (no output) exit=0</code><br>
3197
+ <code>with shellcheck -&gt; bad.yml:8:9: shellcheck reported issue in this script: SC2001 &hellip; exit=1</code>
3198
+
3199
+ So the honest description of the gate before this change was: <code>make lint</code> ran a workflow
3200
+ linter that silently declined to look inside any script, and reported success. That is not
3201
+ hypothetical either &mdash; it is exactly how an <code>SC2001</code> reached CI from a green local
3202
+ gate, in the very change that fixed layer one.
3203
+
3204
+ <b>CI was not safe, only lucky.</b> Its actionlint step carried the comment "shellcheck is
3205
+ preinstalled on the runner, so run: blocks are checked too" &mdash; true today, and an unpinned,
3206
+ unversioned, silently revocable dependency on somebody else's base image. If GitHub ever drops it
3207
+ from <code>ubuntu-latest</code>, CI degrades to the same hollow check with no signal that anything
3208
+ changed. For a repository that hash-pins its entire lint toolchain precisely so an upstream release
3209
+ cannot move a gate underneath it, an implicit dependency on a runner image is the same bug in a
3210
+ different coat.
3211
+
3212
+ <b>Shipped.</b> <code>shellcheck-py==0.11.0.1</code> is declared in
3213
+ <code>requirements/lint-tools.in</code> and hash-pinned into the generated
3214
+ <code>lint-tools.txt</code> like every other tool, which puts it on both sides: CI installs it from
3215
+ that lock, and <code>make venv</code> puts it in <code>.venv/bin</code>. <code>make lint</code> now
3216
+ prepends <code>.venv/bin</code> to <code>PATH</code> so actionlint can find it, and <b>fails</b> if
3217
+ it is missing rather than running a check it knows is hollow; CI asserts <code>command -v
3218
+ shellcheck</code> before invoking actionlint. Verified in four states against the real recipe: the
3219
+ tool absent (skip message, exit 0), shellcheck missing from the venv (exit 1 with a message naming
3220
+ the fix), both present and workflows clean (exit 0), and both present with an <code>SC2001</code> in
3221
+ a <code>run:</code> block (exit 1 &mdash; the case that used to pass). The old recipe on that same
3222
+ file exits 0.
3223
+
3224
+ <b>What is deliberately still skipped.</b> If <code>actionlint</code> itself is absent,
3225
+ <code>make lint</code> prints a message and continues. Closing that would mean pinning
3226
+ <code>actionlint-py</code>, which is sdist-only and fetches the binary from the network at install
3227
+ time, and which tracks a different actionlint version than the URL-pinned one CI uses. Trading a
3228
+ pinned binary for a build-time download is a worse trade than the skip, so the skip stays and is
3229
+ documented rather than quietly tolerated. The wider gap named by the earlier card is also still
3230
+ open: <code>zizmor</code> and <code>gitleaks</code> run only in CI and have no Makefile equivalent.</p>
3231
+ <div class="meta">
3232
+ <span class="m">Complexity <b>S</b></span>
3233
+ <span class="m">Impact <b>Med</b></span>
3234
+ <span class="m">Wow <b class="wow">★★★★</b></span>
3235
+ <span class="m">fixed — shellcheck is pinned in lint-tools and both gates now assert it is there</span>
3236
+ </div>
3237
+ </article>
3180
3238
  <!-- /ROADMAP:cards -->
3181
3239
 
3182
3240
  </div>
@@ -4279,6 +4337,56 @@ having found error-severity alerts.</p>
4279
4337
  <span class="m">safe scoped to CodeQL (0 open) — adding Scorecard deadlocks every merge</span>
4280
4338
  </div>
4281
4339
  </article>
4340
+
4341
+ <article class="cap rcard" id="sbom-declares-the-wrong-version">
4342
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Supply chain · Bug</span></div>
4343
+ <h3>The SBOM can declare a different version than the release it is attached to</h3>
4344
+ <p><code>sbom.yml</code> builds each released tag separately so that every release gets an SBOM
4345
+ describing <em>its own</em> version. It does that by checking the tag out:
4346
+ <code>git checkout --detach "refs/tags/$TAG"</code>. The premise is wrong.
4347
+ <b>setuptools-scm derives the version from the commit, not from the ref used to reach it</b>, so
4348
+ when one commit carries two tags every checkout resolves to the same version — whichever one
4349
+ <code>git describe</code> picks, which is not the highest.
4350
+
4351
+ Measured against the real repository, detached at each tag in turn:
4352
+
4353
+ <code>checked out v1.0.278 -&gt; setuptools-scm says: 1.0.277</code><br>
4354
+ <code>checked out v1.0.277 -&gt; setuptools-scm says: 1.0.277</code>
4355
+
4356
+ And confirmed in production rather than in a fixture — the published asset on
4357
+ <code>v1.0.278</code>, downloaded from the release, contains
4358
+ <code>{"name": "boost-skill-cli", "version": "1.0.277"}</code>. <b>The SBOM attached to release
4359
+ v1.0.278 describes v1.0.277.</b> A consumer resolving that release's bill of materials gets a
4360
+ document for a different version, which is precisely the trust property an SBOM exists to provide.
4361
+
4362
+ The blast radius is bounded by how often one commit cuts two releases, which
4363
+ <code>one-commit-can-cut-two-releases</code> documents happening three times so far
4364
+ (<code>246</code>/<code>247</code>, <code>248</code>/<code>249</code>, <code>277</code>/<code>278</code>).
4365
+ Every duplicate pair mislabels one of its two SBOMs. It is <em>not</em> latent in
4366
+ <code>publish.yml</code>, which builds the PyPI dist: that job checks out before the sibling run's
4367
+ tag exists, so it happens to resolve correctly — all 281 PyPI versions are present and correctly
4368
+ numbered. The defect is specific to the job that runs <em>after</em> both tags are in place.
4369
+
4370
+ <b>Shipped.</b> The build now pins the version to the tag it is building
4371
+ (<code>SETUPTOOLS_SCM_PRETEND_VERSION_FOR_BOOST_SKILL_CLI="${TAG#v}"</code>) and then asserts the
4372
+ wheel it produced carries that version, so a package rename — which would silently unhook the
4373
+ scoped variable and restore the bug — fails the job instead of shipping a mislabelled document.
4374
+ Verified both ways against the live repository: without the pin, <code>v1.0.278</code> resolves to
4375
+ <code>1.0.277</code>; with it, <code>1.0.278</code>.
4376
+
4377
+ The same exercise settled the other thing this workflow had never proven: the multi-tag loop
4378
+ itself. Both <code>run:</code> blocks were extracted verbatim from the YAML and driven against a
4379
+ fixture repository with two tags on one commit, with <code>gh</code> and the build toolchain
4380
+ stubbed. Resolution returns both tags newest-first, the loop iterates both, and it issues a
4381
+ separate <code>upload</code> and a separate post-upload <code>view</code> assertion per tag. That
4382
+ path had never executed in production — every commit since it shipped has carried exactly one tag.</p>
4383
+ <div class="meta">
4384
+ <span class="m">Complexity <b>S</b></span>
4385
+ <span class="m hi">Impact <b>High</b></span>
4386
+ <span class="m">Wow <b class="wow">★★★★★</b></span>
4387
+ <span class="m">fixed — release v1.0.278's SBOM declared 1.0.277; the version is now pinned to the tag</span>
4388
+ </div>
4389
+ </article>
4282
4390
  <!-- /ROADMAP:cards -->
4283
4391
 
4284
4392
  </div>
@@ -30,3 +30,13 @@ interrogate==1.7.0
30
30
  # itself, which is why this set is lint-only and never a runtime dependency.
31
31
  # Reuses the mypy pinned above.
32
32
  refurb==2.3.1
33
+ # shellcheck, as a pinned dependency rather than an assumption. actionlint does
34
+ # not lint `run:` blocks itself — it shells out to shellcheck, and when
35
+ # shellcheck is not on PATH it skips that entirely and still exits 0. Same
36
+ # workflow file, same actionlint: without shellcheck, no output and exit 0; with
37
+ # it, `SC2001` and exit 1. CI got away with it because the GitHub runner image
38
+ # happens to preinstall shellcheck, which is an unpinned, unversioned, silently
39
+ # revocable dependency on somebody else's base image — and locally, where it is
40
+ # usually absent, `make lint` was passing a check it never ran. Pinning it here
41
+ # puts it on both sides and makes the version reviewable like every other tool.
42
+ shellcheck-py==0.11.0.1
@@ -564,6 +564,13 @@ ruff==0.16.0 \
564
564
  --hash=sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e \
565
565
  --hash=sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4
566
566
  # via -r requirements/lint-tools.in
567
+ shellcheck-py==0.11.0.1 \
568
+ --hash=sha256:1b274df81de5b000ff78db433e7328b87e52e3c38481c60f8e488c3095beef05 \
569
+ --hash=sha256:5c620c88901e8f1d3be5934b31ea99e3310065e1245253741eafd0a275c8c9cc \
570
+ --hash=sha256:6b88d0a244c82ed07e06a53e444da841f69330ca59ae15d4a66c391655dae7a0 \
571
+ --hash=sha256:784156289ecb17e91c692cd783ab5152333309588cabb10032a047331c63e759 \
572
+ --hash=sha256:b6a3fee28efda2e16e38d6e6d59faf7224300256456639727370d404730849e8
573
+ # via -r requirements/lint-tools.in
567
574
  six==1.17.0 \
568
575
  --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
569
576
  --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81