boost-skill-cli 1.2.9__tar.gz → 1.2.10__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 (731) hide show
  1. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  4. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  5. boost_skill_cli-1.2.10/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +53 -0
  6. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap.html +51 -1
  7. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/eval_corpus.py +64 -12
  8. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_corpus.py +153 -0
  9. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_scale_corpus.py +34 -0
  10. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.gitattributes +0 -0
  11. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.gitignore +0 -0
  12. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.gitleaks.toml +0 -0
  13. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.htmlvalidate.json +0 -0
  14. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.lighthouserc.json +0 -0
  15. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.lycheeignore +0 -0
  16. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.markdownlint-cli2.jsonc +0 -0
  17. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.pre-commit-config.yaml +0 -0
  18. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.stylelintrc.json +0 -0
  19. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.vale/styles/boost/Terminology.yml +0 -0
  20. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  21. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/.vale.ini +0 -0
  22. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/CLAUDE.md +0 -0
  23. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/CODE_OF_CONDUCT.md +0 -0
  24. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/CONTRIBUTING.md +0 -0
  25. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/LICENSE +0 -0
  26. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/MANIFEST.in +0 -0
  27. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/Makefile +0 -0
  28. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/README.md +0 -0
  29. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/SECURITY.md +0 -0
  30. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost +0 -0
  31. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/__init__.py +0 -0
  32. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/__main__.py +0 -0
  33. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/cli.py +0 -0
  34. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/cliparse.py +0 -0
  35. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/__init__.py +0 -0
  36. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/_common.py +0 -0
  37. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/bmad.py +0 -0
  38. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/configuration.py +0 -0
  39. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/discovery.py +0 -0
  40. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/hooks.py +0 -0
  41. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/info.py +0 -0
  42. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/intelligence.py +0 -0
  43. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/pkg.py +0 -0
  44. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/quality.py +0 -0
  45. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/run.py +0 -0
  46. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/safety.py +0 -0
  47. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/taps.py +0 -0
  48. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/commands/team.py +0 -0
  49. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/__init__.py +0 -0
  50. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/adapters.py +0 -0
  51. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/agents.py +0 -0
  52. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/ai.py +0 -0
  53. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/bmad.py +0 -0
  54. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/bootstrap.py +0 -0
  55. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/browse.py +0 -0
  56. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/builtin.py +0 -0
  57. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/capabilities.py +0 -0
  58. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/catalog.py +0 -0
  59. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/catalogbundle.py +0 -0
  60. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/chat.py +0 -0
  61. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/claude_settings.py +0 -0
  62. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/complete.py +0 -0
  63. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/config.py +0 -0
  64. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/dense.py +0 -0
  65. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/ed25519.py +0 -0
  66. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/embed.py +0 -0
  67. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/faithfulness.py +0 -0
  68. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/frontmatter.py +0 -0
  69. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/gitutil.py +0 -0
  70. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/imperative.py +0 -0
  71. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/injectscan.py +0 -0
  72. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/installscan.py +0 -0
  73. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/integrity.py +0 -0
  74. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/journal.py +0 -0
  75. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/localembed.py +0 -0
  76. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/lockfile.py +0 -0
  77. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/logs.py +0 -0
  78. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/mcp.py +0 -0
  79. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/mcpdecl.py +0 -0
  80. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/mcphost.py +0 -0
  81. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/minisign.py +0 -0
  82. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/nethttp.py +0 -0
  83. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/output.py +0 -0
  84. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/paths.py +0 -0
  85. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/policy.py +0 -0
  86. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/projectlock.py +0 -0
  87. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/provenance.py +0 -0
  88. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/rag.py +0 -0
  89. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/registry.py +0 -0
  90. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/resolve.py +0 -0
  91. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/rules.py +0 -0
  92. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/scopes.py +0 -0
  93. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/secretscan.py +0 -0
  94. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/selfupdate.py +0 -0
  95. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/serve.py +0 -0
  96. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/stackprobe.py +0 -0
  97. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/staleness.py +0 -0
  98. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/store.py +0 -0
  99. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/trustaudit.py +0 -0
  100. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/typosquat.py +0 -0
  101. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/updatediff.py +0 -0
  102. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/util.py +0 -0
  103. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/core/workflows.py +0 -0
  104. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/data/registries.json +0 -0
  105. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/data/rules/boost-first.mdc +0 -0
  106. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/errors.py +0 -0
  107. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_cli/spin.py +0 -0
  108. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_langchain/__init__.py +0 -0
  109. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_langchain/_compat.py +0 -0
  110. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_langchain/graph.py +0 -0
  111. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_langchain/loader.py +0 -0
  112. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_langchain/py.typed +0 -0
  113. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_langchain/retriever.py +0 -0
  114. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  115. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  116. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/requires.txt +0 -0
  117. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/top_level.txt +0 -0
  118. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/codecov.yml +0 -0
  119. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/.claude/settings.local.json +0 -0
  120. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/DEBUGGING.md +0 -0
  121. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/adapters.html +0 -0
  122. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/architecture/README.md +0 -0
  123. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/architecture/c4-components-core.md +0 -0
  124. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/architecture/c4-containers.md +0 -0
  125. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/architecture/c4-context.md +0 -0
  126. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/architecture/c4-dynamic-install.md +0 -0
  127. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/distill.gif +0 -0
  128. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/doctor.gif +0 -0
  129. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/explain.gif +0 -0
  130. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/hooks.gif +0 -0
  131. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/install.gif +0 -0
  132. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/pulse.gif +0 -0
  133. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/search.gif +0 -0
  134. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/gifs/tap.gif +0 -0
  135. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/distill.tape +0 -0
  136. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/doctor.tape +0 -0
  137. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/explain.tape +0 -0
  138. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/hooks.tape +0 -0
  139. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/install.tape +0 -0
  140. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/pulse.tape +0 -0
  141. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/search.tape +0 -0
  142. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel/tapes/tap.tape +0 -0
  143. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/carousel.html +0 -0
  144. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/chat.html +0 -0
  145. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/commands.html +0 -0
  146. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/demo-index.json +0 -0
  147. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/demo.gif +0 -0
  148. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/demo.html +0 -0
  149. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/demo.tape +0 -0
  150. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/design-roadmap.html +0 -0
  151. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/eval-latest.json +0 -0
  152. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/eval.html +0 -0
  153. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/index.html +0 -0
  154. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/langchain.html +0 -0
  155. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/mcp-hub.html +0 -0
  156. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/rag-architecture.md +0 -0
  157. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D01.md +0 -0
  158. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D02.md +0 -0
  159. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D03.md +0 -0
  160. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D04.md +0 -0
  161. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D05.md +0 -0
  162. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D06.md +0 -0
  163. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D07.md +0 -0
  164. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D08.md +0 -0
  165. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D09.md +0 -0
  166. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D10.md +0 -0
  167. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D11.md +0 -0
  168. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D12.md +0 -0
  169. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D13.md +0 -0
  170. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D14.md +0 -0
  171. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D15.md +0 -0
  172. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D16.md +0 -0
  173. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D17.md +0 -0
  174. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D18.md +0 -0
  175. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D19.md +0 -0
  176. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D20.md +0 -0
  177. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D21.md +0 -0
  178. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D22.md +0 -0
  179. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D23.md +0 -0
  180. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D24.md +0 -0
  181. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D25.md +0 -0
  182. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D26.md +0 -0
  183. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  184. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  185. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  186. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  187. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  188. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  189. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  190. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  191. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  192. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  193. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  194. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  195. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  196. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-first-rule.md +0 -0
  197. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  198. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  199. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  200. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  201. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  202. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  203. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  204. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  205. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  206. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  207. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  208. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  209. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  210. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  211. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  212. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  213. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  214. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  215. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/command-carousel-page.md +0 -0
  216. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  217. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  218. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  219. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  220. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  221. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  222. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  223. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  224. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  225. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  226. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  227. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  228. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  229. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  230. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  231. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  232. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  233. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  234. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  235. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  236. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  237. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  238. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  239. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  240. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  241. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  242. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  243. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  244. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  245. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  246. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  247. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  248. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  249. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  250. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  251. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  252. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  253. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  254. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  255. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  256. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  257. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  258. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  259. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  260. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  261. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  262. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/github-community-health-files.md +0 -0
  263. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  264. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  265. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  266. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  267. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  268. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  269. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  270. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  271. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  272. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  273. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  274. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  275. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  276. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  277. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  278. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  279. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  280. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  281. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  282. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  283. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  284. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  285. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  286. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  287. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  288. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  289. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  290. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  291. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  292. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  293. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  294. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  295. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  296. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  297. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  298. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  299. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  300. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  301. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  302. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  303. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  304. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  305. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  306. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  307. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  308. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  309. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  310. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  311. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  312. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  313. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  314. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  315. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  316. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  317. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  318. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  319. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  320. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  321. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  322. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  323. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  324. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  325. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  326. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  327. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  328. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  329. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  330. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  331. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  332. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  333. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  334. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  335. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  336. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  337. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  338. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  339. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  340. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  341. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  342. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  343. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  344. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  345. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  346. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  347. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  348. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  349. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  350. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  351. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  352. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  353. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  354. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  355. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  356. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  357. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  358. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  359. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  360. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  361. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  362. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  363. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  364. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  365. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  366. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  367. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  368. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  369. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  370. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  371. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  372. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  373. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  374. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  375. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  376. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  377. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  378. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  379. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  380. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  381. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  382. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  383. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  384. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  385. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  386. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  387. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  388. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  389. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  390. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  391. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  392. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  393. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  394. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  395. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  396. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  397. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  398. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  399. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  400. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  401. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  402. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  403. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  404. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  405. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  406. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  407. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  408. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  409. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  410. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  411. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  412. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  413. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  414. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  415. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  416. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  417. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  418. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  419. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  420. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  421. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  422. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  423. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  424. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  425. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  426. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  427. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  428. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  429. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  430. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  431. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  432. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  433. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  434. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  435. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  436. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  437. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/workspace-scope-install.md +0 -0
  438. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/zip-strict-audit.md +0 -0
  439. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  440. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  441. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  442. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/eslint.config.mjs +0 -0
  443. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/README.md +0 -0
  444. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/__init__.py +0 -0
  445. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/baseline.json +0 -0
  446. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/faithfulness.py +0 -0
  447. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/golden_set.json +0 -0
  448. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/make_corpus.py +0 -0
  449. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/make_golden.py +0 -0
  450. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/metrics.py +0 -0
  451. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/publish_golden_dataset.py +0 -0
  452. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/evals/run_evals.py +0 -0
  453. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/examples/README.md +0 -0
  454. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/examples/adapt-demo.sh +0 -0
  455. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/examples/boost-run-prototype.sh +0 -0
  456. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/index.html +0 -0
  457. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/noxfile.py +0 -0
  458. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/pyproject.toml +0 -0
  459. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/coverage-tools.in +0 -0
  460. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/coverage-tools.txt +0 -0
  461. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/lint-tools.in +0 -0
  462. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/lint-tools.txt +0 -0
  463. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/mutation-tools.in +0 -0
  464. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/mutation-tools.txt +0 -0
  465. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/platform-pins.lock +0 -0
  466. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/release-tools.in +0 -0
  467. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/release-tools.txt +0 -0
  468. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/test-tools.in +0 -0
  469. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/requirements/test-tools.txt +0 -0
  470. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/a11y_check.py +0 -0
  471. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/bench_cli.sh +0 -0
  472. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/build_command_reference.py +0 -0
  473. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/build_demo_index.py +0 -0
  474. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/build_registries.py +0 -0
  475. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/build_roadmap.py +0 -0
  476. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/build_scale_corpus.py +0 -0
  477. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/check_anchors.py +0 -0
  478. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/check_licenses.py +0 -0
  479. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/check_required_checks.py +0 -0
  480. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/ensure_eval_corpus.sh +0 -0
  481. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/eval_explain.py +0 -0
  482. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/eval_gate.py +0 -0
  483. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/eval_recommend.py +0 -0
  484. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/eval_retrieval.py +0 -0
  485. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/eval_stats_summary.py +0 -0
  486. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/import_budget.py +0 -0
  487. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/lock_toolchain.py +0 -0
  488. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/measure_registry.py +0 -0
  489. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/mutation_gate.py +0 -0
  490. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/mutation_shards.py +0 -0
  491. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/mutation_weights.json +0 -0
  492. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/page_budget.py +0 -0
  493. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/perf_gate.py +0 -0
  494. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/post_deploy_smoke.py +0 -0
  495. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/publish_eval_json.py +0 -0
  496. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/release_guard.py +0 -0
  497. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/release_preflight.py +0 -0
  498. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/scripts/serve_docs.py +0 -0
  499. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/setup.cfg +0 -0
  500. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/sonar-project.properties +0 -0
  501. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/style/README.md +0 -0
  502. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/style/boost.css +0 -0
  503. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/style/boost.js +0 -0
  504. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/style/demo.html +0 -0
  505. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/adapt.feature +0 -0
  506. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/browse.feature +0 -0
  507. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/count.feature +0 -0
  508. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/discover.feature +0 -0
  509. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/doctor.feature +0 -0
  510. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/environment.py +0 -0
  511. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/explain.feature +0 -0
  512. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/index.feature +0 -0
  513. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/install.feature +0 -0
  514. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/list.feature +0 -0
  515. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/mcp.feature +0 -0
  516. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/search.feature +0 -0
  517. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/cli_steps.py +0 -0
  518. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/discovery_steps.py +0 -0
  519. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/mcp_steps.py +0 -0
  520. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/quality_steps.py +0 -0
  521. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/conftest.py +0 -0
  522. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/baseline.json +0 -0
  523. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/explain.jsonl +0 -0
  524. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/golden-natural.jsonl +0 -0
  525. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/golden.jsonl +0 -0
  526. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/recommend.jsonl +0 -0
  527. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/taps-scale.txt +0 -0
  528. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/eval/taps.txt +0 -0
  529. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_capabilities_policy.py +0 -0
  530. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_adapt.py +0 -0
  531. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_bmad.py +0 -0
  532. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_catalog.py +0 -0
  533. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_chat.py +0 -0
  534. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_configuration.py +0 -0
  535. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_discovery.py +0 -0
  536. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_hooks.py +0 -0
  537. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_info.py +0 -0
  538. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_intelligence.py +0 -0
  539. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_pkg.py +0 -0
  540. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_quality.py +0 -0
  541. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_taps.py +0 -0
  542. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_cli_team.py +0 -0
  543. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_everyday_loop.py +0 -0
  544. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_integrity_enforce.py +0 -0
  545. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_kind_conformance.py +0 -0
  546. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_property_parsers.py +0 -0
  547. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_run.py +0 -0
  548. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_tap_signing.py +0 -0
  549. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/functional/test_workspace_scope.py +0 -0
  550. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/README.md +0 -0
  551. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  552. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  553. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  554. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  555. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  556. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  557. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  558. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  559. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  560. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  561. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  562. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  563. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  564. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  565. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  566. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  567. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  568. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  569. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  570. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  571. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  572. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  573. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  574. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/fuzz_frontmatter.py +0 -0
  575. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/fuzz/fuzz_registry.py +0 -0
  576. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/langchain/conftest.py +0 -0
  577. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/langchain/test_graph.py +0 -0
  578. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/langchain/test_loader.py +0 -0
  579. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/langchain/test_retriever.py +0 -0
  580. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/make_fixture.py +0 -0
  581. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/perf/test_benchmarks.py +0 -0
  582. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/smoke.sh +0 -0
  583. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_a11y_check.py +0 -0
  584. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_action_pin_lockstep.py +0 -0
  585. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_adapters.py +0 -0
  586. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_adapters_multi.py +0 -0
  587. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_adapters_runner.py +0 -0
  588. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_agents.py +0 -0
  589. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_ai.py +0 -0
  590. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_bmad_core.py +0 -0
  591. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_boost_first_offer.py +0 -0
  592. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_bootstrap.py +0 -0
  593. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_browse.py +0 -0
  594. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_builtin.py +0 -0
  595. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_capabilities.py +0 -0
  596. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_catalog.py +0 -0
  597. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_catalogbundle.py +0 -0
  598. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_chat.py +0 -0
  599. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_check_anchors.py +0 -0
  600. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_check_licenses.py +0 -0
  601. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_claude_settings.py +0 -0
  602. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_clean_internal_cache.py +0 -0
  603. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_cliparse.py +0 -0
  604. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_codeql_analysis_key.py +0 -0
  605. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_command_reference_fresh.py +0 -0
  606. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_community_health_files.py +0 -0
  607. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_compact.py +0 -0
  608. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_complete.py +0 -0
  609. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_complete_rc_block.py +0 -0
  610. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_config.py +0 -0
  611. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_content_dedupe.py +0 -0
  612. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_content_identity.py +0 -0
  613. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_crash_redaction.py +0 -0
  614. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dedup_trust.py +0 -0
  615. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_demo_index.py +0 -0
  616. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense.py +0 -0
  617. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_embed_dedupe.py +0 -0
  618. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_fallback.py +0 -0
  619. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_fix_hint.py +0 -0
  620. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_shard_real_schema.py +0 -0
  621. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  622. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_shards.py +0 -0
  623. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dense_status.py +0 -0
  624. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_dependabot_config.py +0 -0
  625. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_docs_pages_linked.py +0 -0
  626. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_docsite_chrome.py +0 -0
  627. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_ed25519.py +0 -0
  628. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_embed.py +0 -0
  629. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_embed_local.py +0 -0
  630. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_embed_truncated_response.py +0 -0
  631. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_entry_key.py +0 -0
  632. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_errors_and_cli_table.py +0 -0
  633. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_baseline.py +0 -0
  634. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_faithfulness.py +0 -0
  635. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_gate.py +0 -0
  636. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_grading.py +0 -0
  637. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_metrics.py +0 -0
  638. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_eval_stats_summary.py +0 -0
  639. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  640. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_faithfulness.py +0 -0
  641. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_frontmatter.py +0 -0
  642. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_fuzz_targets.py +0 -0
  643. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  644. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_gitleaks_config.py +0 -0
  645. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_gitutil.py +0 -0
  646. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_gitutil_lfs.py +0 -0
  647. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_gitutil_sparse.py +0 -0
  648. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_imperative.py +0 -0
  649. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_import_budget.py +0 -0
  650. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_injectscan.py +0 -0
  651. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_install_permission_error.py +0 -0
  652. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_installscan.py +0 -0
  653. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_integrity.py +0 -0
  654. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_journal.py +0 -0
  655. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_langchain_packaging.py +0 -0
  656. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_link_ownership.py +0 -0
  657. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_localembed.py +0 -0
  658. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_localembed_e2e.py +0 -0
  659. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_lockfile.py +0 -0
  660. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_logs.py +0 -0
  661. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_marketing_counts.py +0 -0
  662. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mcp.py +0 -0
  663. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mcp_install_scan.py +0 -0
  664. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mcpdecl.py +0 -0
  665. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mcphost.py +0 -0
  666. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_measure_registry.py +0 -0
  667. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_minisign.py +0 -0
  668. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mutation_hardening.py +0 -0
  669. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mutation_shards.py +0 -0
  670. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mutation_subfile_shards.py +0 -0
  671. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_mutmut_source_paths.py +0 -0
  672. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_nethttp.py +0 -0
  673. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_output.py +0 -0
  674. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_page_budget.py +0 -0
  675. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_paths.py +0 -0
  676. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_perf_gate.py +0 -0
  677. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_pkg_confusions.py +0 -0
  678. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_pkg_injection.py +0 -0
  679. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_pkg_secrets.py +0 -0
  680. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_platform_pins.py +0 -0
  681. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_policy.py +0 -0
  682. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_post_deploy_smoke.py +0 -0
  683. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_project_mcp_sidecar.py +0 -0
  684. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_projectlock.py +0 -0
  685. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_provenance.py +0 -0
  686. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_publish_golden_dataset.py +0 -0
  687. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_rag.py +0 -0
  688. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_rag_fusion.py +0 -0
  689. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_registries_fresh.py +0 -0
  690. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_registry.py +0 -0
  691. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_registry_categories.py +0 -0
  692. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_registry_control_chars.py +0 -0
  693. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_release_guard.py +0 -0
  694. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_release_preflight.py +0 -0
  695. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_required_checks.py +0 -0
  696. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_resolve.py +0 -0
  697. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_roadmap_fresh.py +0 -0
  698. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_rules.py +0 -0
  699. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_scopes.py +0 -0
  700. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_secretscan.py +0 -0
  701. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_selfupdate.py +0 -0
  702. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_serve.py +0 -0
  703. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_serve_docs.py +0 -0
  704. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_shards_matrix.py +0 -0
  705. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_smoke_covers_every_command.py +0 -0
  706. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_spin.py +0 -0
  707. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_stackprobe.py +0 -0
  708. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_staleness.py +0 -0
  709. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_store.py +0 -0
  710. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_store_materialize.py +0 -0
  711. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_sync_blocked_links.py +0 -0
  712. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  713. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_token_parity.py +0 -0
  714. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_toolchain_lock.py +0 -0
  715. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_trustaudit.py +0 -0
  716. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_typosquat.py +0 -0
  717. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_updatediff.py +0 -0
  718. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_util.py +0 -0
  719. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_version.py +0 -0
  720. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_visual_harness_flags.py +0 -0
  721. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_concurrency.py +0 -0
  722. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  723. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  724. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_timeouts.py +0 -0
  725. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_workflows.py +0 -0
  726. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  727. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/visual/a11y_check.mjs +0 -0
  728. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/visual/console_check.mjs +0 -0
  729. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/visual/package-lock.json +0 -0
  730. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/visual/package.json +0 -0
  731. {boost_skill_cli-1.2.9 → boost_skill_cli-1.2.10}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.9
