boost-skill-cli 1.2.19__tar.gz → 1.2.21__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 (744) hide show
  1. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
  2. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/PKG-INFO +1 -1
  3. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/cli.py +37 -7
  5. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/discovery.py +19 -0
  6. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/team.py +2 -2
  7. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/output.py +12 -1
  8. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/rag.py +65 -0
  9. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  10. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  11. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/rag-architecture.md +14 -0
  12. boost_skill_cli-1.2.21/docs/roadmap/items/bm25-has-no-stemming.md +68 -0
  13. boost_skill_cli-1.2.21/docs/roadmap/items/cli-output-ignored-the-terminal.md +56 -0
  14. boost_skill_cli-1.2.21/docs/roadmap/items/long-hints-overflow-narrow-panes.md +38 -0
  15. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap.html +151 -1
  16. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_discovery.py +23 -0
  17. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_team.py +16 -0
  18. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_errors_and_cli_table.py +36 -0
  19. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_output.py +50 -0
  20. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rag.py +123 -0
  21. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.gitattributes +0 -0
  22. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.gitignore +0 -0
  23. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.gitleaks.toml +0 -0
  24. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.htmlvalidate.json +0 -0
  25. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.lighthouserc.json +0 -0
  26. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.lycheeignore +0 -0
  27. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.markdownlint-cli2.jsonc +0 -0
  28. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.pre-commit-config.yaml +0 -0
  29. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.stylelintrc.json +0 -0
  30. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.vale/styles/boost/Terminology.yml +0 -0
  31. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.vale.ini +0 -0
  32. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/CLAUDE.md +0 -0
  33. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/CODE_OF_CONDUCT.md +0 -0
  34. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/CONTRIBUTING.md +0 -0
  35. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/LICENSE +0 -0
  36. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/MANIFEST.in +0 -0
  37. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/Makefile +0 -0
  38. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/README.md +0 -0
  39. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/SECURITY.md +0 -0
  40. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost +0 -0
  41. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/__init__.py +0 -0
  42. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/__main__.py +0 -0
  43. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/cliparse.py +0 -0
  44. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/__init__.py +0 -0
  45. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/_common.py +0 -0
  46. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/bmad.py +0 -0
  47. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/configuration.py +0 -0
  48. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/hooks.py +0 -0
  49. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/info.py +0 -0
  50. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/intelligence.py +0 -0
  51. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/pkg.py +0 -0
  52. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/quality.py +0 -0
  53. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/run.py +0 -0
  54. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/safety.py +0 -0
  55. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/taps.py +0 -0
  56. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/__init__.py +0 -0
  57. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/adapters.py +0 -0
  58. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/agents.py +0 -0
  59. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/ai.py +0 -0
  60. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/bmad.py +0 -0
  61. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/bootstrap.py +0 -0
  62. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/browse.py +0 -0
  63. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/builtin.py +0 -0
  64. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/capabilities.py +0 -0
  65. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/catalog.py +0 -0
  66. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/catalogbundle.py +0 -0
  67. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/chat.py +0 -0
  68. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/claude_settings.py +0 -0
  69. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/complete.py +0 -0
  70. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/config.py +0 -0
  71. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/dense.py +0 -0
  72. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/ed25519.py +0 -0
  73. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/embed.py +0 -0
  74. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/faithfulness.py +0 -0
  75. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/frontmatter.py +0 -0
  76. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/gitutil.py +0 -0
  77. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/imperative.py +0 -0
  78. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/injectscan.py +0 -0
  79. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/installscan.py +0 -0
  80. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/integrity.py +0 -0
  81. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/journal.py +0 -0
  82. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/localembed.py +0 -0
  83. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/lockfile.py +0 -0
  84. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/logs.py +0 -0
  85. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/mcp.py +0 -0
  86. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/mcpdecl.py +0 -0
  87. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/mcphost.py +0 -0
  88. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/minisign.py +0 -0
  89. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/nethttp.py +0 -0
  90. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/paths.py +0 -0
  91. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/policy.py +0 -0
  92. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/projectlock.py +0 -0
  93. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/provenance.py +0 -0
  94. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/registry.py +0 -0
  95. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/resolve.py +0 -0
  96. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/rules.py +0 -0
  97. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/scopes.py +0 -0
  98. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/secretscan.py +0 -0
  99. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/selfupdate.py +0 -0
  100. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/serve.py +0 -0
  101. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/stackprobe.py +0 -0
  102. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/staleness.py +0 -0
  103. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/store.py +0 -0
  104. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/trustaudit.py +0 -0
  105. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/typosquat.py +0 -0
  106. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/updatediff.py +0 -0
  107. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/util.py +0 -0
  108. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/workflows.py +0 -0
  109. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/data/registries.json +0 -0
  110. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/data/rules/boost-first.mdc +0 -0
  111. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/errors.py +0 -0
  112. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/spin.py +0 -0
  113. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/__init__.py +0 -0
  114. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/_compat.py +0 -0
  115. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/graph.py +0 -0
  116. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/loader.py +0 -0
  117. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/py.typed +0 -0
  118. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/retriever.py +0 -0
  119. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  120. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  121. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/requires.txt +0 -0
  122. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/top_level.txt +0 -0
  123. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/codecov.yml +0 -0
  124. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/.claude/settings.local.json +0 -0
  125. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/DEBUGGING.md +0 -0
  126. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/adapters.html +0 -0
  127. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/README.md +0 -0
  128. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-components-core.md +0 -0
  129. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-containers.md +0 -0
  130. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-context.md +0 -0
  131. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-dynamic-install.md +0 -0
  132. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/distill.gif +0 -0
  133. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/doctor.gif +0 -0
  134. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/explain.gif +0 -0
  135. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/hooks.gif +0 -0
  136. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/install.gif +0 -0
  137. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/pulse.gif +0 -0
  138. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/search.gif +0 -0
  139. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/tap.gif +0 -0
  140. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/distill.tape +0 -0
  141. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/doctor.tape +0 -0
  142. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/explain.tape +0 -0
  143. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/hooks.tape +0 -0
  144. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/install.tape +0 -0
  145. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/pulse.tape +0 -0
  146. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/search.tape +0 -0
  147. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/tap.tape +0 -0
  148. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel.html +0 -0
  149. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/chat.html +0 -0
  150. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/commands.html +0 -0
  151. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo-index.json +0 -0
  152. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo.gif +0 -0
  153. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo.html +0 -0
  154. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo.tape +0 -0
  155. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/design-roadmap.html +0 -0
  156. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/eval-latest.json +0 -0
  157. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/eval.html +0 -0
  158. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/index.html +0 -0
  159. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/langchain.html +0 -0
  160. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/mcp-hub.html +0 -0
  161. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D01.md +0 -0
  162. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D02.md +0 -0
  163. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D03.md +0 -0
  164. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D04.md +0 -0
  165. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D05.md +0 -0
  166. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D06.md +0 -0
  167. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D07.md +0 -0
  168. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D08.md +0 -0
  169. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D09.md +0 -0
  170. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D10.md +0 -0
  171. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D11.md +0 -0
  172. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D12.md +0 -0
  173. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D13.md +0 -0
  174. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D14.md +0 -0
  175. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D15.md +0 -0
  176. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D16.md +0 -0
  177. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D17.md +0 -0
  178. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D18.md +0 -0
  179. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D19.md +0 -0
  180. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D20.md +0 -0
  181. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D21.md +0 -0
  182. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D22.md +0 -0
  183. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D23.md +0 -0
  184. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D24.md +0 -0
  185. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D25.md +0 -0
  186. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D26.md +0 -0
  187. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  188. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  189. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  190. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  191. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  192. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  193. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  194. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  195. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  196. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  197. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  198. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  199. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  200. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-rule.md +0 -0
  201. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  202. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  203. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  204. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  205. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  206. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  207. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  208. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  209. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  210. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  211. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  212. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  213. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  214. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  215. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  216. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  217. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  218. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  219. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  220. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-carousel-page.md +0 -0
  221. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  222. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  223. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  224. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  225. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  226. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  227. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  228. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  229. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  230. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  231. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  232. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  233. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  234. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  235. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  236. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  237. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  238. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  239. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  240. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  241. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  242. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  243. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  244. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  245. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  246. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  247. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  248. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  249. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  250. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  251. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  252. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  253. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  254. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  255. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  256. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  257. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  258. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  259. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  260. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  261. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  262. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  263. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  264. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  265. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  266. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  267. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  268. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-community-health-files.md +0 -0
  269. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  270. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  271. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  272. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  273. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  274. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  275. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  276. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  277. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  278. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  279. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  280. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  281. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  282. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  283. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  284. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  285. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  286. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  287. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  288. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  289. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  290. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  291. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  292. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  293. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  294. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  295. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  296. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  297. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  298. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  299. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  300. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  301. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  302. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  303. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  304. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  305. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  306. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  307. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  308. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  309. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  310. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  311. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  312. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  313. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  314. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  315. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  316. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  317. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  318. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  319. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  320. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  321. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  322. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  323. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  324. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  325. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  326. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  327. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  328. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  329. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  330. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  331. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  332. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  333. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  334. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  335. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  336. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  337. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  338. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  339. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  340. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  341. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  342. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  343. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  344. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  345. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  346. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  347. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  348. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  349. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  350. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  351. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  352. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  353. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  354. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  355. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  356. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  357. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  358. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  359. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  360. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  361. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  362. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  363. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  364. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  365. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  366. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  367. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  368. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  369. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  370. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  371. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  372. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  373. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  374. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  375. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  376. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  377. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  378. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  379. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  380. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  381. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  382. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  383. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  384. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  385. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  386. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  387. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  388. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  389. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  390. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  391. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  392. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  393. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  394. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  395. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  396. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  397. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  398. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  399. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  400. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  401. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  402. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  403. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  404. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  405. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  406. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  407. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  408. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  409. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  410. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  411. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  412. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  413. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  414. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  415. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  416. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  417. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  418. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  419. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  420. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  421. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  422. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  423. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  424. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  425. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  426. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  427. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  428. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  429. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  430. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  431. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  432. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  433. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  434. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  435. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  436. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  437. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  438. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  439. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  440. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  441. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  442. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  443. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  444. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  445. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  446. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  447. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workspace-scope-install.md +0 -0
  448. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/zip-strict-audit.md +0 -0
  449. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  450. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  451. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  452. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/eslint.config.mjs +0 -0
  453. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/README.md +0 -0
  454. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/__init__.py +0 -0
  455. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/baseline.json +0 -0
  456. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/faithfulness.py +0 -0
  457. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/golden_set.json +0 -0
  458. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/make_corpus.py +0 -0
  459. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/make_golden.py +0 -0
  460. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/metrics.py +0 -0
  461. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/publish_golden_dataset.py +0 -0
  462. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/run_evals.py +0 -0
  463. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/examples/README.md +0 -0
  464. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/examples/adapt-demo.sh +0 -0
  465. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/examples/boost-run-prototype.sh +0 -0
  466. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/index.html +0 -0
  467. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/noxfile.py +0 -0
  468. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/pyproject.toml +0 -0
  469. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/coverage-tools.in +0 -0
  470. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/coverage-tools.txt +0 -0
  471. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/lint-tools.in +0 -0
  472. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/lint-tools.txt +0 -0
  473. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/mutation-tools.in +0 -0
  474. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/mutation-tools.txt +0 -0
  475. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/platform-pins.lock +0 -0
  476. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/release-tools.in +0 -0
  477. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/release-tools.txt +0 -0
  478. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/test-tools.in +0 -0
  479. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/test-tools.txt +0 -0
  480. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/a11y_check.py +0 -0
  481. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/bench_cli.sh +0 -0
  482. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_command_reference.py +0 -0
  483. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_demo_index.py +0 -0
  484. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_registries.py +0 -0
  485. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_roadmap.py +0 -0
  486. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_scale_corpus.py +0 -0
  487. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/check_anchors.py +0 -0
  488. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/check_licenses.py +0 -0
  489. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/check_required_checks.py +0 -0
  490. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/ensure_eval_corpus.sh +0 -0
  491. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_corpus.py +0 -0
  492. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_explain.py +0 -0
  493. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_gate.py +0 -0
  494. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_recommend.py +0 -0
  495. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_retrieval.py +0 -0
  496. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_stats_summary.py +0 -0
  497. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/import_budget.py +0 -0
  498. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/lock_toolchain.py +0 -0
  499. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/measure_registry.py +0 -0
  500. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/mutation_gate.py +0 -0
  501. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/mutation_shards.py +0 -0
  502. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/mutation_weights.json +0 -0
  503. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/page_budget.py +0 -0
  504. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/perf_gate.py +0 -0
  505. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/post_deploy_smoke.py +0 -0
  506. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/publish_eval_json.py +0 -0
  507. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/release_guard.py +0 -0
  508. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/release_preflight.py +0 -0
  509. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/serve_docs.py +0 -0
  510. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/setup.cfg +0 -0
  511. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/sonar-project.properties +0 -0
  512. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/README.md +0 -0
  513. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/boost.css +0 -0
  514. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/boost.js +0 -0
  515. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/demo.html +0 -0
  516. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/adapt.feature +0 -0
  517. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/browse.feature +0 -0
  518. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/count.feature +0 -0
  519. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/discover.feature +0 -0
  520. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/doctor.feature +0 -0
  521. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/environment.py +0 -0
  522. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/explain.feature +0 -0
  523. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/index.feature +0 -0
  524. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/install.feature +0 -0
  525. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/list.feature +0 -0
  526. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/mcp.feature +0 -0
  527. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/search.feature +0 -0
  528. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/cli_steps.py +0 -0
  529. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/discovery_steps.py +0 -0
  530. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/mcp_steps.py +0 -0
  531. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/quality_steps.py +0 -0
  532. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/conftest.py +0 -0
  533. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/baseline.json +0 -0
  534. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/explain.jsonl +0 -0
  535. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/golden-natural.jsonl +0 -0
  536. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/golden.jsonl +0 -0
  537. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/recommend.jsonl +0 -0
  538. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/taps-scale.txt +0 -0
  539. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/taps.txt +0 -0
  540. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_capabilities_policy.py +0 -0
  541. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_adapt.py +0 -0
  542. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_bmad.py +0 -0
  543. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_catalog.py +0 -0
  544. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_chat.py +0 -0
  545. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_configuration.py +0 -0
  546. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_hooks.py +0 -0
  547. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_info.py +0 -0
  548. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_intelligence.py +0 -0
  549. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_pkg.py +0 -0
  550. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_quality.py +0 -0
  551. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_taps.py +0 -0
  552. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_everyday_loop.py +0 -0
  553. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_integrity_enforce.py +0 -0
  554. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_kind_conformance.py +0 -0
  555. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_property_parsers.py +0 -0
  556. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_run.py +0 -0
  557. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_tap_signing.py +0 -0
  558. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_workspace_scope.py +0 -0
  559. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/README.md +0 -0
  560. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  561. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  562. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  563. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  564. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  565. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  566. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  567. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  568. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  569. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  570. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  571. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  572. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  573. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  574. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  575. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  576. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  577. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  578. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  579. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  580. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  581. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  582. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  583. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_frontmatter.py +0 -0
  584. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_registry.py +0 -0
  585. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/conftest.py +0 -0
  586. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/test_graph.py +0 -0
  587. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/test_loader.py +0 -0
  588. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/test_retriever.py +0 -0
  589. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/make_fixture.py +0 -0
  590. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/perf/test_benchmarks.py +0 -0
  591. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/smoke.sh +0 -0
  592. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_a11y_check.py +0 -0
  593. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_action_pin_lockstep.py +0 -0
  594. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_adapters.py +0 -0
  595. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_multi.py +0 -0
  596. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_runner.py +0 -0
  597. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_agents.py +0 -0
  598. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_ai.py +0 -0
  599. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_bmad_core.py +0 -0
  600. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_boost_first_offer.py +0 -0
  601. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_bootstrap.py +0 -0
  602. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_browse.py +0 -0
  603. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_builtin.py +0 -0
  604. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_capabilities.py +0 -0
  605. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_catalog.py +0 -0
  606. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_catalogbundle.py +0 -0
  607. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_chat.py +0 -0
  608. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_check_anchors.py +0 -0
  609. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_check_licenses.py +0 -0
  610. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_claude_settings.py +0 -0
  611. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_clean_internal_cache.py +0 -0
  612. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_cliparse.py +0 -0
  613. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_codeql_analysis_key.py +0 -0
  614. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_command_reference_fresh.py +0 -0
  615. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_community_health_files.py +0 -0
  616. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_compact.py +0 -0
  617. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_complete.py +0 -0
  618. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_complete_rc_block.py +0 -0
  619. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_config.py +0 -0
  620. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_content_dedupe.py +0 -0
  621. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_content_identity.py +0 -0
  622. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_crash_redaction.py +0 -0
  623. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dedup_trust.py +0 -0
  624. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_demo_index.py +0 -0
  625. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense.py +0 -0
  626. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_embed_dedupe.py +0 -0
  627. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fallback.py +0 -0
  628. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fix_hint.py +0 -0
  629. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_quantized.py +0 -0
  630. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_ready_order.py +0 -0
  631. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_real_schema.py +0 -0
  632. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  633. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shards.py +0 -0
  634. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status.py +0 -0
  635. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status_cheap.py +0 -0
  636. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dependabot_config.py +0 -0
  637. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_docs_pages_linked.py +0 -0
  638. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_docsite_chrome.py +0 -0
  639. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_ed25519.py +0 -0
  640. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_embed.py +0 -0
  641. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_embed_local.py +0 -0
  642. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_embed_truncated_response.py +0 -0
  643. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_entry_key.py +0 -0
  644. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_baseline.py +0 -0
  645. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_corpus.py +0 -0
  646. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_faithfulness.py +0 -0
  647. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_gate.py +0 -0
  648. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_grading.py +0 -0
  649. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_metrics.py +0 -0
  650. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_stats_summary.py +0 -0
  651. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  652. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_faithfulness.py +0 -0
  653. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_frontmatter.py +0 -0
  654. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_fuzz_targets.py +0 -0
  655. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  656. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitleaks_config.py +0 -0
  657. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil.py +0 -0
  658. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_lfs.py +0 -0
  659. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_sparse.py +0 -0
  660. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_imperative.py +0 -0
  661. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_import_budget.py +0 -0
  662. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_injectscan.py +0 -0
  663. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_install_permission_error.py +0 -0
  664. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_installscan.py +0 -0
  665. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_integrity.py +0 -0
  666. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_journal.py +0 -0
  667. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_langchain_packaging.py +0 -0
  668. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_link_ownership.py +0 -0
  669. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_localembed.py +0 -0
  670. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_localembed_e2e.py +0 -0
  671. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_lockfile.py +0 -0
  672. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_logs.py +0 -0
  673. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_marketing_counts.py +0 -0
  674. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcp.py +0 -0
  675. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcp_install_scan.py +0 -0
  676. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcpdecl.py +0 -0
  677. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcphost.py +0 -0
  678. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_measure_registry.py +0 -0
  679. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_minisign.py +0 -0
  680. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_hardening.py +0 -0
  681. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_shards.py +0 -0
  682. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_subfile_shards.py +0 -0
  683. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutmut_source_paths.py +0 -0
  684. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_nethttp.py +0 -0
  685. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_page_budget.py +0 -0
  686. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_paths.py +0 -0
  687. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_perf_gate.py +0 -0
  688. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_confusions.py +0 -0
  689. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_injection.py +0 -0
  690. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_secrets.py +0 -0
  691. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_platform_pins.py +0 -0
  692. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_policy.py +0 -0
  693. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_post_deploy_smoke.py +0 -0
  694. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_project_mcp_sidecar.py +0 -0
  695. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_projectlock.py +0 -0
  696. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_provenance.py +0 -0
  697. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_publish_golden_dataset.py +0 -0
  698. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fastpath.py +0 -0
  699. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fusion.py +0 -0
  700. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registries_fresh.py +0 -0
  701. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registry.py +0 -0
  702. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registry_categories.py +0 -0
  703. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registry_control_chars.py +0 -0
  704. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_release_guard.py +0 -0
  705. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_release_preflight.py +0 -0
  706. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_required_checks.py +0 -0
  707. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rerank_cache.py +0 -0
  708. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_resolve.py +0 -0
  709. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_roadmap_fresh.py +0 -0
  710. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rules.py +0 -0
  711. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_scale_corpus.py +0 -0
  712. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_scopes.py +0 -0
  713. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_secretscan.py +0 -0
  714. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_selfupdate.py +0 -0
  715. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_serve.py +0 -0
  716. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_serve_docs.py +0 -0
  717. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_shards_matrix.py +0 -0
  718. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_smoke_covers_every_command.py +0 -0
  719. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_spin.py +0 -0
  720. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_stackprobe.py +0 -0
  721. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_staleness.py +0 -0
  722. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_store.py +0 -0
  723. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_store_materialize.py +0 -0
  724. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_sync_blocked_links.py +0 -0
  725. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  726. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_token_parity.py +0 -0
  727. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_toolchain_lock.py +0 -0
  728. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_trustaudit.py +0 -0
  729. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_typosquat.py +0 -0
  730. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_updatediff.py +0 -0
  731. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_util.py +0 -0
  732. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_version.py +0 -0
  733. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_visual_harness_flags.py +0 -0
  734. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency.py +0 -0
  735. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  736. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  737. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_timeouts.py +0 -0
  738. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflows.py +0 -0
  739. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  740. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/a11y_check.mjs +0 -0
  741. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/console_check.mjs +0 -0
  742. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/package-lock.json +0 -0
  743. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/package.json +0 -0
  744. {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/visual_check.mjs +0 -0
@@ -98,6 +98,8 @@ stderr
98
98
  Stdlib
99
99
  stdlib
100
100
  stdout
101
+ stemmer
102
+ stemming
101
103
  subagents
102
104
  subcommand
103
105
  tappable
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.19
3
+ Version: 1.2.21
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.19'
22
- __version_tuple__ = version_tuple = (1, 2, 19)
21
+ __version__ = version = '1.2.21'
22
+ __version_tuple__ = version_tuple = (1, 2, 21)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -155,20 +155,50 @@ _GROUP_HUES = ("cyan", "violet", "pink", "green", "yellow")
155
155
 
156
156
 
157
157
  def print_help() -> None:
158
- print(out.gradient(PRODUCT) + " — Homebrew for AI coding skills"
159
- + out.c(" (%s · v%s)" % (TAGLINE, __version__), out.DIM))
158
+ """The command index, fitted to the pane.
159
+
160
+ Every other screen in the CLI adapts — `search` drops the tap column and
161
+ truncates at 60 columns — while this one emitted a fixed 105-column banner
162
+ at every width and wrapped mid-word for anyone not running a wide
163
+ terminal. Names are never clipped, because the help's whole job is to be
164
+ an index you can copy a command out of; summaries are.
165
+ """
166
+ cols = out.term_width()
167
+
168
+ title_line = out.gradient(PRODUCT) + " — Homebrew for AI coding skills"
169
+ stamp = "%s · v%s" % (TAGLINE, __version__)
170
+ if out.visible_len(title_line) + out.visible_len(stamp) + 4 <= cols:
171
+ print(title_line + out.c(" (%s)" % stamp, out.DIM))
172
+ else:
173
+ print(title_line)
174
+ # The tagline is the first thing to go; the version never is, because
175
+ # it is what a bug report needs.
176
+ print(out.c(stamp if out.visible_len(stamp) <= cols
177
+ else "v%s" % __version__, out.DIM))
160
178
  print()
161
- print(out.c("Usage:", out.BOLD) + " boost <command> [args] "
162
- + out.c("boost help <command> for details", out.DIM))
179
+
180
+ usage = out.c("Usage:", out.BOLD) + " boost <command> [args]"
181
+ detail = out.c("boost help <command> for details", out.DIM)
182
+ if out.visible_len(usage) + out.visible_len(detail) + 3 <= cols:
183
+ print(usage + " " + detail)
184
+ else:
185
+ print(usage)
186
+ print(" " + detail)
187
+
163
188
  width = max(len(n) for n, _, _, _ in COMMANDS)
164
189
  for idx, (gkey, (_icon, title, desc)) in enumerate(GROUPS.items()):
165
190
  cmds = [(n, s) for n, g, _m, s in COMMANDS if g == gkey]
166
191
  bullet = out.aurora("●", _GROUP_HUES[idx % len(_GROUP_HUES)])
167
192
  print()
168
- print(bullet + " " + out.c(title, out.BOLD)
169
- + out.c(" — %s" % desc, out.DIM))
193
+ head = bullet + " " + out.c(title, out.BOLD)
194
+ room = cols - len(title) - 6 # "● " + title + " — "
195
+ if room >= 8:
196
+ print(head + out.c(" — %s" % out.truncate(desc, room), out.DIM))
197
+ else:
198
+ print(head)
170
199
  for n, s in cmds:
171
- print(" " + out.c(n.ljust(width + 2), out.CYAN) + s)
200
+ print(" " + out.c(n.ljust(width + 2), out.CYAN)
201
+ + out.truncate(s, max(0, cols - width - 4)))
172
202
  print()
173
203
  print(out.c("%d commands · %d groups" % (len(COMMANDS), len(GROUPS)), out.DIM))
174
204
 
@@ -176,10 +176,29 @@ def cmd_search(argv):
176
176
  installed=e["name"] in installed, lay=lay))
