boost-skill-cli 1.0.279__tar.gz → 1.0.281__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 (518) hide show
  1. {boost_skill_cli-1.0.279/boost_skill_cli.egg-info → boost_skill_cli-1.0.281}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  5. boost_skill_cli-1.0.281/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +38 -0
  6. boost_skill_cli-1.0.281/docs/roadmap/items/one-commit-can-cut-two-releases.md +52 -0
  7. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/sbom-release-event-never-fires.md +4 -1
  8. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap.html +87 -2
  9. boost_skill_cli-1.0.281/tests/unit/test_codeql_analysis_key.py +95 -0
  10. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.gitattributes +0 -0
  11. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.gitignore +0 -0
  12. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.gitleaks.toml +0 -0
  13. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.htmlvalidate.json +0 -0
  14. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.lighthouserc.json +0 -0
  15. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.lycheeignore +0 -0
  16. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.markdownlint-cli2.jsonc +0 -0
  17. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.pre-commit-config.yaml +0 -0
  18. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.stylelintrc.json +0 -0
  19. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.vale/styles/boost/Terminology.yml +0 -0
  20. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  21. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/.vale.ini +0 -0
  22. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/CLAUDE.md +0 -0
  23. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/CODE_OF_CONDUCT.md +0 -0
  24. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/CONTRIBUTING.md +0 -0
  25. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/LICENSE +0 -0
  26. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/MANIFEST.in +0 -0
  27. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/Makefile +0 -0
  28. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/README.md +0 -0
  29. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/SECURITY.md +0 -0
  30. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost +0 -0
  31. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/__init__.py +0 -0
  32. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/__main__.py +0 -0
  33. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/cli.py +0 -0
  34. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/cliparse.py +0 -0
  35. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/__init__.py +0 -0
  36. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/_common.py +0 -0
  37. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/bmad.py +0 -0
  38. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/configuration.py +0 -0
  39. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/discovery.py +0 -0
  40. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/hooks.py +0 -0
  41. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/info.py +0 -0
  42. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/intelligence.py +0 -0
  43. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/pkg.py +0 -0
  44. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/quality.py +0 -0
  45. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/run.py +0 -0
  46. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/safety.py +0 -0
  47. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/taps.py +0 -0
  48. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/commands/team.py +0 -0
  49. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/__init__.py +0 -0
  50. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/adapters.py +0 -0
  51. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/agents.py +0 -0
  52. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/ai.py +0 -0
  53. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/capabilities.py +0 -0
  54. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/catalog.py +0 -0
  55. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/claude_settings.py +0 -0
  56. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/config.py +0 -0
  57. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/dense.py +0 -0
  58. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/ed25519.py +0 -0
  59. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/embed.py +0 -0
  60. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/faithfulness.py +0 -0
  61. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/frontmatter.py +0 -0
  62. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/gitutil.py +0 -0
  63. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/imperative.py +0 -0
  64. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/injectscan.py +0 -0
  65. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/integrity.py +0 -0
  66. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/journal.py +0 -0
  67. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/lockfile.py +0 -0
  68. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/logs.py +0 -0
  69. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/mcp.py +0 -0
  70. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/mcpdecl.py +0 -0
  71. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/minisign.py +0 -0
  72. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/nethttp.py +0 -0
  73. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/output.py +0 -0
  74. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/paths.py +0 -0
  75. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/policy.py +0 -0
  76. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/projectlock.py +0 -0
  77. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/provenance.py +0 -0
  78. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/rag.py +0 -0
  79. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/registry.py +0 -0
  80. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/resolve.py +0 -0
  81. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/rules.py +0 -0
  82. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/scopes.py +0 -0
  83. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/secretscan.py +0 -0
  84. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/selfupdate.py +0 -0
  85. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/serve.py +0 -0
  86. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/stackprobe.py +0 -0
  87. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/staleness.py +0 -0
  88. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/store.py +0 -0
  89. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/trustaudit.py +0 -0
  90. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/typosquat.py +0 -0
  91. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/updatediff.py +0 -0
  92. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/util.py +0 -0
  93. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/core/workflows.py +0 -0
  94. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/data/registries.json +0 -0
  95. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/errors.py +0 -0
  96. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_cli/spin.py +0 -0
  97. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  98. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  99. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_skill_cli.egg-info/requires.txt +0 -0
  100. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/boost_skill_cli.egg-info/top_level.txt +0 -0
  101. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/codecov.yml +0 -0
  102. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/.claude/settings.local.json +0 -0
  103. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/DEBUGGING.md +0 -0
  104. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/adapters.html +0 -0
  105. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/distill.gif +0 -0
  106. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/doctor.gif +0 -0
  107. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/explain.gif +0 -0
  108. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/hooks.gif +0 -0
  109. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/install.gif +0 -0
  110. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/pulse.gif +0 -0
  111. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/search.gif +0 -0
  112. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/gifs/tap.gif +0 -0
  113. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/distill.tape +0 -0
  114. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/doctor.tape +0 -0
  115. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/explain.tape +0 -0
  116. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/hooks.tape +0 -0
  117. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/install.tape +0 -0
  118. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/pulse.tape +0 -0
  119. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/search.tape +0 -0
  120. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel/tapes/tap.tape +0 -0
  121. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/carousel.html +0 -0
  122. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/commands.html +0 -0
  123. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/demo.gif +0 -0
  124. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/demo.tape +0 -0
  125. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/design-roadmap.html +0 -0
  126. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/eval.html +0 -0
  127. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/index.html +0 -0
  128. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/mcp-hub.html +0 -0
  129. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/rag-architecture.md +0 -0
  130. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D01.md +0 -0
  131. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D02.md +0 -0
  132. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D03.md +0 -0
  133. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D04.md +0 -0
  134. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D05.md +0 -0
  135. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D06.md +0 -0
  136. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D07.md +0 -0
  137. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D08.md +0 -0
  138. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D09.md +0 -0
  139. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D10.md +0 -0
  140. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D11.md +0 -0
  141. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D12.md +0 -0
  142. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D13.md +0 -0
  143. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D14.md +0 -0
  144. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D15.md +0 -0
  145. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D16.md +0 -0
  146. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D17.md +0 -0
  147. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D18.md +0 -0
  148. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D19.md +0 -0
  149. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D20.md +0 -0
  150. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D21.md +0 -0
  151. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D22.md +0 -0
  152. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D23.md +0 -0
  153. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D24.md +0 -0
  154. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D25.md +0 -0
  155. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/BOOST-D26.md +0 -0
  156. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  157. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  158. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  159. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  160. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  161. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  162. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  163. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  164. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  165. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  166. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  167. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  168. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  169. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  170. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  171. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  172. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  173. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  174. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  175. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/command-carousel-page.md +0 -0
  176. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  177. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  178. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  179. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  180. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  181. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  182. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  183. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  184. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  185. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  186. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  187. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  188. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  189. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  190. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  191. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  192. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  193. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  194. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  195. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  196. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  197. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  198. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  199. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  200. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  201. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  202. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  203. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/github-community-health-files.md +0 -0
  204. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  205. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  206. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  207. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  208. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  209. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  210. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  211. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  212. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  213. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  214. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  215. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  216. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  217. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  218. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  219. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  220. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  221. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  222. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  223. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  224. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  225. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  226. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  227. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  228. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  229. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  230. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  231. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  232. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  233. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  234. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  235. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  236. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  237. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  238. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  239. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  240. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  241. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  242. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  243. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  244. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  245. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  246. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  247. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  248. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  249. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  250. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  251. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  252. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  253. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  254. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  255. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  256. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  257. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  258. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  259. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  260. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  261. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  262. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  263. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  264. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  265. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  266. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  267. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  268. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  269. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  270. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  271. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  272. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  273. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  274. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  275. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  276. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  277. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  278. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  279. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  280. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  281. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  282. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  283. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  284. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  285. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  286. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  287. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  288. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  289. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  290. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  291. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  292. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  293. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  294. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  295. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  296. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  297. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  298. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  299. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  300. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  301. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  302. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  303. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  304. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  305. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  306. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  307. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  308. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  309. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  310. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  311. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  312. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  313. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  314. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  315. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  316. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  317. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  318. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  319. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  320. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  321. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  322. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  323. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  324. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/workspace-scope-install.md +0 -0
  325. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  326. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/eslint.config.mjs +0 -0
  327. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/examples/README.md +0 -0
  328. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/examples/adapt-demo.sh +0 -0
  329. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/examples/boost-run-prototype.sh +0 -0
  330. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/index.html +0 -0
  331. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/noxfile.py +0 -0
  332. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/pyproject.toml +0 -0
  333. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/coverage-tools.in +0 -0
  334. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/coverage-tools.txt +0 -0
  335. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/lint-tools.in +0 -0
  336. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/lint-tools.txt +0 -0
  337. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/mutation-tools.in +0 -0
  338. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/mutation-tools.txt +0 -0
  339. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/release-tools.in +0 -0
  340. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/release-tools.txt +0 -0
  341. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/test-tools.in +0 -0
  342. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/requirements/test-tools.txt +0 -0
  343. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/a11y_check.py +0 -0
  344. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/bench_cli.sh +0 -0
  345. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/build_command_reference.py +0 -0
  346. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/build_registries.py +0 -0
  347. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/build_roadmap.py +0 -0
  348. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/check_anchors.py +0 -0
  349. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/check_licenses.py +0 -0
  350. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/check_required_checks.py +0 -0
  351. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/ensure_eval_corpus.sh +0 -0
  352. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/eval_explain.py +0 -0
  353. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/eval_recommend.py +0 -0
  354. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/eval_retrieval.py +0 -0
  355. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/eval_stats_summary.py +0 -0
  356. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/import_budget.py +0 -0
  357. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/lock_toolchain.py +0 -0
  358. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/mutation_gate.py +0 -0
  359. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/mutation_shards.py +0 -0
  360. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/mutation_weights.json +0 -0
  361. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/perf_gate.py +0 -0
  362. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/post_deploy_smoke.py +0 -0
  363. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/scripts/release_preflight.py +0 -0
  364. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/setup.cfg +0 -0
  365. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/sonar-project.properties +0 -0
  366. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/style/README.md +0 -0
  367. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/style/boost.css +0 -0
  368. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/style/boost.js +0 -0
  369. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/style/demo.html +0 -0
  370. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/adapt.feature +0 -0
  371. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/browse.feature +0 -0
  372. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/count.feature +0 -0
  373. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/discover.feature +0 -0
  374. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/doctor.feature +0 -0
  375. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/environment.py +0 -0
  376. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/explain.feature +0 -0
  377. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/index.feature +0 -0
  378. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/install.feature +0 -0
  379. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/list.feature +0 -0
  380. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/mcp.feature +0 -0
  381. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/search.feature +0 -0
  382. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/steps/cli_steps.py +0 -0
  383. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/steps/discovery_steps.py +0 -0
  384. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/steps/mcp_steps.py +0 -0
  385. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/bdd/features/steps/quality_steps.py +0 -0
  386. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/conftest.py +0 -0
  387. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/eval/baseline.json +0 -0
  388. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/eval/explain.jsonl +0 -0
  389. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/eval/golden.jsonl +0 -0
  390. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/eval/recommend.jsonl +0 -0
  391. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/eval/taps.txt +0 -0
  392. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_capabilities_policy.py +0 -0
  393. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_adapt.py +0 -0
  394. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_bmad.py +0 -0
  395. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_configuration.py +0 -0
  396. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_discovery.py +0 -0
  397. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_hooks.py +0 -0
  398. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_info.py +0 -0
  399. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_intelligence.py +0 -0
  400. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_pkg.py +0 -0
  401. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_quality.py +0 -0
  402. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_taps.py +0 -0
  403. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_cli_team.py +0 -0
  404. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_everyday_loop.py +0 -0
  405. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_integrity_enforce.py +0 -0
  406. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_property_parsers.py +0 -0
  407. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_run.py +0 -0
  408. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_tap_signing.py +0 -0
  409. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/functional/test_workspace_scope.py +0 -0
  410. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/README.md +0 -0
  411. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  412. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  413. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  414. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  415. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  416. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  417. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  418. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  419. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  420. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  421. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  422. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  423. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  424. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  425. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  426. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  427. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  428. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  429. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  430. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  431. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/fuzz_frontmatter.py +0 -0
  432. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/fuzz/fuzz_registry.py +0 -0
  433. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/make_fixture.py +0 -0
  434. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/perf/test_benchmarks.py +0 -0
  435. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/smoke.sh +0 -0
  436. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_a11y_check.py +0 -0
  437. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_adapters.py +0 -0
  438. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_adapters_multi.py +0 -0
  439. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_adapters_runner.py +0 -0
  440. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_agents.py +0 -0
  441. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_ai.py +0 -0
  442. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_capabilities.py +0 -0
  443. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_catalog.py +0 -0
  444. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_check_anchors.py +0 -0
  445. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_check_licenses.py +0 -0
  446. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_claude_settings.py +0 -0
  447. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_cliparse.py +0 -0
  448. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_command_reference_fresh.py +0 -0
  449. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_community_health_files.py +0 -0
  450. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_config.py +0 -0
  451. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_dense.py +0 -0
  452. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_dense_fallback.py +0 -0
  453. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_dependabot_config.py +0 -0
  454. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_docs_pages_linked.py +0 -0
  455. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_docsite_chrome.py +0 -0
  456. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_ed25519.py +0 -0
  457. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_embed.py +0 -0
  458. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_errors_and_cli_table.py +0 -0
  459. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_eval_stats_summary.py +0 -0
  460. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_faithfulness.py +0 -0
  461. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_frontmatter.py +0 -0
  462. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_fuzz_targets.py +0 -0
  463. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_gitleaks_config.py +0 -0
  464. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_gitutil.py +0 -0
  465. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_imperative.py +0 -0
  466. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_import_budget.py +0 -0
  467. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_injectscan.py +0 -0
  468. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_integrity.py +0 -0
  469. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_journal.py +0 -0
  470. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_lockfile.py +0 -0
  471. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_logs.py +0 -0
  472. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_marketing_counts.py +0 -0
  473. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_mcp.py +0 -0
  474. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_mcpdecl.py +0 -0
  475. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_minisign.py +0 -0
  476. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_mutation_hardening.py +0 -0
  477. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_mutation_shards.py +0 -0
  478. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_mutmut_source_paths.py +0 -0
  479. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_nethttp.py +0 -0
  480. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_output.py +0 -0
  481. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_paths.py +0 -0
  482. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_perf_gate.py +0 -0
  483. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_pkg_confusions.py +0 -0
  484. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_pkg_injection.py +0 -0
  485. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_pkg_secrets.py +0 -0
  486. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_policy.py +0 -0
  487. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_post_deploy_smoke.py +0 -0
  488. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_projectlock.py +0 -0
  489. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_provenance.py +0 -0
  490. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_rag.py +0 -0
  491. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_registries_fresh.py +0 -0
  492. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_registry.py +0 -0
  493. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_release_preflight.py +0 -0
  494. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_required_checks.py +0 -0
  495. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_resolve.py +0 -0
  496. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_roadmap_fresh.py +0 -0
  497. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_rules.py +0 -0
  498. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_scopes.py +0 -0
  499. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_secretscan.py +0 -0
  500. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_selfupdate.py +0 -0
  501. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_serve.py +0 -0
  502. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_spin.py +0 -0
  503. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_stackprobe.py +0 -0
  504. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_staleness.py +0 -0
  505. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_store.py +0 -0
  506. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_token_parity.py +0 -0
  507. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_toolchain_lock.py +0 -0
  508. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_trustaudit.py +0 -0
  509. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_typosquat.py +0 -0
  510. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_updatediff.py +0 -0
  511. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_util.py +0 -0
  512. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_version.py +0 -0
  513. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_workflow_timeouts.py +0 -0
  514. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/unit/test_workflows.py +0 -0
  515. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/visual/a11y_check.mjs +0 -0
  516. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/visual/console_check.mjs +0 -0
  517. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/visual/package.json +0 -0
  518. {boost_skill_cli-1.0.279 → boost_skill_cli-1.0.281}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.279