3
+ Version: 1.2.10
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.9'
22
- __version_tuple__ = version_tuple = (1, 2, 9)
21
+ __version__ = version = '1.2.10'
22
+ __version_tuple__ = version_tuple = (1, 2, 10)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.9
3
+ Version: 1.2.10
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -412,6 +412,7 @@ docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md
412
412
  docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md
413
413
  docs/roadmap/items/taps-check-out-freight-they-never-index.md
414
414
  docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md
415
+ docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md
415
416
  docs/roadmap/items/the-shard-job-that-could-not-finish.md
416
417
  docs/roadmap/items/theme-asset-linting-stylelint-eslint.md
417
418
  docs/roadmap/items/tool-call-eval-tier.md
@@ -0,0 +1,53 @@
1
+ ---
2
+ id: the-scale-corpus-refreshed-the-wrong-rows
3
+ board: code
4
+ section: internals
5
+ status: shipped
6
+ category: CI · Evaluation
7
+ complexity: S
8
+ impact: High
9
+ wow: 5
10
+ note: 185 rows, 20 pinned — the monthly job moved exactly the 20 it did not own and pinned none of the 165 it existed to pin
11
+ order: 121
12
+ owner: loop/scale-refresh-freezes-required
13
+ pr: 537
14
+ title: the scheduled re-pin that refreshed the twenty rows it must not touch, and none of the hundred and sixty-five it existed to pin
15
+ ---
16
+ <b>The Tier 1b scale corpus is the required corpus plus distractors</b> &mdash; 20 rows copied
17
+ verbatim out of <code>taps.txt</code>, pins and counts included, so both tiers start from the same
18
+ trees, plus 165 curated registries that make it the size of a real install. The golden floors were
19
+ calibrated against those 20 trees. A scale tier measuring a <em>different</em> snapshot of the same
20
+ repos reports a difference that is not scale.
21
+
22
+ <b>The monthly job did precisely the inverse of its job.</b>
23
+ <code>eval_corpus.py --refresh</code> walked every row of whatever file it was handed, so it moved
24
+ the 20 required pins &mdash; which <code>build_scale_corpus.py</code> owns and copies verbatim
25
+ &mdash; and, because <code>relock_text</code> skipped any row with fewer than two fields, pinned
26
+ <b>zero</b> of the 165 bare distractors. The tier that exists to measure a pinned 20,000-entry
27
+ corpus was floating on upstream HEAD for <b>89% of its rows</b>.
28
+
29
+ <b>It also could never merge.</b> The same workflow runs
30
+ <code>build_scale_corpus.py --check</code> one step <em>before</em> the refresh; the refresh then
31
+ broke exactly that check. Every PR it opened was unmergeable by construction, and the diff read as
32
+ ordinary pin movement &mdash; 20 SHAs and 20 counts, which is what a healthy re-pin looks like.
33
+ PR #536 is the specimen.
34
+
35
+ <b>Two mechanisms, both about a fallback being consulted too early.</b> The pins moved because
36
+ nothing said the required rows belong to another file. The distractors stayed bare because
37
+ <code>relock_text</code> gated on <em>&ldquo;does this row already have a pin&rdquo;</em> when the
38
+ durable rule is <em>&ldquo;never write a count without a SHA&rdquo;</em> &mdash;
39
+ <code>--relock</code> re-measures the same tree and has no SHA to offer, but <code>--refresh</code>
40
+ has just resolved upstream HEAD and can close the row. A third, quieter symptom fell out of the
41
+ first: the column width is the longest name being rewritten, and the distractor names are longer
42
+ than anything in <code>taps.txt</code>, so every required row was re-columned even where its pin had
43
+ not changed.
44
+
45
+ <b>Freezing is by membership, not identity.</b> <code>--refresh</code> on <code>taps.txt</code>
46
+ itself is exactly the job that <em>may</em> move those pins, so it freezes nothing. Freezing on
47
+ &ldquo;is this a required repo&rdquo; would have made the required corpus permanently unrefreshable
48
+ &mdash; the same bug pointed the other way, and far quieter.
49
+
50
+ <b>Verified against the real file, not argued.</b> Simulating a refresh that resolved a new SHA for
51
+ all 185 rows: the 20 required rows come back byte-identical, all 185 end up pinned, and
52
+ <code>--check</code> passes &mdash; so the PR is mergeable. The workflow now runs that check
53
+ <b>after</b> the refresh as well as before, which is the guard that was missing.
@@ -133,7 +133,7 @@
133
133
  <div class="stat"><b>16</b><span>Shipped</span></div>