177
177
  out.info(out.role("%d match%s · ranked by %s"
178
178
  % (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
179
+ if use_rag:
180
+ _note_stem_expansions(query)
179
181
  _hint_semantic_search(engine)
180
182
  return 0
181
183
 
182
184
 
185
+ def _note_stem_expansions(query: str) -> None:
186
+ """Say when a query term was widened to the word actually indexed.
187
+
188
+ Staying quiet would be a worse answer than the old empty one: the user
189
+ asked for `brainstorm` and is looking at results for `brainstorming`, and
190
+ only one of those is a word they typed.
191
+ """
192
+ subs = rag.stem_expansions(rag.tokenize(query))
193
+ if not subs:
194
+ return
195
+ said = ", ".join("%r" % term for term in subs)
196
+ shown = ", ".join("%r" % term for term in subs.values())
197
+ out.info(out.role(out.truncate(
198
+ "no exact match for %s — showing %s" % (said, shown),
199
+ max(0, out.term_width() - 2)), "muted"))
200
+
201
+
183
202
  def _hint_semantic_search(engine: str) -> None:
184
203
  """Say that a better engine exists, when BM25 answered alone.
185
204
 
@@ -69,7 +69,7 @@ def cmd_cohort(argv) -> int:
69
69
  p = cliparse.parser(
70
70
  prog="boost cohort",
71
71
  description="Controlled skill rollouts & team A/B testing",
72
- epilog="Membership is a deterministic hash of user+cohort, so a 50%% "
72
+ epilog="Membership is a deterministic hash of user+cohort, so a 50% "
73
73
  "rollout lands on the same half of the team every time. "
74
74
  "This machine evaluates its own membership locally.")
75
75
  p.add_argument("action", nargs="?", default="list",
@@ -177,7 +177,7 @@ def cmd_cohort(argv) -> int:
177
177
  return 0
178
178
  out.table(rows, headers=("COHORT", "SKILLS", "ROLLOUT", "YOU"))
179
179
  print()
180
- out.dim("membership = sha256(user:cohort) %% 100 < rollout · apply with `boost cohort apply`")
180
+ out.dim("membership = sha256(user:cohort) % 100 < rollout · apply with `boost cohort apply`")
181
181
  return 0
182
182
 
183
183
 
@@ -317,9 +317,20 @@ def panel(lines, title: str | None = None, hue: str = "cyan") -> str:
317
317
  """
318
318
  if isinstance(lines, str):
319
319
  lines = [lines]
320
+ # The border costs four columns — "\u2502 " on the left, " \u2502" on the right —
321
+ # so that is what the content may not exceed. Without this the box sized
322
+ # itself to its content and sailed past the pane: `boost count` drew 108
323
+ # columns into an 80-column terminal, and a box whose border wraps is the
324
+ # worst-looking overflow the CLI has, because the shape itself breaks.
325
+ room = term_width() - 4
326
+ if title:
327
+ title = _clip_visible(title, room - 2)
328
+ lines = [_clip_visible(x, room) for x in lines]
320
329
  widths = [visible_len(x) for x in lines]
321
330
  tw = visible_len(title) if title else 0
322
- inner = max([*widths, tw + 2]) # a titled rule needs a space each side
331
+ # A titled rule needs a space each side, hence the +2 / -2. Clipping above
332
+ # already bounds every width by `room`, so no second clamp is needed here.
333
+ inner = max([*widths, tw + 2])
323
334
 
324
335
  def b(s: str) -> str:
325
336
  return aurora(s, hue)
@@ -383,6 +383,65 @@ def read_postings(terms: Sequence[str]) -> dict[str, list[list[int]]]:
383
383
  return dict(out) # noqa: FURB123 out is a defaultdict; .copy() would keep the factory
384
384
 
385
385
 
386
+ # A query term shorter than this expands to noise: `cal` prefixes `calendar`,
387
+ # `calculate` and `callbacks` alike, and picking one of them for the user is a
388
+ # guess rather than a correction.
389
+ STEM_MIN_LEN = 4
390
+
391
+
392
+ def stem_expansions(terms: Sequence[str]) -> dict[str, str]:
393
+ """Map each term that indexes *nothing* to the commonest term it prefixes.
394
+
395
+ `tokenize` is exact-match, so a query term and its own inflection are
396
+ unrelated strings: `boost search brainstorm` returned zero matches while
397
+ `brainstorming` returned the skill, and `boost chat` had the same hole.
398
+ Measured over the 461 tap caches on one real machine, 4,663 of 29,607 item
399
+ names (15.7%) were unreachable by an attested stem — `pattern` missed 474
400
+ names ending `-patterns`, `skill` missed 252 ending `-skills`.
401
+
402
+ **A term that has postings is never expanded.** That is the whole safety
403
+ argument: this can only ever add signal where `_bm25` scored exactly none
404
+ (it skips a term with no posting list), so a query whose terms all exist
405
+ ranks byte-identically and the retrieval floors cannot move. It is also why
406
+ this is a fallback rather than a stemmer — a real stemmer conflates terms
407
+ that both exist, which changes established rankings and needs an index
408
+ format bump and a regenerated baseline.
409
+
410
+ Returns ``{}`` — never raises — when the store is missing or unreadable,
411
+ matching :func:`read_postings`.
412
+ """
413
+ uniq = [t for t in dict.fromkeys(terms) if len(t) >= STEM_MIN_LEN]
414
+ if not uniq:
415
+ return {}
416
+ indexed = read_postings(uniq)
417
+ missing = [t for t in uniq if not indexed.get(t)]
418
+ if not missing:
419
+ return {}
420
+ try:
421
+ con = sqlite3.connect("file:%s?mode=ro" % postings_path(), uri=True)
422
+ except sqlite3.Error:
423
+ return {}
424
+ out: dict[str, str] = {}
425
+ try:
426
+ for term in missing:
427
+ # `tokenize` emits only [a-z0-9]+, and "~" sorts above every
428
+ # character it can produce — so this half-open range is exactly the
429
+ # terms beginning with `term`, and it rides the postings_term index
430
+ # instead of scanning. Ties break on the term itself so the choice
431
+ # is deterministic across machines.
432
+ row = con.execute(
433
+ "SELECT term FROM postings WHERE term > ? AND term < ? "
434
+ "GROUP BY term ORDER BY COUNT(*) DESC, term LIMIT 1",
435
+ (term, term + "~")).fetchone()
436
+ if row:
437
+ out[term] = row[0]
438
+ except sqlite3.Error:
439
+ return {}
440
+ finally:
441
+ con.close()
442
+ return out
443
+
444
+
386
445
  def _all_postings() -> dict[str, list[list[int]]]:
387
446
  """Every posting — only the incremental rebuild path needs this."""
388
447
  try:
@@ -804,6 +863,12 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
804
863
  terms = tokenize(query)
805
864
  if not terms:
806
865
  return []
866
+ # Substitute before scoring, not after: the expanded term has to reach the
867
+ # snippet windowing too, or the hit is highlighted on a word it does not
868
+ # contain.
869
+ substitutions = stem_expansions(terms)
870
+ if substitutions:
871
+ terms = [substitutions.get(t, t) for t in terms]
807
872
  docs = raw["docs"]
808
873
  scores = _bm25(terms, raw, read_postings(terms))
809
874
  if entries is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.19
3
+ Version: 1.2.21
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -191,6 +191,7 @@ docs/roadmap/items/ambiguous-tap-short-name-resolution.md
191
191
  docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
192
192
  docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
193
193
  docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
194
+ docs/roadmap/items/bm25-has-no-stemming.md
194
195
  docs/roadmap/items/bm25-index-is-one-json-blob.md
195
196
  docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
196
197
  docs/roadmap/items/boost-first-carried-the-losing-trigger.md
@@ -211,6 +212,7 @@ docs/roadmap/items/ci-job-timeout-minutes.md
211
212
  docs/roadmap/items/ci-summary-step-fails-itself.md
212
213
  docs/roadmap/items/ci-time-is-now-runner-queueing.md
213
214
  docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
215
+ docs/roadmap/items/cli-output-ignored-the-terminal.md
214
216
  docs/roadmap/items/code-scanning-rule-can-be-restored.md
215
217
  docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
216
218
  docs/roadmap/items/cold-search-reads-the-whole-catalogue.md
@@ -296,6 +298,7 @@ docs/roadmap/items/localize-the-stored-bm25-snippet.md
296
298
  docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md
297
299
  docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md
298
300
  docs/roadmap/items/log-timestamps-mislabeled-utc.md
301
+ docs/roadmap/items/long-hints-overflow-narrow-panes.md
299
302
  docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md
300
303
  docs/roadmap/items/main-has-no-branch-protection.md
301
304
  docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md
@@ -135,6 +135,20 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
135
135
  Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
136
136
  dict-of-postings scan — comfortably sub-second per query in Python.
137
137
 
138
+ **Tokenization is exact-match, and `stem_expansions` is the one concession to that.**
139
+ A query term and its own inflection are unrelated strings, so `boost search brainstorm`
140
+ returned nothing while `brainstorming` returned the skill. Measured over 461 tap caches,
141
+ 4,663 of 29,607 item names (15.7%) were unreachable by an attested stem — `pattern` missed
142
+ 474 names ending `-patterns`. Before scoring, any term with **no** posting list is replaced
143
+ by the commonest term it prefixes, found with an index-backed range scan over the postings
144
+ table. A term that *has* postings is never touched: expansion only ever adds signal where
145
+ `_bm25` scored exactly none, so a query whose terms all exist ranks byte-identically and the
146
+ retrieval floors cannot move. That is what makes it a fallback rather than a stemmer — a real
147
+ stemmer conflates terms that both exist, which changes established rankings and would need an
148
+ index-format bump and a regenerated baseline. Terms shorter than `STEM_MIN_LEN` (4) are left
149
+ alone, because a three-letter prefix expands to a guess. `boost search` states the
150
+ substitution rather than silently answering a different question.
151
+
138
152
  **Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
139
153
  `entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
140
154
  the index's own doc metadata and materialises real catalog entries only for the
@@ -0,0 +1,68 @@
1
+ ---
2
+ id: bm25-has-no-stemming
3
+ board: code
4
+ section: pipeline
5
+ status: inflight
6
+ category: Search · Retrieval
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still
11
+ order: 127
12
+ owner: loop/bm25-stem-fallback
13
+ pr:
14
+ title: <code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it
15
+ ---
16
+ <b>The symptom, in two commands against the same five-skill tap.</b>
17
+ <code>boost search brainstorming</code> returns the skill.
18
+ <code>boost search brainstorm</code> returns <b>zero</b> matches and sends the user to
19
+ <code>boost discover</code> to search all of GitHub for something already sitting in their
20
+ catalogue. <code>boost chat "what helps me brainstorm"</code> has the same hole and answers with
21
+ two unrelated skills. <code>core/rag.tokenize</code> lowercases, splits on non-alphanumerics and
22
+ drops a small stopword list — there is no stemming and no prefix fallback, so
23
+ <code>brainstorm</code> and <code>brainstorming</code> are simply different terms.
24
+
25
+ <b>Measured on the 461 tap caches on this machine: 29,607 distinct item names, 9,739 distinct
26
+ name tokens.</b> <b>4,663 of those names (15.7%)</b> carry a token whose stem finds nothing —
27
+ counting only stems that appear at least five times elsewhere in the corpus, so each is
28
+ demonstrably a word people type rather than an artefact of naive suffix stripping. The worst are
29
+ not exotic: <code>pattern</code> misses <b>474</b> names ending <code>-patterns</code>,
30
+ <code>skill</code> misses <b>252</b> ending <code>-skills</code>, <code>implement</code> misses
31
+ 161, <code>event</code> 115, <code>error</code> 112, <code>webhook</code> 109,
32
+ <code>agent</code> 83, <code>market</code> 81 named <code>-marketing</code>. A user searching
33
+ this catalogue for <code>skill</code> cannot reach a quarter of a thousand items named for it.
34
+
35
+ <b>It is invisible from a developer install, which is why it survived.</b> This machine has the
36
+ <code>[rag]</code> extra and a built dense store, so search reports <code>hybrid RRF (BM25 +
37
+ dense)</code> and the embeddings absorb the morphology: <code>webhook</code> returns 51 matches
38
+ and <code>webhooks</code> returns 47. The gap is only visible on the always-on, zero-dependency
39
+ BM25 path — which is what every user without the extra runs, what
40
+ <code>search</code> prints <code>semantic search is off</code> for, and what the required
41
+ <code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
42
+ easily reproduce a plain user's result.
43
+
44
+ <b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
45
+ whole query returns zero hits — was drafted and rejected, because it does not fix the reported
46
+ case. <code>boost chat &ldquo;what helps me brainstorm&rdquo;</code> already returns non-empty
47
+ results from its other words, so a zero-hit trigger never fires and chat stays broken.
48
+ Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
49
+ term it prefixes, found by an index-backed range scan (<code>term &gt; ? AND term &lt; ?</code>,
50
+ upper bound <code>term + "~"</code> because <code>~</code> outranks every character
51
+ <code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
52
+ <code>analy</code> &rarr; <code>analyze</code>). Measured after: <code>search brainstorm</code>
53
+ returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
54
+
55
+ <b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
56
+ <em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
57
+ no posting list, so expansion can only add signal where there was exactly none — meaning any
58
+ query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
59
+ <code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
60
+ <code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
61
+ rewrites a query that already worked and fails. Nine hand-written mutants were run against the
62
+ new lines and all nine died, including that one.
63
+
64
+ <b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
65
+ inflection — a user typing <code>patterns</code> still will not reach an item named
66
+ <code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
67
+ Closing that means conflating terms that both exist, which changes established rankings and costs
68
+ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.
@@ -0,0 +1,56 @@
1
+ ---
2
+ id: cli-output-ignored-the-terminal
3
+ board: code
4
+ section: dx
5
+ status: inflight
6
+ category: CLI · Output
7
+ complexity: S
8
+ impact: Med
9
+ wow: 3
10
+ note: an 80-command sweep found a box that drew wider than the pane, a help screen that never measured it, and a literal %% on screen
11
+ order: 125
12
+ owner: loop/cli-output-defects
13
+ pr: 552
14
+ title: The box drew 108 columns into an 80-column pane, and <code>--help</code> never asked how wide the pane was
15
+ ---
16
+ <b>Every one of the 80 commands was run, not just read.</b> All 80 answered
17
+ <code>--help</code> with exit 0 and no traceback; ~73 were then driven for their real effect
18
+ against a disposable <code>HOME</code> — install, link, quarantine, focus, snapshot, replay,
19
+ cohort, hooks and the rest, checking the filesystem after each rather than trusting the success
20
+ line. <code>boost focus tdd-workflow</code> was confirmed by listing
21
+ <code>~/.claude/skills</code> and finding the other two skills genuinely unlinked with the
22
+ canonical store intact, and <code>focus --clear</code> by finding all three back. Seven commands
23
+ could not run here and are recorded as blocked rather than passed: <code>serve</code> (the
24
+ sandbox denies <code>socket.bind</code>), <code>discover</code> and <code>index</code> (no
25
+ <code>gh</code> auth), <code>run</code> live (no Agents SDK — <code>--print</code> was verified
26
+ instead), plus the interactive halves of <code>browse</code>, <code>chat</code> and
27
+ <code>edit</code>, each of which degraded with a correct hint.
28
+
29
+ <b>A literal <code>%%</code> was reaching the terminal.</b>
30
+ <code>boost cohort</code> printed <code>sha256(user:cohort) %% 100 &lt; rollout</code> and its
31
+ <code>--help</code> epilog offered <code>a 50%% rollout</code>. Both strings carry printf
32
+ escaping and neither is ever <code>%</code>-formatted, so the escape survived to the screen. The
33
+ existing test asserted <code>"membership = sha256(user:cohort)" in r.out</code> — it stops one
34
+ character short of the defect, which is exactly how it survived. Four other <code>%%</code> in
35
+ the same file are correct: they sit inside real <code>%</code>-format calls, including the
36
+ <code>Exec=%s %%u</code> that a <code>.desktop</code> file requires.
37
+
38
+ <b><code>panel()</code> sized itself to its content and never asked the terminal.</b> Measured:
39
+ <code>boost count</code> drew <b>108 columns into an 80-column pane</b>. A box is the worst
40
+ thing to overflow, because the border wraps and the shape itself breaks. It now clamps to
41
+ <code>term_width() - 4</code> — the four columns the border costs — and clips over-long content,
42
+ so every row stays the same width at any pane size.
43
+
44
+ <b>The help screen was the one screen that never measured the pane.</b>
45
+ <code>search</code> already adapts, dropping the tap column and truncating at 60 columns —
46
+ <code>term_width()</code> existed and <code>discovery.py</code> was its only caller. Meanwhile
47
+ <code>boost --help</code>, the first thing a new user sees, emitted a fixed <b>102-column</b>
48
+ banner at every width. It now fits exactly at 60, 80 and 100. Command <em>names</em> are never
49
+ clipped, because the help's whole job is to be an index you can copy a command out of; summaries
50
+ and the tagline are. The version never is — it is what a bug report needs.
51
+
52
+ <b>Two findings were measured and deliberately left for their own items.</b> Eleven commands
53
+ still overflow 80 columns, but the remainder are prose hints, and the worst of them is one shared
54
+ string that six test files and a BDD feature pin by substring — wrapping it is a cross-cutting
55
+ output change, not a rider on this one. See <code>long-hints-overflow-narrow-panes</code> and
56
+ <code>bm25-has-no-stemming</code>.
@@ -0,0 +1,38 @@
1
+ ---
2
+ id: long-hints-overflow-narrow-panes
3
+ board: code
4
+ section: dx
5
+ status: next
6
+ category: CLI · Output
7
+ complexity: M
8
+ impact: Low
9
+ wow: 2
10
+ note: 11 commands still emit prose hints past 80 columns; the worst is one string pinned by six test files
11
+ order: 126
12
+ owner:
13
+ pr:
14
+ title: The hints still run past the pane, and the worst one is pinned by six test files
15
+ ---
16
+ <b>Measured, at <code>COLUMNS=80</code>, over 46 commands.</b> After the box and the help screen
17
+ were fitted, <b>11</b> still emit a line past 80 columns. Ranked:
18
+ <code>doctor</code>'s semantic-search hint at <b>127</b>; the AI-fallback notice at <b>101</b>,
19
+ which is one shared string surfacing in <code>explain</code>, <code>impact</code> and
20
+ <code>simulate</code>; <code>protocol</code>'s URL forms at 100; <code>changelog</code>'s
21
+ unshallow hint at 93; <code>who</code>'s footer at 87; <code>search</code>'s extra hint at 82;
22
+ <code>replay</code>'s footer at 81.
23
+
24
+ <b>Two of the eleven must be left alone.</b> <code>pulse</code>'s <code>source=</code> paths and
25
+ <code>fingerprint</code>'s hash are data, not chrome — clipping them destroys the information the
26
+ line exists to carry. So a blanket "no line exceeds <code>term_width()</code>" assertion is the
27
+ wrong gate: it would false-positive on exactly the lines that should be long. Pin the composed
28
+ sites individually.
29
+
30
+ <b>Why this is not a quick wrap.</b> The 101-column offender contains
31
+ <code>using the heuristic fallback</code>, which is asserted by <b>six</b> test files plus
32
+ <code>tests/bdd/features/explain.feature</code>. Wrapping inserts a newline mid-sentence and
33
+ breaks every one of them; and under pytest <code>term_width()</code> falls back to 80, so the
34
+ wrap fires in the suite rather than only on a narrow terminal. The change is a
35
+ <code>wrap()</code> helper in <code>core/output.py</code> — mutation-gated, so boundary-width
36
+ tests, not coverage — plus re-pinning those assertions. Shortening the strings instead is a
37
+ smaller diff but a voice decision, and the substring pinned by the tests would have to survive
38
+ either way.
@@ -133,7 +133,7 @@
133
133
  <div class="stat"><b>16</b><span>Shipped</span></div>
134
134
  <div class="stat"><b>1</b><span>Next up</span></div>
135
135
  <div class="stat"><b>7</b><span>Planned</span></div>
136
- <div class="stat"><b>264</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>267</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -7053,6 +7053,70 @@ state where that line is the advice.</p>
7053
7053
  <span class="m">0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use</span>
7054
7054
  </div>
7055
7055
  </article>
7056
+
7057
+ <article class="cap rcard" id="bm25-has-no-stemming">
7058
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Retrieval</span></div>
7059
+ <h3><code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it</h3>
7060
+ <p><b>The symptom, in two commands against the same five-skill tap.</b>
7061
+ <code>boost search brainstorming</code> returns the skill.
7062
+ <code>boost search brainstorm</code> returns <b>zero</b> matches and sends the user to
7063
+ <code>boost discover</code> to search all of GitHub for something already sitting in their
7064
+ catalogue. <code>boost chat "what helps me brainstorm"</code> has the same hole and answers with
7065
+ two unrelated skills. <code>core/rag.tokenize</code> lowercases, splits on non-alphanumerics and
7066
+ drops a small stopword list — there is no stemming and no prefix fallback, so
7067
+ <code>brainstorm</code> and <code>brainstorming</code> are simply different terms.
7068
+
7069
+ <b>Measured on the 461 tap caches on this machine: 29,607 distinct item names, 9,739 distinct
7070
+ name tokens.</b> <b>4,663 of those names (15.7%)</b> carry a token whose stem finds nothing —
7071
+ counting only stems that appear at least five times elsewhere in the corpus, so each is
7072
+ demonstrably a word people type rather than an artefact of naive suffix stripping. The worst are
7073
+ not exotic: <code>pattern</code> misses <b>474</b> names ending <code>-patterns</code>,
7074
+ <code>skill</code> misses <b>252</b> ending <code>-skills</code>, <code>implement</code> misses
7075
+ 161, <code>event</code> 115, <code>error</code> 112, <code>webhook</code> 109,
7076
+ <code>agent</code> 83, <code>market</code> 81 named <code>-marketing</code>. A user searching
7077
+ this catalogue for <code>skill</code> cannot reach a quarter of a thousand items named for it.
7078
+
7079
+ <b>It is invisible from a developer install, which is why it survived.</b> This machine has the
7080
+ <code>[rag]</code> extra and a built dense store, so search reports <code>hybrid RRF (BM25 +
7081
+ dense)</code> and the embeddings absorb the morphology: <code>webhook</code> returns 51 matches
7082
+ and <code>webhooks</code> returns 47. The gap is only visible on the always-on, zero-dependency
7083
+ BM25 path — which is what every user without the extra runs, what
7084
+ <code>search</code> prints <code>semantic search is off</code> for, and what the required
7085
+ <code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
7086
+ easily reproduce a plain user's result.
7087
+
7088
+ <b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
7089
+ whole query returns zero hits — was drafted and rejected, because it does not fix the reported
7090
+ case. <code>boost chat &ldquo;what helps me brainstorm&rdquo;</code> already returns non-empty
7091
+ results from its other words, so a zero-hit trigger never fires and chat stays broken.
7092
+ Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
7093
+ term it prefixes, found by an index-backed range scan (<code>term &gt; ? AND term &lt; ?</code>,
7094
+ upper bound <code>term + "~"</code> because <code>~</code> outranks every character
7095
+ <code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
7096
+ <code>analy</code> &rarr; <code>analyze</code>). Measured after: <code>search brainstorm</code>
7097
+ returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
7098
+
7099
+ <b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
7100
+ <em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
7101
+ no posting list, so expansion can only add signal where there was exactly none — meaning any
7102
+ query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
7103
+ <code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
7104
+ <code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
7105
+ rewrites a query that already worked and fails. Nine hand-written mutants were run against the
7106
+ new lines and all nine died, including that one.
7107
+
7108
+ <b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
7109
+ inflection — a user typing <code>patterns</code> still will not reach an item named
7110
+ <code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
7111
+ Closing that means conflating terms that both exist, which changes established rankings and costs
7112
+ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.</p>
7113
+ <div class="meta">
7114
+ <span class="m">Complexity <b>M</b></span>
7115
+ <span class="m hi">Impact <b>High</b></span>
7116
+ <span class="m">Wow <b class="wow">★★★★</b></span>
7117
+ <span class="m">a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still</span>
7118
+ </div>
7119
+ </article>
7056
7120
  <!-- /ROADMAP:cards -->
7057
7121
 
7058
7122
  </div>
@@ -9009,6 +9073,92 @@ the same search from 0.94 s to 0.49 s.</p>
9009
9073
  <span class="m">MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one</span>
9010
9074
  </div>
9011
9075
  </article>
9076
+
9077
+ <article class="cap rcard" id="cli-output-ignored-the-terminal">
9078
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">CLI · Output</span></div>
9079
+ <h3>The box drew 108 columns into an 80-column pane, and <code>--help</code> never asked how wide the pane was</h3>
9080
+ <p><b>Every one of the 80 commands was run, not just read.</b> All 80 answered
9081
+ <code>--help</code> with exit 0 and no traceback; ~73 were then driven for their real effect
9082
+ against a disposable <code>HOME</code> — install, link, quarantine, focus, snapshot, replay,
9083
+ cohort, hooks and the rest, checking the filesystem after each rather than trusting the success
9084
+ line. <code>boost focus tdd-workflow</code> was confirmed by listing
9085
+ <code>~/.claude/skills</code> and finding the other two skills genuinely unlinked with the
9086
+ canonical store intact, and <code>focus --clear</code> by finding all three back. Seven commands
9087
+ could not run here and are recorded as blocked rather than passed: <code>serve</code> (the
9088
+ sandbox denies <code>socket.bind</code>), <code>discover</code> and <code>index</code> (no
9089
+ <code>gh</code> auth), <code>run</code> live (no Agents SDK — <code>--print</code> was verified
9090
+ instead), plus the interactive halves of <code>browse</code>, <code>chat</code> and
9091
+ <code>edit</code>, each of which degraded with a correct hint.
9092
+
9093
+ <b>A literal <code>%%</code> was reaching the terminal.</b>
9094
+ <code>boost cohort</code> printed <code>sha256(user:cohort) %% 100 &lt; rollout</code> and its
9095
+ <code>--help</code> epilog offered <code>a 50%% rollout</code>. Both strings carry printf
9096
+ escaping and neither is ever <code>%</code>-formatted, so the escape survived to the screen. The
9097
+ existing test asserted <code>"membership = sha256(user:cohort)" in r.out</code> — it stops one
9098
+ character short of the defect, which is exactly how it survived. Four other <code>%%</code> in
9099
+ the same file are correct: they sit inside real <code>%</code>-format calls, including the
9100
+ <code>Exec=%s %%u</code> that a <code>.desktop</code> file requires.
9101
+
9102
+ <b><code>panel()</code> sized itself to its content and never asked the terminal.</b> Measured:
9103
+ <code>boost count</code> drew <b>108 columns into an 80-column pane</b>. A box is the worst
9104
+ thing to overflow, because the border wraps and the shape itself breaks. It now clamps to
9105
+ <code>term_width() - 4</code> — the four columns the border costs — and clips over-long content,
9106
+ so every row stays the same width at any pane size.
9107
+
9108
+ <b>The help screen was the one screen that never measured the pane.</b>
9109
+ <code>search</code> already adapts, dropping the tap column and truncating at 60 columns —
9110
+ <code>term_width()</code> existed and <code>discovery.py</code> was its only caller. Meanwhile
9111
+ <code>boost --help</code>, the first thing a new user sees, emitted a fixed <b>102-column</b>
9112
+ banner at every width. It now fits exactly at 60, 80 and 100. Command <em>names</em> are never
9113
+ clipped, because the help's whole job is to be an index you can copy a command out of; summaries
9114
+ and the tagline are. The version never is — it is what a bug report needs.
9115
+
9116
+ <b>Two findings were measured and deliberately left for their own items.</b> Eleven commands
9117
+ still overflow 80 columns, but the remainder are prose hints, and the worst of them is one shared
9118
+ string that six test files and a BDD feature pin by substring — wrapping it is a cross-cutting
9119
+ output change, not a rider on this one. See <code>long-hints-overflow-narrow-panes</code> and
9120
+ <code>bm25-has-no-stemming</code>.</p>
9121
+ <div class="meta">
9122
+ <span class="m">Complexity <b>S</b></span>
9123
+ <span class="m">Impact <b>Med</b></span>
9124
+ <span class="m">Wow <b class="wow">★★★</b></span>
9125
+ <span class="m">an 80-command sweep found a box that drew wider than the pane, a help screen that never measured it, and a literal %% on screen</span>
9126
+ </div>
9127
+ </article>
9128
+
9129
+ <article class="cap rcard" id="long-hints-overflow-narrow-panes">
9130
+ <div class="head"><span class="pill next">Next</span><span class="cat">CLI · Output</span></div>
9131
+ <h3>The hints still run past the pane, and the worst one is pinned by six test files</h3>
9132
+ <p><b>Measured, at <code>COLUMNS=80</code>, over 46 commands.</b> After the box and the help screen
9133
+ were fitted, <b>11</b> still emit a line past 80 columns. Ranked:
9134
+ <code>doctor</code>'s semantic-search hint at <b>127</b>; the AI-fallback notice at <b>101</b>,
9135
+ which is one shared string surfacing in <code>explain</code>, <code>impact</code> and
9136
+ <code>simulate</code>; <code>protocol</code>'s URL forms at 100; <code>changelog</code>'s
9137
+ unshallow hint at 93; <code>who</code>'s footer at 87; <code>search</code>'s extra hint at 82;
9138
+ <code>replay</code>'s footer at 81.
9139
+
9140
+ <b>Two of the eleven must be left alone.</b> <code>pulse</code>'s <code>source=</code> paths and
9141
+ <code>fingerprint</code>'s hash are data, not chrome — clipping them destroys the information the
9142
+ line exists to carry. So a blanket "no line exceeds <code>term_width()</code>" assertion is the
9143
+ wrong gate: it would false-positive on exactly the lines that should be long. Pin the composed
9144
+ sites individually.
9145
+
9146
+ <b>Why this is not a quick wrap.</b> The 101-column offender contains
9147
+ <code>using the heuristic fallback</code>, which is asserted by <b>six</b> test files plus
9148
+ <code>tests/bdd/features/explain.feature</code>. Wrapping inserts a newline mid-sentence and
9149
+ breaks every one of them; and under pytest <code>term_width()</code> falls back to 80, so the
9150
+ wrap fires in the suite rather than only on a narrow terminal. The change is a
9151
+ <code>wrap()</code> helper in <code>core/output.py</code> — mutation-gated, so boundary-width
9152
+ tests, not coverage — plus re-pinning those assertions. Shortening the strings instead is a
9153
+ smaller diff but a voice decision, and the substring pinned by the tests would have to survive
9154
+ either way.</p>
9155
+ <div class="meta">
9156
+ <span class="m">Complexity <b>M</b></span>
9157
+ <span class="m">Impact <b>Low</b></span>
9158
+ <span class="m">Wow <b class="wow">★★</b></span>
9159
+ <span class="m">11 commands still emit prose hints past 80 columns; the worst is one string pinned by six test files</span>
9160
+ </div>
9161
+ </article>
9012
9162
  <!-- /ROADMAP:cards -->
9013
9163
 
9014
9164
  </div>