3
+ Version: 1.0.281
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.279'
22
- __version_tuple__ = version_tuple = (1, 0, 279)
21
+ __version__ = version = '1.0.281'
22
+ __version_tuple__ = version_tuple = (1, 0, 281)
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.279
3
+ Version: 1.0.281
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -173,6 +173,7 @@ docs/roadmap/items/ci-summary-step-fails-itself.md
173
173
  docs/roadmap/items/ci-time-is-now-runner-queueing.md
174
174
  docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
175
175
  docs/roadmap/items/code-scanning-rule-can-be-restored.md
176
+ docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
176
177
  docs/roadmap/items/command-carousel-page.md
177
178
  docs/roadmap/items/command-reference-docs-site.md
178
179
  docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md
@@ -249,6 +250,7 @@ docs/roadmap/items/mypy-strict-mode-for-commands.md
249
250
  docs/roadmap/items/negative-limit-inverts-log-pulse-output.md
250
251
  docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md
251
252
  docs/roadmap/items/one-command-every-env-nox.md
253
+ docs/roadmap/items/one-commit-can-cut-two-releases.md
252
254
  docs/roadmap/items/one-shared-atomic-write-helper.md
253
255
  docs/roadmap/items/package-metadata-validation-twine-check-friends.md
254
256
  docs/roadmap/items/patch-coverage-gate-diff-cover.md