134
134
  <div class="stat"><b>1</b><span>Next up</span></div>
135
135
  <div class="stat"><b>7</b><span>Planned</span></div>
136
- <div class="stat"><b>258</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>259</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -4255,6 +4255,56 @@ with the numbers.</p></details>
4255
4255
  <span class="m">5h30m cancelled at the ceiling, then 2h07m green — the same job, with duplicate embeddings collapsed</span>
4256
4256
  </div>
4257
4257
  </article>
4258
+
4259
+ <article class="cap rcard" id="the-scale-corpus-refreshed-the-wrong-rows">
4260
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI · Evaluation</span></div>
4261
+ <h3>the scheduled re-pin that refreshed the twenty rows it must not touch, and none of the hundred and sixty-five it existed to pin</h3>
4262
+ <details class="cardbody"><summary>Write-up</summary>
4263
+ <p><b>The Tier 1b scale corpus is the required corpus plus distractors</b> &mdash; 20 rows copied
4264
+ verbatim out of <code>taps.txt</code>, pins and counts included, so both tiers start from the same
4265
+ trees, plus 165 curated registries that make it the size of a real install. The golden floors were
4266
+ calibrated against those 20 trees. A scale tier measuring a <em>different</em> snapshot of the same
4267
+ repos reports a difference that is not scale.
4268
+
4269
+ <b>The monthly job did precisely the inverse of its job.</b>
4270
+ <code>eval_corpus.py --refresh</code> walked every row of whatever file it was handed, so it moved
4271
+ the 20 required pins &mdash; which <code>build_scale_corpus.py</code> owns and copies verbatim
4272
+ &mdash; and, because <code>relock_text</code> skipped any row with fewer than two fields, pinned
4273
+ <b>zero</b> of the 165 bare distractors. The tier that exists to measure a pinned 20,000-entry
4274
+ corpus was floating on upstream HEAD for <b>89% of its rows</b>.
4275
+
4276
+ <b>It also could never merge.</b> The same workflow runs
4277
+ <code>build_scale_corpus.py --check</code> one step <em>before</em> the refresh; the refresh then
4278
+ broke exactly that check. Every PR it opened was unmergeable by construction, and the diff read as
4279
+ ordinary pin movement &mdash; 20 SHAs and 20 counts, which is what a healthy re-pin looks like.
4280
+ PR #536 is the specimen.
4281
+
4282
+ <b>Two mechanisms, both about a fallback being consulted too early.</b> The pins moved because
4283
+ nothing said the required rows belong to another file. The distractors stayed bare because
4284
+ <code>relock_text</code> gated on <em>&ldquo;does this row already have a pin&rdquo;</em> when the
4285
+ durable rule is <em>&ldquo;never write a count without a SHA&rdquo;</em> &mdash;
4286
+ <code>--relock</code> re-measures the same tree and has no SHA to offer, but <code>--refresh</code>
4287
+ has just resolved upstream HEAD and can close the row. A third, quieter symptom fell out of the
4288
+ first: the column width is the longest name being rewritten, and the distractor names are longer
4289
+ than anything in <code>taps.txt</code>, so every required row was re-columned even where its pin had
4290
+ not changed.
4291
+
4292
+ <b>Freezing is by membership, not identity.</b> <code>--refresh</code> on <code>taps.txt</code>
4293
+ itself is exactly the job that <em>may</em> move those pins, so it freezes nothing. Freezing on
4294
+ &ldquo;is this a required repo&rdquo; would have made the required corpus permanently unrefreshable
4295
+ &mdash; the same bug pointed the other way, and far quieter.
4296
+
4297
+ <b>Verified against the real file, not argued.</b> Simulating a refresh that resolved a new SHA for
4298
+ all 185 rows: the 20 required rows come back byte-identical, all 185 end up pinned, and
4299
+ <code>--check</code> passes &mdash; so the PR is mergeable. The workflow now runs that check
4300
+ <b>after</b> the refresh as well as before, which is the guard that was missing.</p></details>
4301
+ <div class="meta">
4302
+ <span class="m">Complexity <b>S</b></span>
4303
+ <span class="m hi">Impact <b>High</b></span>
4304
+ <span class="m">Wow <b class="wow">★★★★★</b></span>
4305
+ <span class="m">185 rows, 20 pinned — the monthly job moved exactly the 20 it did not own and pinned none of the 165 it existed to pin</span>
4306
+ </div>
4307
+ </article>
4258
4308
  <!-- /ROADMAP:cards -->
