boost-skill-cli 1.0.304__tar.gz → 1.0.306__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 (559) hide show
  1. {boost_skill_cli-1.0.304/boost_skill_cli.egg-info → boost_skill_cli-1.0.306}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  5. boost_skill_cli-1.0.306/docs/roadmap/items/ci-time-is-now-runner-queueing.md +71 -0
  6. boost_skill_cli-1.0.306/docs/roadmap/items/keyless-item.md +84 -0
  7. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap.html +114 -3
  8. boost_skill_cli-1.0.306/tests/unit/test_workflow_concurrency.py +112 -0
  9. boost_skill_cli-1.0.304/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -40
  10. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.gitattributes +0 -0
  11. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.gitignore +0 -0
  12. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.gitleaks.toml +0 -0
  13. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.htmlvalidate.json +0 -0
  14. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.lighthouserc.json +0 -0
  15. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.lycheeignore +0 -0
  16. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.markdownlint-cli2.jsonc +0 -0
  17. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.pre-commit-config.yaml +0 -0
  18. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.stylelintrc.json +0 -0
  19. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.vale/styles/boost/Terminology.yml +0 -0
  20. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  21. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.vale.ini +0 -0
  22. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/CLAUDE.md +0 -0
  23. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/CODE_OF_CONDUCT.md +0 -0
  24. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/CONTRIBUTING.md +0 -0
  25. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/LICENSE +0 -0
  26. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/MANIFEST.in +0 -0
  27. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/Makefile +0 -0
  28. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/README.md +0 -0
  29. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/SECURITY.md +0 -0
  30. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost +0 -0
  31. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/__init__.py +0 -0
  32. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/__main__.py +0 -0
  33. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/cli.py +0 -0
  34. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/cliparse.py +0 -0
  35. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/__init__.py +0 -0
  36. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/_common.py +0 -0
  37. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/bmad.py +0 -0
  38. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/configuration.py +0 -0
  39. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/discovery.py +0 -0
  40. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/hooks.py +0 -0
  41. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/info.py +0 -0
  42. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/intelligence.py +0 -0
  43. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/pkg.py +0 -0
  44. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/quality.py +0 -0
  45. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/run.py +0 -0
  46. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/safety.py +0 -0
  47. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/taps.py +0 -0
  48. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/team.py +0 -0
  49. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/__init__.py +0 -0
  50. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/adapters.py +0 -0
  51. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/agents.py +0 -0
  52. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/ai.py +0 -0
  53. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/capabilities.py +0 -0
  54. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/catalog.py +0 -0
  55. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/claude_settings.py +0 -0
  56. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/config.py +0 -0
  57. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/dense.py +0 -0
  58. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/ed25519.py +0 -0
  59. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/embed.py +0 -0
  60. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/faithfulness.py +0 -0
  61. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/frontmatter.py +0 -0
  62. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/gitutil.py +0 -0
  63. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/imperative.py +0 -0
  64. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/injectscan.py +0 -0
  65. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/installscan.py +0 -0
  66. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/integrity.py +0 -0
  67. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/journal.py +0 -0
  68. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/lockfile.py +0 -0
  69. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/logs.py +0 -0
  70. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/mcp.py +0 -0
  71. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/mcpdecl.py +0 -0
  72. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/mcphost.py +0 -0
  73. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/minisign.py +0 -0
  74. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/nethttp.py +0 -0
  75. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/output.py +0 -0
  76. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/paths.py +0 -0
  77. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/policy.py +0 -0
  78. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/projectlock.py +0 -0
  79. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/provenance.py +0 -0
  80. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/rag.py +0 -0
  81. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/registry.py +0 -0
  82. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/resolve.py +0 -0
  83. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/rules.py +0 -0
  84. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/scopes.py +0 -0
  85. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/secretscan.py +0 -0
  86. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/selfupdate.py +0 -0
  87. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/serve.py +0 -0
  88. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/stackprobe.py +0 -0
  89. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/staleness.py +0 -0
  90. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/store.py +0 -0
  91. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/trustaudit.py +0 -0
  92. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/typosquat.py +0 -0
  93. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/updatediff.py +0 -0
  94. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/util.py +0 -0
  95. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/workflows.py +0 -0
  96. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/data/registries.json +0 -0
  97. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/errors.py +0 -0
  98. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/spin.py +0 -0
  99. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  100. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  101. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/requires.txt +0 -0
  102. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/top_level.txt +0 -0
  103. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/codecov.yml +0 -0
  104. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/.claude/settings.local.json +0 -0
  105. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/DEBUGGING.md +0 -0
  106. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/adapters.html +0 -0
  107. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/README.md +0 -0
  108. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-components-core.md +0 -0
  109. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-containers.md +0 -0
  110. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-context.md +0 -0
  111. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-dynamic-install.md +0 -0
  112. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/distill.gif +0 -0
  113. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/doctor.gif +0 -0
  114. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/explain.gif +0 -0
  115. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/hooks.gif +0 -0
  116. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/install.gif +0 -0
  117. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/pulse.gif +0 -0
  118. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/search.gif +0 -0
  119. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/tap.gif +0 -0
  120. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/distill.tape +0 -0
  121. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/doctor.tape +0 -0
  122. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/explain.tape +0 -0
  123. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/hooks.tape +0 -0
  124. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/install.tape +0 -0
  125. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/pulse.tape +0 -0
  126. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/search.tape +0 -0
  127. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/tap.tape +0 -0
  128. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel.html +0 -0
  129. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/commands.html +0 -0
  130. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/demo.gif +0 -0
  131. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/demo.tape +0 -0
  132. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/design-roadmap.html +0 -0
  133. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/eval.html +0 -0
  134. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/index.html +0 -0
  135. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/mcp-hub.html +0 -0
  136. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/rag-architecture.md +0 -0
  137. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D01.md +0 -0
  138. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D02.md +0 -0
  139. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D03.md +0 -0
  140. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D04.md +0 -0
  141. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D05.md +0 -0
  142. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D06.md +0 -0
  143. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D07.md +0 -0
  144. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D08.md +0 -0
  145. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D09.md +0 -0
  146. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D10.md +0 -0
  147. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D11.md +0 -0
  148. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D12.md +0 -0
  149. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D13.md +0 -0
  150. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D14.md +0 -0
  151. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D15.md +0 -0
  152. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D16.md +0 -0
  153. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D17.md +0 -0
  154. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D18.md +0 -0
  155. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D19.md +0 -0
  156. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D20.md +0 -0
  157. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D21.md +0 -0
  158. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D22.md +0 -0
  159. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D23.md +0 -0
  160. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D24.md +0 -0
  161. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D25.md +0 -0
  162. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D26.md +0 -0
  163. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  164. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  165. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  166. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  167. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  168. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  169. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  170. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  171. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  172. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  173. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  174. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  175. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  176. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  177. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  178. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  179. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  180. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  181. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  182. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  183. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/command-carousel-page.md +0 -0
  184. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  185. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  186. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  187. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  188. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  189. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  190. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  191. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  192. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  193. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  194. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  195. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  196. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  197. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  198. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  199. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  200. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  201. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  202. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  203. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  204. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  205. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  206. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  207. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  208. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  209. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  210. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  211. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  212. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/github-community-health-files.md +0 -0
  213. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  214. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  215. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  216. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  217. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  218. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  219. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  220. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  221. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  222. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  223. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  224. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  225. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  226. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  227. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  228. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  229. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  230. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  231. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  232. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  233. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  234. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  235. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  236. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  237. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  238. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  239. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  240. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  241. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  242. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  243. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  244. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  245. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  246. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  247. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  248. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  249. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  250. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  251. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  252. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  253. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  254. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  255. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  256. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  257. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  258. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  259. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  260. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  261. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  262. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  263. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  264. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  265. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  266. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  267. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  268. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  269. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  270. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  271. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  272. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  273. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  274. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  275. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  276. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  277. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  278. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  279. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  280. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  281. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  282. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  283. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  284. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  285. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  286. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  287. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  288. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  289. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  290. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  291. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  292. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  293. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  294. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  295. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  296. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  297. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  298. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  299. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  300. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  301. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  302. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  303. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  304. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  305. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  306. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  307. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  308. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  309. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  310. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  311. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  312. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  313. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  314. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  315. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  316. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  317. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  318. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  319. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  320. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  321. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  322. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  323. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  324. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  325. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  326. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  327. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  328. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  329. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  330. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  331. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  332. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  333. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  334. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  335. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  336. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  337. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  338. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  339. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  340. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  341. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workspace-scope-install.md +0 -0
  342. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  343. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/eslint.config.mjs +0 -0
  344. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/README.md +0 -0
  345. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/__init__.py +0 -0
  346. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/baseline.json +0 -0
  347. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/faithfulness.py +0 -0
  348. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/golden_set.json +0 -0
  349. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/make_corpus.py +0 -0
  350. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/make_golden.py +0 -0
  351. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/metrics.py +0 -0
  352. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/run_evals.py +0 -0
  353. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/examples/README.md +0 -0
  354. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/examples/adapt-demo.sh +0 -0
  355. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/examples/boost-run-prototype.sh +0 -0
  356. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/index.html +0 -0
  357. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/noxfile.py +0 -0
  358. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/pyproject.toml +0 -0
  359. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/coverage-tools.in +0 -0
  360. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/coverage-tools.txt +0 -0
  361. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/lint-tools.in +0 -0
  362. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/lint-tools.txt +0 -0
  363. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/mutation-tools.in +0 -0
  364. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/mutation-tools.txt +0 -0
  365. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/platform-pins.lock +0 -0
  366. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/release-tools.in +0 -0
  367. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/release-tools.txt +0 -0
  368. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/test-tools.in +0 -0
  369. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/test-tools.txt +0 -0
  370. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/a11y_check.py +0 -0
  371. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/bench_cli.sh +0 -0
  372. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/build_command_reference.py +0 -0
  373. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/build_registries.py +0 -0
  374. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/build_roadmap.py +0 -0
  375. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/check_anchors.py +0 -0
  376. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/check_licenses.py +0 -0
  377. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/check_required_checks.py +0 -0
  378. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/ensure_eval_corpus.sh +0 -0
  379. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_explain.py +0 -0
  380. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_gate.py +0 -0
  381. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_recommend.py +0 -0
  382. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_retrieval.py +0 -0
  383. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_stats_summary.py +0 -0
  384. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/import_budget.py +0 -0
  385. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/lock_toolchain.py +0 -0
  386. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/mutation_gate.py +0 -0
  387. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/mutation_shards.py +0 -0
  388. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/mutation_weights.json +0 -0
  389. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/perf_gate.py +0 -0
  390. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/post_deploy_smoke.py +0 -0
  391. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/release_guard.py +0 -0
  392. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/release_preflight.py +0 -0
  393. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/setup.cfg +0 -0
  394. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/sonar-project.properties +0 -0
  395. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/README.md +0 -0
  396. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/boost.css +0 -0
  397. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/boost.js +0 -0
  398. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/demo.html +0 -0
  399. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/adapt.feature +0 -0
  400. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/browse.feature +0 -0
  401. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/count.feature +0 -0
  402. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/discover.feature +0 -0
  403. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/doctor.feature +0 -0
  404. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/environment.py +0 -0
  405. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/explain.feature +0 -0
  406. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/index.feature +0 -0
  407. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/install.feature +0 -0
  408. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/list.feature +0 -0
  409. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/mcp.feature +0 -0
  410. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/search.feature +0 -0
  411. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/cli_steps.py +0 -0
  412. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/discovery_steps.py +0 -0
  413. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/mcp_steps.py +0 -0
  414. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/quality_steps.py +0 -0
  415. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/conftest.py +0 -0
  416. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/baseline.json +0 -0
  417. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/explain.jsonl +0 -0
  418. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/golden.jsonl +0 -0
  419. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/recommend.jsonl +0 -0
  420. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/taps.txt +0 -0
  421. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_capabilities_policy.py +0 -0
  422. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_adapt.py +0 -0
  423. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_bmad.py +0 -0
  424. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_configuration.py +0 -0
  425. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_discovery.py +0 -0
  426. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_hooks.py +0 -0
  427. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_info.py +0 -0
  428. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_intelligence.py +0 -0
  429. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_pkg.py +0 -0
  430. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_quality.py +0 -0
  431. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_taps.py +0 -0
  432. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_team.py +0 -0
  433. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_everyday_loop.py +0 -0
  434. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_integrity_enforce.py +0 -0
  435. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_property_parsers.py +0 -0
  436. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_run.py +0 -0
  437. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_tap_signing.py +0 -0
  438. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_workspace_scope.py +0 -0
  439. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/README.md +0 -0
  440. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  441. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  442. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  443. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  444. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  445. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  446. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  447. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  448. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  449. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  450. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  451. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  452. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  453. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  454. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  455. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  456. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  457. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  458. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  459. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  460. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/fuzz_frontmatter.py +0 -0
  461. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/fuzz_registry.py +0 -0
  462. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/make_fixture.py +0 -0
  463. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/perf/test_benchmarks.py +0 -0
  464. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/smoke.sh +0 -0
  465. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_a11y_check.py +0 -0
  466. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_adapters.py +0 -0
  467. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_adapters_multi.py +0 -0
  468. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_adapters_runner.py +0 -0
  469. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_agents.py +0 -0
  470. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_ai.py +0 -0
  471. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_capabilities.py +0 -0
  472. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_catalog.py +0 -0
  473. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_check_anchors.py +0 -0
  474. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_check_licenses.py +0 -0
  475. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_claude_settings.py +0 -0
  476. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_cliparse.py +0 -0
  477. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_codeql_analysis_key.py +0 -0
  478. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_command_reference_fresh.py +0 -0
  479. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_community_health_files.py +0 -0
  480. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_config.py +0 -0
  481. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_dense.py +0 -0
  482. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_dense_fallback.py +0 -0
  483. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_dependabot_config.py +0 -0
  484. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_docs_pages_linked.py +0 -0
  485. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_docsite_chrome.py +0 -0
  486. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_ed25519.py +0 -0
  487. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_embed.py +0 -0
  488. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_errors_and_cli_table.py +0 -0
  489. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_faithfulness.py +0 -0
  490. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_gate.py +0 -0
  491. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_metrics.py +0 -0
  492. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_stats_summary.py +0 -0
  493. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_faithfulness.py +0 -0
  494. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_frontmatter.py +0 -0
  495. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_fuzz_targets.py +0 -0
  496. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_gitleaks_config.py +0 -0
  497. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_gitutil.py +0 -0
  498. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_imperative.py +0 -0
  499. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_import_budget.py +0 -0
  500. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_injectscan.py +0 -0
  501. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_installscan.py +0 -0
  502. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_integrity.py +0 -0
  503. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_journal.py +0 -0
  504. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_lockfile.py +0 -0
  505. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_logs.py +0 -0
  506. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_marketing_counts.py +0 -0
  507. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcp.py +0 -0
  508. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcp_install_scan.py +0 -0
  509. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcpdecl.py +0 -0
  510. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcphost.py +0 -0
  511. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_minisign.py +0 -0
  512. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutation_hardening.py +0 -0
  513. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutation_shards.py +0 -0
  514. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutation_subfile_shards.py +0 -0
  515. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutmut_source_paths.py +0 -0
  516. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_nethttp.py +0 -0
  517. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_output.py +0 -0
  518. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_paths.py +0 -0
  519. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_perf_gate.py +0 -0
  520. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_pkg_confusions.py +0 -0
  521. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_pkg_injection.py +0 -0
  522. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_pkg_secrets.py +0 -0
  523. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_platform_pins.py +0 -0
  524. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_policy.py +0 -0
  525. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_post_deploy_smoke.py +0 -0
  526. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_projectlock.py +0 -0
  527. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_provenance.py +0 -0
  528. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_rag.py +0 -0
  529. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_registries_fresh.py +0 -0
  530. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_registry.py +0 -0
  531. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_registry_categories.py +0 -0
  532. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_release_guard.py +0 -0
  533. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_release_preflight.py +0 -0
  534. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_required_checks.py +0 -0
  535. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_resolve.py +0 -0
  536. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_roadmap_fresh.py +0 -0
  537. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_rules.py +0 -0
  538. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_scopes.py +0 -0
  539. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_secretscan.py +0 -0
  540. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_selfupdate.py +0 -0
  541. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_serve.py +0 -0
  542. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_spin.py +0 -0
  543. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_stackprobe.py +0 -0
  544. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_staleness.py +0 -0
  545. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_store.py +0 -0
  546. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_token_parity.py +0 -0
  547. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_toolchain_lock.py +0 -0
  548. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_trustaudit.py +0 -0
  549. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_typosquat.py +0 -0
  550. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_updatediff.py +0 -0
  551. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_util.py +0 -0
  552. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_version.py +0 -0
  553. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_workflow_timeouts.py +0 -0
  554. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_workflows.py +0 -0
  555. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/a11y_check.mjs +0 -0
  556. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/console_check.mjs +0 -0
  557. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/package-lock.json +0 -0
  558. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/package.json +0 -0
  559. {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/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.304
3
+ Version: 1.0.306
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.304'
22
- __version_tuple__ = version_tuple = (1, 0, 304)
21
+ __version__ = version = '1.0.306'
22
+ __version_tuple__ = version_tuple = (1, 0, 306)
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.304
3
+ Version: 1.0.306
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -225,6 +225,7 @@ docs/roadmap/items/integrity-verification-boost-verify.md
225
225
  docs/roadmap/items/internal-architecture-diagrams.md
226
226
  docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md
227
227
  docs/roadmap/items/journal-rotation-race-and-handle-leak.md
228
+ docs/roadmap/items/keyless-item.md
228
229
  docs/roadmap/items/layering-guard-import-linter.md
229
230
  docs/roadmap/items/license-compliance-scanning.md
230
231
  docs/roadmap/items/lighthouse-ci-on-the-pages-site.md
@@ -546,6 +547,7 @@ tests/unit/test_typosquat.py
546
547
  tests/unit/test_updatediff.py
547
548
  tests/unit/test_util.py
548
549
  tests/unit/test_version.py
550
+ tests/unit/test_workflow_concurrency.py
549
551
  tests/unit/test_workflow_timeouts.py
550
552
  tests/unit/test_workflows.py
551
553
  tests/visual/a11y_check.mjs
@@ -0,0 +1,71 @@
1
+ ---
2
+ id: ci-time-is-now-runner-queueing
3
+ board: code
4
+ section: pipeline
5
+ status: shipped
6
+ category: CI speed
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: 104 job-min queued vs 236 executing — 31% of CI is waiting for a runner
11
+ order: 62
12
+ owner: loop/ci-concurrency
13
+ pr: 350
14
+ title: A third of CI job time is spent waiting for a runner, not running
15
+ ---
16
+ With the mutation gate no longer dominating, the largest remaining term in CI wall clock is
17
+ <b>queueing</b>. Measured over six consecutive successful <code>ci</code> runs: <b>104
18
+ job-minutes queued</b> against <b>236 job-minutes executing</b> &mdash; <b>31%</b> of all job
19
+ time spent waiting for a runner.
20
+
21
+ <b>The obvious metric lies.</b> A run's <code>run_started_at</code> minus
22
+ <code>created_at</code> is <b>0.0 for every run</b>, which reads as "no queueing anywhere".
23
+ Queueing happens per <em>job</em>, not per run, so it is only visible as
24
+ <code>job.started_at - job.created_at</code>. Anything measuring this at run level will
25
+ conclude, wrongly, that there is nothing to fix.
26
+
27
+ The per-run spread shows what drives it &mdash; median job queue by run:
28
+ <code>c36c53a7</code> 0.1&nbsp;min, <code>c15ed9da</code> 0.1, <code>903b704f</code> 0.2,
29
+ <code>638bffeb</code> 0.7, <code>ad71ba99</code> <b>2.5</b>, <code>9e190537</code> <b>2.9</b>.
30
+ That is a 29&times; swing driven not by the change under test but by how many sibling
31
+ <code>loop/*</code> branches and Dependabot PRs happen to be live at the same moment. It is why
32
+ one merge took <b>41 minutes</b> wall clock with a max shard of only 11.4.
33
+
34
+ Sharding the mutation gate made this worse on purpose: it traded one runner slot for six. That
35
+ is the right trade for latency in isolation, and the wrong one to keep making blindly while a
36
+ dozen branches are in flight, because every concurrent PR now multiplies its footprint. Options,
37
+ roughly in increasing order of intrusiveness: a <code>concurrency</code> group that cancels
38
+ superseded PR runs; capping the shard matrix with <code>max-parallel</code>; or making the shard
39
+ count adaptive. Worth measuring before choosing &mdash; this item is the measurement, not the
40
+ fix.
41
+
42
+ <b>Shipped: the least intrusive one, and it turned out to be a plain omission rather than a
43
+ trade-off.</b> Seven workflows here already declare a <code>concurrency</code> group.
44
+ <code>ci.yml</code> &mdash; the largest by a wide margin, ~36 checks including six mutation
45
+ shards &mdash; declared none, so every push to a pull request left the whole previous run
46
+ executing against a commit nobody was waiting on. This session alone pushed four times to one PR,
47
+ which is 24 shard jobs of which 18 were already superseded.
48
+
49
+ Two things keep the release path out of it, and the second is easy to miss. The <b>condition</b>:
50
+ <code>cancel-in-progress: true</code> would also cancel a push to main, which
51
+ <code>publish.yml</code> gates the release on via <code>workflow_run</code> &mdash; a merge that
52
+ silently never ships &mdash; and a <code>merge_group</code> run, where a cancelled run never
53
+ reports its required contexts and the queue then waits forever on a status that is not coming.
54
+ Both evaluate false.
55
+
56
+ The <b>key</b>: non-PR events group on <code>github.sha</code>, not <code>github.ref</code>.
57
+ <code>cancel-in-progress: false</code> does not mean "never cancel" &mdash; it means a newer run
58
+ <i>waits</i>, and GitHub cancels the older <em>pending</em> run when a third arrives. Keying main
59
+ on its ref would put every main push in one group, so three quick merges would leave a middle
60
+ commit whose <code>ci</code> never completes, and since <code>publish.yml</code> fires on
61
+ <code>workflow_run</code> of <code>ci</code>, that commit would never release. A sha is unique per
62
+ commit, so main and the merge queue never share a group at all.
63
+
64
+ Both properties are pinned by tests rather than by the comment, and a separate assertion sweeps
65
+ every workflow that triggers on <code>merge_group</code> and fails if any cancels unconditionally
66
+ &mdash; so the deadlock cannot arrive later through a different file.
67
+
68
+ What this does <em>not</em> do is reduce the footprint of a single run, which is the other half of
69
+ the measurement. <code>max-parallel</code> on the shard matrix and an adaptive shard count are
70
+ still open, and both trade latency for footprint rather than removing waste &mdash; worth
71
+ re-measuring queue time after this lands before spending that trade.
@@ -0,0 +1,84 @@
1
+ ---
2
+ id: keyless-semantic-search-for-everyone
3
+ board: code
4
+ section: internals
5
+ status: next
6
+ category: Retrieval · Architecture
7
+ complexity: L
8
+ impact: High
9
+ wow: 5
10
+ note: the vector store was never the problem — only turning text into vectors needs a key
11
+ order: 0
12
+ owner:
13
+ pr:
14
+ title: Semantic search is gated behind an API key it does not need
15
+ ---
16
+ boost's flagship retrieval is invisible to almost everyone who installs it. <code>boost search "my
17
+ app is slow"</code> on the five default taps returns <code>dnanexus-integration</code>,
18
+ <code>tamarind</code>, <code>cirq</code>, <code>molfeat</code> &mdash; bioinformatics and quantum
19
+ computing, nothing about performance. That is BM25 doing exactly what BM25 does when a human types
20
+ like a human, and it is what every keyless user experiences.
21
+
22
+ <b>The vector database was never the problem.</b> Vectors already live on the user's own machine in
23
+ sqlite-vec (<code>~/.boost/cache/rag_vectors.sqlite</code>), refreshed per tap against the commit it
24
+ was built from. Nothing is hosted and nothing needs to be. The <em>only</em> API-bound step is
25
+ turning text into vectors: <code>embed.provider()</code> returns <code>"voyage"</code> with
26
+ <code>VOYAGE_API_KEY</code> set, <code>"openai"</code> with <code>OPENAI_API_KEY</code>, and
27
+ otherwise <code>None</code> &mdash; at which point everything degrades to BM25. So the real dilemma
28
+ ("every user rebuilds the index, or someone hosts and pays for it") is false in both halves.
29
+
30
+ Six steps, and the first two carry most of the value.
31
+
32
+ <b>1 &mdash; A local ONNX provider, as the third link in a chain built for it.</b> Extend
33
+ <code>embed.provider()</code> to Voyage &rarr; OpenAI &rarr; <b>local</b> &rarr; BM25, using ONNX
34
+ Runtime on CPU with a small model (<code>bge-small-en-v1.5</code>, 384-dim, ~30&nbsp;MB once). The
35
+ sqlite-vec store, the per-tap commit cache and KNN search are all untouched &mdash; only the
36
+ text&rarr;vector call changes. This removes the key, the signup and the card for <em>every</em>
37
+ user, and Voyage stays a free quality upgrade for anyone who adds one.
38
+
39
+ <b>2 &mdash; Prebuild per-registry shards in CI.</b> Embedding the full catalogue (~28k items,
40
+ ~150M tokens) on a laptop is an hour-plus, which no one will wait for. A workflow embeds each
41
+ registry and publishes vectors as GitHub Release artifacts keyed on the registry's git commit
42
+ &mdash; the cache key the code already uses &mdash; so <code>boost tap</code> fetches the catalogue
43
+ <em>and</em> its shard. This is how Homebrew, npm and crates.io index a moving world.
44
+
45
+ <b>3 &mdash; Local delta top-up.</b> When a tap runs ahead of its published shard, or is a team or
46
+ private registry CI has never seen, embed just those files on the spot. This is the structural
47
+ answer to an unbounded ecosystem: shards cover the popular registries, the local model makes the
48
+ long tail self-serve, and cost scales with what each user taps rather than with the size of the
49
+ whole ecosystem. Without it, every uncatalogued registry is a dead end for a keyless user.
50
+
51
+ <b>4 &mdash; Fuse the two engines with reciprocal rank fusion.</b> Confirmed against the shipped
52
+ code: <code>rag.retrieve_any()</code> picks <em>one</em> engine &mdash; dense when it is ready and
53
+ returns a non-empty result, BM25 otherwise. There is no hybrid path today. RRF changes that to "run
54
+ both, fuse by rank": <code>score = 1/(60+rank_bm25) + 1/(60+rank_dense)</code>. Fusing on
55
+ <b>ranks, not scores</b>, is the point &mdash; a BM25 score and a cosine similarity are on
56
+ incomparable scales, and rank fusion sidesteps calibration entirely. The two engines fail in
57
+ opposite directions and this corpus needs both: registries are full of exact identifiers
58
+ (<code>EAS</code>, <code>pptx</code>, skill names) where BM25 is strongest and embeddings weakest,
59
+ while sloppy queries are where BM25 returns quantum computing. <code>retrieve_any</code> is the
60
+ single seam every retrieval path already passes through, CLI and MCP alike, so it is one function.
61
+
62
+ The tradeoffs are real and should be measured rather than assumed: rank fusion discards confidence,
63
+ so plain RRF can trail pure dense on purely semantic queries; "why did this rank third?" gains a
64
+ two-part answer; and both engines must index the same chunks (they already share chunking). Ship
65
+ the k=60 default, benchmark it, and tune only if the eval says so.
66
+
67
+ <b>5 &mdash; A hosted demo</b> on free tiers, so the experience is reachable without installing
68
+ anything. <b>6 &mdash; Publish the eval</b>: BM25 vs local dense vs Voyage dense vs hybrid on the
69
+ existing golden set, with recall@k and MRR. That last one settles step 4 with data instead of
70
+ argument &mdash; and if pure dense wins on this corpus, that is the result worth publishing.
71
+
72
+ <b>Scope note.</b> This is an epic, not a single change. Step 1 is the one that removes the wall and
73
+ is worth landing alone; steps 2&ndash;3 are what make it fast enough to be real; step 4 is ~20 lines
74
+ in one function and independently shippable; 5 and 6 are separable. Expect this card to decompose
75
+ into per-step items as each is picked up &mdash; the value of keeping it whole here is that the
76
+ steps only make sense against each other.
77
+
78
+ Constraints this must respect: the shipped runtime is stdlib-only and
79
+ <code>[project].dependencies</code> is empty, so a local model belongs behind an extra like
80
+ <code>[rag]</code>, with the keyless path degrading to BM25 exactly as it does now. The required
81
+ <code>eval</code> gate already floors BM25 recall@k at 0.85 over the golden set, so step 6 has a
82
+ harness to extend rather than invent. Related:
83
+ [[dense-search-fallback-and-stale-tap-pruning]] and
84
+ [[cache-the-catalog-entry-set-across-rag-queries]].
@@ -111,7 +111,7 @@
111
111
  <div class="stat"><b>16</b><span>Shipped</span></div>
112
112
  <div class="stat"><b>1</b><span>Next up</span></div>
113
113
  <div class="stat"><b>4</b><span>Planned</span></div>
114
- <div class="stat"><b>181</b><span>Loop finds</span></div>
114
+ <div class="stat"><b>182</b><span>Loop finds</span></div>
115
115
  <!-- /ROADMAP:stats -->
116
116
  </div>
117
117
  </section>
@@ -598,6 +598,86 @@ message, so routing it through the helper would change user-facing errors.</p>
598
598
  <div class="rgrid">
599
599
 
600
600
  <!-- ROADMAP:cards section=internals -->
601
+ <article class="cap rcard" id="keyless-semantic-search-for-everyone">
602
+ <div class="head"><span class="pill next">Next</span><span class="cat">Retrieval · Architecture</span></div>
603
+ <h3>Semantic search is gated behind an API key it does not need</h3>
604
+ <p>boost's flagship retrieval is invisible to almost everyone who installs it. <code>boost search "my
605
+ app is slow"</code> on the five default taps returns <code>dnanexus-integration</code>,
606
+ <code>tamarind</code>, <code>cirq</code>, <code>molfeat</code> &mdash; bioinformatics and quantum
607
+ computing, nothing about performance. That is BM25 doing exactly what BM25 does when a human types
608
+ like a human, and it is what every keyless user experiences.
609
+
610
+ <b>The vector database was never the problem.</b> Vectors already live on the user's own machine in
611
+ sqlite-vec (<code>~/.boost/cache/rag_vectors.sqlite</code>), refreshed per tap against the commit it
612
+ was built from. Nothing is hosted and nothing needs to be. The <em>only</em> API-bound step is
613
+ turning text into vectors: <code>embed.provider()</code> returns <code>"voyage"</code> with
614
+ <code>VOYAGE_API_KEY</code> set, <code>"openai"</code> with <code>OPENAI_API_KEY</code>, and
615
+ otherwise <code>None</code> &mdash; at which point everything degrades to BM25. So the real dilemma
616
+ ("every user rebuilds the index, or someone hosts and pays for it") is false in both halves.
617
+
618
+ Six steps, and the first two carry most of the value.
619
+
620
+ <b>1 &mdash; A local ONNX provider, as the third link in a chain built for it.</b> Extend
621
+ <code>embed.provider()</code> to Voyage &rarr; OpenAI &rarr; <b>local</b> &rarr; BM25, using ONNX
622
+ Runtime on CPU with a small model (<code>bge-small-en-v1.5</code>, 384-dim, ~30&nbsp;MB once). The
623
+ sqlite-vec store, the per-tap commit cache and KNN search are all untouched &mdash; only the
624
+ text&rarr;vector call changes. This removes the key, the signup and the card for <em>every</em>
625
+ user, and Voyage stays a free quality upgrade for anyone who adds one.
626
+
627
+ <b>2 &mdash; Prebuild per-registry shards in CI.</b> Embedding the full catalogue (~28k items,
628
+ ~150M tokens) on a laptop is an hour-plus, which no one will wait for. A workflow embeds each
629
+ registry and publishes vectors as GitHub Release artifacts keyed on the registry's git commit
630
+ &mdash; the cache key the code already uses &mdash; so <code>boost tap</code> fetches the catalogue
631
+ <em>and</em> its shard. This is how Homebrew, npm and crates.io index a moving world.
632
+
633
+ <b>3 &mdash; Local delta top-up.</b> When a tap runs ahead of its published shard, or is a team or
634
+ private registry CI has never seen, embed just those files on the spot. This is the structural
635
+ answer to an unbounded ecosystem: shards cover the popular registries, the local model makes the
636
+ long tail self-serve, and cost scales with what each user taps rather than with the size of the
637
+ whole ecosystem. Without it, every uncatalogued registry is a dead end for a keyless user.
638
+
639
+ <b>4 &mdash; Fuse the two engines with reciprocal rank fusion.</b> Confirmed against the shipped
640
+ code: <code>rag.retrieve_any()</code> picks <em>one</em> engine &mdash; dense when it is ready and
641
+ returns a non-empty result, BM25 otherwise. There is no hybrid path today. RRF changes that to "run
642
+ both, fuse by rank": <code>score = 1/(60+rank_bm25) + 1/(60+rank_dense)</code>. Fusing on
643
+ <b>ranks, not scores</b>, is the point &mdash; a BM25 score and a cosine similarity are on
644
+ incomparable scales, and rank fusion sidesteps calibration entirely. The two engines fail in
645
+ opposite directions and this corpus needs both: registries are full of exact identifiers
646
+ (<code>EAS</code>, <code>pptx</code>, skill names) where BM25 is strongest and embeddings weakest,
647
+ while sloppy queries are where BM25 returns quantum computing. <code>retrieve_any</code> is the
648
+ single seam every retrieval path already passes through, CLI and MCP alike, so it is one function.
649
+
650
+ The tradeoffs are real and should be measured rather than assumed: rank fusion discards confidence,
651
+ so plain RRF can trail pure dense on purely semantic queries; "why did this rank third?" gains a
652
+ two-part answer; and both engines must index the same chunks (they already share chunking). Ship
653
+ the k=60 default, benchmark it, and tune only if the eval says so.
654
+
655
+ <b>5 &mdash; A hosted demo</b> on free tiers, so the experience is reachable without installing
656
+ anything. <b>6 &mdash; Publish the eval</b>: BM25 vs local dense vs Voyage dense vs hybrid on the
657
+ existing golden set, with recall@k and MRR. That last one settles step 4 with data instead of
658
+ argument &mdash; and if pure dense wins on this corpus, that is the result worth publishing.
659
+
660
+ <b>Scope note.</b> This is an epic, not a single change. Step 1 is the one that removes the wall and
661
+ is worth landing alone; steps 2&ndash;3 are what make it fast enough to be real; step 4 is ~20 lines
662
+ in one function and independently shippable; 5 and 6 are separable. Expect this card to decompose
663
+ into per-step items as each is picked up &mdash; the value of keeping it whole here is that the
664
+ steps only make sense against each other.
665
+
666
+ Constraints this must respect: the shipped runtime is stdlib-only and
667
+ <code>[project].dependencies</code> is empty, so a local model belongs behind an extra like
668
+ <code>[rag]</code>, with the keyless path degrading to BM25 exactly as it does now. The required
669
+ <code>eval</code> gate already floors BM25 recall@k at 0.85 over the golden set, so step 6 has a
670
+ harness to extend rather than invent. Related:
671
+ [[dense-search-fallback-and-stale-tap-pruning]] and
672
+ [[cache-the-catalog-entry-set-across-rag-queries]].</p>
673
+ <div class="meta">
674
+ <span class="m">Complexity <b>L</b></span>
675
+ <span class="m hi">Impact <b>High</b></span>
676
+ <span class="m">Wow <b class="wow">★★★★★</b></span>
677
+ <span class="m">the vector store was never the problem — only turning text into vectors needs a key</span>
678
+ </div>
679
+ </article>
680
+
601
681
  <article class="cap rcard" id="memoize-config-load-in-process">
602
682
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Performance</span></div>
603
683
  <h3>Memoize <code>config.load()</code> in-process</h3>
@@ -2623,7 +2703,7 @@ missing file is now imputed at the measured mean rate, which keeps every weight
2623
2703
  </article>
2624
2704
 
2625
2705
  <article class="cap rcard" id="ci-time-is-now-runner-queueing">
2626
- <div class="head"><span class="pill planned">Planned</span><span class="cat">CI speed</span></div>
2706
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI speed</span></div>
2627
2707
  <h3>A third of CI job time is spent waiting for a runner, not running</h3>
2628
2708
  <p>With the mutation gate no longer dominating, the largest remaining term in CI wall clock is
2629
2709
  <b>queueing</b>. Measured over six consecutive successful <code>ci</code> runs: <b>104
@@ -2649,7 +2729,38 @@ dozen branches are in flight, because every concurrent PR now multiplies its foo
2649
2729
  roughly in increasing order of intrusiveness: a <code>concurrency</code> group that cancels
2650
2730
  superseded PR runs; capping the shard matrix with <code>max-parallel</code>; or making the shard
2651
2731
  count adaptive. Worth measuring before choosing &mdash; this item is the measurement, not the
2652
- fix.</p>
2732
+ fix.
2733
+
2734
+ <b>Shipped: the least intrusive one, and it turned out to be a plain omission rather than a
2735
+ trade-off.</b> Seven workflows here already declare a <code>concurrency</code> group.
2736
+ <code>ci.yml</code> &mdash; the largest by a wide margin, ~36 checks including six mutation
2737
+ shards &mdash; declared none, so every push to a pull request left the whole previous run
2738
+ executing against a commit nobody was waiting on. This session alone pushed four times to one PR,
2739
+ which is 24 shard jobs of which 18 were already superseded.
2740
+
2741
+ Two things keep the release path out of it, and the second is easy to miss. The <b>condition</b>:
2742
+ <code>cancel-in-progress: true</code> would also cancel a push to main, which
2743
+ <code>publish.yml</code> gates the release on via <code>workflow_run</code> &mdash; a merge that
2744
+ silently never ships &mdash; and a <code>merge_group</code> run, where a cancelled run never
2745
+ reports its required contexts and the queue then waits forever on a status that is not coming.
2746
+ Both evaluate false.
2747
+
2748
+ The <b>key</b>: non-PR events group on <code>github.sha</code>, not <code>github.ref</code>.
2749
+ <code>cancel-in-progress: false</code> does not mean "never cancel" &mdash; it means a newer run
2750
+ <i>waits</i>, and GitHub cancels the older <em>pending</em> run when a third arrives. Keying main
2751
+ on its ref would put every main push in one group, so three quick merges would leave a middle
2752
+ commit whose <code>ci</code> never completes, and since <code>publish.yml</code> fires on
2753
+ <code>workflow_run</code> of <code>ci</code>, that commit would never release. A sha is unique per
2754
+ commit, so main and the merge queue never share a group at all.
2755
+
2756
+ Both properties are pinned by tests rather than by the comment, and a separate assertion sweeps
2757
+ every workflow that triggers on <code>merge_group</code> and fails if any cancels unconditionally
2758
+ &mdash; so the deadlock cannot arrive later through a different file.
2759
+
2760
+ What this does <em>not</em> do is reduce the footprint of a single run, which is the other half of
2761
+ the measurement. <code>max-parallel</code> on the shard matrix and an adaptive shard count are
2762
+ still open, and both trade latency for footprint rather than removing waste &mdash; worth
2763
+ re-measuring queue time after this lands before spending that trade.</p>
2653
2764
  <div class="meta">
2654
2765
  <span class="m">Complexity <b>M</b></span>
2655
2766
  <span class="m hi">Impact <b>High</b></span>
@@ -0,0 +1,112 @@
1
+ """Unit tests: superseded PR runs are cancelled, releases never are.
2
+
3
+ Measured over six consecutive successful ``ci`` runs, **31%** of all job time
4
+ was spent queueing rather than executing (104 job-minutes against 236). The
5
+ median per-job queue swung 29x between runs — 0.1 min when the repo was quiet,
6
+ 2.9 min when a dozen ``loop/*`` branches and Dependabot PRs were live — so the
7
+ cost is driven by concurrent footprint, not by the change under test. Sharding
8
+ the mutation gate traded one runner slot for six and made that worse on purpose.
9
+
10
+ ``ci.yml`` is the largest workflow in the repo by a wide margin, and it was the
11
+ only one with no ``concurrency`` group at all: every push to a pull request left
12
+ the previous run's ~36 checks (six of them mutation shards) running to
13
+ completion against nothing.
14
+
15
+ The dangerous half of the fix is the half these tests pin. Cancelling a
16
+ **pull_request** run that a newer push superseded costs nothing. Cancelling a
17
+ **push to main** would abandon the run ``publish.yml`` gates the release on, and
18
+ cancelling a **merge_group** run would leave a required check permanently
19
+ unreported and deadlock the queue — the exact failure mode ci.yml's own comments
20
+ describe. So cancellation must be conditional on the event, and that condition
21
+ is what a future edit is most likely to get wrong.
22
+ """
23
+ from __future__ import annotations
24
+
25
+ import re
26
+ from pathlib import Path
27
+
28
+ import pytest
29
+
30
+ WORKFLOWS = Path(__file__).resolve().parents[2] / ".github" / "workflows"
31
+ CI = WORKFLOWS / "ci.yml"
32
+
33
+ pytestmark = pytest.mark.skipif(
34
+ not CI.exists(),
35
+ reason=".github/workflows not reachable (e.g. mutation sandbox)")
36
+
37
+
38
+ def concurrency_block(path: Path) -> str:
39
+ """The top-level ``concurrency:`` mapping of a workflow, or ''.
40
+
41
+ Top-level only: a job-level block is indented and must not be mistaken for
42
+ the workflow's own policy.
43
+ """
44
+ text = path.read_text(encoding="utf-8")
45
+ m = re.search(r"^concurrency:\s*$\n((?:^[ \t]+\S.*\n|^\s*#.*\n)*)", text, re.M)
46
+ return m.group(1) if m else ""
47
+
48
+
49
+ class TestCiCancelsSupersededRuns:
50
+ def test_ci_declares_a_concurrency_group(self):
51
+ assert concurrency_block(CI), \
52
+ "ci.yml is the biggest workflow here; without a concurrency group " \
53
+ "every superseded push keeps ~36 checks running against nothing"
54
+
55
+ def test_the_group_is_per_pull_request(self):
56
+ # Keyed on the PR number so two PRs never cancel each other.
57
+ assert "github.event.pull_request.number" in concurrency_block(CI)
58
+
59
+ def test_non_pr_events_group_on_the_commit_not_the_ref(self):
60
+ # THE SUBTLE ONE. `cancel-in-progress: false` does not mean "never
61
+ # cancel" — it means a newer run waits, and GitHub cancels the older
62
+ # *pending* run when a third arrives. Keying main on `github.ref` puts
63
+ # every main push in one group, so three quick merges would leave a
64
+ # middle commit whose ci never completes; publish.yml fires on
65
+ # `workflow_run` of ci, so that commit would never release. A sha is
66
+ # unique per commit, so main and the merge queue never share a group.
67
+ block = concurrency_block(CI)
68
+ assert "github.sha" in block, block
69
+ assert "github.ref" not in block, \
70
+ "grouping non-PR runs on the ref can strand a main commit unreleased"
71
+
72
+ def test_cancellation_is_conditional_not_unconditional(self):
73
+ # `cancel-in-progress: true` would cancel main and merge_group runs too.
74
+ block = concurrency_block(CI)
75
+ m = re.search(r"cancel-in-progress:\s*(.+)", block)
76
+ assert m, "no cancel-in-progress in %r" % block
77
+ value = m.group(1).strip()
78
+ assert value not in ("true", "'true'", '"true"'), \
79
+ "unconditional cancel would abandon the run publish.yml gates on"
80
+ assert "pull_request" in value, value
81
+
82
+ def test_only_pull_request_events_are_cancelled(self):
83
+ # The whole safety property in one assertion: the guard names
84
+ # pull_request, so push-to-main and merge_group evaluate false.
85
+ value = re.search(r"cancel-in-progress:\s*(.+)",
86
+ concurrency_block(CI)).group(1)
87
+ assert "github.event_name == 'pull_request'" in value, value
88
+
89
+
90
+ class TestReleasePathIsNeverCancelled:
91
+ def test_publish_does_not_cancel_in_progress(self):
92
+ # Every merge to main cuts a PyPI release; cancelling a release run
93
+ # mid-upload is how you get a tagged version that never shipped.
94
+ block = concurrency_block(WORKFLOWS / "publish.yml")
95
+ assert "cancel-in-progress: false" in block, block
96
+
97
+ def test_no_workflow_cancels_a_merge_group_run(self):
98
+ # A required context whose run is cancelled never reports, and the
99
+ # merge queue waits on it forever. Any workflow that both triggers on
100
+ # merge_group and cancels unconditionally is that deadlock waiting to
101
+ # happen.
102
+ offenders = []
103
+ for path in sorted(WORKFLOWS.glob("*.yml")):
104
+ text = path.read_text(encoding="utf-8")
105
+ if not re.search(r"^\s*merge_group:", text, re.M):
106
+ continue
107
+ block = concurrency_block(path)
108
+ if re.search(r"cancel-in-progress:\s*true\s*$", block, re.M):
109
+ offenders.append(path.name)
110
+ assert not offenders, \
111
+ "these cancel merge_group runs and would deadlock the queue: %s" \
112
+ % ", ".join(offenders)
@@ -1,40 +0,0 @@
1
- ---
2
- id: ci-time-is-now-runner-queueing
3
- board: code
4
- section: pipeline
5
- status: planned
6
- category: CI speed
7
- complexity: M
8
- impact: High
9
- wow: 4
10
- note: 104 job-min queued vs 236 executing — 31% of CI is waiting for a runner
11
- order: 62
12
- owner:
13
- pr:
14
- title: A third of CI job time is spent waiting for a runner, not running
15
- ---
16
- With the mutation gate no longer dominating, the largest remaining term in CI wall clock is
17
- <b>queueing</b>. Measured over six consecutive successful <code>ci</code> runs: <b>104
18
- job-minutes queued</b> against <b>236 job-minutes executing</b> &mdash; <b>31%</b> of all job
19
- time spent waiting for a runner.
20
-
21
- <b>The obvious metric lies.</b> A run's <code>run_started_at</code> minus
22
- <code>created_at</code> is <b>0.0 for every run</b>, which reads as "no queueing anywhere".
23
- Queueing happens per <em>job</em>, not per run, so it is only visible as
24
- <code>job.started_at - job.created_at</code>. Anything measuring this at run level will
25
- conclude, wrongly, that there is nothing to fix.
26
-
27
- The per-run spread shows what drives it &mdash; median job queue by run:
28
- <code>c36c53a7</code> 0.1&nbsp;min, <code>c15ed9da</code> 0.1, <code>903b704f</code> 0.2,
29
- <code>638bffeb</code> 0.7, <code>ad71ba99</code> <b>2.5</b>, <code>9e190537</code> <b>2.9</b>.
30
- That is a 29&times; swing driven not by the change under test but by how many sibling
31
- <code>loop/*</code> branches and Dependabot PRs happen to be live at the same moment. It is why
32
- one merge took <b>41 minutes</b> wall clock with a max shard of only 11.4.
33
-
34
- Sharding the mutation gate made this worse on purpose: it traded one runner slot for six. That
35
- is the right trade for latency in isolation, and the wrong one to keep making blindly while a
36
- dozen branches are in flight, because every concurrent PR now multiplies its footprint. Options,
37
- roughly in increasing order of intrusiveness: a <code>concurrency</code> group that cancels
38
- superseded PR runs; capping the shard matrix with <code>max-parallel</code>; or making the shard
39
- count adaptive. Worth measuring before choosing &mdash; this item is the measurement, not the
40
- fix.