boost-skill-cli 1.2.167__tar.gz → 1.2.169__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 (1134) hide show
  1. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/pkg.py +67 -4
  4. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/scopes.py +38 -0
  5. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/store.py +187 -5
  6. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  7. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  8. boost_skill_cli-1.2.169/docs/demo.gif +0 -0
  9. boost_skill_cli-1.2.169/docs/roadmap/items/install-writes-through-a-redirected-dotdir-uninstall-will-not.md +46 -0
  10. boost_skill_cli-1.2.169/docs/roadmap/items/project-uninstall-deletes-any-in-repo-directory-the-lock-names.md +118 -0
  11. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap.html +47 -23
  12. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_workspace_scope.py +136 -0
  13. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_store.py +456 -2
  14. boost_skill_cli-1.2.167/docs/demo.gif +0 -0
  15. boost_skill_cli-1.2.167/docs/roadmap/items/project-uninstall-deletes-any-in-repo-directory-the-lock-names.md +0 -36
  16. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.gitattributes +0 -0
  17. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.gitignore +0 -0
  18. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.gitleaks.toml +0 -0
  19. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.htmlvalidate.json +0 -0
  20. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.lighthouserc.json +0 -0
  21. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.lycheeignore +0 -0
  22. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.markdownlint-cli2.jsonc +0 -0
  23. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.pre-commit-config.yaml +0 -0
  24. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.stylelintrc.json +0 -0
  25. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale/styles/boost/AIWriting.yml +0 -0
  26. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale/styles/boost/Terminology.yml +0 -0
  27. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  28. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale.ini +0 -0
  29. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/CLAUDE.md +0 -0
  30. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/CODE_OF_CONDUCT.md +0 -0
  31. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/CONTRIBUTING.md +0 -0
  32. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/DCO +0 -0
  33. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/GOVERNANCE.md +0 -0
  34. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/LICENSE +0 -0
  35. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/MAINTAINERS.md +0 -0
  36. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/MANIFEST.in +0 -0
  37. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/Makefile +0 -0
  38. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/README.md +0 -0
  39. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/SECURITY.md +0 -0
  40. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/SUPPORT.md +0 -0
  41. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost +0 -0
  42. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/__init__.py +0 -0
  43. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/__main__.py +0 -0
  44. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/cli.py +0 -0
  45. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/cliparse.py +0 -0
  46. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/__init__.py +0 -0
  47. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/_common.py +0 -0
  48. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/bmad.py +0 -0
  49. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/configuration.py +0 -0
  50. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/discovery.py +0 -0
  51. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/hooks.py +0 -0
  52. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/info.py +0 -0
  53. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/intelligence.py +0 -0
  54. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/quality.py +0 -0
  55. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/quickstart.py +0 -0
  56. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/run.py +0 -0
  57. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/safety.py +0 -0
  58. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/taps.py +0 -0
  59. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/team.py +0 -0
  60. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/__init__.py +0 -0
  61. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/adapters.py +0 -0
  62. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/agents.py +0 -0
  63. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/ai.py +0 -0
  64. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/aihost.py +0 -0
  65. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/archive.py +0 -0
  66. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/bmad.py +0 -0
  67. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/bootstrap.py +0 -0
  68. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/browse.py +0 -0
  69. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/builtin.py +0 -0
  70. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/capabilities.py +0 -0
  71. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/catalog.py +0 -0
  72. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/catalogbundle.py +0 -0
  73. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/chat.py +0 -0
  74. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/claude_settings.py +0 -0
  75. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/cohort.py +0 -0
  76. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/compact.py +0 -0
  77. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/complete.py +0 -0
  78. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/config.py +0 -0
  79. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/dense.py +0 -0
  80. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/deps.py +0 -0
  81. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/discovery.py +0 -0
  82. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/ed25519.py +0 -0
  83. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/embed.py +0 -0
  84. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/faithfulness.py +0 -0
  85. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/frontmatter.py +0 -0
  86. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/gitutil.py +0 -0
  87. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/hookhost.py +0 -0
  88. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/imperative.py +0 -0
  89. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/injectscan.py +0 -0
  90. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/installscan.py +0 -0
  91. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/integrity.py +0 -0
  92. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/journal.py +0 -0
  93. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/jsonstate.py +0 -0
  94. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/localembed.py +0 -0
  95. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/lockfile.py +0 -0
  96. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/logs.py +0 -0
  97. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/mcp.py +0 -0
  98. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/mcpdecl.py +0 -0
  99. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/mcphost.py +0 -0
  100. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/minisign.py +0 -0
  101. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/nethttp.py +0 -0
  102. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/output.py +0 -0
  103. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/paths.py +0 -0
  104. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/policy.py +0 -0
  105. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/prereq.py +0 -0
  106. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/projectlock.py +0 -0
  107. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/provenance.py +0 -0
  108. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/rag.py +0 -0
  109. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/registry.py +0 -0
  110. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/report.py +0 -0
  111. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/resolve.py +0 -0
  112. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/rules.py +0 -0
  113. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/secretscan.py +0 -0
  114. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/selfupdate.py +0 -0
  115. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/serve.py +0 -0
  116. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/shards.py +0 -0
  117. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/stackprobe.py +0 -0
  118. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/staleness.py +0 -0
  119. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/trustaudit.py +0 -0
  120. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/typedvalue.py +0 -0
  121. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/typosquat.py +0 -0
  122. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/updatediff.py +0 -0
  123. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/util.py +0 -0
  124. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/workflows.py +0 -0
  125. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/data/registries.json +0 -0
  126. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/data/rules/boost-first.mdc +0 -0
  127. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/errors.py +0 -0
  128. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/spin.py +0 -0
  129. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/__init__.py +0 -0
  130. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/_compat.py +0 -0
  131. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/graph.py +0 -0
  132. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/loader.py +0 -0
  133. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/py.typed +0 -0
  134. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/retriever.py +0 -0
  135. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  136. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  137. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/requires.txt +0 -0
  138. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/top_level.txt +0 -0
  139. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/codecov.yml +0 -0
  140. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/DEBUGGING.md +0 -0
  141. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/adapters.html +0 -0
  142. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/README.md +0 -0
  143. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-components-core.md +0 -0
  144. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-containers.md +0 -0
  145. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-context.md +0 -0
  146. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-dynamic-install.md +0 -0
  147. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/bmad.md +0 -0
  148. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/distill.gif +0 -0
  149. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/doctor.gif +0 -0
  150. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/explain.gif +0 -0
  151. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/hooks.gif +0 -0
  152. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/install.gif +0 -0
  153. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/pulse.gif +0 -0
  154. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/search.gif +0 -0
  155. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/tap.gif +0 -0
  156. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/distill.tape +0 -0
  157. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/doctor.tape +0 -0
  158. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/explain.tape +0 -0
  159. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/hooks.tape +0 -0
  160. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/install.tape +0 -0
  161. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/pulse.tape +0 -0
  162. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/search.tape +0 -0
  163. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/tap.tape +0 -0
  164. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel.html +0 -0
  165. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/chat.html +0 -0
  166. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/code-review.md +0 -0
  167. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/commands.html +0 -0
  168. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/commit-audit.md +0 -0
  169. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/demo-index.json +0 -0
  170. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/demo.html +0 -0
  171. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/demo.tape +0 -0
  172. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/dependencies.md +0 -0
  173. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/design-roadmap.html +0 -0
  174. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/eval-latest.json +0 -0
  175. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/eval.html +0 -0
  176. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/index.html +0 -0
  177. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/langchain.html +0 -0
  178. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/mcp-hub.html +0 -0
  179. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/openssf-badge.md +0 -0
  180. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/openssf-playbook.md +0 -0
  181. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/rag-architecture.md +0 -0
  182. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D01.md +0 -0
  183. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D02.md +0 -0
  184. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D03.md +0 -0
  185. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D04.md +0 -0
  186. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D05.md +0 -0
  187. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D06.md +0 -0
  188. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D07.md +0 -0
  189. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D08.md +0 -0
  190. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D09.md +0 -0
  191. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D10.md +0 -0
  192. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D11.md +0 -0
  193. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D12.md +0 -0
  194. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D13.md +0 -0
  195. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D14.md +0 -0
  196. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D15.md +0 -0
  197. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D16.md +0 -0
  198. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D17.md +0 -0
  199. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D18.md +0 -0
  200. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D19.md +0 -0
  201. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D20.md +0 -0
  202. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D21.md +0 -0
  203. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D22.md +0 -0
  204. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D23.md +0 -0
  205. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D24.md +0 -0
  206. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D25.md +0 -0
  207. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D26.md +0 -0
  208. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D27.md +0 -0
  209. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a-correct-link-in-a-locked-dir-reads-as-refused.md +0 -0
  210. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a-new-shipped-card-always-404s-its-own-write-up-link.md +0 -0
  211. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a-refusal-and-its-remedy-never-wrapped.md +0 -0
  212. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  213. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  214. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  215. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  216. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/agent-dir-shapes-install-still-trips-on.md +0 -0
  217. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  218. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  219. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  220. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  221. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/an-item-materialized-nowhere-reads-ok-in-verify-health-drift.md +0 -0
  222. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  223. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  224. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-absorb-findings.md +0 -0
  225. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-adapt-findings.md +0 -0
  226. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
  227. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
  228. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +0 -0
  229. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-attest-findings.md +0 -0
  230. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-audit-findings.md +0 -0
  231. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-bmad-findings.md +0 -0
  232. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-browse-findings.md +0 -0
  233. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-bundle-findings.md +0 -0
  234. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-catalog-findings.md +0 -0
  235. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
  236. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-changelog-findings.md +0 -0
  237. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-chat-findings.md +0 -0
  238. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
  239. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
  240. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-cohort-findings.md +0 -0
  241. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-completions-findings.md +0 -0
  242. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-config-findings.md +0 -0
  243. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
  244. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-context-findings.md +0 -0
  245. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +0 -0
  246. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
  247. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-create-findings.md +0 -0
  248. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
  249. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-deps-findings.md +0 -0
  250. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-discover-findings.md +0 -0
  251. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
  252. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-doctor-findings.md +0 -0
  253. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-drift-findings.md +0 -0
  254. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
  255. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-edit-findings.md +0 -0
  256. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-evolve-findings.md +0 -0
  257. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-explain-findings.md +0 -0
  258. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-export-findings.md +0 -0
  259. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
  260. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
  261. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
  262. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
  263. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
  264. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-health-findings.md +0 -0
  265. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
  266. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
  267. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-import-findings.md +0 -0
  268. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-index-findings.md +0 -0
  269. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
  270. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
  271. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-install-findings.md +0 -0
  272. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
  273. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
  274. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-lint-findings.md +0 -0
  275. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-log-findings.md +0 -0
  276. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
  277. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-mcp-findings.md +0 -0
  278. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
  279. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
  280. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
  281. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-onboard-findings.md +0 -0
  282. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
  283. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
  284. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-outdated-findings.md +0 -0
  285. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
  286. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
  287. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-policy-findings.md +0 -0
  288. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-preview-findings.md +0 -0
  289. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-profile-findings.md +0 -0
  290. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
  291. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-protocol-findings.md +0 -0
  292. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-pulse-findings.md +0 -0
  293. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
  294. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
  295. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
  296. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-recommend-findings.md +0 -0
  297. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-reindex-findings.md +0 -0
  298. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
  299. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-replay-findings.md +0 -0
  300. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-root-findings.md +0 -0
  301. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
  302. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-run-findings.md +0 -0
  303. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-schedule-findings.md +0 -0
  304. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-search-findings.md +0 -0
  305. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-simulate-findings.md +0 -0
  306. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
  307. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
  308. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
  309. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
  310. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
  311. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
  312. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
  313. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-sync-findings.md +0 -0
  314. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-tag-findings.md +0 -0
  315. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
  316. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-tap-findings.md +0 -0
  317. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-taps-findings.md +0 -0
  318. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
  319. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-test-findings.md +0 -0
  320. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-trust-findings.md +0 -0
  321. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
  322. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-unpin-findings.md +0 -0
  323. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-untap-findings.md +0 -0
  324. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-update-findings.md +0 -0
  325. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
  326. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-verify-findings.md +0 -0
  327. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-who-findings.md +0 -0
  328. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  329. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bare-boost-never-names-an-entry-point.md +0 -0
  330. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/because-that-was-not-the-reason.md +0 -0
  331. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bm25-empty-tokenization-kills-catalog-fallback.md +0 -0
  332. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  333. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  334. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  335. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-done-contract-ignores-the-track.md +0 -0
  336. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-gemini-gets-claude-hook-output.md +0 -0
  337. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  338. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-personas-delegate-outside-the-router.md +0 -0
  339. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-roster-drifted-from-bmad-6-12.md +0 -0
  340. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-route-ignores-autopilot-state.md +0 -0
  341. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-router-one-keyword-decides-the-track.md +0 -0
  342. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-router-reads-each-prompt-alone.md +0 -0
  343. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  344. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-first-rule.md +0 -0
  345. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  346. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  347. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/branch-current-gate.md +0 -0
  348. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  349. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  350. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  351. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  352. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  353. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  354. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cache-writers-that-still-crash-on-a-read-only-cache.md +0 -0
  355. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/canary-deps-check-skips-in-the-required-job.md +0 -0
  356. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  357. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
  358. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
  359. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  360. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  361. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  362. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  363. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-summary-reports-the-wrong-coverage-gate.md +0 -0
  364. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  365. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  366. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/claude-md-instructs-the-wrong-licence-header.md +0 -0
  367. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  368. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
  369. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cli-command-audit.md +0 -0
  370. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  371. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  372. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  373. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/codex-hooks-timeout-units-are-unestablished.md +0 -0
  374. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/codex-is-not-an-mcp-host.md +0 -0
  375. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  376. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/command-carousel-page.md +0 -0
  377. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  378. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/compact-answers-a-named-tap-with-a-global-all-clear.md +0 -0
  379. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  380. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  381. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  382. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/concurrency-probe-measured-a-race-not-the-pool.md +0 -0
  383. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
  384. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/config-json-edge-shapes-crash-or-disagree.md +0 -0
  385. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  386. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/corpus-refresh-updates-data-not-prose.md +0 -0
  387. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/corrupt-config-reads-as-ready-to-set-up.md +0 -0
  388. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/count-flags-that-silently-invert.md +0 -0
  389. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  390. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  391. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  392. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  393. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  394. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
  395. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  396. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  397. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  398. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-kill-switch-has-no-reason-state.md +0 -0
  399. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-local-built-store-displaced-by-a-key.md +0 -0
  400. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-no-key-guard-is-unreachable.md +0 -0
  401. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-ready-but-embedder-cannot-run.md +0 -0
  402. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  403. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  404. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  405. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  406. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
  407. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  408. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  409. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  410. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  411. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  412. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  413. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  414. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  415. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  416. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/doctor-prescribes-sync-that-deletes-live-links.md +0 -0
  417. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  418. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  419. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  420. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/err-colour-judged-by-stdout.md +0 -0
  421. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/err-multiline-hint-colours-across-the-newline.md +0 -0
  422. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  423. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  424. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-counted-by-the-method-the-repo-disavows.md +0 -0
  425. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-duplication-is-intra-tap-not-mirrors.md +0 -0
  426. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  427. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  428. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  429. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  430. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  431. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-floor-calibration-stale-after-pin-refresh.md +0 -0
  432. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-gate-scores-a-body-less-corpus.md +0 -0
  433. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  434. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/exemplar-graded-golden-set-runs-in-no-gate.md +0 -0
  435. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  436. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/explain-outline-has-no-cap.md +0 -0
  437. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  438. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  439. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  440. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  441. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/floors-job-never-installed-setuptools.md +0 -0
  442. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  443. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  444. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  445. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  446. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/free-threaded-canary-warns-about-nothing.md +0 -0
  447. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  448. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gate-parity-test-ignores-k-and-golden.md +0 -0
  449. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gated-golden-set-has-zero-exemplars.md +0 -0
  450. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  451. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  452. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  453. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  454. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  455. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/github-community-health-files.md +0 -0
  456. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  457. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  458. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  459. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  460. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  461. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  462. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/hooks-list-drops-the-name-before-the-host.md +0 -0
  463. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  464. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/identifier-columns-shrink-to-a-name-no-command-accepts.md +0 -0
  465. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/import-budget-gate-passes-when-boost-cannot-import.md +0 -0
  466. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/info-deps-materialize-a-dir-they-then-reject.md +0 -0
  467. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  468. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-cannot-tell-a-skill-needs-another-one.md +0 -0
  469. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  470. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  471. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  472. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-paths-that-still-drop-the-result.md +0 -0
  473. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  474. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  475. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  476. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  477. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  478. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  479. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/is-dir-follows-a-symlink-at-eleven-rmtree-call-sites.md +0 -0
  480. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  481. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/keyed-no-store-hint-disagrees-with-shard-remedy.md +0 -0
  482. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  483. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  484. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  485. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  486. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  487. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  488. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  489. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  490. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  491. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lighthouse-flips-on-byte-identical-input.md +0 -0
  492. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  493. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/links-job-503s-its-own-write-up-links.md +0 -0
  494. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  495. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  496. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  497. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  498. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lock-kept-links-it-had-just-removed.md +0 -0
  499. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  500. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  501. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  502. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  503. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  504. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  505. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  506. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  507. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/manifest-in-prunes-only-the-root-copy.md +0 -0
  508. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  509. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  510. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  511. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  512. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  513. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  514. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  515. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-doctor-says-healthy-where-mcp-search-says-nothing-is-tapped.md +0 -0
  516. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  517. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-install-description-omits-antigravity.md +0 -0
  518. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  519. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  520. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-miss-reply-echoes-the-whole-query.md +0 -0
  521. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  522. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  523. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-registration-writes-outside-a-sandboxed-home.md +0 -0
  524. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  525. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-cost-overstated-on-keyless-machines.md +0 -0
  526. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  527. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  528. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-server-dies-on-a-valid-json-message-that-is-not-an-object.md +0 -0
  529. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  530. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-session-dies-on-a-deeply-nested-json-line.md +0 -0
  531. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-skip-list-absent-from-tool-descriptions.md +0 -0
  532. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  533. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  534. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  535. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  536. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  537. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  538. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  539. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  540. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  541. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  542. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-shard-balance-hints-are-a-release-behind.md +0 -0
  543. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  544. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
  545. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  546. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  547. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
  548. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  549. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  550. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-bad-agent-dir-silences-the-whole-doctor-report.md +0 -0
  551. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  552. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  553. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  554. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-failed-shard-job-drops-registries-from-the-manifest.md +0 -0
  555. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  556. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  557. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  558. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-playbook.md +0 -0
  559. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-silver.md +0 -0
  560. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  561. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  562. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/panel-fits-data-to-an-assumed-80-in-a-pipe.md +0 -0
  563. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  564. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  565. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  566. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  567. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  568. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  569. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  570. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  571. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  572. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  573. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  574. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/project-scope-in-an-unmarked-tree-does-not-walk-up.md +0 -0
  575. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  576. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  577. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  578. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  579. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  580. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  581. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  582. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
  583. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  584. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  585. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  586. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  587. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  588. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-drops-incompatible-shard-status.md +0 -0
  589. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-manifest-error-drops-hint-and-misnames-cause.md +0 -0
  590. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-rerun-retargets-tapped-registries.md +0 -0
  591. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-says-ready-exit-0-after-every-tap-failed.md +0 -0
  592. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-shard-download-invisible-in-preview-and-run.md +0 -0
  593. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  594. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  595. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/read-only-boost-home-with-no-cache-dir.md +0 -0
  596. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/readme-81-command-table-lists-80-omits-quickstart.md +0 -0
  597. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/readme-hero-installs-a-name-no-starter-registry-ships.md +0 -0
  598. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  599. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reclone-leaves-a-clone-on-head-when-it-cannot-reach-the-pin.md +0 -0
  600. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/recommend-recomputes-its-columns-per-row.md +0 -0
  601. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  602. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/refresh-strands-the-natural-set-baseline.md +0 -0
  603. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  604. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reindex-reported-a-completeness-share-it-could-not-compute.md +0 -0
  605. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  606. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/release-guard-fails-open-when-it-cannot-read-tags.md +0 -0
  607. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  608. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/relicence-apache-2.md +0 -0
  609. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  610. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  611. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  612. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/required-eval-gate-still-grades-by-name.md +0 -0
  613. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  614. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  615. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  616. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-boards-advertise-python-39.md +0 -0
  617. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  618. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  619. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  620. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  621. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  622. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rule-and-workflow-rows-carry-a-scope-nothing-but-list-local-reads.md +0 -0
  623. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  624. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  625. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  626. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  627. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sandbox-fixture-does-not-sandbox-the-working-directory.md +0 -0
  628. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  629. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  630. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  631. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  632. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  633. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  634. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  635. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  636. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  637. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-caps-the-two-copyable-identifiers.md +0 -0
  638. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-drops-symbol-language-queries-silently.md +0 -0
  639. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-footer-not-fitted-to-the-pane-its-rows-were-fitted-to.md +0 -0
  640. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-footer-overflows-40-col-pane-gate-passes-by-luck.md +0 -0
  641. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  642. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-relevance-meter-is-constant-on-default-page.md +0 -0
  643. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-rows-use-term-width-so-piping-drops-the-tap-column.md +0 -0
  644. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  645. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  646. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  647. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  648. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  649. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  650. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  651. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  652. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  653. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
  654. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  655. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shard-weights-do-not-predict-the-job-timeout.md +0 -0
  656. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  657. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  658. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  659. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shrink-the-published-index.md +0 -0
  660. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  661. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  662. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  663. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  664. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/stale-gate-sizes-in-readme-and-contributing.md +0 -0
  665. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/stale-tap-hint-dead-for-tap-only-installs.md +0 -0
  666. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  667. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  668. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  669. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  670. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/surface-dehyphenation-rationale-is-false.md +0 -0
  671. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  672. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sweep-died-at-a-page-not-at-launch.md +0 -0
  673. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  674. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  675. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  676. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  677. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-repairs-a-disabled-agents-row-every-run.md +0 -0
  678. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  679. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/table-fit-widths-floor-destroys-columns-and-still-overflows.md +0 -0
  680. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  681. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  682. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/taps-vouches-for-a-clone-that-is-not-there.md +0 -0
  683. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/text-io-leaves-its-encoding-to-the-locale.md +0 -0
  684. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  685. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-install-path-hands-agy-claudes-mcp-argv.md +0 -0
  686. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-links-concurrency-cap-did-not-hold.md +0 -0
  687. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-model-back-off-mixes-two-clocks.md +0 -0
  688. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  689. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  690. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-windows-test-cap-is-five-minutes-from-the-measurement.md +0 -0
  691. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  692. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/tier3-ceiling-unreachable-at-default-n.md +0 -0
  693. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  694. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  695. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  696. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  697. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/typos-reported-as-boost-bugs.md +0 -0
  698. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  699. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  700. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  701. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/uninstall-local-cannot-remove-a-rule-or-workflow-list-local-shows.md +0 -0
  702. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unreadable-tap-cache-healthy-doctor-crashing-heal.md +0 -0
  703. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  704. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  705. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unwritable-agent-dir-has-no-remedy.md +0 -0
  706. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unwritable-rule-or-workflow-dir-crashes-install.md +0 -0
  707. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  708. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  709. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  710. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  711. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  712. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/util-rmtree-chmods-a-symlink-target-outside-the-tree.md +0 -0
  713. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  714. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  715. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
  716. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  717. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  718. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  719. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  720. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  721. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  722. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workspace-scope-install.md +0 -0
  723. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/wrap-width-judged-by-stdout.md +0 -0
  724. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/writers-whose-bytes-are-compared-do-not-pin-their-newline.md +0 -0
  725. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/zip-strict-audit.md +0 -0
  726. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  727. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  728. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/security-design.md +0 -0
  729. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/semantic-search.md +0 -0
  730. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  731. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/verifying-releases.md +0 -0
  732. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/meta.md +0 -0
  733. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/openvex.json +0 -0
  734. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  735. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  736. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  737. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  738. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/eslint.config.mjs +0 -0
  739. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/README.md +0 -0
  740. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/__init__.py +0 -0
  741. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/baseline.json +0 -0
  742. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/faithfulness.py +0 -0
  743. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/golden_set.json +0 -0
  744. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/make_corpus.py +0 -0
  745. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/make_golden.py +0 -0
  746. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/metrics.py +0 -0
  747. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/publish_golden_dataset.py +0 -0
  748. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/run_evals.py +0 -0
  749. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/examples/README.md +0 -0
  750. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/examples/adapt-demo.sh +0 -0
  751. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/examples/boost-run-prototype.sh +0 -0
  752. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/index.html +0 -0
  753. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/noxfile.py +0 -0
  754. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/pyproject.toml +0 -0
  755. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/coverage-tools.in +0 -0
  756. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/coverage-tools.txt +0 -0
  757. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/lint-tools.in +0 -0
  758. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/lint-tools.txt +0 -0
  759. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/mutation-tools.in +0 -0
  760. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/mutation-tools.txt +0 -0
  761. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/platform-pins.lock +0 -0
  762. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/release-tools.in +0 -0
  763. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/release-tools.txt +0 -0
  764. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/test-tools.in +0 -0
  765. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/test-tools.txt +0 -0
  766. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/a11y_check.py +0 -0
  767. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/add_spdx_headers.py +0 -0
  768. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/bench_cli.sh +0 -0
  769. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_command_reference.py +0 -0
  770. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_demo_index.py +0 -0
  771. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_registries.py +0 -0
  772. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_roadmap.py +0 -0
  773. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_scale_corpus.py +0 -0
  774. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_vex.py +0 -0
  775. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_anchors.py +0 -0
  776. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_branch_current.py +0 -0
  777. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_dco.py +0 -0
  778. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_licenses.py +0 -0
  779. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_reproducible.py +0 -0
  780. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_required_checks.py +0 -0
  781. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/ensure_eval_corpus.sh +0 -0
  782. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_corpus.py +0 -0
  783. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_explain.py +0 -0
  784. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_gate.py +0 -0
  785. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_recommend.py +0 -0
  786. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_retrieval.py +0 -0
  787. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_stats_summary.py +0 -0
  788. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_tools.py +0 -0
  789. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/import_budget.py +0 -0
  790. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/lock_toolchain.py +0 -0
  791. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/measure_near_duplicate_bound.py +0 -0
  792. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/measure_registry.py +0 -0
  793. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/mutation_gate.py +0 -0
  794. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/mutation_shards.py +0 -0
  795. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/mutation_weights.json +0 -0
  796. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/normalize_sdist.py +0 -0
  797. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/page_budget.py +0 -0
  798. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/perf_gate.py +0 -0
  799. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/post_deploy_smoke.py +0 -0
  800. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/publish_eval_json.py +0 -0
  801. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/publish_shards.py +0 -0
  802. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/release_guard.py +0 -0
  803. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/release_preflight.py +0 -0
  804. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/serve_docs.py +0 -0
  805. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/shard_plan.py +0 -0
  806. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/setup.cfg +0 -0
  807. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/sonar-project.properties +0 -0
  808. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/README.md +0 -0
  809. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/boost.css +0 -0
  810. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/boost.js +0 -0
  811. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/demo.html +0 -0
  812. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/adapt.feature +0 -0
  813. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/browse.feature +0 -0
  814. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/count.feature +0 -0
  815. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/discover.feature +0 -0
  816. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/doctor.feature +0 -0
  817. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/environment.py +0 -0
  818. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/explain.feature +0 -0
  819. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/index.feature +0 -0
  820. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/install.feature +0 -0
  821. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/list.feature +0 -0
  822. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/mcp.feature +0 -0
  823. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/search.feature +0 -0
  824. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/cli_steps.py +0 -0
  825. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/discovery_steps.py +0 -0
  826. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/mcp_steps.py +0 -0
  827. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/quality_steps.py +0 -0
  828. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/conftest.py +0 -0
  829. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/baseline.json +0 -0
  830. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/explain.jsonl +0 -0
  831. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
  832. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/golden-natural.jsonl +0 -0
  833. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/golden.jsonl +0 -0
  834. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/recommend.jsonl +0 -0
  835. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/taps-scale.txt +0 -0
  836. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/taps.txt +0 -0
  837. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/tool_calls.jsonl +0 -0
  838. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_bad_input_is_not_a_crash.py +0 -0
  839. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_bmad_all_hosts.py +0 -0
  840. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_bmad_personas_scope.py +0 -0
  841. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_capabilities_policy.py +0 -0
  842. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_adapt.py +0 -0
  843. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_bmad.py +0 -0
  844. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_catalog.py +0 -0
  845. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_chat.py +0 -0
  846. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_configuration.py +0 -0
  847. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_discovery.py +0 -0
  848. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_hooks.py +0 -0
  849. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_hooks_codex.py +0 -0
  850. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_hooks_gemini.py +0 -0
  851. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_identifier_columns.py +0 -0
  852. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_info.py +0 -0
  853. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_intelligence.py +0 -0
  854. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_json_reports.py +0 -0
  855. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_pane_width.py +0 -0
  856. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_pkg.py +0 -0
  857. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_quality.py +0 -0
  858. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_quickstart.py +0 -0
  859. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_tap_pins.py +0 -0
  860. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_taps.py +0 -0
  861. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_team.py +0 -0
  862. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_context_sees_an_unborn_branch.py +0 -0
  863. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_count_flags_reject_nonpositive.py +0 -0
  864. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_everyday_loop.py +0 -0
  865. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_integrity_enforce.py +0 -0
  866. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_keyed_no_store_hint.py +0 -0
  867. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_kind_conformance.py +0 -0
  868. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_property_parsers.py +0 -0
  869. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_recommend_because_is_true.py +0 -0
  870. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_repo_root_guard_covers_real_installs.py +0 -0
  871. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_reports_match_reality.py +0 -0
  872. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_run.py +0 -0
  873. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_tap_signing.py +0 -0
  874. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/README.md +0 -0
  875. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  876. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  877. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  878. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  879. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  880. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  881. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  882. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  883. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  884. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  885. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  886. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  887. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  888. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  889. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  890. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  891. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  892. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  893. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  894. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  895. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  896. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  897. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  898. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/fuzz_frontmatter.py +0 -0
  899. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/fuzz_registry.py +0 -0
  900. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/conftest.py +0 -0
  901. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/test_graph.py +0 -0
  902. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/test_loader.py +0 -0
  903. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/test_retriever.py +0 -0
  904. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/make_fixture.py +0 -0
  905. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/perf/test_benchmarks.py +0 -0
  906. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/smoke.sh +0 -0
  907. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/data/bmad-skills-6.12.0.json +0 -0
  908. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_a11y_check.py +0 -0
  909. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_action_pin_lockstep.py +0 -0
  910. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_adapters.py +0 -0
  911. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_adapters_multi.py +0 -0
  912. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_adapters_runner.py +0 -0
  913. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_agents.py +0 -0
  914. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_ai.py +0 -0
  915. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_aihost.py +0 -0
  916. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_archive.py +0 -0
  917. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_bmad_core.py +0 -0
  918. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_boost_first_offer.py +0 -0
  919. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_bootstrap.py +0 -0
  920. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_bot_pr_dco.py +0 -0
  921. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_branch_current.py +0 -0
  922. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_browse.py +0 -0
  923. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_builtin.py +0 -0
  924. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_canary_deps.py +0 -0
  925. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_capabilities.py +0 -0
  926. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalog.py +0 -0
  927. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalog_distinct.py +0 -0
  928. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalog_keyword_words.py +0 -0
  929. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalogbundle.py +0 -0
  930. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_chat.py +0 -0
  931. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_anchors.py +0 -0
  932. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_dco.py +0 -0
  933. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_licenses.py +0 -0
  934. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_reproducible.py +0 -0
  935. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_claude_settings.py +0 -0
  936. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_claude_settings_codex.py +0 -0
  937. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_clean_internal_cache.py +0 -0
  938. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_cli_update_shards.py +0 -0
  939. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_cliparse.py +0 -0
  940. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_codeql_analysis_key.py +0 -0
  941. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_cohort.py +0 -0
  942. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_command_reference_fresh.py +0 -0
  943. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_community_health_files.py +0 -0
  944. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_compact.py +0 -0
  945. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_complete.py +0 -0
  946. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_complete_rc_block.py +0 -0
  947. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_config.py +0 -0
  948. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_content_dedupe.py +0 -0
  949. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_content_identity.py +0 -0
  950. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_corpus_prose.py +0 -0
  951. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_count_flags_use_positive_int.py +0 -0
  952. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_coverage_gate_prose.py +0 -0
  953. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_crash_redaction.py +0 -0
  954. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dedup_trust.py +0 -0
  955. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_demo_index.py +0 -0
  956. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense.py +0 -0
  957. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
  958. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_embed_dedupe.py +0 -0
  959. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_entry_reuse.py +0 -0
  960. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_entry_vectors.py +0 -0
  961. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_fallback.py +0 -0
  962. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_fix_hint.py +0 -0
  963. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_model_unavailable.py +0 -0
  964. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_progress.py +0 -0
  965. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_quantized.py +0 -0
  966. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_ready_order.py +0 -0
  967. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_shard_real_schema.py +0 -0
  968. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  969. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_shards.py +0 -0
  970. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_status.py +0 -0
  971. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_status_cheap.py +0 -0
  972. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_vector_dedupe.py +0 -0
  973. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dependabot_config.py +0 -0
  974. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_deps.py +0 -0
  975. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_discovery.py +0 -0
  976. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_distill_merge.py +0 -0
  977. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_docs_pages_linked.py +0 -0
  978. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_docsite_chrome.py +0 -0
  979. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_doctor_output_polish.py +0 -0
  980. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_drift_hint.py +0 -0
  981. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dry_run_parity.py +0 -0
  982. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_ed25519.py +0 -0
  983. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed.py +0 -0
  984. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed_local.py +0 -0
  985. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed_outranking.py +0 -0
  986. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed_truncated_response.py +0 -0
  987. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_entry_key.py +0 -0
  988. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_errors_and_cli_table.py +0 -0
  989. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_baseline.py +0 -0
  990. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_corpus.py +0 -0
  991. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_corpus_bodies.py +0 -0
  992. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_faithfulness.py +0 -0
  993. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_gate.py +0 -0
  994. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_grading.py +0 -0
  995. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_metrics.py +0 -0
  996. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_query_sets.py +0 -0
  997. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_stats_summary.py +0 -0
  998. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_tools.py +0 -0
  999. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_tools_probe.py +0 -0
  1000. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  1001. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_faithfulness.py +0 -0
  1002. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_first_run_pointer.py +0 -0
  1003. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_frontmatter.py +0 -0
  1004. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_fuzz_targets.py +0 -0
  1005. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  1006. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitleaks_config.py +0 -0
  1007. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitutil.py +0 -0
  1008. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitutil_lfs.py +0 -0
  1009. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitutil_sparse.py +0 -0
  1010. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gstack_coexistence.py +0 -0
  1011. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_help_contracts.py +0 -0
  1012. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_hook_settings_hosts.py +0 -0
  1013. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_hookhost.py +0 -0
  1014. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_hookhost_codex.py +0 -0
  1015. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_imperative.py +0 -0
  1016. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_import_budget.py +0 -0
  1017. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_injectscan.py +0 -0
  1018. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_install_permission_error.py +0 -0
  1019. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_installscan.py +0 -0
  1020. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_integrity.py +0 -0
  1021. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_journal.py +0 -0
  1022. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_jsonstate.py +0 -0
  1023. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_langchain_packaging.py +0 -0
  1024. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_launcher_python_floor.py +0 -0
  1025. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_lighthouse_budgets.py +0 -0
  1026. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_link_ownership.py +0 -0
  1027. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_localembed.py +0 -0
  1028. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_localembed_e2e.py +0 -0
  1029. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_lockfile.py +0 -0
  1030. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_logs.py +0 -0
  1031. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_marketing_counts.py +0 -0
  1032. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp.py +0 -0
  1033. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp_install_sandbox_home.py +0 -0
  1034. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp_install_scan.py +0 -0
  1035. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp_read.py +0 -0
  1036. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcpdecl.py +0 -0
  1037. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcphost.py +0 -0
  1038. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_measure_registry.py +0 -0
  1039. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_minisign.py +0 -0
  1040. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_hardening.py +0 -0
  1041. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_shards.py +0 -0
  1042. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_subfile_shards.py +0 -0
  1043. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_weights_drift.py +0 -0
  1044. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutmut_source_paths.py +0 -0
  1045. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_near_duplicate_collapse.py +0 -0
  1046. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_nethttp.py +0 -0
  1047. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_normalize_sdist.py +0 -0
  1048. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_output.py +0 -0
  1049. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_output_table_drop.py +0 -0
  1050. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_output_table_whole.py +0 -0
  1051. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_page_budget.py +0 -0
  1052. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_paths.py +0 -0
  1053. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_perf_gate.py +0 -0
  1054. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_pkg_confusions.py +0 -0
  1055. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_pkg_injection.py +0 -0
  1056. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_pkg_secrets.py +0 -0
  1057. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_platform_pins.py +0 -0
  1058. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_policy.py +0 -0
  1059. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_post_deploy_smoke.py +0 -0
  1060. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_prereq.py +0 -0
  1061. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_project_mcp_sidecar.py +0 -0
  1062. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_projectlock.py +0 -0
  1063. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_provenance.py +0 -0
  1064. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_publish_golden_dataset.py +0 -0
  1065. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_quickstart_readiness.py +0 -0
  1066. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag.py +0 -0
  1067. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_completeness.py +0 -0
  1068. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_extra_hint.py +0 -0
  1069. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_fastpath.py +0 -0
  1070. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_fusion.py +0 -0
  1071. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_read_text_arg.py +0 -0
  1072. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registries_fresh.py +0 -0
  1073. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry.py +0 -0
  1074. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry_categories.py +0 -0
  1075. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry_control_chars.py +0 -0
  1076. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry_parallel.py +0 -0
  1077. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_release_guard.py +0 -0
  1078. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_release_preflight.py +0 -0
  1079. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_repo_root_guard.py +0 -0
  1080. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_report.py +0 -0
  1081. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_required_checks.py +0 -0
  1082. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rerank_cache.py +0 -0
  1083. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_resolve.py +0 -0
  1084. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
  1085. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_roadmap_fresh.py +0 -0
  1086. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rules.py +0 -0
  1087. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sandbox_fixture_cwd.py +0 -0
  1088. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_scale_corpus.py +0 -0
  1089. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_schedule_plist.py +0 -0
  1090. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_scopes.py +0 -0
  1091. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sdist_contents.py +0 -0
  1092. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_secretscan.py +0 -0
  1093. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_selfupdate.py +0 -0
  1094. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_serve.py +0 -0
  1095. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_serve_docs.py +0 -0
  1096. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shard_plan.py +0 -0
  1097. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards.py +0 -0
  1098. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_carry_forward.py +0 -0
  1099. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_incremental.py +0 -0
  1100. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_ingest.py +0 -0
  1101. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_matrix.py +0 -0
  1102. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_smoke_covers_every_command.py +0 -0
  1103. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_spdx_headers.py +0 -0
  1104. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_spin.py +0 -0
  1105. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_stackprobe.py +0 -0
  1106. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_staleness.py +0 -0
  1107. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_store_materialize.py +0 -0
  1108. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sync_blocked_links.py +0 -0
  1109. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sync_lost_lock.py +0 -0
  1110. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  1111. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_tap_pins.py +0 -0
  1112. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_text_io_names_its_encoding.py +0 -0
  1113. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_token_parity.py +0 -0
  1114. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_toolchain_lock.py +0 -0
  1115. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_trustaudit.py +0 -0
  1116. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_typedvalue.py +0 -0
  1117. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_typosquat.py +0 -0
  1118. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_updatediff.py +0 -0
  1119. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_upstream_path.py +0 -0
  1120. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_util.py +0 -0
  1121. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_version.py +0 -0
  1122. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_version_tags.py +0 -0
  1123. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_vex.py +0 -0
  1124. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_visual_harness_capture.py +0 -0
  1125. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_visual_harness_flags.py +0 -0
  1126. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_concurrency.py +0 -0
  1127. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  1128. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  1129. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_timeouts.py +0 -0
  1130. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflows.py +0 -0
  1131. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  1132. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/visual/a11y_check.mjs +0 -0
  1133. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/visual/console_check.mjs +0 -0
  1134. {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.167
3
+ Version: 1.2.169
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -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.167'
22
- __version_tuple__ = version_tuple = (1, 2, 167)
21
+ __version__ = version = '1.2.169'
22
+ __version_tuple__ = version_tuple = (1, 2, 169)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -832,10 +832,73 @@ def cmd_uninstall(argv: list[str]) -> int:
832
832
  else "removed from"
833
833
  out.ok("%s %s" % (verb, " · ".join(info["unlinked"])))
834
834
  if is_project:
835
- # Report where it actually went, not where a user-scope install
836
- # would have put it — a project skill never touches the
837
- # canonical store.
838
- out.ok("removed from %s" % _tilde(info.get("base", "this repo")))
835
+ refused = info.get("refused") or []
836
+ escaped = info.get("escaped") or []
837
+ redirected = info.get("redirected") or []
838
+ at = _tilde(info.get("base", "this repo"))
839
+ # Only claim a removal that happened, and read it off what came
840
+ # off disk rather than off `unlinked`, which is the *agent* list:
841
+ # a lock row need not name an agent, and gating on the agent list
842
+ # told a user whose row was agentless that nothing had been
843
+ # removed while the directory was gone. An unconditional "removed
844
+ # from <repo>" over an empty removal is the green panel this
845
+ # change exists to stop the user trusting, and this is the same
846
+ # sentence in the other direction. The lock *entry* does go
847
+ # either way, so the summary panel still counts the skill.
848
+ if info.get("removed_count"):
849
+ # Where it actually went, not where a user-scope install
850
+ # would have put it — a project skill never touches the
851
+ # canonical store.
852
+ out.ok("removed from %s" % at)
853
+ elif refused or escaped or redirected:
854
+ out.warn("nothing removed from %s — every path the lock named "
855
+ "was left alone" % at, wrap=True)
856
+ # A lock row boost will not act on, named rather than swallowed:
857
+ # the row is in a committed file, so a user who sees nothing has
858
+ # no way to learn their lock was edited. Through `out.plain`
859
+ # because the row *is* the attacker-controlled input — a path
860
+ # carrying `\x1b[1A\x1b[2K` would erase the lines above it.
861
+ for row in refused:
862
+ out.warn("left alone: the lock names %s, which is not a path "
863
+ "boost removes here" % out.plain(row), wrap=True)
864
+ # Worded apart from the above on purpose: this row may well be a
865
+ # path an install writes, with the lie in the filesystem rather
866
+ # than in the string.
867
+ for row in escaped:
868
+ out.warn("left alone: the lock names %s, which resolves "
869
+ "outside this repo" % out.plain(row), wrap=True)
870
+ # And this one *is* a path an install writes — it is in the
871
+ # derived set by construction, which is why it must not borrow
872
+ # `refused`'s wording: that printed "not a path boost removes
873
+ # here" directly above a list containing the same string. The
874
+ # remedy is a real one, because `rm` follows the committed
875
+ # symlink exactly as the install did.
876
+ for row in redirected:
877
+ out.warn("left alone: the lock names %s, but a symlink inside "
878
+ "the repo redirects the path to it. boost will not "
879
+ "delete through a symlink it did not create; "
880
+ "`rm -rf %s/%s` removes it if it is yours."
881
+ % (out.plain(row), at, out.plain(row)), wrap=True)
882
+ if refused:
883
+ # The derived set, not a `<repo>/<dotdir>/skills/<name>`
884
+ # shape: the leaf comes from the agent's `dir`, so the shape
885
+ # told a user with a renamed skills dir that their path was
886
+ # not one an install writes — directly above a shape it
887
+ # matched. And worded as what boost *removes* rather than
888
+ # what an install *writes*, because the set keeps disabled
889
+ # agents on purpose and an install skips them.
890
+ #
891
+ # Gated on `refused` alone. A redirected row is in `expected`
892
+ # by construction, so printing this under one contradicts the
893
+ # line above it; its own message carries its own remedy.
894
+ expected = info.get("expected") or []
895
+ out.info(("boost only removes %s here. The lock entry is gone "
896
+ "from your working copy; the directory is not, so "
897
+ "remove it by hand if it is not yours."
898
+ % ", ".join(expected)) if expected else
899
+ ("boost cannot derive where this skill installs, so "
900
+ "every row was left alone; remove the directories "
901
+ "by hand if they are yours"), wrap=True)
839
902
  unregistered = info.get("mcp_unregistered") or []
840
903
  if unregistered:
841
904
  from ..core import mcpdecl
@@ -246,6 +246,44 @@ def resolve_in_base(base, rel: str) -> Path | None:
246
246
  return candidate
247
247
 
248
248
 
249
+ def parent_matches_spelling(base, rel: str) -> bool:
250
+ """True when walking to ``rel``'s parent is not redirected on the way.
251
+
252
+ The third question about a committed path, and the one the other two miss.
253
+ :func:`contains` resolves and answers "does this end up inside the repo?".
254
+ :func:`resolve_in_base` returns the path *unresolved*, so an identity check
255
+ can compare the strings an install writes. Between them sits a row that is
256
+ contained, and spelled exactly like a legal path, and still points
257
+ somewhere else: a committed ``<repo>/.claude/skills -> ../src`` makes the
258
+ row ``.claude/skills/<name>`` string-equal to the legal target while
259
+ denoting ``src/<name>``. The leaf is honest and an ancestor is not, so a
260
+ guard that only inspects the leaf walks straight through it and
261
+ ``rmtree`` takes the victim.
262
+
263
+ So the parent is walked for real and compared against where the spelling
264
+ says it should be, anchored on the **real** base. ``realpath`` on both
265
+ sides, because a repo can sit *under* a symlink without containing one —
266
+ a checkout below ``/tmp`` on macOS, a home directory behind an automount,
267
+ a worktree reached through a convenience link. Resolve the walk and not
268
+ the base and every row of such a repo is compared real-against-nominal,
269
+ matches nothing, and is refused. The symlinked-base test builds that
270
+ link itself rather than relying on the runner's ``$TMPDIR``, which pytest
271
+ resolves before a test ever sees it.
272
+
273
+ The leaf itself is deliberately left unresolved. A materialization that
274
+ *is* a symlink is boost's own, and ``util.remove_path`` unlinks it without
275
+ following it — judging it by what it points at is the bug one layer down.
276
+ """
277
+ if not rel or not isinstance(rel, str) or Path(rel).is_absolute():
278
+ return False
279
+ try:
280
+ anchor = Path(os.path.realpath(base))
281
+ return Path(os.path.realpath((Path(base) / rel).parent)) == (
282
+ anchor / rel).parent
283
+ except (OSError, ValueError):
284
+ return False
285
+
286
+
249
287
  def contains(base, path) -> bool:
250
288
  """True when ``path`` sits inside ``base`` — the guard before any delete.
251
289
 
@@ -1327,12 +1327,106 @@ def _install_project_skill(entry: dict, force: bool = False,
1327
1327
  return res
1328
1328
 
1329
1329
 
1330
+ def project_skill_targets(base, name: str) -> set[Path]:
1331
+ """Every path a project install of ``name`` could legally have written.
1332
+
1333
+ :func:`_install_project_skill` writes exactly
1334
+ ``<base>/<dotdir>/<skills dir>/<name>``, once per agent, so the legal set is
1335
+ small and *derivable* — which is the point. :func:`uninstall_project` reads
1336
+ its paths out of a committed lock file and so must decide "is this mine?"
1337
+ from the agent table rather than from the record being checked.
1338
+
1339
+ Built from :func:`agents.known_agents` filtered on ``project_scope``, and
1340
+ deliberately **not** on ``enabled``. An agent turned off after the install
1341
+ still has its directory in the repo, and a legal-set that forgot it would
1342
+ turn ``uninstall`` into a command that silently leaves real directories
1343
+ behind — trading a delete bug for an orphan bug. Disabling an agent stops
1344
+ boost writing there; it does not stop boost cleaning up what it wrote.
1345
+
1346
+ Derived from *this* machine's config, which has a cost worth stating: the
1347
+ project lock is committed and read on other people's machines, so any drift
1348
+ between the config that wrote a row and the config that reads it refuses a
1349
+ directory a real install wrote. An agent deleted from ``config.json``, one
1350
+ hand-added on a teammate's machine but not here, one whose ``dir`` was
1351
+ renamed since — all three leave the copy in the repo rather than removing
1352
+ it. That is deliberate and it is the fail-closed direction: the user is
1353
+ told which row was skipped *and* what boost removes here, so the drift is
1354
+ on screen and the directory can go by hand. The other way round, boost
1355
+ deletes a path it can no longer explain — and the alternative that would
1356
+ cover drift (checking the path's *shape* rather than deriving it) reads the
1357
+ dotdir back out of the lock, which is the attacker-controlled input this
1358
+ whole function exists not to trust.
1359
+ """
1360
+ out: set[Path] = set()
1361
+ for agent, spec in agents.known_agents().items():
1362
+ if not spec.get("project_scope"):
1363
+ continue
1364
+ skills_dir = spec["dir"]
1365
+ try:
1366
+ out.add(scopes.skill_target(
1367
+ skills_dir, name, base=base,
1368
+ dotdir=agents.project_dotdir(agent, skills_dir)))
1369
+ except BoostError:
1370
+ # An unusable skill name is the *caller's* problem to report, not
1371
+ # a reason for the legal set to be wrong. Nothing matches it.
1372
+ return set()
1373
+ return out
1374
+
1375
+
1330
1376
  def uninstall_project(name: str, base=None) -> dict:
1331
1377
  """Remove a project-scoped skill: its per-agent copies and its lock entry.
1332
1378
 
1333
- Every recorded path is re-derived and checked to sit inside the project
1334
- before it is deleted (:func:`scopes.contains`) — the lock is a committed file
1335
- anyone with merge rights can edit, so a path out of it is input, not truth.
1379
+ Every recorded path is re-derived and checked against the set of paths an
1380
+ install could have produced (:func:`project_skill_targets`) — the lock is a
1381
+ committed file anyone with merge rights can edit, so a path out of it is
1382
+ input, not truth.
1383
+
1384
+ Containment inside the project was the whole guard and is not enough:
1385
+ ``{"path": "src/core"}`` is inside the base, so it passed, and the repo's
1386
+ own source tree was removed under a command the user typed with boost
1387
+ having already said the path was safe. Being *inside the project* is the
1388
+ weaker property; being *a path this install writes* is the real one, and
1389
+ it is derivable.
1390
+
1391
+ Derivable, and then checked twice, because a path is a string and a place.
1392
+ The string must be in the derived set, and the walk to it must not be
1393
+ redirected by a committed symlink at an ancestor — ``.claude/skills -> src``
1394
+ makes the legal spelling denote ``src/<name>``, so a set-membership test
1395
+ alone passes it *by construction*. The first revision of this change
1396
+ shipped with exactly that open. :func:`scopes.parent_matches_spelling` is
1397
+ the second half.
1398
+
1399
+ Rows boost will not act on come back in three lists, because the remedy
1400
+ differs. ``refused`` is a contained row that is not one of the paths an
1401
+ uninstall removes here. ``escaped`` is one containment stopped outright —
1402
+ absolute, climbing out with ``..``, or sitting on a symlink that resolves
1403
+ out of the repo — which may well be a path an install writes, with the lie
1404
+ in the filesystem rather than in the string. ``redirected`` is the third
1405
+ and the quiet one: a row *in* the derived set whose walk is bent by a
1406
+ committed symlink at an ancestor. None is deleted and all three are
1407
+ reported; an escaped row used to be dropped in silence, and a redirected
1408
+ one used to be reported as ``refused``, which printed "not a path boost
1409
+ removes here" directly above a list containing that exact string.
1410
+
1411
+ A ``redirected`` row is also where install and uninstall disagree, and the
1412
+ disagreement is deliberate. ``_install_project_skill`` gates on
1413
+ :func:`scopes.ensure_in_base`, which is containment only, so
1414
+ ``boost install --local`` writes straight through an in-repo
1415
+ ``<repo>/.cursor -> config/cursor`` and records the row it spelled.
1416
+ Uninstall will not delete through that redirect, because a committed
1417
+ symlink is input: the benign layout and the attack
1418
+ (``.claude/skills -> ../src``) are byte-identical on disk, and no test
1419
+ distinguishes the intent behind them. Creating through a redirect is safe
1420
+ and destroying through one is not, so the asymmetry is the right way
1421
+ round — but it does leave boost's own copy behind, which the message says
1422
+ by path. Making install refuse too is its own card.
1423
+
1424
+ The lock entry goes in all four cases (see the ``refused`` note in the
1425
+ body), so the command still exits 0 on an all-refused run. That is also
1426
+ why a redirected row does not hold the entry open: an attacker commits a
1427
+ redirect as easily as a doctored path, so keeping it would be the same
1428
+ denial of service by another route. ``uninstall`` has no ``--json``, so
1429
+ the warning lines are the whole signal a caller gets.
1336
1430
  """
1337
1431
  resolved_base = _resolve_base(scopes.SCOPE_PROJECT, base)
1338
1432
  entry = projectlock.get_skill(resolved_base, name) if resolved_base else None
@@ -1340,8 +1434,64 @@ def uninstall_project(name: str, base=None) -> dict:
1340
1434
  raise BoostError("%s is not installed in this project" % name,
1341
1435
  hint="see what is with `boost list --local`")
1342
1436
  removed: list[str] = []
1437
+ refused: list[str] = []
1438
+ redirected: list[str] = []
1439
+ escaped: list[str] = []
1440
+ gone = 0
1441
+ legal = project_skill_targets(resolved_base, name)
1343
1442
  for m in entry.get("materializations") or []:
1443
+ row = str(m.get("path"))
1344
1444
  path = scopes.resolve_in_base(resolved_base, m.get("path"))
1445
+ if path is None:
1446
+ # Empty, absolute, climbing out with `..` — or spelled legally and
1447
+ # sitting on a symlink that resolves out of the repo, which
1448
+ # `contains` catches because it resolves. Containment already
1449
+ # stopped the delete; what was missing is saying so. This was the
1450
+ # one doctored row that produced *no* output at all, under a
1451
+ # change whose whole argument is that a silent survival teaches
1452
+ # the user nothing. Kept apart from `refused` because the two need
1453
+ # different words: this row may well be a path an install writes,
1454
+ # with the lie in the filesystem rather than in the string.
1455
+ escaped.append(row)
1456
+ continue
1457
+ # Identity, in two parts, because a path is a string *and* a place.
1458
+ #
1459
+ # The string must be one an install writes, compared **unresolved**,
1460
+ # and that is load-bearing rather than incidental: resolving both
1461
+ # sides reopens the hole this function closes. The legal path is
1462
+ # itself a repo path, so a commit can make `.claude/skills/<name>` a
1463
+ # *symlink* to `src/core` and file a row of `src/core`; both sides
1464
+ # then resolve to `<base>/src/core`, the row is accepted, and the
1465
+ # source tree is deleted again. Resolving is strictly weaker in the
1466
+ # benign direction too — a user's own `<repo>/my-link ->
1467
+ # .claude/skills/<name>` starts matching, and boost unlinks an alias
1468
+ # it never created.
1469
+ #
1470
+ # And the walk to it must not be redirected, which comparing strings
1471
+ # cannot tell on its own. `<repo>/.claude/skills` committed as a
1472
+ # symlink to `src` leaves the row `.claude/skills/<name>` *equal to
1473
+ # the legal path by construction* while denoting `src/<name>`:
1474
+ # `is_dir()` follows the ancestor happily and `rmtree` takes the
1475
+ # victim, which is this card's bug one component up. The leaf is
1476
+ # honest and the ancestor is not, so the leaf-only check sees nothing.
1477
+ # `scopes.parent_matches_spelling` walks the parent for real.
1478
+ #
1479
+ # Pinned by `test_a_legal_path_symlinked_at_an_in_repo_target_stays_a_
1480
+ # string`, `test_a_users_own_symlink_to_the_skill_dir_is_refused` and
1481
+ # `test_a_symlinked_skills_dir_does_not_redirect_the_delete`.
1482
+ #
1483
+ # The two halves fail differently and are reported differently. A row
1484
+ # outside the derived set is not a path an uninstall writes here. A row
1485
+ # *in* the set whose walk is redirected is the opposite — it is in
1486
+ # `expected` by construction, so folding it into `refused` printed "not
1487
+ # a path boost removes here" directly above a list containing that
1488
+ # exact string.
1489
+ if path not in legal:
1490
+ refused.append(row)
1491
+ continue
1492
+ if not scopes.parent_matches_spelling(resolved_base, row):
1493
+ redirected.append(row)
1494
+ continue
1345
1495
  # `resolve_in_base` checks containment against the *resolved* path but
1346
1496
  # returns the unresolved one, so a materialization recorded as a
1347
1497
  # symlink arrives here as a symlink. A link out of the project was
@@ -1357,10 +1507,18 @@ def uninstall_project(name: str, base=None) -> dict:
1357
1507
  # link rather than through it — must not decide it by accident. A link
1358
1508
  # is still removed whatever it points at, because the link is boost's
1359
1509
  # and unlinking it leaves the target untouched.
1360
- if path is None or not (path.is_symlink() or path.is_dir()):
1361
- continue # refused, absent, or a file we did not create
1510
+ if not (path.is_symlink() or path.is_dir()):
1511
+ continue # absent, or a plain file we did not create
1362
1512
  if not util.remove_path(path):
1363
1513
  continue # vanished between the check and the call
1514
+ gone += 1
1515
+ # `removed` is the *agent* list, and a lock row need not name one. The
1516
+ # delete above is not gated on `agent` and must not be: an agentless
1517
+ # row at a legal path is still the skill's own directory. So the count
1518
+ # of what came off disk is tracked separately — gating the caller's
1519
+ # "removed from <repo>" line on the agent list told a user whose lock
1520
+ # had an agentless row that nothing had been removed, while the
1521
+ # directory was gone.
1364
1522
  if m.get("agent"):
1365
1523
  removed.append(m["agent"])
1366
1524
  projectlock.remove_skill(resolved_base, name)
@@ -1371,6 +1529,30 @@ def uninstall_project(name: str, base=None) -> dict:
1371
1529
  unregistered = unregister_project_mcp(resolved_base, name)
1372
1530
  journal.log("uninstall", name, scope=scopes.SCOPE_PROJECT)
1373
1531
  return {"name": name, "unlinked": removed, "entry": entry,
1532
+ # How many paths actually came off disk, which `unlinked` does not
1533
+ # answer — see the `gone` note in the body.
1534
+ "removed_count": gone,
1535
+ "refused": refused,
1536
+ # In the legal set, but an ancestor of the row is a symlink, so the
1537
+ # walk to it is redirected. Its own list because the remedy is the
1538
+ # opposite of `refused`'s: this *is* a path boost writes, and the
1539
+ # spelling the user is shown still removes it by hand, since `rm`
1540
+ # follows the ancestor the way the install did.
1541
+ "redirected": redirected,
1542
+ # Rows the containment check stopped. Separate from `refused`
1543
+ # because the remedy differs: a refused row is not a path an
1544
+ # install writes, where an escaped one may be exactly that with a
1545
+ # symlink under it that leaves the repo.
1546
+ "escaped": escaped,
1547
+ # What an install writes *here*. The refusal message used to spell
1548
+ # the shape out as `<repo>/<agent dotdir>/skills/<name>`, which
1549
+ # hardcodes a leaf that comes from `spec["dir"]` — so for a renamed
1550
+ # skills dir it told the user their path was "not a path a project
1551
+ # install writes" directly above a shape that path matched. Naming
1552
+ # the derived set instead is true under any config, and it is what
1553
+ # puts config drift on screen.
1554
+ "expected": sorted(scopes.relative_to_base(resolved_base, p)
1555
+ for p in legal),
1374
1556
  "mcp_unregistered": unregistered, "kind": "skill",
1375
1557
  "scope": scopes.SCOPE_PROJECT, "base": str(resolved_base)}
1376
1558
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.167
3
+ Version: 1.2.169
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -474,6 +474,7 @@ docs/roadmap/items/install-path-disambiguation.md
474
474
  docs/roadmap/items/install-paths-that-still-drop-the-result.md
475
475
  docs/roadmap/items/install-resolves-skill-dependencies.md
476
476
  docs/roadmap/items/install-scope-user-or-project.md
477
+ docs/roadmap/items/install-writes-through-a-redirected-dotdir-uninstall-will-not.md
477
478
  docs/roadmap/items/installed-skill-trust-audit.md
478
479
  docs/roadmap/items/integrity-verification-boost-verify.md
479
480
  docs/roadmap/items/internal-architecture-diagrams.md
Binary file
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: install-writes-through-a-redirected-dotdir-uninstall-will-not
3
+ board: code
4
+ section: trust
5
+ status: planned
6
+ category: Core · Security
7
+ complexity: M
8
+ impact: Low
9
+ wow: 2
10
+ note: install gates on containment and writes through an in-repo symlinked dotdir; uninstall refuses to delete through one, so the copy is orphaned
11
+ order: 357
12
+ title: "<code>install --local</code> writes through a redirected dotdir that <code>uninstall --local</code> will not remove"
13
+ ---
14
+ A repo that commits <code>&lt;repo&gt;/.cursor &rarr; config/cursor</code> &mdash; an ordinary
15
+ dotfile layout, not an attack &mdash; gets two different answers from the two halves of the same
16
+ command. <code>_install_project_skill</code> gates its target with
17
+ <code>scopes.ensure_in_base</code>, which is containment only, so <code>boost install --local</code>
18
+ writes <code>config/cursor/skills/&lt;name&gt;</code> and records the row it spelled,
19
+ <code>.cursor/skills/&lt;name&gt;</code>. <code>boost uninstall --local</code> then refuses that row,
20
+ because <code>scopes.parent_matches_spelling</code> walks the parent for real and finds the
21
+ redirect. Boost's own copy is left on disk and the lock entry goes anyway, so a second uninstall
22
+ answers <em>not installed in this project</em>.
23
+
24
+ Reproduced on the commit that introduced the guard: install wrote through the symlink, uninstall
25
+ reported the row as <code>redirected</code>, and the directory survived.
26
+
27
+ <b>The uninstall side is right and is not the thing to change.</b> The benign layout and the attack
28
+ are byte-identical on disk: <code>.claude/skills &rarr; ../src</code> with a legally-spelled lock row
29
+ is the same two objects in the same two places, and nothing in the filesystem carries the intent
30
+ behind them. Creating through a redirect is safe; destroying through one hands an attacker with
31
+ merge rights an <code>rmtree</code> aimed wherever the symlink points. So the asymmetry stays, and
32
+ <code>uninstall</code> now names the row, says a symlink redirects it, and prints an
33
+ <code>rm -rf</code> that works &mdash; because <code>rm</code> follows the ancestor exactly as the
34
+ install did (shipped in #1016).
35
+
36
+ What is left is the other half: <b>install should not write somewhere uninstall cannot reach.</b>
37
+ The options are not equivalent and the choice needs measuring rather than guessing &mdash; refuse
38
+ the install outright (safe, breaks a layout that works today); record the <em>resolved</em> path in
39
+ the lock so uninstall's walk agrees (keeps the layout, but the lock then carries a path the repo
40
+ never spells, and a teammate whose clone resolves differently gets a row that matches nothing); or
41
+ record both and match on either (most forgiving, widest attack surface to re-audit). Whichever
42
+ lands, <code>boost doctor</code> should report a project whose lock rows no longer resolve to where
43
+ the install put them, since today nothing notices until an uninstall leaves a directory behind.
44
+
45
+ Related: <code>project-uninstall-deletes-any-in-repo-directory-the-lock-names</code>, which added
46
+ the walk and the <code>redirected</code> reporting this card inherits.
@@ -0,0 +1,118 @@
1
+ ---
2
+ id: project-uninstall-deletes-any-in-repo-directory-the-lock-names
3
+ board: code
4
+ section: trust
5
+ status: shipped
6
+ category: Core · Security
7
+ complexity: S
8
+ impact: Med
9
+ wow: 3
10
+ note: a materialization path of src/core passes the containment check and is removed
11
+ order: 356
12
+ owner: loop/uninstall-local-dotdir-guard
13
+ pr: 1016
14
+ title: "<code>uninstall --local</code> deletes any in-repo directory the committed lock names"
15
+ ---
16
+ <code>store.uninstall_project</code> re-derives every recorded materialization through
17
+ <code>scopes.resolve_in_base</code> and refuses anything outside the project &middot; the guard
18
+ works, and the verification of PR #998 confirmed a planted victim outside the repo survives every
19
+ escape attempt. What it does not check is that the path is an <em>agent skills directory</em>. A
20
+ lock row reading <code>{"path": "src/core"}</code> is inside the base, so it passes, and
21
+ <code>util.rmtree</code> removes the repo's source tree (store.py:1296-1300).
22
+
23
+ <code>.boost/skill-lock.json</code> is a committed file: whoever can land a commit can write that
24
+ row, and the victim runs one ordinary <code>boost uninstall &lt;skill&gt; --local</code>. That is a
25
+ narrower threat than it sounds &mdash; someone who can commit to your repo can also commit a
26
+ <code>Makefile</code> &mdash; but this is the one path where the damage happens under a boost
27
+ command the user typed, with boost's own containment check having already said yes.
28
+
29
+ <b>Shipped.</b> <code>store.project_skill_targets(base, name)</code> derives the whole legal set
30
+ &mdash; <code>_install_project_skill</code> writes
31
+ <code>&lt;base&gt;/&lt;dotdir&gt;/&lt;skills dir&gt;/&lt;name&gt;</code> and nothing else &mdash;
32
+ and <code>uninstall_project</code> now asks "is this a path an install writes?" rather than only
33
+ "is this inside the repo?". A row that is not in the set is returned in <code>refused</code> and
34
+ left on disk; <code>boost uninstall --local</code> names it <em>and prints the derived set
35
+ beside it</em>, because the row is in a committed file and a silent survival teaches the user
36
+ nothing. Printing the set rather than a <code>&lt;repo&gt;/&lt;agent
37
+ dotdir&gt;/skills/&lt;name&gt;</code> shape matters: the leaf comes from the agent's
38
+ <code>dir</code>, so for a renamed skills dir the old wording told the user their path was not
39
+ one an install writes directly above a shape that path matched.
40
+
41
+ <b>Two decisions the obvious fix gets wrong.</b> The set is built from
42
+ <code>known_agents()</code> filtered on <code>project_scope</code> and deliberately <em>not</em>
43
+ on <code>enabled</code>: an agent switched off after the install still has its copy in the repo,
44
+ and a legal set that forgot it would trade this delete bug for an orphan bug in the command whose
45
+ job is to clean up. And the lock entry is removed even when a row is refused &mdash; otherwise the
46
+ one doctored row pins the entry forever and the skill can never be uninstalled.
47
+
48
+ <b>The leaf name is part of the identity, and so is comparing strings.</b> Matching "under an
49
+ agent dotdir" would let <code>.claude/skills/&lt;other skill&gt;</code> through, so <code>boost
50
+ uninstall --local a</code> would take <code>b</code> with it. The comparison is against the exact
51
+ path, <em>unresolved</em>, and that half is load-bearing too: the legal path is a repo path, so a
52
+ commit can make <code>.claude/skills/&lt;name&gt;</code> a symlink to <code>src/core</code> and
53
+ file a row of <code>src/core</code>. Resolve both sides and they meet at the victim &mdash; the
54
+ whole bug, re-entered through the comparison instead of the containment check.
55
+
56
+ <b>A path is a string <em>and</em> a place, and the first revision only checked the string.</b>
57
+ Set membership is equal <em>by construction</em> when the row is spelled as the legal path, so a
58
+ committed <code>&lt;repo&gt;/.claude/skills &rarr; src</code> left the row
59
+ <code>.claude/skills/&lt;name&gt;</code> passing every check while denoting
60
+ <code>src/&lt;name&gt;</code>: <code>is_dir()</code> follows the ancestor, <code>rmtree</code>
61
+ takes the victim, and the probe printed <code>refused=[]</code>. The leaf is honest and the
62
+ ancestor is not, which is precisely what a leaf-only guard cannot see &mdash; this card's own bug,
63
+ one component up, shipped open in the first revision and found by the verification pass.
64
+ <code>scopes.parent_matches_spelling</code> walks the parent for real and compares it against
65
+ where the spelling says it should be, anchored on <code>realpath(base)</code>. Both sides real: a
66
+ repo can sit <em>under</em> a symlink without containing one &mdash; a checkout below
67
+ <code>/tmp</code>, a home behind an automount, a worktree reached through a convenience link
68
+ &mdash; and resolving the walk but not the base compares real against nominal, matches nothing,
69
+ and refuses every row of that repo. Its test builds the link itself rather than leaning on the
70
+ runner's <code>$TMPDIR</code>, which pytest resolves before a test sees it; an earlier draft of
71
+ this paragraph claimed the opposite, and re-measuring the table is what caught it.
72
+
73
+ <b>Three refusal lists, because they need different words.</b> <code>refused</code> is a
74
+ contained row that is not a path an uninstall removes here; <code>escaped</code> is one
75
+ containment stopped outright, which may well be a path an install writes with the lie in the
76
+ filesystem rather than the string; <code>redirected</code> is a row <em>in</em> the derived set
77
+ whose walk a committed symlink bends. An escaped row used to fall through every branch to a bare
78
+ <code>continue</code> &mdash; no deletion, and no output either, so the most hostile row in the
79
+ set was the one that left no trace. A redirected row is worse than silent: folded into
80
+ <code>refused</code> it printed "not a path boost removes here" three lines above a list
81
+ containing that exact string, because it is in that list <em>by construction</em>. It now says a
82
+ symlink redirects the path and prints an <code>rm -rf</code> that works, since <code>rm</code>
83
+ follows the ancestor the way the install did.
84
+
85
+ <b>And that row is where install and uninstall disagree, deliberately.</b>
86
+ <code>_install_project_skill</code> gates on <code>scopes.ensure_in_base</code> &mdash;
87
+ containment only &mdash; so <code>install --local</code> writes straight through a committed
88
+ <code>&lt;repo&gt;/.cursor &rarr; config/cursor</code>, and uninstall then will not delete through
89
+ it, leaving boost's own copy behind. The benign layout and the attack are byte-identical on disk,
90
+ so nothing distinguishes the intent: creating through a redirect is safe and destroying through
91
+ one is not, and that is the right way round. Fixing the install side is
92
+ <code>install-writes-through-a-redirected-dotdir-uninstall-will-not</code>. The two tests that
93
+ set that layout up are skipped on Windows, where <code>install</code> cannot stage a copy
94
+ through a relative directory symlink at all &mdash; the guard is still covered there by the two
95
+ ancestor tests, which symlink after the install rather than before it. And the success line is now gated on a count of what actually came off disk, not on
96
+ <code>unlinked</code>: an all-refused uninstall printed "removed from &lt;repo&gt;" over an empty
97
+ removal, which is the green panel this whole change exists to stop the user trusting &mdash; and
98
+ gating it on the <em>agent</em> list then told the same lie backwards, since a lock row need not
99
+ name an agent and the delete is not gated on one. It still exits 0, because the lock entry does
100
+ go; <code>uninstall</code> has no <code>--json</code>, so the warning lines are the whole signal a
101
+ scripted caller gets.
102
+
103
+ <b>The cost, stated.</b> The legal set comes from <em>this</em> machine's agent table while the
104
+ lock is committed and read on others, so config drift refuses a directory a real install wrote:
105
+ an agent hand-added on a teammate's machine, or one whose <code>dir</code> was renamed since. The
106
+ copy stays in the repo and the lock entry goes, so the user is told by path and has to remove it
107
+ by hand. That is deliberate. The alternative that would cover drift &mdash; checking the path's
108
+ <em>shape</em> rather than deriving it &mdash; reads the dotdir back out of the lock, which is the
109
+ attacker-controlled input the guard exists not to trust.
110
+
111
+ Related: <code>util-rmtree-chmods-a-symlink-target-outside-the-tree</code>, and
112
+ <code>is-dir-follows-a-symlink-at-eleven-rmtree-call-sites</code>, which brought
113
+ <code>util.remove_path</code> in. Its
114
+ <code>test_a_materialization_naming_a_plain_file_is_left_alone</code> deferred the wider "what may
115
+ a lock row name?" question by name, and this change had quietly made that test vacuous &mdash; it
116
+ pointed at <code>pyproject.toml</code>, which the new identity check refuses two guards before the
117
+ type check it exists to pin. It now names a legal path holding a plain file, so the guard is what
118
+ saves the file again.