@@ -441,6 +443,7 @@ tests/unit/test_check_anchors.py
441
443
  tests/unit/test_check_licenses.py
442
444
  tests/unit/test_claude_settings.py
443
445
  tests/unit/test_cliparse.py
446
+ tests/unit/test_codeql_analysis_key.py
444
447
  tests/unit/test_command_reference_fresh.py
445
448
  tests/unit/test_community_health_files.py
446
449
  tests/unit/test_config.py
@@ -0,0 +1,38 @@
1
+ ---
2
+ id: codeql-job-rename-stranded-merge-protection
3
+ board: code
4
+ section: trust
5
+ status: shipped
6
+ category: CI · Bug
7
+ complexity: S
8
+ impact: High
9
+ wow: 4
10
+ note: a job rename forked the code-scanning config and blocked 100% of merges for a day
11
+ order: 37
12
+ owner: loop/codeql-analysis-key-guard
13
+ pr:
14
+ title: A CodeQL job rename silently blocked every merge
15
+ ---
16
+ GitHub identifies a code-scanning configuration by <code>&lt;workflow path&gt;:&lt;job id&gt;</code>, which makes
17
+ the job id load-bearing in a way nothing in the workflow file hints at: renaming it does not
18
+ <i>move</i> the configuration, it <b>forks</b> it. #259 renamed this job <code>analyze</code> to
19
+ <code>codeql-analyze</code> on 2026-07-27. The last <code>:analyze</code> analysis landed 20 seconds
20
+ after that merge and never refreshed, stranding <b>247</b> of them on <code>refs/heads/main</code>
21
+ where GitHub kept counting them as a configuration present on the base branch. Merge protection
22
+ then reported <code>1 configuration not found</code> on every pull request — conclusion
23
+ <code>neutral</code> — and because the branch ruleset carries a <code>code_scanning</code> rule,
24
+ that neutral <b>blocked 100% of merges</b> while every required status check stayed green.
25
+ The cutover is exact: the last <code>success</code> was #263, the first <code>neutral</code> #259,
26
+ and every PR from #264 to #316 was neutral regardless of whether its diff contained Python at all.
27
+ That symmetry is what makes it so easy to misread — it presents as a rule that rejects docs-only
28
+ PRs, and the two hypotheses it invites (<i>"CodeQL has nothing to analyse"</i> and <i>"the rule is
29
+ unsatisfiable"</i>) are both wrong. 29 docs-only PRs merged happily under the same rule before the
30
+ rename. The check body says the real answer outright, and reading it beats inferring from
31
+ <code>mergeable_state</code>. Fixed by deleting the 247 orphaned analyses, which was verified safe
32
+ first: every alert still on the stale key was <code>fixed</code>, and all nine dismissed CodeQL
33
+ alerts already carried their false-positive rationale on the live key. The job id was <i>already</i>
34
+ guarded as a required status-check context by
35
+ <code>scripts/check_required_checks.py</code>, and that guard passed during #259 because the
36
+ context list was updated in the same commit — only the invisible half broke. So the guard added
37
+ here pins the id from the analysis-key side, with a note that a future rename is not finished until
38
+ the stale configuration is deleted. Related: [[release-verifies-the-wrong-commit]].
@@ -0,0 +1,52 @@
1
+ ---
2
+ id: one-commit-can-cut-two-releases
3
+ board: code
4
+ section: pipeline
5
+ status: planned
6
+ category: Release safety
7
+ complexity: M
8
+ impact: Med
9
+ wow: 3
10
+ note: v1.0.277 and v1.0.278 are the same commit; so were 246/247 and 248/249
11
+ order: 67
12
+ owner:
13
+ pr:
14
+ title: One commit can cut two releases, and the naive guard against it breaks retries
15
+ ---
16
+ <code>publish.yml</code> checks out <code>ref: main</code> rather than the commit whose
17
+ <code>ci</code> fired it. <code>release-verifies-the-wrong-commit</code> fixed the
18
+ <em>verification</em> half of that &mdash; preflight now waits on the shipped sha's own gates
19
+ &mdash; but the same decoupling has a second consequence it does not address: <b>two triggers can
20
+ both resolve to the same tip and release it twice.</b>
21
+
22
+ Observed on <code>5061e756</code>: two <code>release</code> runs created 27 seconds apart
23
+ (22:24:32Z and 22:24:59Z), both succeeding, cutting <b>v1.0.277 and v1.0.278 from one commit</b>.
24
+ It recurs &mdash; <code>v1.0.246</code>/<code>v1.0.247</code> both point at <code>c1d67c1c</code>,
25
+ and <code>v1.0.248</code>/<code>v1.0.249</code> both at <code>c750651</code>. Each duplicate burns
26
+ a PyPI version on a byte-identical build and, until the companion fix in this change, left one of
27
+ the two GitHub Releases with no SBOM.
28
+
29
+ Preflight does not stop it and was never going to: both runs check out the same green tip, so both
30
+ legitimately pass every gate. The duplication is upstream of verification.
31
+
32
+ <b>The obvious fix is a trap, which is why this is filed rather than patched.</b> Guarding with
33
+ "skip if <code>git tag --points-at HEAD</code> already has a <code>v*</code> tag" would stop the
34
+ duplicate &mdash; and would also stop any legitimate <b>retry</b>. release-drafter creates the tag
35
+ <em>before</em> the build, attestation, wheel smoke-test and PyPI upload run, so a release that
36
+ failed at the upload step leaves a tag behind with nothing on PyPI. Under that guard, re-running it
37
+ would skip instead of finishing the job, converting a recoverable failure into a version that can
38
+ never be published. The <code>concurrency: group: release</code> block does not help either: it
39
+ serialises the two runs rather than collapsing them, which is exactly what happened here.
40
+
41
+ A correct fix has to distinguish "already released" from "tagged but not published" &mdash; check
42
+ whether the version exists on PyPI, or whether the GitHub Release has its expected assets, rather
43
+ than whether a tag exists. Alternatives worth weighing: collapse the trigger so only the newest
44
+ queued run proceeds (<code>cancel-in-progress</code> on a group keyed by nothing, losing the
45
+ serialisation the release job wants), or skip when <code>git rev-parse HEAD</code> already differs
46
+ from <code>workflow_run.head_sha</code> &mdash; that is self-healing, since the newer commit's own
47
+ ci will trigger its own release, but it means some merges never get their own version.
48
+
49
+ <b>Already mitigated:</b> <code>sbom.yml</code> now builds and attaches an SBOM for <em>every</em>
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.
@@ -48,7 +48,10 @@ Two details the trigger change forced. The workflow now resolves its tag from th
48
48
  commit (<code>git tag --points-at</code>) rather than "newest release" &mdash; releases here
49
49
  land minutes apart, so <code>gh release view</code> would race and SBOM the <em>next</em>
50
50
  version; and two tags on one commit is real (<code>v1.0.248</code> and <code>v1.0.249</code>
51
- both point at <code>c750651</code>), so it takes the highest. And per the original note, a
51
+ both point at <code>c750651</code>), so it takes <em>every</em> tag on the commit and builds each
52
+ separately &mdash; taking only the highest left the other release with no SBOM, which showed up in
53
+ production as <code>v1.0.277</code>; see <code>one-commit-can-cut-two-releases</code>. And per the
54
+ original note, a
52
55
  final step re-reads the release and fails unless the asset is actually attached &mdash; a