4259
4309
 
4260
4310
  </div>
@@ -77,7 +77,7 @@ import argparse
77
77
  import re
78
78
  import subprocess
79
79
  import sys
80
- from collections.abc import Sequence
80
+ from collections.abc import Collection, Sequence
81
81
  from pathlib import Path
82
82
 
83
83
  ROOT = Path(__file__).resolve().parent.parent
@@ -346,31 +346,50 @@ def _report_failures(failures: Sequence[CorpusError], total_rows: int) -> int:
346
346
 
347
347
 
348
348
  def relock_text(text: str, counts: dict[str, int],
349
- shas: dict[str, str] | None = None) -> str:
349
+ shas: dict[str, str] | None = None,
350
+ frozen: Collection[str] | None = None) -> str:
350
351
  """Rewrite each pinned row's entry count — and its SHA when ``shas`` says so.
351
352
 
352
353
  A whole-file rewrite would lose the header, which is where the reasoning
353
- lives; this touches only rows it has a new count for. A row with no SHA is
354
- left alone — a count beside an unpinned repo describes a tree free to change
355
- underneath it, so it must never be written.
354
+ lives; this touches only rows it has a new count for. A count is never
355
+ written without a SHA — beside an unpinned repo it would describe a tree
356
+ free to change underneath it — but the SHA may come from ``shas`` rather
357
+ than from the row, which is how ``--refresh`` closes a row that arrived
358
+ bare. Gating on "the row already has a pin" instead left the scale corpus
359
+ at 165 bare rows to 20 pinned, refreshing only the 20 it did not own.
356
360
 
357
361
  ``shas`` is what makes ``--refresh`` a rewrite of the pins rather than of
358
362
  the counts alone. It is optional because the two operations are genuinely
359
363
  different: ``--relock`` re-measures the *same* trees (the scanner changed),
360
364
  ``--refresh`` moves to *new* trees (the world changed).
365
+
366
+ ``frozen`` names repos whose rows this file does not own, and they are
367
+ emitted byte for byte — not re-pinned, and *not re-columned*. Both halves
368
+ matter: the width is the longest name being rewritten, so refreshing
369
+ ``taps-scale.txt`` (whose distractor names are longer than anything in
370
+ ``taps.txt``) moved every required row even where its pin had not changed.
361
371
  """
