boost-skill-cli 1.0.415__tar.gz → 1.0.416__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 (636) hide show
  1. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/Makefile +1 -1
  2. {boost_skill_cli-1.0.415/boost_skill_cli.egg-info → boost_skill_cli-1.0.416}/PKG-INFO +1 -1
  3. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scripts-under-the-lint-gate.md +4 -2
  6. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap.html +32 -31
  7. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_command_reference.py +5 -6
  8. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_scale_corpus.py +11 -11
  9. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/check_licenses.py +5 -5
  10. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/check_required_checks.py +20 -21
  11. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_corpus.py +19 -19
  12. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_explain.py +11 -12
  13. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_gate.py +6 -7
  14. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_recommend.py +14 -14
  15. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_retrieval.py +51 -49
  16. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_stats_summary.py +3 -4
  17. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/import_budget.py +9 -10
  18. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/lock_toolchain.py +6 -6
  19. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/mutation_shards.py +27 -27
  20. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/page_budget.py +5 -5
  21. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/release_guard.py +7 -7
  22. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/serve_docs.py +1 -2
  23. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.gitattributes +0 -0
  24. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.gitignore +0 -0
  25. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.gitleaks.toml +0 -0
  26. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.htmlvalidate.json +0 -0
  27. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.lighthouserc.json +0 -0
  28. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.lycheeignore +0 -0
  29. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.markdownlint-cli2.jsonc +0 -0
  30. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.pre-commit-config.yaml +0 -0
  31. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.stylelintrc.json +0 -0
  32. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.vale/styles/boost/Terminology.yml +0 -0
  33. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  34. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.vale.ini +0 -0
  35. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/CLAUDE.md +0 -0
  36. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/CODE_OF_CONDUCT.md +0 -0
  37. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/CONTRIBUTING.md +0 -0
  38. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/LICENSE +0 -0
  39. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/MANIFEST.in +0 -0
  40. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/README.md +0 -0
  41. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/SECURITY.md +0 -0
  42. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost +0 -0
  43. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/__init__.py +0 -0
  44. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/__main__.py +0 -0
  45. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/cli.py +0 -0
  46. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/cliparse.py +0 -0
  47. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/__init__.py +0 -0
  48. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/_common.py +0 -0
  49. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/bmad.py +0 -0
  50. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/configuration.py +0 -0
  51. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/discovery.py +0 -0
  52. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/hooks.py +0 -0
  53. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/info.py +0 -0
  54. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/intelligence.py +0 -0
  55. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/pkg.py +0 -0
  56. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/quality.py +0 -0
  57. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/run.py +0 -0
  58. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/safety.py +0 -0
  59. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/taps.py +0 -0
  60. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/team.py +0 -0
  61. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/__init__.py +0 -0
  62. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/adapters.py +0 -0
  63. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/agents.py +0 -0
  64. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/ai.py +0 -0
  65. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/capabilities.py +0 -0
  66. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/catalog.py +0 -0
  67. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/chat.py +0 -0
  68. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/claude_settings.py +0 -0
  69. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/complete.py +0 -0
  70. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/config.py +0 -0
  71. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/dense.py +0 -0
  72. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/ed25519.py +0 -0
  73. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/embed.py +0 -0
  74. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/faithfulness.py +0 -0
  75. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/frontmatter.py +0 -0
  76. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/gitutil.py +0 -0
  77. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/imperative.py +0 -0
  78. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/injectscan.py +0 -0
  79. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/installscan.py +0 -0
  80. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/integrity.py +0 -0
  81. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/journal.py +0 -0
  82. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/localembed.py +0 -0
  83. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/lockfile.py +0 -0
  84. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/logs.py +0 -0
  85. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/mcp.py +0 -0
  86. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/mcpdecl.py +0 -0
  87. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/mcphost.py +0 -0
  88. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/minisign.py +0 -0
  89. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/nethttp.py +0 -0
  90. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/output.py +0 -0
  91. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/paths.py +0 -0
  92. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/policy.py +0 -0
  93. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/projectlock.py +0 -0
  94. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/provenance.py +0 -0
  95. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/rag.py +0 -0
  96. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/registry.py +0 -0
  97. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/resolve.py +0 -0
  98. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/rules.py +0 -0
  99. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/scopes.py +0 -0
  100. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/secretscan.py +0 -0
  101. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/selfupdate.py +0 -0
  102. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/serve.py +0 -0
  103. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/stackprobe.py +0 -0
  104. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/staleness.py +0 -0
  105. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/store.py +0 -0
  106. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/trustaudit.py +0 -0
  107. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/typosquat.py +0 -0
  108. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/updatediff.py +0 -0
  109. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/util.py +0 -0
  110. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/workflows.py +0 -0
  111. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/data/registries.json +0 -0
  112. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/errors.py +0 -0
  113. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/spin.py +0 -0
  114. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  115. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  116. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  117. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/requires.txt +0 -0
  118. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/top_level.txt +0 -0
  119. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/codecov.yml +0 -0
  120. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/.claude/settings.local.json +0 -0
  121. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/DEBUGGING.md +0 -0
  122. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/adapters.html +0 -0
  123. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/README.md +0 -0
  124. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-components-core.md +0 -0
  125. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-containers.md +0 -0
  126. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-context.md +0 -0
  127. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-dynamic-install.md +0 -0
  128. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/distill.gif +0 -0
  129. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/doctor.gif +0 -0
  130. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/explain.gif +0 -0
  131. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/hooks.gif +0 -0
  132. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/install.gif +0 -0
  133. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/pulse.gif +0 -0
  134. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/search.gif +0 -0
  135. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/tap.gif +0 -0
  136. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/distill.tape +0 -0
  137. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/doctor.tape +0 -0
  138. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/explain.tape +0 -0
  139. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/hooks.tape +0 -0
  140. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/install.tape +0 -0
  141. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/pulse.tape +0 -0
  142. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/search.tape +0 -0
  143. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/tap.tape +0 -0
  144. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel.html +0 -0
  145. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/chat.html +0 -0
  146. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/commands.html +0 -0
  147. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo-index.json +0 -0
  148. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo.gif +0 -0
  149. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo.html +0 -0
  150. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo.tape +0 -0
  151. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/design-roadmap.html +0 -0
  152. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/eval-latest.json +0 -0
  153. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/eval.html +0 -0
  154. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/index.html +0 -0
  155. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/langchain.html +0 -0
  156. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/mcp-hub.html +0 -0
  157. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/rag-architecture.md +0 -0
  158. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D01.md +0 -0
  159. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D02.md +0 -0
  160. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D03.md +0 -0
  161. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D04.md +0 -0
  162. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D05.md +0 -0
  163. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D06.md +0 -0
  164. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D07.md +0 -0
  165. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D08.md +0 -0
  166. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D09.md +0 -0
  167. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D10.md +0 -0
  168. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D11.md +0 -0
  169. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D12.md +0 -0
  170. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D13.md +0 -0
  171. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D14.md +0 -0
  172. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D15.md +0 -0
  173. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D16.md +0 -0
  174. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D17.md +0 -0
  175. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D18.md +0 -0
  176. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D19.md +0 -0
  177. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D20.md +0 -0
  178. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D21.md +0 -0
  179. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D22.md +0 -0
  180. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D23.md +0 -0
  181. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D24.md +0 -0
  182. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D25.md +0 -0
  183. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D26.md +0 -0
  184. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  185. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  186. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  187. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  188. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  189. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  190. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  191. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  192. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  193. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  194. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  195. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  196. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  197. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  198. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  199. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  200. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  201. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  202. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  203. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  204. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  205. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  206. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  207. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  208. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  209. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  210. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  211. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/command-carousel-page.md +0 -0
  212. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  213. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  214. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  215. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  216. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  217. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  218. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  219. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  220. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  221. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  222. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  223. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  224. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  225. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  226. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  227. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  228. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  229. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  230. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  231. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  232. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  233. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  234. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  235. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  236. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  237. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  238. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  239. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  240. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  241. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  242. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  243. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  244. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  245. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  246. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  247. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  248. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/github-community-health-files.md +0 -0
  249. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  250. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  251. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  252. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  253. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  254. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  255. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  256. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  257. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  258. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  259. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  260. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  261. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  262. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  263. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  264. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  265. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  266. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  267. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  268. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  269. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  270. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  271. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  272. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  273. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  274. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  275. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  276. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  277. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  278. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  279. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  280. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  281. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  282. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  283. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  284. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  285. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  286. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  287. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  288. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  289. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  290. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  291. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  292. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  293. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  294. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  295. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  296. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  297. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  298. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  299. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  300. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  301. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  302. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  303. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  304. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  305. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  306. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  307. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  308. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  309. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  310. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  311. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  312. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  313. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  314. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  315. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  316. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  317. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  318. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  319. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  320. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  321. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  322. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  323. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  324. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  325. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  326. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  327. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  328. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  329. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  330. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  331. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  332. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  333. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  334. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  335. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  336. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  337. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  338. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  339. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  340. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  341. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  342. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  343. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  344. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  345. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  346. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  347. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  348. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  349. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  350. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  351. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  352. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  353. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  354. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  355. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  356. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  357. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  358. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  359. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  360. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  361. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  362. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  363. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  364. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  365. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  366. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  367. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  368. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  369. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  370. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  371. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  372. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  373. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  374. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  375. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  376. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  377. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  378. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  379. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  380. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  381. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  382. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  383. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  384. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  385. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  386. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  387. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  388. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  389. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  390. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  391. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  392. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  393. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  394. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  395. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  396. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  397. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  398. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  399. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  400. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  401. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workspace-scope-install.md +0 -0
  402. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/zip-strict-audit.md +0 -0
  403. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  404. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/eslint.config.mjs +0 -0
  405. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/README.md +0 -0
  406. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/__init__.py +0 -0
  407. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/baseline.json +0 -0
  408. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/faithfulness.py +0 -0
  409. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/golden_set.json +0 -0
  410. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/make_corpus.py +0 -0
  411. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/make_golden.py +0 -0
  412. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/metrics.py +0 -0
  413. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/run_evals.py +0 -0
  414. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/examples/README.md +0 -0
  415. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/examples/adapt-demo.sh +0 -0
  416. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/examples/boost-run-prototype.sh +0 -0
  417. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/index.html +0 -0
  418. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/noxfile.py +0 -0
  419. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/pyproject.toml +0 -0
  420. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/coverage-tools.in +0 -0
  421. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/coverage-tools.txt +0 -0
  422. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/lint-tools.in +0 -0
  423. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/lint-tools.txt +0 -0
  424. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/mutation-tools.in +0 -0
  425. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/mutation-tools.txt +0 -0
  426. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/platform-pins.lock +0 -0
  427. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/release-tools.in +0 -0
  428. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/release-tools.txt +0 -0
  429. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/test-tools.in +0 -0
  430. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/test-tools.txt +0 -0
  431. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/a11y_check.py +0 -0
  432. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/bench_cli.sh +0 -0
  433. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_demo_index.py +0 -0
  434. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_registries.py +0 -0
  435. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_roadmap.py +0 -0
  436. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/check_anchors.py +0 -0
  437. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/ensure_eval_corpus.sh +0 -0
  438. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/mutation_gate.py +0 -0
  439. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/mutation_weights.json +0 -0
  440. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/perf_gate.py +0 -0
  441. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/post_deploy_smoke.py +0 -0
  442. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/publish_eval_json.py +0 -0
  443. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/release_preflight.py +0 -0
  444. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/setup.cfg +0 -0
  445. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/sonar-project.properties +0 -0
  446. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/README.md +0 -0
  447. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/boost.css +0 -0
  448. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/boost.js +0 -0
  449. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/demo.html +0 -0
  450. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/adapt.feature +0 -0
  451. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/browse.feature +0 -0
  452. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/count.feature +0 -0
  453. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/discover.feature +0 -0
  454. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/doctor.feature +0 -0
  455. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/environment.py +0 -0
  456. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/explain.feature +0 -0
  457. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/index.feature +0 -0
  458. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/install.feature +0 -0
  459. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/list.feature +0 -0
  460. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/mcp.feature +0 -0
  461. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/search.feature +0 -0
  462. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/cli_steps.py +0 -0
  463. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/discovery_steps.py +0 -0
  464. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/mcp_steps.py +0 -0
  465. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/quality_steps.py +0 -0
  466. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/conftest.py +0 -0
  467. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/baseline.json +0 -0
  468. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/explain.jsonl +0 -0
  469. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/golden-natural.jsonl +0 -0
  470. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/golden.jsonl +0 -0
  471. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/recommend.jsonl +0 -0
  472. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/taps-scale.txt +0 -0
  473. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/taps.txt +0 -0
  474. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_capabilities_policy.py +0 -0
  475. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_adapt.py +0 -0
  476. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_bmad.py +0 -0
  477. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_chat.py +0 -0
  478. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_configuration.py +0 -0
  479. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_discovery.py +0 -0
  480. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_hooks.py +0 -0
  481. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_info.py +0 -0
  482. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_intelligence.py +0 -0
  483. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_pkg.py +0 -0
  484. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_quality.py +0 -0
  485. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_taps.py +0 -0
  486. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_team.py +0 -0
  487. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_everyday_loop.py +0 -0
  488. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_integrity_enforce.py +0 -0
  489. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_kind_conformance.py +0 -0
  490. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_property_parsers.py +0 -0
  491. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_run.py +0 -0
  492. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_tap_signing.py +0 -0
  493. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_workspace_scope.py +0 -0
  494. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/README.md +0 -0
  495. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  496. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  497. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  498. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  499. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  500. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  501. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  502. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  503. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  504. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  505. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  506. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  507. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  508. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  509. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  510. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  511. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  512. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  513. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  514. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  515. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/fuzz_frontmatter.py +0 -0
  516. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/fuzz_registry.py +0 -0
  517. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/make_fixture.py +0 -0
  518. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/perf/test_benchmarks.py +0 -0
  519. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/smoke.sh +0 -0
  520. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_a11y_check.py +0 -0
  521. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_adapters.py +0 -0
  522. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_adapters_multi.py +0 -0
  523. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_adapters_runner.py +0 -0
  524. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_agents.py +0 -0
  525. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_ai.py +0 -0
  526. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_capabilities.py +0 -0
  527. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_catalog.py +0 -0
  528. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_chat.py +0 -0
  529. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_check_anchors.py +0 -0
  530. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_check_licenses.py +0 -0
  531. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_claude_settings.py +0 -0
  532. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_cliparse.py +0 -0
  533. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_codeql_analysis_key.py +0 -0
  534. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_command_reference_fresh.py +0 -0
  535. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_community_health_files.py +0 -0
  536. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_complete.py +0 -0
  537. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_config.py +0 -0
  538. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_content_dedupe.py +0 -0
  539. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dedup_trust.py +0 -0
  540. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_demo_index.py +0 -0
  541. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense.py +0 -0
  542. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_fallback.py +0 -0
  543. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_fix_hint.py +0 -0
  544. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_shards.py +0 -0
  545. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_status.py +0 -0
  546. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dependabot_config.py +0 -0
  547. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_docs_pages_linked.py +0 -0
  548. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_docsite_chrome.py +0 -0
  549. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_ed25519.py +0 -0
  550. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_embed.py +0 -0
  551. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_embed_local.py +0 -0
  552. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_entry_key.py +0 -0
  553. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_errors_and_cli_table.py +0 -0
  554. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_baseline.py +0 -0
  555. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_corpus.py +0 -0
  556. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_faithfulness.py +0 -0
  557. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_gate.py +0 -0
  558. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_grading.py +0 -0
  559. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_metrics.py +0 -0
  560. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_stats_summary.py +0 -0
  561. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_faithfulness.py +0 -0
  562. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_frontmatter.py +0 -0
  563. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_fuzz_targets.py +0 -0
  564. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_gitleaks_config.py +0 -0
  565. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_gitutil.py +0 -0
  566. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_imperative.py +0 -0
  567. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_import_budget.py +0 -0
  568. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_injectscan.py +0 -0
  569. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_installscan.py +0 -0
  570. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_integrity.py +0 -0
  571. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_journal.py +0 -0
  572. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_link_ownership.py +0 -0
  573. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_localembed.py +0 -0
  574. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_localembed_e2e.py +0 -0
  575. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_lockfile.py +0 -0
  576. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_logs.py +0 -0
  577. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_marketing_counts.py +0 -0
  578. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcp.py +0 -0
  579. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcp_install_scan.py +0 -0
  580. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcpdecl.py +0 -0
  581. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcphost.py +0 -0
  582. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_minisign.py +0 -0
  583. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutation_hardening.py +0 -0
  584. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutation_shards.py +0 -0
  585. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutation_subfile_shards.py +0 -0
  586. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutmut_source_paths.py +0 -0
  587. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_nethttp.py +0 -0
  588. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_output.py +0 -0
  589. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_page_budget.py +0 -0
  590. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_paths.py +0 -0
  591. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_perf_gate.py +0 -0
  592. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_pkg_confusions.py +0 -0
  593. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_pkg_injection.py +0 -0
  594. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_pkg_secrets.py +0 -0
  595. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_platform_pins.py +0 -0
  596. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_policy.py +0 -0
  597. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_post_deploy_smoke.py +0 -0
  598. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_project_mcp_sidecar.py +0 -0
  599. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_projectlock.py +0 -0
  600. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_provenance.py +0 -0
  601. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_rag.py +0 -0
  602. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_rag_fusion.py +0 -0
  603. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_registries_fresh.py +0 -0
  604. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_registry.py +0 -0
  605. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_registry_categories.py +0 -0
  606. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_release_guard.py +0 -0
  607. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_release_preflight.py +0 -0
  608. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_required_checks.py +0 -0
  609. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_resolve.py +0 -0
  610. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_roadmap_fresh.py +0 -0
  611. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_rules.py +0 -0
  612. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_scale_corpus.py +0 -0
  613. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_scopes.py +0 -0
  614. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_secretscan.py +0 -0
  615. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_selfupdate.py +0 -0
  616. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_serve.py +0 -0
  617. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_serve_docs.py +0 -0
  618. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_spin.py +0 -0
  619. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_stackprobe.py +0 -0
  620. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_staleness.py +0 -0
  621. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_store.py +0 -0
  622. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_token_parity.py +0 -0
  623. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_toolchain_lock.py +0 -0
  624. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_trustaudit.py +0 -0
  625. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_typosquat.py +0 -0
  626. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_updatediff.py +0 -0
  627. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_util.py +0 -0
  628. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_version.py +0 -0
  629. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_workflow_concurrency.py +0 -0
  630. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_workflow_timeouts.py +0 -0
  631. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_workflows.py +0 -0
  632. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/a11y_check.mjs +0 -0
  633. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/console_check.mjs +0 -0
  634. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/package-lock.json +0 -0
  635. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/package.json +0 -0
  636. {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/visual_check.mjs +0 -0
@@ -52,7 +52,7 @@ mutation:
52
52
  $(PY) scripts/mutation_gate.py --run --min 80
53
53
 
54
54
  lint:
55
- $(VENV)/bin/ruff check boost_cli tests evals
55
+ $(VENV)/bin/ruff check boost_cli tests evals scripts
56
56
  $(VENV)/bin/mypy
57
57
  $(VENV)/bin/pyright
58
58
  $(VENV)/bin/lint-imports
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.415
3
+ Version: 1.0.416
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.415'
22
- __version_tuple__ = version_tuple = (1, 0, 415)
21
+ __version__ = version = '1.0.416'
22
+ __version_tuple__ = version_tuple = (1, 0, 416)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.415
3
+ Version: 1.0.416
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  id: scripts-under-the-lint-gate
3
3
  board: code
4
- section: planned
5
- status: planned
4
+ section: internals
5
+ status: shipped
6
+ owner: loop/scripts-lint
7
+ pr: 471
6
8
  category: Tech-debt
7
9
  complexity: M
8
10
  impact: Med
@@ -125,7 +125,7 @@
125
125
  <!-- ROADMAP:stats -->
126
126
  <div class="stat"><b>16</b><span>Shipped</span></div>
127
127
  <div class="stat"><b>1</b><span>Next up</span></div>
128
- <div class="stat"><b>7</b><span>Planned</span></div>
128
+ <div class="stat"><b>6</b><span>Planned</span></div>
129
129
  <div class="stat"><b>221</b><span>Loop finds</span></div>
130
130
  <!-- /ROADMAP:stats -->
131
131
  </div>
@@ -680,36 +680,6 @@ published version works against PyPI as it stands today.</p>
680
680
  <span class="m">the artifacts already build and pass twine check in CI — what is missing is a cadence and a Trusted Publisher</span>
681
681
  </div>
682
682
  </article>
683
-
684
- <article class="cap rcard" id="scripts-under-the-lint-gate">
685
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Tech-debt</span></div>
686
- <h3>bring <code>scripts/</code> under the ruff gate</h3>
687
- <p><code>make lint</code> runs <code>ruff check boost_cli tests evals</code> — and <code>scripts/</code>,
688
- the 28 build-and-gate tools that decide whether every PR merges, is not in the list. Nothing that
689
- lints the product lints the gatekeepers.
690
-
691
- <b>Why it bit, twice in one day.</b> The <code>zip(strict=)</code> audit enforced B905 across the
692
- linted trees, and an adversarial review immediately found two more <code>zip()</code> sites in
693
- <code>scripts/</code> that the rule cannot guard — one of them (<code>eval_explain.py</code> pairing
694
- ragas scores with samples by position) exactly the silent-misattribution shape the audit existed to
695
- kill. They were fixed by hand, but the next <code>zip()</code> added to <code>scripts/</code> gets
696
- no intent check, and the same blindness applies to every rule the gate enforces.
697
-
698
- <b>Measured, not guessed:</b> running the current rule set over <code>scripts/</code> today finds
699
- <b>291</b> violations — ~277 are the mechanical UP typing sweep the rest of the repo just finished
700
- (<code>List</code> → <code>list</code> and friends), plus a handful of real ones (a
701
- <code>raise ... from</code> miss, collapsible ifs, stale <code>noqa</code>s). So the shape is: one
702
- mechanical pass like the pep585 sweep, a short judgement pass over the rest, then add
703
- <code>scripts</code> to the Makefile line and CI so it stays clean. Some rules may deserve
704
- per-directory ignores (scripts legitimately print, exit, and parse argv) — decide those in the PR
705
- rather than globally.</p>
706
- <div class="meta">
707
- <span class="m">Complexity <b>M</b></span>
708
- <span class="m">Impact <b>Med</b></span>
709
- <span class="m">Wow <b class="wow">★</b></span>
710
- <span class="m">291 findings across 28 files, measured — most are the same UP sweep the package just finished</span>
711
- </div>
712
- </article>
713
683
  <!-- /ROADMAP:cards -->
714
684
 
715
685
  </div>
@@ -3444,6 +3414,37 @@ ownership check reverted.</p></details>
3444
3414
  </div>
3445
3415
  </article>
3446
3416
 
3417
+ <article class="cap rcard" id="scripts-under-the-lint-gate">
3418
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Tech-debt</span></div>
3419
+ <h3>bring <code>scripts/</code> under the ruff gate</h3>
3420
+ <details class="cardbody"><summary>Write-up</summary>
3421
+ <p><code>make lint</code> runs <code>ruff check boost_cli tests evals</code> — and <code>scripts/</code>,
3422
+ the 28 build-and-gate tools that decide whether every PR merges, is not in the list. Nothing that
3423
+ lints the product lints the gatekeepers.
3424
+
3425
+ <b>Why it bit, twice in one day.</b> The <code>zip(strict=)</code> audit enforced B905 across the
3426
+ linted trees, and an adversarial review immediately found two more <code>zip()</code> sites in
3427
+ <code>scripts/</code> that the rule cannot guard — one of them (<code>eval_explain.py</code> pairing
3428
+ ragas scores with samples by position) exactly the silent-misattribution shape the audit existed to
3429
+ kill. They were fixed by hand, but the next <code>zip()</code> added to <code>scripts/</code> gets
3430
+ no intent check, and the same blindness applies to every rule the gate enforces.
3431
+
3432
+ <b>Measured, not guessed:</b> running the current rule set over <code>scripts/</code> today finds
3433
+ <b>291</b> violations — ~277 are the mechanical UP typing sweep the rest of the repo just finished
3434
+ (<code>List</code> → <code>list</code> and friends), plus a handful of real ones (a
3435
+ <code>raise ... from</code> miss, collapsible ifs, stale <code>noqa</code>s). So the shape is: one
3436
+ mechanical pass like the pep585 sweep, a short judgement pass over the rest, then add
3437
+ <code>scripts</code> to the Makefile line and CI so it stays clean. Some rules may deserve
3438
+ per-directory ignores (scripts legitimately print, exit, and parse argv) — decide those in the PR
3439
+ rather than globally.</p></details>
3440
+ <div class="meta">
3441
+ <span class="m">Complexity <b>M</b></span>
3442
+ <span class="m">Impact <b>Med</b></span>
3443
+ <span class="m">Wow <b class="wow">★</b></span>
3444
+ <span class="m">291 findings across 28 files, measured — most are the same UP sweep the package just finished</span>
3445
+ </div>
3446
+ </article>
3447
+
3447
3448
  <article class="cap rcard" id="dry-run-promised-a-link-nobody-makes">
3448
3449
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Correctness</span></div>
3449
3450
  <h3>install --dry-run predicted an install that never happens</h3>
@@ -71,9 +71,9 @@ def _capture_parser(name: str, module: str):
71
71
  cliparse.parser = spy
72
72
  try:
73
73
  buf = io.StringIO()
74
- with contextlib.redirect_stdout(buf), contextlib.redirect_stderr(buf):
75
- with contextlib.suppress(SystemExit):
76
- getattr(mod, fn)(["--help"])
74
+ with contextlib.redirect_stdout(buf), contextlib.redirect_stderr(buf), \
75
+ contextlib.suppress(SystemExit):
76
+ getattr(mod, fn)(["--help"])
77
77
  finally:
78
78
  cliparse.parser = real
79
79
  return created[0] if created else None # main parser is created first
@@ -121,8 +121,7 @@ def _extract(name: str, group: str, module: str, summary: str) -> dict:
121
121
  for act in opt:
122
122
  flag = act.option_strings[-1]
123
123
  syn.append("[%s]" % (flag if act.nargs == 0 else "%s %s" % (flag, _metavar(act))))
124
- for act in pos:
125
- syn.append(_positional_syn(act))
124
+ syn.extend(_positional_syn(act) for act in pos)
126
125
 
127
126
  def rows(actions, is_opt):
128
127
  out = []
@@ -178,7 +177,7 @@ def render() -> str:
178
177
  for c in items:
179
178
  search = html.escape(
180
179
  (" ".join([c["name"], c["summary"], c["description"]]
181
- + [l for l, _h in c["options"] + c["positionals"]])).lower(),
180
+ + [label for label, _h in c["options"] + c["positionals"]])).lower(),
182
181
  quote=True)
