boost-skill-cli 1.0.347__tar.gz → 1.0.349__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 (592) hide show
  1. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/chat.py +106 -16
  4. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +15 -0
  6. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +41 -2
  7. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap.html +57 -4
  8. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_chat.py +81 -0
  9. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.gitattributes +0 -0
  10. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.gitignore +0 -0
  11. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.gitleaks.toml +0 -0
  12. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.htmlvalidate.json +0 -0
  13. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.lighthouserc.json +0 -0
  14. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.lycheeignore +0 -0
  15. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.markdownlint-cli2.jsonc +0 -0
  16. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.pre-commit-config.yaml +0 -0
  17. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.stylelintrc.json +0 -0
  18. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.vale/styles/boost/Terminology.yml +0 -0
  19. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  20. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.vale.ini +0 -0
  21. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/CLAUDE.md +0 -0
  22. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/CODE_OF_CONDUCT.md +0 -0
  23. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/CONTRIBUTING.md +0 -0
  24. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/LICENSE +0 -0
  25. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/MANIFEST.in +0 -0
  26. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/Makefile +0 -0
  27. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/README.md +0 -0
  28. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/SECURITY.md +0 -0
  29. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost +0 -0
  30. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/__init__.py +0 -0
  31. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/__main__.py +0 -0
  32. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/cli.py +0 -0
  33. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/cliparse.py +0 -0
  34. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/__init__.py +0 -0
  35. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/_common.py +0 -0
  36. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/bmad.py +0 -0
  37. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/configuration.py +0 -0
  38. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/discovery.py +0 -0
  39. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/hooks.py +0 -0
  40. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/info.py +0 -0
  41. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/intelligence.py +0 -0
  42. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/pkg.py +0 -0
  43. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/quality.py +0 -0
  44. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/run.py +0 -0
  45. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/safety.py +0 -0
  46. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/taps.py +0 -0
  47. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/team.py +0 -0
  48. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/__init__.py +0 -0
  49. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/adapters.py +0 -0
  50. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/agents.py +0 -0
  51. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/ai.py +0 -0
  52. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/capabilities.py +0 -0
  53. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/catalog.py +0 -0
  54. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/claude_settings.py +0 -0
  55. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/config.py +0 -0
  56. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/dense.py +0 -0
  57. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/ed25519.py +0 -0
  58. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/embed.py +0 -0
  59. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/faithfulness.py +0 -0
  60. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/frontmatter.py +0 -0
  61. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/gitutil.py +0 -0
  62. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/imperative.py +0 -0
  63. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/injectscan.py +0 -0
  64. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/installscan.py +0 -0
  65. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/integrity.py +0 -0
  66. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/journal.py +0 -0
  67. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/localembed.py +0 -0
  68. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/lockfile.py +0 -0
  69. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/logs.py +0 -0
  70. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/mcp.py +0 -0
  71. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/mcpdecl.py +0 -0
  72. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/mcphost.py +0 -0
  73. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/minisign.py +0 -0
  74. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/nethttp.py +0 -0
  75. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/output.py +0 -0
  76. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/paths.py +0 -0
  77. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/policy.py +0 -0
  78. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/projectlock.py +0 -0
  79. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/provenance.py +0 -0
  80. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/rag.py +0 -0
  81. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/registry.py +0 -0
  82. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/resolve.py +0 -0
  83. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/rules.py +0 -0
  84. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/scopes.py +0 -0
  85. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/secretscan.py +0 -0
  86. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/selfupdate.py +0 -0
  87. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/serve.py +0 -0
  88. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/stackprobe.py +0 -0
  89. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/staleness.py +0 -0
  90. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/store.py +0 -0
  91. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/trustaudit.py +0 -0
  92. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/typosquat.py +0 -0
  93. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/updatediff.py +0 -0
  94. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/util.py +0 -0
  95. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/workflows.py +0 -0
  96. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/data/registries.json +0 -0
  97. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/errors.py +0 -0
  98. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/spin.py +0 -0
  99. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  100. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  101. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  102. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/requires.txt +0 -0
  103. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/top_level.txt +0 -0
  104. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/codecov.yml +0 -0
  105. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/.claude/settings.local.json +0 -0
  106. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/DEBUGGING.md +0 -0
  107. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/adapters.html +0 -0
  108. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/README.md +0 -0
  109. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-components-core.md +0 -0
  110. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-containers.md +0 -0
  111. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-context.md +0 -0
  112. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-dynamic-install.md +0 -0
  113. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/distill.gif +0 -0
  114. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/doctor.gif +0 -0
  115. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/explain.gif +0 -0
  116. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/hooks.gif +0 -0
  117. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/install.gif +0 -0
  118. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/pulse.gif +0 -0
  119. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/search.gif +0 -0
  120. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/tap.gif +0 -0
  121. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/distill.tape +0 -0
  122. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/doctor.tape +0 -0
  123. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/explain.tape +0 -0
  124. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/hooks.tape +0 -0
  125. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/install.tape +0 -0
  126. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/pulse.tape +0 -0
  127. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/search.tape +0 -0
  128. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/tap.tape +0 -0
  129. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel.html +0 -0
  130. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/chat.html +0 -0
  131. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/commands.html +0 -0
  132. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo-index.json +0 -0
  133. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo.gif +0 -0
  134. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo.html +0 -0
  135. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo.tape +0 -0
  136. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/design-roadmap.html +0 -0
  137. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/eval.html +0 -0
  138. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/index.html +0 -0
  139. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/mcp-hub.html +0 -0
  140. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/rag-architecture.md +0 -0
  141. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D01.md +0 -0
  142. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D02.md +0 -0
  143. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D03.md +0 -0
  144. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D04.md +0 -0
  145. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D05.md +0 -0
  146. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D06.md +0 -0
  147. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D07.md +0 -0
  148. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D08.md +0 -0
  149. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D09.md +0 -0
  150. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D10.md +0 -0
  151. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D11.md +0 -0
  152. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D12.md +0 -0
  153. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D13.md +0 -0
  154. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D14.md +0 -0
  155. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D15.md +0 -0
  156. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D16.md +0 -0
  157. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D17.md +0 -0
  158. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D18.md +0 -0
  159. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D19.md +0 -0
  160. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D20.md +0 -0
  161. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D21.md +0 -0
  162. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D22.md +0 -0
  163. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D23.md +0 -0
  164. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D24.md +0 -0
  165. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D25.md +0 -0
  166. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D26.md +0 -0
  167. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  168. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  169. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  170. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  171. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  172. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  173. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  174. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  175. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  176. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  177. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  178. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  179. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  180. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  181. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  182. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  183. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  184. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  185. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  186. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  187. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  188. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  189. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  190. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  191. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/command-carousel-page.md +0 -0
  192. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  193. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  194. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  195. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  196. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  197. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  198. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  199. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  200. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  201. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  202. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  203. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  204. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  205. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  206. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  207. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  208. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  209. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  210. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  211. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  212. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  213. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  214. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  215. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  216. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  217. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  218. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  219. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  220. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  221. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/github-community-health-files.md +0 -0
  222. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  223. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  224. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  225. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  226. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  227. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  228. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  229. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  230. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  231. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  232. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  233. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  234. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  235. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  236. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  237. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  238. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  239. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  240. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  241. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  242. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  243. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  244. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  245. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  246. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  247. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  248. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  249. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  250. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  251. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  252. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  253. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  254. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  255. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  256. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  257. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  258. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  259. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  260. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  261. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  262. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  263. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  264. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  265. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  266. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  267. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  268. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  269. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  270. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  271. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  272. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  273. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  274. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  275. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  276. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  277. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  278. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  279. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  280. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  281. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  282. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  283. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  284. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  285. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  286. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  287. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  288. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  289. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  290. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  291. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  292. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  293. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  294. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  295. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  296. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  297. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  298. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  299. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  300. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  301. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  302. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  303. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  304. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  305. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  306. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  307. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  308. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  309. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  310. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  311. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  312. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  313. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  314. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  315. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  316. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  317. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  318. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  319. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  320. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  321. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  322. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  323. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  324. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  325. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  326. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  327. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  328. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  329. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  330. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  331. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  332. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  333. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  334. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  335. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  336. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  337. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  338. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  339. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  340. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  341. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  342. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  343. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  344. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  345. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  346. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  347. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  348. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  349. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  350. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  351. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  352. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  353. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  354. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  355. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  356. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  357. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workspace-scope-install.md +0 -0
  358. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  359. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/eslint.config.mjs +0 -0
  360. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/README.md +0 -0
  361. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/__init__.py +0 -0
  362. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/baseline.json +0 -0
  363. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/faithfulness.py +0 -0
  364. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/golden_set.json +0 -0
  365. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/make_corpus.py +0 -0
  366. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/make_golden.py +0 -0
  367. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/metrics.py +0 -0
  368. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/run_evals.py +0 -0
  369. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/examples/README.md +0 -0
  370. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/examples/adapt-demo.sh +0 -0
  371. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/examples/boost-run-prototype.sh +0 -0
  372. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/index.html +0 -0
  373. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/noxfile.py +0 -0
  374. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/pyproject.toml +0 -0
  375. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/coverage-tools.in +0 -0
  376. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/coverage-tools.txt +0 -0
  377. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/lint-tools.in +0 -0
  378. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/lint-tools.txt +0 -0
  379. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/mutation-tools.in +0 -0
  380. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/mutation-tools.txt +0 -0
  381. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/platform-pins.lock +0 -0
  382. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/release-tools.in +0 -0
  383. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/release-tools.txt +0 -0
  384. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/test-tools.in +0 -0
  385. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/test-tools.txt +0 -0
  386. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/a11y_check.py +0 -0
  387. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/bench_cli.sh +0 -0
  388. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_command_reference.py +0 -0
  389. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_demo_index.py +0 -0
  390. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_registries.py +0 -0
  391. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_roadmap.py +0 -0
  392. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/check_anchors.py +0 -0
  393. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/check_licenses.py +0 -0
  394. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/check_required_checks.py +0 -0
  395. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/ensure_eval_corpus.sh +0 -0
  396. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_explain.py +0 -0
  397. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_gate.py +0 -0
  398. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_recommend.py +0 -0
  399. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_retrieval.py +0 -0
  400. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_stats_summary.py +0 -0
  401. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/import_budget.py +0 -0
  402. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/lock_toolchain.py +0 -0
  403. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/mutation_gate.py +0 -0
  404. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/mutation_shards.py +0 -0
  405. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/mutation_weights.json +0 -0
  406. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/perf_gate.py +0 -0
  407. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/post_deploy_smoke.py +0 -0
  408. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/release_guard.py +0 -0
  409. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/release_preflight.py +0 -0
  410. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/setup.cfg +0 -0
  411. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/sonar-project.properties +0 -0
  412. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/README.md +0 -0
  413. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/boost.css +0 -0
  414. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/boost.js +0 -0
  415. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/demo.html +0 -0
  416. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/adapt.feature +0 -0
  417. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/browse.feature +0 -0
  418. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/count.feature +0 -0
  419. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/discover.feature +0 -0
  420. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/doctor.feature +0 -0
  421. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/environment.py +0 -0
  422. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/explain.feature +0 -0
  423. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/index.feature +0 -0
  424. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/install.feature +0 -0
  425. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/list.feature +0 -0
  426. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/mcp.feature +0 -0
  427. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/search.feature +0 -0
  428. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/cli_steps.py +0 -0
  429. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/discovery_steps.py +0 -0
  430. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/mcp_steps.py +0 -0
  431. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/quality_steps.py +0 -0
  432. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/conftest.py +0 -0
  433. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/baseline.json +0 -0
  434. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/explain.jsonl +0 -0
  435. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/golden-natural.jsonl +0 -0
  436. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/golden.jsonl +0 -0
  437. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/recommend.jsonl +0 -0
  438. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/taps.txt +0 -0
  439. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_capabilities_policy.py +0 -0
  440. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_adapt.py +0 -0
  441. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_bmad.py +0 -0
  442. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_chat.py +0 -0
  443. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_configuration.py +0 -0
  444. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_discovery.py +0 -0
  445. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_hooks.py +0 -0
  446. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_info.py +0 -0
  447. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_intelligence.py +0 -0
  448. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_pkg.py +0 -0
  449. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_quality.py +0 -0
  450. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_taps.py +0 -0
  451. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_team.py +0 -0
  452. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_everyday_loop.py +0 -0
  453. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_integrity_enforce.py +0 -0
  454. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_property_parsers.py +0 -0
  455. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_run.py +0 -0
  456. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_tap_signing.py +0 -0
  457. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_workspace_scope.py +0 -0
  458. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/README.md +0 -0
  459. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  460. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  461. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  462. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  463. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  464. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  465. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  466. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  467. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  468. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  469. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  470. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  471. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  472. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  473. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  474. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  475. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  476. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  477. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  478. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  479. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/fuzz_frontmatter.py +0 -0
  480. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/fuzz_registry.py +0 -0
  481. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/make_fixture.py +0 -0
  482. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/perf/test_benchmarks.py +0 -0
  483. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/smoke.sh +0 -0
  484. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_a11y_check.py +0 -0
  485. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_adapters.py +0 -0
  486. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_adapters_multi.py +0 -0
  487. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_adapters_runner.py +0 -0
  488. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_agents.py +0 -0
  489. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_ai.py +0 -0
  490. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_capabilities.py +0 -0
  491. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_catalog.py +0 -0
  492. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_check_anchors.py +0 -0
  493. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_check_licenses.py +0 -0
  494. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_claude_settings.py +0 -0
  495. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_cliparse.py +0 -0
  496. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_codeql_analysis_key.py +0 -0
  497. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_command_reference_fresh.py +0 -0
  498. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_community_health_files.py +0 -0
  499. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_config.py +0 -0
  500. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_content_dedupe.py +0 -0
  501. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dedup_trust.py +0 -0
  502. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_demo_index.py +0 -0
  503. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense.py +0 -0
  504. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_fallback.py +0 -0
  505. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_fix_hint.py +0 -0
  506. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_shards.py +0 -0
  507. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_status.py +0 -0
  508. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dependabot_config.py +0 -0
  509. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_docs_pages_linked.py +0 -0
  510. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_docsite_chrome.py +0 -0
  511. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_ed25519.py +0 -0
  512. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_embed.py +0 -0
  513. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_embed_local.py +0 -0
  514. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_entry_key.py +0 -0
  515. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_errors_and_cli_table.py +0 -0
  516. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_baseline.py +0 -0
  517. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_faithfulness.py +0 -0
  518. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_gate.py +0 -0
  519. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_metrics.py +0 -0
  520. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_stats_summary.py +0 -0
  521. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_faithfulness.py +0 -0
  522. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_frontmatter.py +0 -0
  523. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_fuzz_targets.py +0 -0
  524. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_gitleaks_config.py +0 -0
  525. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_gitutil.py +0 -0
  526. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_imperative.py +0 -0
  527. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_import_budget.py +0 -0
  528. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_injectscan.py +0 -0
  529. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_installscan.py +0 -0
  530. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_integrity.py +0 -0
  531. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_journal.py +0 -0
  532. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_localembed.py +0 -0
  533. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_localembed_e2e.py +0 -0
  534. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_lockfile.py +0 -0
  535. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_logs.py +0 -0
  536. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_marketing_counts.py +0 -0
  537. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcp.py +0 -0
  538. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcp_install_scan.py +0 -0
  539. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcpdecl.py +0 -0
  540. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcphost.py +0 -0
  541. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_minisign.py +0 -0
  542. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutation_hardening.py +0 -0
  543. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutation_shards.py +0 -0
  544. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutation_subfile_shards.py +0 -0
  545. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutmut_source_paths.py +0 -0
  546. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_nethttp.py +0 -0
  547. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_output.py +0 -0
  548. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_paths.py +0 -0
  549. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_perf_gate.py +0 -0
  550. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_pkg_confusions.py +0 -0
  551. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_pkg_injection.py +0 -0
  552. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_pkg_secrets.py +0 -0
  553. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_platform_pins.py +0 -0
  554. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_policy.py +0 -0
  555. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_post_deploy_smoke.py +0 -0
  556. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_project_mcp_sidecar.py +0 -0
  557. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_projectlock.py +0 -0
  558. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_provenance.py +0 -0
  559. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_rag.py +0 -0
  560. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_rag_fusion.py +0 -0
  561. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_registries_fresh.py +0 -0
  562. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_registry.py +0 -0
  563. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_registry_categories.py +0 -0
  564. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_release_guard.py +0 -0
  565. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_release_preflight.py +0 -0
  566. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_required_checks.py +0 -0
  567. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_resolve.py +0 -0
  568. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_roadmap_fresh.py +0 -0
  569. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_rules.py +0 -0
  570. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_scopes.py +0 -0
  571. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_secretscan.py +0 -0
  572. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_selfupdate.py +0 -0
  573. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_serve.py +0 -0
  574. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_spin.py +0 -0
  575. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_stackprobe.py +0 -0
  576. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_staleness.py +0 -0
  577. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_store.py +0 -0
  578. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_token_parity.py +0 -0
  579. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_toolchain_lock.py +0 -0
  580. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_trustaudit.py +0 -0
  581. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_typosquat.py +0 -0
  582. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_updatediff.py +0 -0
  583. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_util.py +0 -0
  584. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_version.py +0 -0
  585. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_workflow_concurrency.py +0 -0
  586. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_workflow_timeouts.py +0 -0
  587. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_workflows.py +0 -0
  588. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/a11y_check.mjs +0 -0
  589. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/console_check.mjs +0 -0
  590. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/package-lock.json +0 -0
  591. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/package.json +0 -0
  592. {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.347
3
+ Version: 1.0.349
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.347'
22
- __version_tuple__ = version_tuple = (1, 0, 347)
21
+ __version__ = version = '1.0.349'
22
+ __version_tuple__ = version_tuple = (1, 0, 349)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -52,6 +52,18 @@ MIN_FAITHFULNESS = 0.60
52
52
  # conversation instead of from what retrieval actually returned.
53
53
  HISTORY_TURNS = 4
54
54
 
55
+ # A catalogue-name shape: lowercase, hyphenated, e.g. `code-reviewer`.
56
+ _NAME = r"[a-z][a-z0-9]*(?:-[a-z0-9]+)+"
57
+ _TOKEN = re.compile(r"\b%s\b" % _NAME)
58
+
59
+ # Emphasis around a name-shaped token: `x`, **x**, *x*.
60
+ _EMPHASISED = re.compile(r"`(%(n)s)`|\*\*(%(n)s)\*\*|\*(%(n)s)\*" % {"n": _NAME}, re.IGNORECASE)
61
+
62
+ # Verbs that introduce a recommendation. What follows one is a claim about what
63
+ # to install, which is the phrasing a reader acts on.
64
+ _RECOMMENDS = re.compile(
65
+ r"\b(?:use|using|install|try|run|pick|choose|recommends?)\b", re.IGNORECASE)
66
+
55
67
  _SYSTEM = (
56
68
  "You help a developer pick an AI coding-agent skill from a catalogue. "
57
69
  "Answer ONLY from the numbered skills provided. Never invent a skill name. "
@@ -132,10 +144,36 @@ def retrieve(question: str, history: Sequence[Turn] = (),
132
144
  return [h["entry"] for h in hits[:k]], engine
133
145
 
134
146
 
147
+ # Catalogue descriptions are untrusted upstream text and some are enormous:
148
+ # measured over a real 71,655-entry catalogue, 22.7% exceed 300 characters and
149
+ # the longest is 5,771. One entry rendered as a screenful of embedded
150
+ # `<example>` blocks — a correct answer nobody could read.
151
+ DESC_CHARS = 200
152
+
153
+
154
+ def _one_line(text: str) -> str:
155
+ """Collapse a description to a single line of plain text.
156
+
157
+ Handles real newlines *and* the literal two-character ``\\n`` that 635
158
+ entries carry from double-escaped upstream frontmatter — those reach a
159
+ terminal as visible backslash-n noise rather than as line breaks.
160
+ """
161
+ return " ".join(text.replace("\\n", " ").replace("\\t", " ").split())
162
+
163
+
135
164
  def _describe(entry: dict) -> str:
136
- """One catalogue entry as a line of prompt/answer text."""
165
+ """One catalogue entry as a line of prompt/answer text.
166
+
167
+ Truncation is marked with an ellipsis rather than silent: the reader needs
168
+ to know there is more to the description before deciding, and `boost info
169
+ <name>` is where the full text lives.
170
+ """
171
+ desc = _one_line(entry.get("description") or "")
172
+ if len(desc) > DESC_CHARS:
173
+ # Cut on a word boundary so the tail is not a severed token.
174
+ desc = desc[:DESC_CHARS].rsplit(" ", 1)[0] + " …"
137
175
  return "%s (%s) — %s" % (entry.get("name", "?"), entry.get("tap", "?"),
138
- (entry.get("description") or "").strip() or "no description")
176
+ desc or "no description")
139
177
 
140
178
 
141
179
  def source_text(entries: Sequence[dict]) -> str:
@@ -143,22 +181,74 @@ def source_text(entries: Sequence[dict]) -> str:
143
181
  return "\n".join("%d. %s" % (i, _describe(e)) for i, e in enumerate(entries, 1))
144
182
 
145
183
 
146
- def ungrounded_names(reply: str, entries: Sequence[dict]) -> List[str]:
147
- """Skill-shaped tokens in ``reply`` that name nothing in ``entries``.
184
+ def grounding_text(entries: Sequence[dict]) -> str:
185
+ """The text a reply is checked against — untruncated, unlike the prompt.
186
+
187
+ These must be different strings. The prompt is trimmed to keep an answer
188
+ readable, but checking a reply against the *trimmed* text would score a
189
+ faithful sentence as unfaithful purely because its evidence fell past
190
+ :data:`DESC_CHARS` — the truncation would manufacture the very failure the
191
+ check exists to detect.
192
+ """
193
+ return "\n".join(
194
+ "%s %s" % (e.get("name", ""), _one_line(e.get("description") or ""))
195
+ for e in entries)
196
+
197
+
198
+ def claimed_names(reply: str) -> set:
199
+ """Name-shaped tokens the reply presents *as skills to install*.
200
+
201
+ Not every hyphenated word is a claim. Descriptions in this catalogue are
202
+ thick with ordinary compounds — "read-only", "multi-agent", "single-pass",
203
+ "security-focused" — and treating each as a possible fabricated skill name
204
+ rejected essentially every real answer (reported from live use). The harm
205
+ this guards against is specific: a reader acting on a recommendation and
206
+ hunting for a package that does not exist. So a token counts as claimed when
207
+ it is emphasised, or when it sits in the clause a recommending verb
208
+ introduces — "try code-reviewer or docker-compose-expert" claims both.
209
+
210
+ Scanning the whole clause rather than just the next word is what catches the
211
+ second item in a list, which is exactly where an invention tends to hide.
212
+ Prose that merely *describes* ("a read-only multi-agent review") claims
213
+ nothing and is left to :func:`faithfulness.score`, the second gate.
214
+ """
215
+ out = {next(g for g in m.groups() if g).lower()
216
+ for m in _EMPHASISED.finditer(reply)}
217
+ for verb in _RECOMMENDS.finditer(reply):
218
+ # Stop at the sentence end: a later sentence is a new statement, not
219
+ # part of this recommendation.
220
+ clause = re.split(r"[.;!?\n]", reply[verb.end():], maxsplit=1)[0]
221
+ out |= {t.lower() for t in _TOKEN.findall(clause)}
222
+ return out
148
223
 
149
- Catalogue names are lowercase hyphenated words (``code-reviewer``,
150
- ``pdf``), which is a distinctive enough shape to spot in prose. Anything
151
- matching that shape and not present in the candidate set is a name the model
152
- supplied itself — the exact failure that sends a user hunting for a skill
153
- that does not exist.
154
224
 
155
- Deliberately narrow: it only flags *hyphenated* tokens. A single ordinary
156
- word cannot be told apart from prose, so this under-reports rather than
157
- firing on innocent sentences, and the faithfulness score covers the rest.
225
+ def ungrounded_names(reply: str, entries: Sequence[dict]) -> List[str]:
226
+ """Skill-shaped tokens in ``reply`` that appear nowhere in ``entries``.
227
+
228
+ Catalogue names are lowercase hyphenated words (``code-reviewer``), which is
229
+ a distinctive enough shape to spot in prose. A token of that shape that
230
+ appears in neither the retrieved names nor the retrieved *text* is one the
231
+ model supplied itself — the failure that sends a user hunting for a skill
232
+ which does not exist, or toward a typosquat (see ``core/typosquat.py``).
233
+
234
+ THE SOURCES GROUND THE REPLY, NOT JUST THE NAMES. An earlier version checked
235
+ only against the name list, so ordinary hyphenated English quoted straight
236
+ out of a description — "read-only", "multi-agent", "pre-deployment" — scored
237
+ as fabricated. In this catalogue those compounds are everywhere, so a
238
+ faithful reply was rejected almost every time and the AI path silently
239
+ degraded to extractive for nearly every real query. Reported from live use.
240
+
241
+ Deliberately narrow in the other direction too: it only flags *hyphenated*
242
+ tokens, because a single ordinary word cannot be told apart from prose. This
243
+ under-reports rather than firing on innocent sentences, and
244
+ :func:`faithfulness.score` covers the rest.
158
245
  """
159
- known = {str(e.get("name", "")).lower() for e in entries}
160
- candidates = set(re.findall(r"\b[a-z][a-z0-9]*(?:-[a-z0-9]+)+\b", reply.lower()))
161
- return sorted(c for c in candidates if c not in known)
246
+ # Whole tokens, not a substring scan. `x in "…"` would treat an invented
247
+ # `code-review` as grounded because `code-reviewer` contains it — precisely
248
+ # the near-miss shape a typosquat has.
249
+ grounded = set(_TOKEN.findall(grounding_text(entries).lower()))
250
+ grounded |= {str(e.get("name", "")).lower() for e in entries}
251
+ return sorted(c for c in claimed_names(reply) if c not in grounded)
162
252
 
163
253
 
164
254
  def _extractive(question: str, entries: Sequence[dict]) -> str:
@@ -208,7 +298,7 @@ def answer(question: str, history: Sequence[Turn] = (),
208
298
  # A manufactured name is unrecoverable — there is no honest way to show
209
299
  # prose that points at a skill which does not exist.
210
300
  return Reply(extractive, entries.copy(), engine, "extractive", False)
211
- if faithfulness.score(reply, source) < MIN_FAITHFULNESS:
301
+ if faithfulness.score(reply, grounding_text(entries)) < MIN_FAITHFULNESS:
212
302
  return Reply(extractive, entries.copy(), engine, "extractive", False)
213
303
  return Reply(reply, entries.copy(), engine, "ai", True)
214
304
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.347
3
+ Version: 1.0.349
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -72,3 +72,18 @@ Nothing in the tree needed changing. Recording it as shipped rather than deletin
72
72
  card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
73
73
  <code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
74
74
  could fix a repository-level setting is what stopped that from being a long false lead.
75
+
76
+ <b>Update &mdash; the repository setting this card called immovable has been turned on.</b> The API
77
+ now reports <code>can_approve_pull_request_reviews: <b>true</b></code>, <code>demo.yml</code>
78
+ succeeds on every push to <code>main</code>, and it has opened real pull requests as
79
+ <code>github-actions[bot]</code> (<code>#353</code>, <code>#394</code>). So the coupled item
80
+ [[scheduled-toolchain-lock-regeneration]] was unblocked too, and shipped on the strength of it.
81
+
82
+ <b>What did not change is the check-run consequence</b>, which is worth keeping on the record
83
+ because it is invisible: a PR opened this way lands with <b>zero</b> check runs, since
84
+ <code>create-pull-request</code> pushes with <code>GITHUB_TOKEN</code> and a
85
+ <code>GITHUB_TOKEN</code> push never triggers workflows. Measured on both bot PRs &mdash;
86
+ <code>ffc07b0</code> and <code>a9da922</code> each had 0, and the same commits had 27 after an
87
+ <i>Update branch</i>. An empty check list is indistinguishable from "CI has not started yet", so a
88
+ bot PR can look ready to merge while nothing has run.
89
+
@@ -2,12 +2,12 @@
2
2
  id: scheduled-toolchain-lock-regeneration
3
3
  board: code
4
4
  section: internals
5
- status: planned
5
+ status: shipped
6
6
  category: Build · Gap
7
7
  complexity: M
8
8
  impact: Med
9
9
  wow: 2
10
- note: the toolchain lock now has no proactive update path — by choice, but nothing replaces it yet
10
+ note: the blocker this card recorded had already been lifted — re-checked, not assumed
11
11
  order: 36
12
12
  owner:
13
13
  pr:
@@ -87,3 +87,42 @@ when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runn
87
87
  untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
88
88
  The value of this note is that the next person picking it up starts from &ldquo;build it&rdquo;
89
89
  rather than from &ldquo;it cannot be built&rdquo;.
90
+
91
+ <b>Shipped as <code>.github/workflows/lock-refresh.yml</code>, and the first thing that had to be
92
+ re-checked was this card's own blocker.</b> It states the work is blocked because
93
+ Actions&nbsp;&rarr;&nbsp;Workflow permissions forbids creating pull requests, citing
94
+ <code>can_approve_pull_request_reviews: false</code>. That is no longer true: the API now returns
95
+ <b><code>true</code></b>, <code>demo.yml</code> succeeds on every push to <code>main</code>, and it
96
+ opened <code>#353</code> and <code>#394</code> as <code>github-actions[bot]</code>. A blocker
97
+ recorded once is a claim with an expiry date; this one had quietly lapsed, and the card would have
98
+ kept the item shelved indefinitely.
99
+
100
+ <b>One PR for all five groups &mdash; a deliberate departure from what this card proposed.</b> The
101
+ card suggested per-group jobs so a bump stays reviewable. Two things measured while building it
102
+ argue the other way. <code>lock_toolchain.py</code> has <b>no per-group flag</b>
103
+ (<code>--upgrade</code> always re-resolves all five), so a five-job matrix would run the same
104
+ resolution five times and commit one file from each. And a PR opened this way arrives with
105
+ <b>zero check runs</b> &mdash; <code>create-pull-request</code> pushes with
106
+ <code>GITHUB_TOKEN</code>, which never triggers workflows &mdash; so every one of them costs a human
107
+ a manual <i>Update branch</i> before CI reports at all. Five PRs a month is five full CI runs and
108
+ five manual unblocks to review what is usually a list of version bumps. Reviewability is bought
109
+ instead with a <b>monthly</b> cadence and a per-group diffstat in the PR body.
110
+
111
+ <b>The other three constraints this card named were met as written.</b> <code>uv</code> and the
112
+ network are provisioned the same way <code>ci.yml</code> does it (<code>pip install uv</code>, then
113
+ the script). <code>--audit</code> runs as its own invocation, because the script refuses it
114
+ alongside <code>--upgrade</code> &mdash; auditing a file mid-replacement reads the old bytes &mdash;
115
+ and a failure there means no PR is opened. Every <code>uses:</code> is pinned to the same peeled
116
+ SHAs the repo already uses, permissions are <code>contents: read</code> at the top with the two
117
+ writes scoped to the one job, and no <code>merge_group:</code> trigger is needed because this is not
118
+ a required context (<code>check_required_checks.py</code> passes).
119
+
120
+ <b>Verified before pushing:</b> the workflow parses, and <code>zizmor</code> reports <b>no
121
+ findings</b>. That clean result was itself checked rather than trusted &mdash; re-running the
122
+ scanner against a copy with <code>${{ github.event.head_commit.message }}</code> spliced into a
123
+ <code>run:</code> block produces a high-severity <code>template-injection</code>, so the scanner is
124
+ genuinely reading this file. That check exists because an earlier workflow in this repo
125
+ (<code>shards.yml</code>) shipped exactly that hole.
126
+
127
+ <b>Unproven until it runs:</b> the first scheduled execution is the first end-to-end exercise.
128
+
@@ -1806,8 +1806,9 @@ validator that rejects values below 1; reuse it here.</p></details>
1806
1806
  </article>
1807
1807
 
1808
1808
  <article class="cap rcard" id="scheduled-toolchain-lock-regeneration">
1809
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Build · Gap</span></div>
1809
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Build · Gap</span></div>
1810
1810
  <h3>The toolchain lock has no proactive update path any more</h3>
1811
+ <details class="cardbody"><summary>Write-up</summary>
1811
1812
  <p><code>#342</code> set <code>open-pull-requests-limit: 0</code> on the <code>/requirements</code>
1812
1813
  Dependabot entry, because Dependabot cannot regenerate a hash-pinned universal lock without dropping
1813
1814
  the pins whose environment markers exclude them on the resolving platform (see
@@ -1881,12 +1882,50 @@ Deliberately left unimplemented here. It needs a real decision about cadence and
1881
1882
  when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runner, and shipping an
1882
1883
  untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
1883
1884
  The value of this note is that the next person picking it up starts from &ldquo;build it&rdquo;
1884
- rather than from &ldquo;it cannot be built&rdquo;.</p>
1885
+ rather than from &ldquo;it cannot be built&rdquo;.
1886
+
1887
+ <b>Shipped as <code>.github/workflows/lock-refresh.yml</code>, and the first thing that had to be
1888
+ re-checked was this card's own blocker.</b> It states the work is blocked because
1889
+ Actions&nbsp;&rarr;&nbsp;Workflow permissions forbids creating pull requests, citing
1890
+ <code>can_approve_pull_request_reviews: false</code>. That is no longer true: the API now returns
1891
+ <b><code>true</code></b>, <code>demo.yml</code> succeeds on every push to <code>main</code>, and it
1892
+ opened <code>#353</code> and <code>#394</code> as <code>github-actions[bot]</code>. A blocker
1893
+ recorded once is a claim with an expiry date; this one had quietly lapsed, and the card would have
1894
+ kept the item shelved indefinitely.
1895
+
1896
+ <b>One PR for all five groups &mdash; a deliberate departure from what this card proposed.</b> The
1897
+ card suggested per-group jobs so a bump stays reviewable. Two things measured while building it
1898
+ argue the other way. <code>lock_toolchain.py</code> has <b>no per-group flag</b>
1899
+ (<code>--upgrade</code> always re-resolves all five), so a five-job matrix would run the same
1900
+ resolution five times and commit one file from each. And a PR opened this way arrives with
1901
+ <b>zero check runs</b> &mdash; <code>create-pull-request</code> pushes with
1902
+ <code>GITHUB_TOKEN</code>, which never triggers workflows &mdash; so every one of them costs a human
1903
+ a manual <i>Update branch</i> before CI reports at all. Five PRs a month is five full CI runs and
1904
+ five manual unblocks to review what is usually a list of version bumps. Reviewability is bought
1905
+ instead with a <b>monthly</b> cadence and a per-group diffstat in the PR body.
1906
+
1907
+ <b>The other three constraints this card named were met as written.</b> <code>uv</code> and the
1908
+ network are provisioned the same way <code>ci.yml</code> does it (<code>pip install uv</code>, then
1909
+ the script). <code>--audit</code> runs as its own invocation, because the script refuses it
1910
+ alongside <code>--upgrade</code> &mdash; auditing a file mid-replacement reads the old bytes &mdash;
1911
+ and a failure there means no PR is opened. Every <code>uses:</code> is pinned to the same peeled
1912
+ SHAs the repo already uses, permissions are <code>contents: read</code> at the top with the two
1913
+ writes scoped to the one job, and no <code>merge_group:</code> trigger is needed because this is not
1914
+ a required context (<code>check_required_checks.py</code> passes).
1915
+
1916
+ <b>Verified before pushing:</b> the workflow parses, and <code>zizmor</code> reports <b>no
1917
+ findings</b>. That clean result was itself checked rather than trusted &mdash; re-running the
1918
+ scanner against a copy with <code>${{ github.event.head_commit.message }}</code> spliced into a
1919
+ <code>run:</code> block produces a high-severity <code>template-injection</code>, so the scanner is
1920
+ genuinely reading this file. That check exists because an earlier workflow in this repo
1921
+ (<code>shards.yml</code>) shipped exactly that hole.
1922
+
1923
+ <b>Unproven until it runs:</b> the first scheduled execution is the first end-to-end exercise.</p></details>
1885
1924
  <div class="meta">
1886
1925
  <span class="m">Complexity <b>M</b></span>
1887
1926
  <span class="m">Impact <b>Med</b></span>
1888
1927
  <span class="m">Wow <b class="wow">★★</b></span>
1889
- <span class="m">the toolchain lock now has no proactive update path — by choice, but nothing replaces it yet</span>
1928
+ <span class="m">the blocker this card recorded had already been lifted — re-checked, not assumed</span>
1890
1929
  </div>
1891
1930
  </article>
1892
1931
 
@@ -3713,7 +3752,21 @@ this card says is impossible.
3713
3752
  Nothing in the tree needed changing. Recording it as shipped rather than deleting it, because the
3714
3753
  card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
3715
3754
  <code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
3716
- could fix a repository-level setting is what stopped that from being a long false lead.</p></details>
3755
+ could fix a repository-level setting is what stopped that from being a long false lead.
3756
+
3757
+ <b>Update &mdash; the repository setting this card called immovable has been turned on.</b> The API
3758
+ now reports <code>can_approve_pull_request_reviews: <b>true</b></code>, <code>demo.yml</code>
3759
+ succeeds on every push to <code>main</code>, and it has opened real pull requests as
3760
+ <code>github-actions[bot]</code> (<code>#353</code>, <code>#394</code>). So the coupled item
3761
+ [[scheduled-toolchain-lock-regeneration]] was unblocked too, and shipped on the strength of it.
3762
+
3763
+ <b>What did not change is the check-run consequence</b>, which is worth keeping on the record
3764
+ because it is invisible: a PR opened this way lands with <b>zero</b> check runs, since
3765
+ <code>create-pull-request</code> pushes with <code>GITHUB_TOKEN</code> and a
3766
+ <code>GITHUB_TOKEN</code> push never triggers workflows. Measured on both bot PRs &mdash;
3767
+ <code>ffc07b0</code> and <code>a9da922</code> each had 0, and the same commits had 27 after an
3768
+ <i>Update branch</i>. An empty check list is indistinguishable from "CI has not started yet", so a
3769
+ bot PR can look ready to merge while nothing has run.</p></details>
3717
3770
  <div class="meta">
3718
3771
  <span class="m">Complexity <b>S</b></span>
3719
3772
  <span class="m">Impact <b>Med</b></span>
@@ -190,3 +190,84 @@ class TestSourceText:
190
190
  # A blank line reads as "no such skill"; the placeholder keeps the
191
191
  # numbering honest and tells the model there is nothing to summarise.
192
192
  assert "no description" in chat.source_text([_entry("bare")])
193
+
194
+
195
+ class TestGroundingDoesNotFlagOrdinaryEnglish:
196
+ """A hyphenated word is not a skill name.
197
+
198
+ Reported from real use: every AI reply was rejected with "named something
199
+ outside the retrieved skills". The catalogue's own descriptions are full of
200
+ hyphenated compounds — "read-only", "multi-agent", "pre-deployment",
201
+ "risk-adaptive", "test-driven" — and the first version of
202
+ :func:`ungrounded_names` flagged any hyphenated token that was not itself a
203
+ catalogue name. So a reply that faithfully quoted its sources was scored as
204
+ fabricating, and the AI path degraded to extractive for essentially every
205
+ query in this domain.
206
+
207
+ The fix is that the *sources* ground the reply, not just the name list:
208
+ a term that appears in the retrieved text came from the retrieved text.
209
+ """
210
+
211
+ ENTRIES = ({"name": "code-reviewer", "tap": "t",
212
+ "description": "Parallel read-only multi-agent review of a git diff, "
213
+ "risk-adaptive and pre-deployment focused."},)
214
+
215
+ def test_compounds_quoted_from_the_sources_are_grounded(self):
216
+ reply = ("The read-only multi-agent code-reviewer fits — it is "
217
+ "risk-adaptive and pre-deployment focused.")
218
+ assert chat.ungrounded_names(reply, self.ENTRIES) == []
219
+
220
+ def test_a_genuinely_invented_name_is_still_caught(self):
221
+ # The whole point of the check: boost is a package manager, so a
222
+ # plausible-but-absent name sends the user hunting for a skill that
223
+ # does not exist, or to a typosquat.
224
+ reply = "Use docker-compose-expert for that."
225
+ assert "docker-compose-expert" in chat.ungrounded_names(reply, self.ENTRIES)
226
+
227
+ def test_a_near_miss_is_not_grounded_by_a_longer_real_name(self):
228
+ # A substring scan would treat "code-review" as grounded because
229
+ # "code-reviewer" contains it — exactly the near-miss shape a
230
+ # typosquat has, so matching is on whole tokens.
231
+ reply = "Install code-review for that."
232
+ assert "code-review" in chat.ungrounded_names(reply, self.ENTRIES)
233
+
234
+ def test_grounding_is_case_insensitive(self):
235
+ reply = "Read-Only review is what Code-Reviewer does."
236
+ assert chat.ungrounded_names(reply, self.ENTRIES) == []
237
+
238
+ def test_a_name_never_needs_the_description_to_be_grounded(self):
239
+ entries = [{"name": "tdd-workflow", "tap": "t", "description": ""}]
240
+ assert chat.ungrounded_names("Try tdd-workflow.", entries) == []
241
+
242
+
243
+ class TestLongDescriptionsAreReadable:
244
+ """Catalogue descriptions are untrusted text and some are enormous.
245
+
246
+ Measured over a real 71,655-entry catalogue: 22.7% of descriptions exceed
247
+ 300 characters, the longest is 5,771, and 635 contain literal ``\\n``
248
+ escape sequences. One such entry rendered as a screenful of embedded
249
+ ``<example>`` blocks, which is what a user actually saw — the answer was
250
+ correct and unreadable.
251
+ """
252
+
253
+ def test_a_long_description_is_truncated(self):
254
+ entry = {"name": "x", "tap": "t", "description": "word " * 400}
255
+ line = chat._describe(entry)
256
+ assert len(line) < 300, len(line)
257
+
258
+ def test_truncation_is_marked_rather_than_silent(self):
259
+ entry = {"name": "x", "tap": "t", "description": "word " * 400}
260
+ assert chat._describe(entry).rstrip().endswith("…")
261
+
262
+ def test_a_short_description_is_left_alone(self):
263
+ entry = {"name": "x", "tap": "t", "description": "Short and useful."}
264
+ assert chat._describe(entry).endswith("Short and useful.")
265
+
266
+ def test_embedded_newlines_collapse_to_one_line(self):
267
+ # Both real newlines and the literal two-character \n seen in 635
268
+ # entries, which reach the terminal as visible backslash-n noise.
269
+ entry = {"name": "x", "tap": "t",
270
+ "description": "first\nsecond\\nthird\r\nfourth"}
271
+ line = chat._describe(entry)
272
+ assert "\n" not in line and "\\n" not in line
273
+ assert "first second third fourth" in line