362
372
  shas = shas or {}
363
- width = max([len(r) for r in counts] or [1])
373
+ frozen = frozen or ()
374
+ width = max([len(r) for r in counts if r not in frozen] or [1])
364
375
  out = []
365
376
  for raw in text.splitlines():
366
377
  line = raw.strip()
367
378
  parts = line.split()
368
- if not line or line.startswith("#") or len(parts) < 2 \
369
- or parts[0] not in counts or not _SHA.fullmatch(parts[1]):
379
+ if not line or line.startswith("#") or not parts \
380
+ or parts[0] not in counts or parts[0] in frozen:
370
381
  out.append(raw)
371
382
  continue
372
383
  repo = parts[0]
373
- sha = shas.get(repo, parts[1])
384
+ # The row's own pin is only a fallback, and only when well formed: a
385
+ # malformed one is not a value to carry forward, it is a row nothing
386
+ # may claim to have measured.
387
+ committed = (parts[1] if len(parts) > 1
388
+ and _SHA.fullmatch(parts[1]) else None)
389
+ sha = shas.get(repo) or committed
390
+ if sha is None:
391
+ out.append(raw)
392
+ continue
374
393
  if not _SHA.fullmatch(sha):
375
394
  raise SystemExit(
376
395
  "refusing to write %s: %r is not a 40-character commit SHA"
@@ -379,6 +398,27 @@ def relock_text(text: str, counts: dict[str, int],
379
398
  return "\n".join(out) + ("\n" if text.endswith("\n") else "")
380
399
 
381
400
 
401
+ def frozen_rows(taps: Path, required: Path = DEFAULT_TAPS) -> set[str]:
402
+ """Repos in ``taps`` whose pins belong to ``required``, not to ``taps``.
403
+
404
+ The scale corpus is the required corpus PLUS distractors, and
405
+ ``build_scale_corpus.render`` copies the required block in verbatim so both
406
+ tiers start from the same trees. The golden floors were calibrated against
407
+ those trees; a scale tier measuring a *different* snapshot of the same
408
+ repos reports a difference that is not scale.
409
+
410
+ Membership, not identity, decides. ``--refresh`` on ``taps.txt`` itself is
411
+ exactly the job that MAY move those pins, so it must freeze nothing —
412
+ freezing on "is this a required repo" rather than "does another file own
413
+ this row" would make the required corpus permanently unrefreshable, which
414
+ is the same bug pointed the other way and far quieter.
415
+ """
416
+ if taps.resolve() == required.resolve() or not required.exists():
417
+ return set()
418
+ return {repo for repo, _sha, _n in
419
+ parse_taps(required.read_text(encoding="utf-8"))}
420
+
421
+
382
422
  def refresh_summary(rows: Sequence[Row], shas: dict[str, str],
383
423
  counts: dict[str, int]) -> str:
384
424
  """A Markdown table of what a refresh moved, for the pull request body.
@@ -465,10 +505,20 @@ def _refresh(taps: Path, summary_path: str | None = None) -> int:
465
505
  from boost_cli.core import catalog, gitutil, registry # deferred: path shim
466
506
 
467
507
  rows = parse_taps(taps.read_text(encoding="utf-8"))
508
+ # Rows another file owns are neither measured nor written — skipping the
509
+ # measurement is not just an optimisation here, it is what keeps the two
510
+ # tiers pinned to one set of trees. It also saves re-cloning the required
511
+ # corpus, whose largest member is 6,309 entries.
512
+ frozen = frozen_rows(taps)
513
+ failures: list[CorpusError] = []
468
514
  shas: dict[str, str] = {}
469
515
  counts: dict[str, int] = {}
470
- failures: list[CorpusError] = []
516
+ if frozen:
517
+ print(" %d rows are owned by %s and are left alone"
518
+ % (len(frozen & {r for r, _s, _n in rows}), DEFAULT_TAPS.name))
471
519
  for repo, old_sha, _n in rows:
520
+ if repo in frozen:
521
+ continue
472
522
  try:
473
523
  try:
474
524
  tap = registry.get(repo)
@@ -499,8 +549,10 @@ def _refresh(taps: Path, summary_path: str | None = None) -> int:
499
549
  "" if sha == old_sha else " MOVED"))
500
550
  if failures:
501
551
  return _report_failures(failures, len(rows))
502
- taps.write_text(relock_text(taps.read_text(encoding="utf-8"), counts, shas),
503
- encoding="utf-8")
552
+ taps.write_text(
553
+ relock_text(taps.read_text(encoding="utf-8"), counts, shas,
554
+ frozen=frozen),
555
+ encoding="utf-8")
504
556
  summary = refresh_summary(rows, shas, counts)
505
557
  print("\n" + summary)
506
558
  if summary_path:
@@ -543,3 +543,156 @@ class TestTheSentinelIsKeyedOnTheTapList:
543
543
  out = self._wrapper_run(tmp_path, "owner/repo %s 2\n" % ("a" * 40), calls)
544
544
  assert "skipping" not in out
545
545
  assert calls.read_text(encoding="utf-8").count("ensure") == 2
546
+
547
+
548
+ class TestRefreshingTheScaleCorpusLeavesTheRequiredRowsAlone:
549
+ """The required rows in `taps-scale.txt` belong to `taps.txt`.
550
+
551
+ `build_scale_corpus.render` copies them in verbatim — pin and count
552
+ included — because both tiers must start from the same trees: the golden
553
+ floors were calibrated against the required corpus, and a scale tier
554
+ measuring a *different* snapshot of the same repos reports a difference
555
+ that is not scale. The generator's own section header says "verbatim".
556
+
557
+ Nothing enforced it. `--refresh` walked every row of whatever file it was
558
+ given, so the monthly scale job moved the required pins too, and the two
559
+ tiers silently decoupled. It also re-columned the whole file (the width is
560
+ the longest name in the file, and the distractor names are longer), so
561
+ every required row changed even where the pin did not.
562
+
563
+ The PR it opened could never merge: `build_scale_corpus.py --check` — which
564
+ the same workflow runs one step earlier — calls the result stale, forever.
565
+ """
566
+
567
+ def _scale_file(self, tmp_path):
568
+ required = ("anthropics/skills %s 18\n" % ("a" * 40)
569
+ + "minio/skills %s 3\n" % ("b" * 40))
570
+ scale = tmp_path / "taps-scale.txt"
571
+ scale.write_text(
572
+ "# --- the required corpus, verbatim ---\n"
573
+ + required
574
+ + "\n# --- distractors ---\n"
575
+ + "some-very-long-owner/some-very-long-repo-name\n",
576
+ encoding="utf-8")
577
+ (tmp_path / "taps.txt").write_text(required, encoding="utf-8")
578
+ return scale, required
579
+
580
+ def test_a_required_row_is_not_re_pinned(self, tmp_path):
581
+ scale, required = self._scale_file(tmp_path)
582
+ frozen = _load().frozen_rows(scale, tmp_path / "taps.txt")
583
+ assert frozen == {"anthropics/skills", "minio/skills"}
584
+ # A refresh that measured new trees for them must still not write them.
585
+ out = _load().relock_text(
586
+ scale.read_text(encoding="utf-8"),
587
+ {"anthropics/skills": 20, "minio/skills": 9},
588
+ {"anthropics/skills": "c" * 40, "minio/skills": "d" * 40},
589
+ frozen=frozen)
590
+ for row in required.splitlines():
591
+ assert row in out, "required row was rewritten: %r" % row
592
+
593
+ def test_a_frozen_row_keeps_its_column_width(self, tmp_path):
594
+ """The subtler half: even an unchanged pin was being re-columned.
595
+
596
+ `relock_text` pads to the longest name it is rewriting, and the scale
597
+ file's distractors are longer than anything in `taps.txt` — so the
598
+ required block came back at a different width and stopped matching the
599
+ generator byte for byte.
600
+ """
601
+ scale, _required = self._scale_file(tmp_path)
602
+ out = _load().relock_text(
603
+ scale.read_text(encoding="utf-8"),
604
+ {"anthropics/skills": 18,
605
+ "some-very-long-owner/some-very-long-repo-name": 7},
606
+ {"some-very-long-owner/some-very-long-repo-name": "e" * 40},
607
+ frozen={"anthropics/skills"})
608
+ assert "anthropics/skills %s 18" % ("a" * 40) in out
609
+ assert "some-very-long-owner/some-very-long-repo-name %s" % ("e" * 40) in out
610
+
611
+ def test_distractors_are_still_refreshed(self, tmp_path):
612
+ # Freezing must not turn the monthly job into a no-op.
613
+ scale, _required = self._scale_file(tmp_path)
614
+ out = _load().relock_text(
615
+ scale.read_text(encoding="utf-8"),
616
+ {"some-very-long-owner/some-very-long-repo-name": 7},
617
+ {"some-very-long-owner/some-very-long-repo-name": "e" * 40},
618
+ frozen={"anthropics/skills", "minio/skills"})
619
+ assert "some-very-long-owner/some-very-long-repo-name %s 7" % ("e" * 40) in out
620
+
621
+ def test_refreshing_the_required_corpus_itself_freezes_nothing(self, tmp_path):
622
+ """`--refresh` on taps.txt is exactly the job that MAY move those pins.
623
+
624
+ Freezing on identity rather than on membership would make the required
625
+ corpus permanently unrefreshable — the opposite failure, and a quieter
626
+ one.
627
+ """
628
+ _scale, required = self._scale_file(tmp_path)
629
+ taps = tmp_path / "taps.txt"
630
+ assert _load().frozen_rows(taps, taps) == set()
631
+ out = _load().relock_text(required, {"anthropics/skills": 20},
632
+ {"anthropics/skills": "c" * 40},
633
+ frozen=_load().frozen_rows(taps, taps))
634
+ assert "c" * 40 in out
635
+
636
+ def test_a_missing_required_file_freezes_nothing(self, tmp_path):
637
+ # A refresh must degrade to the old behaviour, never crash.
638
+ scale, _required = self._scale_file(tmp_path)
639
+ assert _load().frozen_rows(scale, tmp_path / "absent.txt") == set()
640
+
641
+
642
+ class TestRefreshPinsARowThatArrivedBare:
643
+ """`--refresh` resolves a new SHA, so it can pin a row that has none.
644
+
645
+ `relock_text` skipped any row with fewer than two fields, on a rule that is
646
+ right for `--relock` and wrong for `--refresh`. The two differ in exactly
647
+ the way that matters: `--relock` re-measures the *same* tree and has no SHA
648
+ to offer, so writing a count beside an unpinned repo would describe a tree
649
+ free to change underneath it. `--refresh` has just resolved upstream HEAD,
650
+ so it has both halves and the row can be closed.
651
+
652
+ Measured cost of the old rule: the shipped scale corpus is 165 bare rows
653
+ and 20 pinned ones, and the monthly job rewrote exactly the 20 — the
654
+ required block it must not touch — while pinning none of the 165 it exists
655
+ to pin. The tier that is supposed to measure a pinned 20,000-entry corpus
656
+ was floating on upstream HEAD for 89% of its rows.
657
+
658
+ The durable rule is about the SHA, not about the row: never write a count
659
+ without one.
660
+ """
661
+
662
+ def test_a_bare_row_gains_a_pin_when_a_sha_was_resolved(self):
663
+ m = _load()
664
+ out = m.relock_text("a/b\n", {"a/b": 7}, {"a/b": "f" * 40})
665
+ assert out == "a/b %s 7\n" % ("f" * 40)
666
+
667
+ def test_a_bare_row_is_left_alone_when_no_sha_was_resolved(self):
668
+ """The property the old rule was protecting, kept.
669
+
670
+ This is `--relock`: the scanner changed, the trees did not, and there
671
+ is no SHA on offer. A count here would claim a measurement of a tree
672
+ nobody pinned.
673
+ """
674
+ m = _load()
675
+ assert m.relock_text("a/b\n", {"a/b": 7}) == "a/b\n"
676
+
677
+ def test_a_bare_row_with_no_count_is_left_alone(self):
678
+ m = _load()
679
+ assert m.relock_text("a/b\n", {}, {"a/b": "f" * 40}) == "a/b\n"
680
+
681
+ def test_a_malformed_pin_is_still_refused(self):
682
+ # Not a SHA and nothing resolved for it: writing would launder a typo
683
+ # into a row that reads as measured.
684
+ m = _load()
685
+ assert m.relock_text("a/b nope 3\n", {"a/b": 7}) == "a/b nope 3\n"
686
+
687
+ def test_a_malformed_pin_is_replaced_when_a_sha_was_resolved(self):
688
+ m = _load()
689
+ out = m.relock_text("a/b nope 3\n", {"a/b": 7}, {"a/b": "f" * 40})
690
+ assert out == "a/b %s 7\n" % ("f" * 40)
691
+
692
+ def test_the_width_covers_rows_that_were_bare(self):
693
+ # A newly-pinned long name must not be excluded from the column maths.
694
+ m = _load()
695
+ out = m.relock_text("short/x\nmuch-longer-owner/repo\n",
696
+ {"short/x": 1, "much-longer-owner/repo": 2},
697
+ {"short/x": "a" * 40, "much-longer-owner/repo": "b" * 40})
698
+ assert "short/x %s 1" % ("a" * 40) in out
@@ -230,3 +230,37 @@ class TestPinsSurviveRegeneration:
230
230
  refreshed = first.replace("\ns/one\n", "\ns/one %s 99\n" % ("d" * 40))
231
231
  again = m.render(required, picked, 30, m.existing_pins(refreshed))
232
232
  assert again == refreshed
233
+
234
+
235
+ class TestTheScheduledJobCannotOpenAnUnmergeablePR:
236
+ """`--check` must run AFTER the refresh, not only before it.
237
+
238
+ Running it first proves the committed file is fresh; it says nothing about
239
+ what the refresh then wrote. For months the job checked, refreshed, and
240
+ opened a PR that the very same check would have rejected — because
241
+ `--refresh` re-pinned and re-columned the required block, which the
242
+ generator copies verbatim from `taps.txt`. The PR was unmergeable by
243
+ construction and the diff read as ordinary pin movement.
244
+ """
245
+
246
+ _WORKFLOW = _ROOT / ".github" / "workflows" / "eval-scale.yml"
247
+
248
+ @pytest.mark.skipif(not _WORKFLOW.exists(), reason="workflow not reachable")
249
+ def test_the_check_runs_after_the_refresh(self):
250
+ text = self._WORKFLOW.read_text(encoding="utf-8")
251
+ check = "build_scale_corpus.py --check"
252
+ refresh = "eval_corpus.py --refresh"
253
+ assert text.count(check) >= 2, (
254
+ "only one --check: a refresh that breaks the selection would still "
255
+ "open a PR")
256
+ assert text.index(refresh) < text.rindex(check), (
257
+ "the last --check must follow the refresh")
258
+
259
+ @pytest.mark.skipif(not _WORKFLOW.exists(), reason="workflow not reachable")
260
+ def test_the_check_is_not_allowed_to_fail_quietly(self):
261
+ # `score it` is continue-on-error by design; the selection check is not.
262
+ text = self._WORKFLOW.read_text(encoding="utf-8")
263
+ tail = text[text.rindex("build_scale_corpus.py --check"):]
264
+ head = text[:text.rindex("build_scale_corpus.py --check")]
265
+ step = head[head.rindex(" - name:"):] + tail.split(" - name:")[0]
266
+ assert "continue-on-error" not in step
File without changes