183
182
  nav.append(
184
183
  ' <a class="cmd-link" href="#cmd-%s" data-search="%s">%s</a>'
@@ -64,8 +64,8 @@ from __future__ import annotations
64
64
  import argparse
65
65
  import json
66
66
  import sys
67
+ from collections.abc import Sequence
67
68
  from pathlib import Path
68
- from typing import Dict, List, Optional, Sequence, Tuple
69
69
 
70
70
  ROOT = Path(__file__).resolve().parent.parent
71
71
  REGISTRIES = ROOT / "boost_cli" / "data" / "registries.json"
@@ -86,7 +86,7 @@ DEFAULT_TARGET = 20_000
86
86
  TYPE_ORDER = ("rule", "workflow", "skill")
87
87
 
88
88
 
89
- def required_rows(text: str) -> List[str]:
89
+ def required_rows(text: str) -> list[str]:
90
90
  """The required corpus's rows, verbatim, in file order."""
91
91
  return [ln.rstrip() for ln in text.splitlines()
92
92
  if ln.strip() and not ln.lstrip().startswith("#")]
@@ -97,14 +97,14 @@ def repo_of(row: str) -> str:
97
97
 
98
98
 
99
99
  def candidates(registries: Sequence[dict], exclude: Sequence[str]
100
- ) -> Dict[str, List[Tuple[str, int]]]:
100
+ ) -> dict[str, list[tuple[str, int]]]:
101
101
  """``type -> [(repo, est_items)]``, largest first, excluding what we have.
102
102
 
103
103
  ``list_only`` rows are awesome-list indexes rather than skill trees, so they
104
104
  contribute nothing to scan and are dropped — the same distinction
105
105
  `registries.json` already draws for its own item-count math.
106
106
  """