53
56
  silent upload no-op is indistinguishable from success, which is the same class of quiet
54
57
  nothing that produced this bug.
@@ -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>171</b><span>Loop finds</span></div>
113
+ <div class="stat"><b>173</b><span>Loop finds</span></div>
114
114
  <!-- /ROADMAP:stats -->
115
115
  </div>
116
116
  </section>
@@ -2668,6 +2668,54 @@ before touching a tree, and 68 stale entries make that check noisier for every c
2668
2668
  <span class="m">68 of 70 loop/* branches have a merged PR; one setting fixes it</span>
2669
2669
  </div>
2670
2670
  </article>
2671
+
2672
+ <article class="cap rcard" id="one-commit-can-cut-two-releases">
2673
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Release safety</span></div>
2674
+ <h3>One commit can cut two releases, and the naive guard against it breaks retries</h3>
2675
+ <p><code>publish.yml</code> checks out <code>ref: main</code> rather than the commit whose
2676
+ <code>ci</code> fired it. <code>release-verifies-the-wrong-commit</code> fixed the
2677
+ <em>verification</em> half of that &mdash; preflight now waits on the shipped sha's own gates
2678
+ &mdash; but the same decoupling has a second consequence it does not address: <b>two triggers can
2679
+ both resolve to the same tip and release it twice.</b>
2680
+
2681
+ Observed on <code>5061e756</code>: two <code>release</code> runs created 27 seconds apart
2682
+ (22:24:32Z and 22:24:59Z), both succeeding, cutting <b>v1.0.277 and v1.0.278 from one commit</b>.
2683
+ It recurs &mdash; <code>v1.0.246</code>/<code>v1.0.247</code> both point at <code>c1d67c1c</code>,
2684
+ and <code>v1.0.248</code>/<code>v1.0.249</code> both at <code>c750651</code>. Each duplicate burns
2685
+ a PyPI version on a byte-identical build and, until the companion fix in this change, left one of
2686
+ the two GitHub Releases with no SBOM.
2687
+
2688
+ Preflight does not stop it and was never going to: both runs check out the same green tip, so both
2689
+ legitimately pass every gate. The duplication is upstream of verification.
2690
+
2691
+ <b>The obvious fix is a trap, which is why this is filed rather than patched.</b> Guarding with
2692
+ "skip if <code>git tag --points-at HEAD</code> already has a <code>v*</code> tag" would stop the
2693
+ duplicate &mdash; and would also stop any legitimate <b>retry</b>. release-drafter creates the tag
2694
+ <em>before</em> the build, attestation, wheel smoke-test and PyPI upload run, so a release that
2695
+ failed at the upload step leaves a tag behind with nothing on PyPI. Under that guard, re-running it
2696
+ would skip instead of finishing the job, converting a recoverable failure into a version that can
2697
+ never be published. The <code>concurrency: group: release</code> block does not help either: it
2698
+ serialises the two runs rather than collapsing them, which is exactly what happened here.
2699
+
2700
+ A correct fix has to distinguish "already released" from "tagged but not published" &mdash; check
2701
+ whether the version exists on PyPI, or whether the GitHub Release has its expected assets, rather
2702
+ than whether a tag exists. Alternatives worth weighing: collapse the trigger so only the newest
2703
+ queued run proceeds (<code>cancel-in-progress</code> on a group keyed by nothing, losing the
2704
+ serialisation the release job wants), or skip when <code>git rev-parse HEAD</code> already differs
2705
+ from <code>workflow_run.head_sha</code> &mdash; that is self-healing, since the newer commit's own
2706
+ ci will trigger its own release, but it means some merges never get their own version.
2707
+
2708
+ <b>Already mitigated:</b> <code>sbom.yml</code> now builds and attaches an SBOM for <em>every</em>
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>
2712
+ <div class="meta">
2713
+ <span class="m">Complexity <b>M</b></span>
2714
+ <span class="m">Impact <b>Med</b></span>
2715
+ <span class="m">Wow <b class="wow">★★★</b></span>
2716
+ <span class="m">v1.0.277 and v1.0.278 are the same commit; so were 246/247 and 248/249</span>
2717
+ </div>
2718
+ </article>
2671
2719
  <!-- /ROADMAP:cards -->
2672
2720
 
2673
2721
  </div>
@@ -3966,6 +4014,40 @@ is built.</p>
3966
4014
  </div>
3967
4015
  </article>
3968
4016
 
4017
+ <article class="cap rcard" id="codeql-job-rename-stranded-merge-protection">
4018
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI · Bug</span></div>
4019
+ <h3>A CodeQL job rename silently blocked every merge</h3>
4020
+ <p>GitHub identifies a code-scanning configuration by <code>&lt;workflow path&gt;:&lt;job id&gt;</code>, which makes
4021
+ the job id load-bearing in a way nothing in the workflow file hints at: renaming it does not
4022
+ <i>move</i> the configuration, it <b>forks</b> it. #259 renamed this job <code>analyze</code> to
4023
+ <code>codeql-analyze</code> on 2026-07-27. The last <code>:analyze</code> analysis landed 20 seconds
4024
+ after that merge and never refreshed, stranding <b>247</b> of them on <code>refs/heads/main</code>
4025
+ where GitHub kept counting them as a configuration present on the base branch. Merge protection
4026
+ then reported <code>1 configuration not found</code> on every pull request — conclusion
4027
+ <code>neutral</code> — and because the branch ruleset carries a <code>code_scanning</code> rule,
4028
+ that neutral <b>blocked 100% of merges</b> while every required status check stayed green.
4029
+ The cutover is exact: the last <code>success</code> was #263, the first <code>neutral</code> #259,
4030
+ and every PR from #264 to #316 was neutral regardless of whether its diff contained Python at all.
4031
+ That symmetry is what makes it so easy to misread — it presents as a rule that rejects docs-only
4032
+ PRs, and the two hypotheses it invites (<i>"CodeQL has nothing to analyse"</i> and <i>"the rule is
4033
+ unsatisfiable"</i>) are both wrong. 29 docs-only PRs merged happily under the same rule before the
4034
+ rename. The check body says the real answer outright, and reading it beats inferring from
4035
+ <code>mergeable_state</code>. Fixed by deleting the 247 orphaned analyses, which was verified safe
4036
+ first: every alert still on the stale key was <code>fixed</code>, and all nine dismissed CodeQL
4037
+ alerts already carried their false-positive rationale on the live key. The job id was <i>already</i>
4038
+ guarded as a required status-check context by
4039
+ <code>scripts/check_required_checks.py</code>, and that guard passed during #259 because the
4040
+ context list was updated in the same commit — only the invisible half broke. So the guard added
4041
+ here pins the id from the analysis-key side, with a note that a future rename is not finished until
4042
+ the stale configuration is deleted. Related: [[release-verifies-the-wrong-commit]].</p>
4043
+ <div class="meta">
4044
+ <span class="m">Complexity <b>S</b></span>
4045
+ <span class="m hi">Impact <b>High</b></span>
4046
+ <span class="m">Wow <b class="wow">★★★★</b></span>
4047
+ <span class="m">a job rename forked the code-scanning config and blocked 100% of merges for a day</span>
4048
+ </div>
4049
+ </article>
4050
+
3969
4051
  <article class="cap rcard" id="installed-skill-trust-audit">
3970
4052
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Trust · Health</span></div>
3971
4053
  <h3><code>boost audit --skills</code> — a trust/staleness report for installed skills</h3>
@@ -4029,7 +4111,10 @@ Two details the trigger change forced. The workflow now resolves its tag from th
4029
4111
  commit (<code>git tag --points-at</code>) rather than "newest release" &mdash; releases here
4030
4112
  land minutes apart, so <code>gh release view</code> would race and SBOM the <em>next</em>
4031
4113
  version; and two tags on one commit is real (<code>v1.0.248</code> and <code>v1.0.249</code>
4032
- both point at <code>c750651</code>), so it takes the highest. And per the original note, a
4114
+ both point at <code>c750651</code>), so it takes <em>every</em> tag on the commit and builds each
4115
+ separately &mdash; taking only the highest left the other release with no SBOM, which showed up in
4116
+ production as <code>v1.0.277</code>; see <code>one-commit-can-cut-two-releases</code>. And per the
4117
+ original note, a
4033
4118
  final step re-reads the release and fails unless the asset is actually attached &mdash; a
4034
4119
  silent upload no-op is indistinguishable from success, which is the same class of quiet
4035
4120
  nothing that produced this bug.</p>
@@ -0,0 +1,95 @@
1
+ """Unit tests: the CodeQL job id is half of a code-scanning analysis key.
2
+
3
+ GitHub identifies a code-scanning configuration by ``<workflow path>:<job id>``.
4
+ That makes the job id load-bearing in a way nothing in the file hints at:
5
+ renaming it does not *move* the configuration, it **forks** it. The old key stays
6
+ on record as a configuration present on the default branch, no future run ever
7
+ refreshes it, and code-scanning merge protection then reports
8
+
9
+ 1 configuration not found
10
+ .github/workflows/codeql.yml:<old job id>
11
+
12
+ on every pull request — conclusion ``neutral``, forever.
13
+
14
+ This is not hypothetical. #259 ("ci(release-safety): make the required-check list
15
+ config-as-code") renamed this job ``analyze`` -> ``codeql-analyze`` on
16
+ 2026-07-27. The last ``:analyze`` analysis landed 20 seconds after that merge and
17
+ never refreshed, stranding 247 of them on ``refs/heads/main``. Every PR from #264
18
+ onward reported ``neutral``, and because the branch ruleset carries a
19
+ ``code_scanning`` rule, that neutral blocked **100% of merges** — with all
20
+ required status checks green, which is what made it so hard to read. It looked
21
+ like a rule that rejected docs-only PRs; it was a rule that could never be
22
+ satisfied by anything.
23
+
24
+ The job id is also a required status-check context (``.github/required-checks.txt``,
25
+ enforced by scripts/check_required_checks.py), so a rename already had one guard.
26
+ That guard passed: the context list was updated in the same commit. Only the
27
+ invisible half — the analysis key — broke.
28
+
29
+ So this pins the id. If you genuinely need to rename the job, the rename is not
30
+ finished until the stale configuration is deleted from the default branch
31
+ (Security -> Code scanning -> any alert -> Affected branches -> main ->
32
+ Configurations analyzing -> delete the old key; or DELETE
33
+ /repos/{owner}/{repo}/code-scanning/analyses/{id}?confirm_delete=true, walking
34
+ ``next_analysis_url`` to the end of the set).
35
+ """
36
+ from __future__ import annotations
37
+
38
+ import importlib.util
39
+ from pathlib import Path
40
+
41
+ ROOT = Path(__file__).resolve().parent.parent.parent
42
+ WORKFLOW = ROOT / ".github" / "workflows" / "codeql.yml"
43
+
44
+ # Both halves of the analysis key GitHub records for this repo's CodeQL setup.
45
+ # Changing either one strands the configuration these names describe.
46
+ EXPECTED_WORKFLOW = ".github/workflows/codeql.yml"
47
+ EXPECTED_JOB_ID = "codeql-analyze"
48
+
49
+
50
+ def _parse_workflow():
51
+ """Reuse the repo's own stdlib workflow parser (no YAML dep in the lint set)."""
52
+ script = ROOT / "scripts" / "check_required_checks.py"
53
+ spec = importlib.util.spec_from_file_location("check_required_checks_for_key",
54
+ script)
55
+ mod = importlib.util.module_from_spec(spec)
56
+ assert spec.loader is not None
57
+ spec.loader.exec_module(mod)
58
+ return mod.parse_workflow(WORKFLOW)
59
+
60
+
61
+ class TestAnalysisKeyIsStable:
62
+ def test_the_workflow_lives_where_the_key_says_it_does(self):
63
+ assert WORKFLOW.is_file()
64
+ assert WORKFLOW.relative_to(ROOT).as_posix() == EXPECTED_WORKFLOW
65
+
66
+ def test_the_codeql_job_id_is_pinned(self):
67
+ _, _, jobs = _parse_workflow()
68
+ assert EXPECTED_JOB_ID in jobs, (
69
+ "the CodeQL job id changed to %r. That forks the code-scanning "
70
+ "configuration: GitHub keeps '%s:%s' on record as present on the "
71
+ "default branch, nothing refreshes it, and merge protection reports "
72
+ "'1 configuration not found' -> neutral on every PR from now on. "
73
+ "Delete the stale configuration before landing the rename."
74
+ % (sorted(jobs), EXPECTED_WORKFLOW, EXPECTED_JOB_ID))
75
+
76
+ def test_exactly_one_job_produces_the_key(self):
77
+ # A second job in this file would add a second configuration, and every
78
+ # one of them has to keep reporting or merge protection goes neutral
79
+ # again. Adding one is a deliberate act, not a drive-by edit.
80
+ _, _, jobs = _parse_workflow()
81
+ assert list(jobs) == [EXPECTED_JOB_ID], sorted(jobs)
82
+
83
+
84
+ class TestTheGuardActuallyParses:
85
+ """A parser that silently stops matching would make the pin vacuous."""
86
+
87
+ def test_parser_finds_jobs_at_all(self):
88
+ _, _, jobs = _parse_workflow()
89
+ assert jobs, "parsed no jobs out of codeql.yml — the guard is not checking anything"
90
+
91
+ def test_workflow_still_runs_on_pull_request(self):
92
+ # The key is only ever exercised on PRs; a workflow that stopped
93
+ # triggering there would strand the configuration just as effectively.
94
+ on_pr, _, _ = _parse_workflow()
95
+ assert on_pr != "none", "codeql.yml no longer runs on pull_request"