107
- out: Dict[str, List[Tuple[str, int]]] = {}
107
+ out: dict[str, list[tuple[str, int]]] = {}
108
108
  seen = set(exclude)
109
109
  for row in registries:
110
110
  name = str(row.get("name", ""))
@@ -117,8 +117,8 @@ def candidates(registries: Sequence[dict], exclude: Sequence[str]
117
117
  return out
118
118
 
119
119
 
120
- def select(pools: Dict[str, List[Tuple[str, int]]], target: int
121
- ) -> List[Tuple[str, int]]:
120
+ def select(pools: dict[str, list[tuple[str, int]]], target: int
121
+ ) -> list[tuple[str, int]]:
122
122
  """Round-robin across types, largest first within each, until ``target``.
123
123
 
124
124
  Deterministic: the pools are already sorted, and the cycle order is fixed.
@@ -126,7 +126,7 @@ def select(pools: Dict[str, List[Tuple[str, int]]], target: int
126
126
  ``--check`` gate is meaningless.
127
127
  """
128
128
  cursors = dict.fromkeys(pools, 0)
129
- picked: List[Tuple[str, int]] = []
129
+ picked: list[tuple[str, int]] = []
130
130
  total = 0
131
131
  order = [k for k in TYPE_ORDER if k in pools] + \
132
132
  [k for k in sorted(pools) if k not in TYPE_ORDER]
@@ -149,7 +149,7 @@ def select(pools: Dict[str, List[Tuple[str, int]]], target: int
149
149
  return picked
150
150
 
151
151
 
152
- def existing_pins(text: str) -> Dict[str, str]:
152
+ def existing_pins(text: str) -> dict[str, str]:
153
153
  """``repo -> its committed row``, so a regeneration keeps what was measured.
154
154
 
155
155
  Without this the generator and `eval_corpus.py --refresh` fight: the refresh
@@ -160,7 +160,7 @@ def existing_pins(text: str) -> Dict[str, str]:
160
160
  So `--check` verifies the *selection* — which registries are in and in what
161
161
  order — and leaves the pins to the job that actually measured them.
162
162
  """
163
- out: Dict[str, str] = {}
163
+ out: dict[str, str] = {}
164
164
  for line in text.splitlines():
165
165
  if not line.strip() or line.lstrip().startswith("#"):
166
166
  continue
@@ -168,8 +168,8 @@ def existing_pins(text: str) -> Dict[str, str]:
168
168
  return out
169
169
 
170
170
 
171
- def render(required: Sequence[str], picked: Sequence[Tuple[str, int]],
172
- target: int, pinned: Optional[Dict[str, str]] = None) -> str:
171
+ def render(required: Sequence[str], picked: Sequence[tuple[str, int]],
172
+ target: int, pinned: dict[str, str] | None = None) -> str:
173
173
  """The taps-scale.txt text, header included."""
174
174
  pinned = pinned or {}
175
175
  est = sum(e for _n, e in picked)
@@ -29,13 +29,13 @@ from __future__ import annotations
29
29
  import json
30
30
  import re
31
31
  import sys
32
- from typing import List, Tuple
32
+ from pathlib import Path
33
33
 
34
34
  # (pattern, why). Matched case-insensitively against the whole declared licence
35
35
  # string. Deliberately short: the aim is high-confidence incompatibility, not a
36
36
  # taxonomy. LGPL, MPL and EPL are all fine to *consume* from a GPL-3.0 project
37
37
  # and are not listed.
38
- DENIED: Tuple[Tuple[str, str], ...] = (
38
+ DENIED: tuple[tuple[str, str], ...] = (
39
39
  (r"affero|\bagpl\b",
40
40
  "AGPL adds network-use copyleft that GPL-3.0 does not carry"),
41
41
  # GPLv2-*only* cannot be combined with GPL-3.0. "v2 or later" / "GPLv2+"
@@ -63,7 +63,7 @@ def is_undeclared(licence: str) -> bool:
63
63
  return bool(_UNDECLARED.match(licence or ""))
64
64
 
65
65
 
66
- def violations(rows: List[dict]) -> List[str]:
66
+ def violations(rows: list[dict]) -> list[str]:
67
67
  """Human-readable problems in a ``pip-licenses --format=json`` payload."""
68
68
  problems = []
69
69
  for row in rows:
@@ -83,8 +83,8 @@ def violations(rows: List[dict]) -> List[str]:
83
83
  return problems
84
84
 
85
85
 
86
- def main(argv: List[str]) -> int:
87
- raw = (open(argv[0], encoding="utf-8").read() if argv
86
+ def main(argv: list[str]) -> int:
87
+ raw = (Path(argv[0]).read_text(encoding="utf-8") if argv
88
88
  else sys.stdin.read())
89
89
  try:
90
90
  rows = json.loads(raw)
@@ -44,7 +44,6 @@ import json
44
44
  import re
45
45
  import sys
46
46
  from pathlib import Path
47
- from typing import Dict, List, Set, Tuple
48
47
 
49
48
  ROOT = Path(__file__).resolve().parent.parent
50
49
  WORKFLOWS = ROOT / ".github" / "workflows"
@@ -92,7 +91,7 @@ PR_ALWAYS = "always" # fires on every PR — safe to require
92
91
  PR_FILTERED = "filtered" # fires only on some PRs — NEVER safe to require
93
92
 
94
93
 
95
- def has_merge_group(header_lines: List[str]) -> bool:
94
+ def has_merge_group(header_lines: list[str]) -> bool:
96
95
  """Does this workflow declare a ``merge_group:`` trigger?
97
96
 
98
97
  Same narrow, stdlib-only parsing as everything else here: a top-level
@@ -101,7 +100,7 @@ def has_merge_group(header_lines: List[str]) -> bool:
101
100
  return any(_MG_TRIGGER.match(line) for line in header_lines)
102
101
 
103
102
 
104
- def pull_request_state(header_lines: List[str]) -> str:
103
+ def pull_request_state(header_lines: list[str]) -> str:
105
104
  """Classify the ``pull_request:`` trigger in a workflow header.
106
105
 
107
106
  Returns one of :data:`PR_NONE`, :data:`PR_ALWAYS`, :data:`PR_FILTERED`.
@@ -143,7 +142,7 @@ def _strip_quotes(s: str) -> str:
143
142
  return s
144
143
 
145
144
 
146
- def parse_workflow(path: Path) -> Tuple[str, bool, Dict[str, str]]:
145
+ def parse_workflow(path: Path) -> tuple[str, bool, dict[str, str]]:
147
146
  """``(pull_request_state, has_merge_group, {job_id: display_name})``."""
148
147
  lines = path.read_text(encoding="utf-8").splitlines()
149
148
  try:
@@ -154,7 +153,7 @@ def parse_workflow(path: Path) -> Tuple[str, bool, Dict[str, str]]:
154
153
  on_pr = pull_request_state(lines[:jobs_at])
155
154
  on_mg = has_merge_group(lines[:jobs_at])
156
155
 
157
- jobs: Dict[str, str] = {}
156
+ jobs: dict[str, str] = {}
158
157
  current = None
159
158
  for line in lines[jobs_at + 1:]:
160
159
  job = _JOB.match(line)
@@ -169,17 +168,17 @@ def parse_workflow(path: Path) -> Tuple[str, bool, Dict[str, str]]:
169
168
  return on_pr, on_mg, jobs
170
169
 
171
170
 
172
- def collect() -> Tuple[Dict[str, List[str]], Set[str], Dict[str, str], Set[str]]:
171
+ def collect() -> tuple[dict[str, list[str]], set[str], dict[str, str], set[str]]:
173
172
  """``({check_name: [workflow, ...]}, {on every PR}, {name: workflow}, {on merge_group})``.
174
173
 
175
174
  The third value maps a *conditionally*-triggered check name to the workflow
176
175
  that narrows it, so the error message can name the culprit. The fourth is
177
176
  the set of names that would also report on a merge-queue ref.
178
177
  """
179
- by_name: Dict[str, List[str]] = {}
180
- on_pr: Set[str] = set()
181
- filtered: Dict[str, str] = {}
182
- on_mg: Set[str] = set()
178
+ by_name: dict[str, list[str]] = {}
179
+ on_pr: set[str] = set()
180
+ filtered: dict[str, str] = {}
181
+ on_mg: set[str] = set()
183
182
  files = sorted(WORKFLOWS.glob("*.yml")) + sorted(WORKFLOWS.glob("*.yaml"))
184
183
  if not files:
185
184
  raise SystemExit("required-checks: no workflow files found under %s" % WORKFLOWS)
@@ -204,7 +203,7 @@ def collect() -> Tuple[Dict[str, List[str]], Set[str], Dict[str, str], Set[str]]
204
203
  return by_name, on_pr, filtered, on_mg
205
204
 
206
205
 
207
- def read_config() -> List[str]:
206
+ def read_config() -> list[str]:
208
207
  if not CONFIG.exists():
209
208
  raise SystemExit("required-checks: missing %s" % CONFIG)
210
209
  out = []
@@ -217,7 +216,7 @@ def read_config() -> List[str]:
217
216
  return out
218
217
 
219
218
 
220
- def resolve(required: str, on_pr: Set[str]) -> Tuple[bool, str]:
219
+ def resolve(required: str, on_pr: set[str]) -> tuple[bool, str]:
221
220
  """Is ``required`` satisfied by some job name in ``on_pr``?
222
221
 
223
222
  Called twice — once against the names that run on every PR, and once
@@ -242,7 +241,7 @@ def resolve(required: str, on_pr: Set[str]) -> Tuple[bool, str]:
242
241
  return False, ""
243
242
 
244
243
 
245
- def workflows_for(required: str, by_name: Dict[str, List[str]]) -> List[str]:
244
+ def workflows_for(required: str, by_name: dict[str, list[str]]) -> list[str]:
246
245
  """Which workflow file(s) produce ``required``.
247
246
 
248
247
  Accepts the same three spellings :func:`resolve` does — an exact name, a
@@ -262,7 +261,7 @@ def workflows_for(required: str, by_name: Dict[str, List[str]]) -> List[str]:
262
261
  return ["an unknown workflow"]
263
262
 
264
263
 
265
- def classic_payload(required: List[str]) -> dict:
264
+ def classic_payload(required: list[str]) -> dict:
266
265
  """The `PUT /branches/{branch}/protection` body for this required list."""
267
266
  return {
268
267
  "required_status_checks": {"strict": True, "contexts": list(required)},
@@ -274,7 +273,7 @@ def classic_payload(required: List[str]) -> dict:
274
273
  }
275
274
 
276
275
 
277
- def ruleset_rule(required: List[str]) -> dict:
276
+ def ruleset_rule(required: list[str]) -> dict:
278
277
  """The `required_status_checks` RULE for a repository ruleset.
279
278
 
280
279
  Shaped differently from the classic payload on purpose — this is not a
@@ -294,7 +293,7 @@ def ruleset_rule(required: List[str]) -> dict:
294
293
  }
295
294
 
296
295
 
297
- def drift(required: List[str], remote: List[str]) -> Tuple[List[str], List[str]]:
296
+ def drift(required: list[str], remote: list[str]) -> tuple[list[str], list[str]]:
298
297
  """``(missing, extra)`` — how a live mechanism disagrees with the file.
299
298
 
300
299
  Order-insensitive and duplicate-tolerant: GitHub returns contexts in its own
@@ -315,7 +314,7 @@ def _api(path: str, token: str) -> object:
315
314
  return json.load(resp)
316
315
 
317
316
 
318
- def ruleset_contexts(detail: dict) -> Tuple[bool, List[str]]:
317
+ def ruleset_contexts(detail: dict) -> tuple[bool, list[str]]:
319
318
  """``(has_rule, contexts)`` for one ruleset's required-status-checks rule.
320
319
 
321
320
  ``has_rule`` is returned separately from an empty list because the two mean
@@ -329,9 +328,9 @@ def ruleset_contexts(detail: dict) -> Tuple[bool, List[str]]:
329
328
  return False, []
330
329
 
331
330
 
332
- def verify_remote(required: List[str], token: str) -> List[str]:
331
+ def verify_remote(required: list[str], token: str) -> list[str]:
333
332
  """Compare BOTH live mechanisms against the file. Returns problems."""
334
- problems: List[str] = []
333
+ problems: list[str] = []
335
334
 
336
335
  prot = _api("/repos/%s/branches/%s/protection" % (REPO, BRANCH), token)
337
336
  contexts = ((prot or {}).get("required_status_checks") or {}).get("contexts", [])
@@ -377,7 +376,7 @@ def verify_remote(required: List[str], token: str) -> List[str]:
377
376
  return problems
378
377
 
379
378
 
380
- def main(argv: List[str]) -> int:
379
+ def main(argv: list[str]) -> int:
381
380
  ap = argparse.ArgumentParser(description=__doc__)
382
381
  ap.add_argument("--print-api", action="store_true",
383
382
  help="print the CLASSIC branch-protection payload and exit")
@@ -436,7 +435,7 @@ def main(argv: List[str]) -> int:
436
435
  "(%d checks)." % (CONFIG.name, len(required)))
437
436
  return 0
438
437
 
439
- problems: List[str] = []
438
+ problems: list[str] = []
440
439
 
441
440
  ambiguous = {n: w for n, w in sorted(by_name.items()) if len(w) > 1}
442
441
  for name, where in ambiguous.items():
@@ -77,8 +77,8 @@ import argparse
77
77
  import re
78
78
  import subprocess
79
79
  import sys
80
+ from collections.abc import Sequence
80
81
  from pathlib import Path
81
- from typing import Dict, List, Optional, Sequence, Tuple
82
82
 
83
83
  ROOT = Path(__file__).resolve().parent.parent
84
84
  DEFAULT_TAPS = ROOT / "tests" / "eval" / "taps.txt"
@@ -89,7 +89,7 @@ SCALE_TAPS = ROOT / "tests" / "eval" / "taps-scale.txt"
89
89
  _SHA = re.compile(r"[0-9a-f]{40}")
90
90
 
91
91
  #: ``(owner/repo, pinned commit or None, pinned entry count or None)``.
92
- Row = Tuple[str, Optional[str], Optional[int]]
92
+ Row = tuple[str, str | None, int | None]
93
93
 
94
94
  #: A repository, or the commit a row pins, could not be fetched.
95
95
  UNAVAILABLE = "unavailable"
@@ -129,7 +129,7 @@ class CorpusError(RuntimeError):
129
129
  self.detail = detail
130
130
 
131
131
 
132
- def parse_taps(text: str) -> List[Row]:
132
+ def parse_taps(text: str) -> list[Row]:
133
133
  """Rows of ``owner/repo [sha [count]]``, comments and blanks dropped.
134
134
 
135
135
  An absent SHA parses as ``None`` rather than an error so the format stays
@@ -139,7 +139,7 @@ def parse_taps(text: str) -> List[Row]:
139
139
  fatal on the same grounds, and requires a SHA — a count beside an unpinned
140
140
  repo describes a tree that is free to change underneath it.
141
141
  """
142
- rows: List[Row] = []
142
+ rows: list[Row] = []
143
143
  for raw in text.splitlines():
144
144
  line = raw.strip()
145
145
  if not line or line.startswith("#"):
@@ -170,7 +170,7 @@ def parse_taps(text: str) -> List[Row]:
170
170
  return rows
171
171
 
172
172
 
173
- def shares(rows: Sequence[Row]) -> List[Tuple[str, int, float]]:
173
+ def shares(rows: Sequence[Row]) -> list[tuple[str, int, float]]:
174
174
  """``(repo, count, share)`` for every counted row, largest first.
175
175
 
176
176
  Rows with no recorded count are omitted rather than treated as zero: a
@@ -185,7 +185,7 @@ def shares(rows: Sequence[Row]) -> List[Tuple[str, int, float]]:
185
185
  key=lambda row: (-row[1], row[0]))
186
186
 
187
187
 
188
- def check_concentration(rows: Sequence[Row]) -> Optional[str]:
188
+ def check_concentration(rows: Sequence[Row]) -> str | None:
189
189
  """Return a message when one repository exceeds ``MAX_SHARE``, else ``None``.
190
190
 
191
191
  Static — it reads the counts already in the file, so it costs no network and
@@ -208,7 +208,7 @@ def check_concentration(rows: Sequence[Row]) -> Optional[str]:
208
208
  MAX_SHARE * 100))
209
209
 
210
210
 
211
- def extra_taps(configured: Sequence[str], pinned: Sequence[str]) -> List[str]:
211
+ def extra_taps(configured: Sequence[str], pinned: Sequence[str]) -> list[str]:
212
212
  """Configured taps that this list does not pin, sorted.
213
213
 
214
214
  The third way to score a corpus that is not the pinned one, and the easiest
@@ -261,7 +261,7 @@ def pin_clone(path: Path, sha: str) -> None:
261
261
 
262
262
 
263
263
  def _materialise(rows: Sequence[Row], verify: bool = True
264
- ) -> Tuple[Dict[str, int], List[CorpusError]]:
264
+ ) -> tuple[dict[str, int], list[CorpusError]]:
265
265
  """Tap, pin and rescan every row. Returns ``(counts, failures)``.
266
266
 
267
267
  Every row is attempted even after one fails. Stopping at the first would
@@ -271,8 +271,8 @@ def _materialise(rows: Sequence[Row], verify: bool = True
271
271
  sys.path.insert(0, str(ROOT))
272
272
  from boost_cli.core import catalog, registry # deferred: repo-root import shim
273
273
 
274
- counts: Dict[str, int] = {}
275
- failures: List[CorpusError] = []
274
+ counts: dict[str, int] = {}
275
+ failures: list[CorpusError] = []
276
276
  for repo, sha, want in rows:
277
277
  try:
278
278
  try:
@@ -345,8 +345,8 @@ def _report_failures(failures: Sequence[CorpusError], total_rows: int) -> int:
345
345
  return EXIT_DRIFT if drift else EXIT_UNAVAILABLE
346
346
 
347
347
 
348
- def relock_text(text: str, counts: Dict[str, int],
349
- shas: Optional[Dict[str, str]] = None) -> str:
348
+ def relock_text(text: str, counts: dict[str, int],
349
+ shas: dict[str, str] | None = None) -> str:
350
350
  """Rewrite each pinned row's entry count — and its SHA when ``shas`` says so.
351
351
 
352
352
  A whole-file rewrite would lose the header, which is where the reasoning
@@ -379,8 +379,8 @@ def relock_text(text: str, counts: Dict[str, int],
379
379
  return "\n".join(out) + ("\n" if text.endswith("\n") else "")
380
380
 
381
381
 
382
- def refresh_summary(rows: Sequence[Row], shas: Dict[str, str],
383
- counts: Dict[str, int]) -> str:
382
+ def refresh_summary(rows: Sequence[Row], shas: dict[str, str],
383
+ counts: dict[str, int]) -> str:
384
384
  """A Markdown table of what a refresh moved, for the pull request body.
385
385
 
386
386
  The point of the scheduled refresh is not the refresh — it is that the diff
@@ -446,7 +446,7 @@ def _ensure(taps: Path, relock: bool = False) -> int:
446
446
  return 0
447
447
 
448
448
 
449
- def _refresh(taps: Path, summary_path: Optional[str] = None) -> int:
449
+ def _refresh(taps: Path, summary_path: str | None = None) -> int:
450
450
  """Move every row to current upstream HEAD, re-measure, rewrite taps.txt.
451
451
 
452
452
  Pinning bought reproducibility with representativeness: the gate measures
@@ -465,9 +465,9 @@ def _refresh(taps: Path, summary_path: Optional[str] = None) -> int:
465
465
  from boost_cli.core import catalog, gitutil, registry # deferred: path shim
466
466
 
467
467
  rows = parse_taps(taps.read_text(encoding="utf-8"))
468
- shas: Dict[str, str] = {}
469
- counts: Dict[str, int] = {}
470
- failures: List[CorpusError] = []
468
+ shas: dict[str, str] = {}
469
+ counts: dict[str, int] = {}
470
+ failures: list[CorpusError] = []
471
471
  for repo, old_sha, _n in rows:
472
472
  try:
473
473
  try:
@@ -534,7 +534,7 @@ def _audit(taps: Path) -> int:
534
534
  return 0
535
535
 
536
536
 
537
- def main(argv: Optional[List[str]] = None) -> int:
537
+ def main(argv: list[str] | None = None) -> int:
538
538
  p = argparse.ArgumentParser(prog="eval_corpus.py", description=__doc__)
539
539
  p.add_argument("--ensure", action="store_true",
540
540
  help="tap, pin and verify every row, then rebuild its cache")