boost-skill-cli 1.2.89__tar.gz → 1.2.90__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 (961) hide show
  1. {boost_skill_cli-1.2.89/boost_skill_cli.egg-info → boost_skill_cli-1.2.90}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/hooks.py +5 -2
  4. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/intelligence.py +16 -6
  5. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/quality.py +6 -3
  6. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/team.py +20 -8
  7. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/claude_settings.py +29 -12
  8. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/config.py +33 -16
  9. boost_skill_cli-1.2.90/boost_cli/core/jsonstate.py +76 -0
  10. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/registry.py +12 -0
  11. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  12. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  13. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/DEBUGGING.md +36 -0
  14. boost_skill_cli-1.2.90/docs/demo.gif +0 -0
  15. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +7 -3
  16. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-drift-findings.md +4 -4
  17. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap.html +9 -4
  18. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_hooks.py +26 -0
  19. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_quality.py +14 -0
  20. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_team.py +23 -0
  21. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_claude_settings.py +37 -1
  22. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_config.py +51 -0
  23. boost_skill_cli-1.2.90/tests/unit/test_drift_hint.py +55 -0
  24. boost_skill_cli-1.2.90/tests/unit/test_jsonstate.py +100 -0
  25. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry.py +28 -0
  26. boost_skill_cli-1.2.89/docs/demo.gif +0 -0
  27. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.gitattributes +0 -0
  28. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.gitignore +0 -0
  29. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.gitleaks.toml +0 -0
  30. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.htmlvalidate.json +0 -0
  31. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.lighthouserc.json +0 -0
  32. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.lycheeignore +0 -0
  33. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.markdownlint-cli2.jsonc +0 -0
  34. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.pre-commit-config.yaml +0 -0
  35. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.stylelintrc.json +0 -0
  36. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale/styles/boost/AIWriting.yml +0 -0
  37. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale/styles/boost/Terminology.yml +0 -0
  38. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  39. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale.ini +0 -0
  40. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/CLAUDE.md +0 -0
  41. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/CODE_OF_CONDUCT.md +0 -0
  42. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/CONTRIBUTING.md +0 -0
  43. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/DCO +0 -0
  44. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/GOVERNANCE.md +0 -0
  45. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/LICENSE +0 -0
  46. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/MAINTAINERS.md +0 -0
  47. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/MANIFEST.in +0 -0
  48. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/Makefile +0 -0
  49. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/README.md +0 -0
  50. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/SECURITY.md +0 -0
  51. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/SUPPORT.md +0 -0
  52. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost +0 -0
  53. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/__init__.py +0 -0
  54. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/__main__.py +0 -0
  55. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/cli.py +0 -0
  56. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/cliparse.py +0 -0
  57. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/__init__.py +0 -0
  58. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/_common.py +0 -0
  59. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/bmad.py +0 -0
  60. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/configuration.py +0 -0
  61. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/discovery.py +0 -0
  62. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/info.py +0 -0
  63. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/pkg.py +0 -0
  64. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/quickstart.py +0 -0
  65. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/run.py +0 -0
  66. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/safety.py +0 -0
  67. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/taps.py +0 -0
  68. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/__init__.py +0 -0
  69. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/adapters.py +0 -0
  70. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/agents.py +0 -0
  71. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/ai.py +0 -0
  72. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/aihost.py +0 -0
  73. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/bmad.py +0 -0
  74. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/bootstrap.py +0 -0
  75. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/browse.py +0 -0
  76. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/builtin.py +0 -0
  77. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/capabilities.py +0 -0
  78. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/catalog.py +0 -0
  79. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/catalogbundle.py +0 -0
  80. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/chat.py +0 -0
  81. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/complete.py +0 -0
  82. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/dense.py +0 -0
  83. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/ed25519.py +0 -0
  84. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/embed.py +0 -0
  85. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/faithfulness.py +0 -0
  86. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/frontmatter.py +0 -0
  87. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/gitutil.py +0 -0
  88. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/hookhost.py +0 -0
  89. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/imperative.py +0 -0
  90. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/injectscan.py +0 -0
  91. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/installscan.py +0 -0
  92. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/integrity.py +0 -0
  93. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/journal.py +0 -0
  94. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/localembed.py +0 -0
  95. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/lockfile.py +0 -0
  96. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/logs.py +0 -0
  97. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/mcp.py +0 -0
  98. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/mcpdecl.py +0 -0
  99. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/mcphost.py +0 -0
  100. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/minisign.py +0 -0
  101. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/nethttp.py +0 -0
  102. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/output.py +0 -0
  103. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/paths.py +0 -0
  104. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/policy.py +0 -0
  105. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/projectlock.py +0 -0
  106. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/provenance.py +0 -0
  107. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/rag.py +0 -0
  108. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/resolve.py +0 -0
  109. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/rules.py +0 -0
  110. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/scopes.py +0 -0
  111. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/secretscan.py +0 -0
  112. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/selfupdate.py +0 -0
  113. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/serve.py +0 -0
  114. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/shards.py +0 -0
  115. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/stackprobe.py +0 -0
  116. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/staleness.py +0 -0
  117. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/store.py +0 -0
  118. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/trustaudit.py +0 -0
  119. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/typedvalue.py +0 -0
  120. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/typosquat.py +0 -0
  121. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/updatediff.py +0 -0
  122. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/util.py +0 -0
  123. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/workflows.py +0 -0
  124. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/data/registries.json +0 -0
  125. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/data/rules/boost-first.mdc +0 -0
  126. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/errors.py +0 -0
  127. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/spin.py +0 -0
  128. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/__init__.py +0 -0
  129. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/_compat.py +0 -0
  130. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/graph.py +0 -0
  131. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/loader.py +0 -0
  132. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/py.typed +0 -0
  133. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/retriever.py +0 -0
  134. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  135. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  136. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/requires.txt +0 -0
  137. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/top_level.txt +0 -0
  138. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/codecov.yml +0 -0
  139. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/.claude/settings.local.json +0 -0
  140. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/adapters.html +0 -0
  141. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/README.md +0 -0
  142. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-components-core.md +0 -0
  143. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-containers.md +0 -0
  144. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-context.md +0 -0
  145. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-dynamic-install.md +0 -0
  146. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/bmad.md +0 -0
  147. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/distill.gif +0 -0
  148. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/doctor.gif +0 -0
  149. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/explain.gif +0 -0
  150. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/hooks.gif +0 -0
  151. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/install.gif +0 -0
  152. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/pulse.gif +0 -0
  153. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/search.gif +0 -0
  154. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/tap.gif +0 -0
  155. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/distill.tape +0 -0
  156. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/doctor.tape +0 -0
  157. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/explain.tape +0 -0
  158. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/hooks.tape +0 -0
  159. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/install.tape +0 -0
  160. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/pulse.tape +0 -0
  161. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/search.tape +0 -0
  162. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/tap.tape +0 -0
  163. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel.html +0 -0
  164. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/chat.html +0 -0
  165. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/code-review.md +0 -0
  166. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/commands.html +0 -0
  167. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/commit-audit.md +0 -0
  168. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/demo-index.json +0 -0
  169. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/demo.html +0 -0
  170. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/demo.tape +0 -0
  171. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/dependencies.md +0 -0
  172. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/design-roadmap.html +0 -0
  173. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/eval-latest.json +0 -0
  174. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/eval.html +0 -0
  175. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/index.html +0 -0
  176. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/langchain.html +0 -0
  177. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/mcp-hub.html +0 -0
  178. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/openssf-badge.md +0 -0
  179. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/openssf-playbook.md +0 -0
  180. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/rag-architecture.md +0 -0
  181. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D01.md +0 -0
  182. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D02.md +0 -0
  183. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D03.md +0 -0
  184. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D04.md +0 -0
  185. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D05.md +0 -0
  186. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D06.md +0 -0
  187. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D07.md +0 -0
  188. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D08.md +0 -0
  189. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D09.md +0 -0
  190. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D10.md +0 -0
  191. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D11.md +0 -0
  192. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D12.md +0 -0
  193. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D13.md +0 -0
  194. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D14.md +0 -0
  195. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D15.md +0 -0
  196. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D16.md +0 -0
  197. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D17.md +0 -0
  198. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D18.md +0 -0
  199. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D19.md +0 -0
  200. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D20.md +0 -0
  201. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D21.md +0 -0
  202. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D22.md +0 -0
  203. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D23.md +0 -0
  204. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D24.md +0 -0
  205. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D25.md +0 -0
  206. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D26.md +0 -0
  207. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D27.md +0 -0
  208. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  209. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  210. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  211. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  212. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  213. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  214. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  215. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  216. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  217. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  218. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-absorb-findings.md +0 -0
  219. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-adapt-findings.md +0 -0
  220. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
  221. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
  222. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +0 -0
  223. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-attest-findings.md +0 -0
  224. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-audit-findings.md +0 -0
  225. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-bmad-findings.md +0 -0
  226. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-browse-findings.md +0 -0
  227. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-bundle-findings.md +0 -0
  228. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-catalog-findings.md +0 -0
  229. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
  230. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-changelog-findings.md +0 -0
  231. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-chat-findings.md +0 -0
  232. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
  233. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
  234. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-cohort-findings.md +0 -0
  235. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-completions-findings.md +0 -0
  236. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-config-findings.md +0 -0
  237. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
  238. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-context-findings.md +0 -0
  239. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
  240. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-create-findings.md +0 -0
  241. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
  242. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-deps-findings.md +0 -0
  243. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-discover-findings.md +0 -0
  244. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
  245. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-doctor-findings.md +0 -0
  246. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
  247. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-edit-findings.md +0 -0
  248. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-evolve-findings.md +0 -0
  249. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-explain-findings.md +0 -0
  250. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-export-findings.md +0 -0
  251. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
  252. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
  253. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
  254. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
  255. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
  256. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-health-findings.md +0 -0
  257. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
  258. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
  259. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-import-findings.md +0 -0
  260. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-index-findings.md +0 -0
  261. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
  262. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
  263. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-install-findings.md +0 -0
  264. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
  265. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
  266. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-lint-findings.md +0 -0
  267. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-log-findings.md +0 -0
  268. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
  269. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-mcp-findings.md +0 -0
  270. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
  271. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
  272. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
  273. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-onboard-findings.md +0 -0
  274. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
  275. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
  276. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-outdated-findings.md +0 -0
  277. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
  278. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
  279. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-policy-findings.md +0 -0
  280. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-preview-findings.md +0 -0
  281. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-profile-findings.md +0 -0
  282. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
  283. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-protocol-findings.md +0 -0
  284. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-pulse-findings.md +0 -0
  285. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
  286. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
  287. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
  288. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-recommend-findings.md +0 -0
  289. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-reindex-findings.md +0 -0
  290. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
  291. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-replay-findings.md +0 -0
  292. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-root-findings.md +0 -0
  293. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
  294. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-run-findings.md +0 -0
  295. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-schedule-findings.md +0 -0
  296. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-search-findings.md +0 -0
  297. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-simulate-findings.md +0 -0
  298. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
  299. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
  300. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
  301. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
  302. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
  303. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
  304. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
  305. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-sync-findings.md +0 -0
  306. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-tag-findings.md +0 -0
  307. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
  308. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-tap-findings.md +0 -0
  309. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-taps-findings.md +0 -0
  310. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
  311. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-test-findings.md +0 -0
  312. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-trust-findings.md +0 -0
  313. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
  314. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-unpin-findings.md +0 -0
  315. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-untap-findings.md +0 -0
  316. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-update-findings.md +0 -0
  317. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
  318. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-verify-findings.md +0 -0
  319. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-who-findings.md +0 -0
  320. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  321. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  322. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  323. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  324. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  325. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  326. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-first-rule.md +0 -0
  327. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  328. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  329. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/branch-current-gate.md +0 -0
  330. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  331. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  332. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  333. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  334. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  335. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  336. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  337. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
  338. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
  339. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  340. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  341. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  342. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  343. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  344. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  345. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  346. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
  347. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cli-command-audit.md +0 -0
  348. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  349. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  350. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  351. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  352. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/command-carousel-page.md +0 -0
  353. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  354. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  355. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  356. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  357. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
  358. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  359. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  360. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  361. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  362. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  363. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  364. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
  365. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  366. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  367. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  368. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  369. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  370. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  371. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  372. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
  373. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  374. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  375. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  376. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  377. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  378. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  379. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  380. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  381. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  382. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  383. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  384. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  385. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  386. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  387. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  388. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  389. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  390. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  391. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  392. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  393. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  394. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  395. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  396. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  397. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  398. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  399. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  400. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  401. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  402. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  403. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  404. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  405. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  406. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  407. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  408. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/github-community-health-files.md +0 -0
  409. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  410. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  411. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  412. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  413. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  414. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  415. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  416. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  417. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  418. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  419. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  420. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  421. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  422. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  423. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  424. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  425. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  426. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  427. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  428. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  429. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  430. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  431. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  432. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  433. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  434. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  435. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  436. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  437. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  438. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  439. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  440. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  441. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  442. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  443. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  444. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  445. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  446. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  447. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  448. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  449. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  450. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  451. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  452. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  453. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  454. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  455. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  456. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  457. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  458. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  459. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  460. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  461. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  462. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  463. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  464. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  465. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  466. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  467. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  468. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  469. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  470. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  471. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  472. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  473. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  474. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  475. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  476. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
  477. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  478. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  479. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
  480. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  481. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  482. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  483. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  484. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  485. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  486. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  487. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  488. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-playbook.md +0 -0
  489. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-silver.md +0 -0
  490. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  491. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  492. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  493. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  494. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  495. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  496. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  497. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  498. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  499. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  500. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  501. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  502. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  503. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  504. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  505. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  506. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  507. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  508. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  509. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  510. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
  511. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  512. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  513. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  514. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  515. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  516. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  517. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  518. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  519. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  520. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  521. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  522. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  523. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/relicence-apache-2.md +0 -0
  524. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  525. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  526. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  527. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  528. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  529. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  530. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  531. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  532. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  533. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  534. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  535. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  536. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  537. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  538. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  539. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  540. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  541. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  542. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  543. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  544. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  545. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  546. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  547. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  548. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  549. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  550. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  551. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  552. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  553. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  554. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  555. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  556. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  557. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  558. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
  559. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  560. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  561. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  562. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  563. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shrink-the-published-index.md +0 -0
  564. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  565. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  566. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  567. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  568. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  569. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  570. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  571. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  572. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  573. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  574. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  575. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  576. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  577. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  578. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  579. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  580. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  581. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  582. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  583. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  584. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  585. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  586. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  587. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  588. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  589. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  590. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  591. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  592. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  593. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  594. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  595. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  596. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  597. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  598. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  599. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  600. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
  601. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  602. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  603. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  604. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  605. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  606. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  607. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workspace-scope-install.md +0 -0
  608. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/zip-strict-audit.md +0 -0
  609. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  610. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  611. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/security-design.md +0 -0
  612. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/semantic-search.md +0 -0
  613. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  614. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/verifying-releases.md +0 -0
  615. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/meta.md +0 -0
  616. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/openvex.json +0 -0
  617. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  618. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  619. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  620. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  621. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/eslint.config.mjs +0 -0
  622. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/README.md +0 -0
  623. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/__init__.py +0 -0
  624. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/baseline.json +0 -0
  625. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/faithfulness.py +0 -0
  626. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/golden_set.json +0 -0
  627. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/make_corpus.py +0 -0
  628. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/make_golden.py +0 -0
  629. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/metrics.py +0 -0
  630. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/publish_golden_dataset.py +0 -0
  631. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/run_evals.py +0 -0
  632. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/examples/README.md +0 -0
  633. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/examples/adapt-demo.sh +0 -0
  634. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/examples/boost-run-prototype.sh +0 -0
  635. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/index.html +0 -0
  636. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/noxfile.py +0 -0
  637. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/pyproject.toml +0 -0
  638. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/coverage-tools.in +0 -0
  639. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/coverage-tools.txt +0 -0
  640. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/lint-tools.in +0 -0
  641. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/lint-tools.txt +0 -0
  642. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/mutation-tools.in +0 -0
  643. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/mutation-tools.txt +0 -0
  644. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/platform-pins.lock +0 -0
  645. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/release-tools.in +0 -0
  646. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/release-tools.txt +0 -0
  647. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/test-tools.in +0 -0
  648. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/test-tools.txt +0 -0
  649. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/a11y_check.py +0 -0
  650. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/add_spdx_headers.py +0 -0
  651. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/bench_cli.sh +0 -0
  652. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_command_reference.py +0 -0
  653. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_demo_index.py +0 -0
  654. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_registries.py +0 -0
  655. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_roadmap.py +0 -0
  656. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_scale_corpus.py +0 -0
  657. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_vex.py +0 -0
  658. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_anchors.py +0 -0
  659. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_branch_current.py +0 -0
  660. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_dco.py +0 -0
  661. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_licenses.py +0 -0
  662. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_reproducible.py +0 -0
  663. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_required_checks.py +0 -0
  664. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/ensure_eval_corpus.sh +0 -0
  665. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_corpus.py +0 -0
  666. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_explain.py +0 -0
  667. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_gate.py +0 -0
  668. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_recommend.py +0 -0
  669. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_retrieval.py +0 -0
  670. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_stats_summary.py +0 -0
  671. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_tools.py +0 -0
  672. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/import_budget.py +0 -0
  673. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/lock_toolchain.py +0 -0
  674. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/measure_near_duplicate_bound.py +0 -0
  675. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/measure_registry.py +0 -0
  676. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/mutation_gate.py +0 -0
  677. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/mutation_shards.py +0 -0
  678. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/mutation_weights.json +0 -0
  679. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/normalize_sdist.py +0 -0
  680. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/page_budget.py +0 -0
  681. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/perf_gate.py +0 -0
  682. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/post_deploy_smoke.py +0 -0
  683. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/publish_eval_json.py +0 -0
  684. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/publish_shards.py +0 -0
  685. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/release_guard.py +0 -0
  686. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/release_preflight.py +0 -0
  687. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/serve_docs.py +0 -0
  688. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/shard_plan.py +0 -0
  689. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/setup.cfg +0 -0
  690. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/sonar-project.properties +0 -0
  691. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/README.md +0 -0
  692. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/boost.css +0 -0
  693. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/boost.js +0 -0
  694. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/demo.html +0 -0
  695. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/adapt.feature +0 -0
  696. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/browse.feature +0 -0
  697. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/count.feature +0 -0
  698. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/discover.feature +0 -0
  699. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/doctor.feature +0 -0
  700. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/environment.py +0 -0
  701. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/explain.feature +0 -0
  702. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/index.feature +0 -0
  703. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/install.feature +0 -0
  704. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/list.feature +0 -0
  705. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/mcp.feature +0 -0
  706. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/search.feature +0 -0
  707. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/cli_steps.py +0 -0
  708. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/discovery_steps.py +0 -0
  709. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/mcp_steps.py +0 -0
  710. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/quality_steps.py +0 -0
  711. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/conftest.py +0 -0
  712. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/baseline.json +0 -0
  713. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/explain.jsonl +0 -0
  714. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
  715. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/golden-natural.jsonl +0 -0
  716. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/golden.jsonl +0 -0
  717. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/recommend.jsonl +0 -0
  718. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/taps-scale.txt +0 -0
  719. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/taps.txt +0 -0
  720. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/tool_calls.jsonl +0 -0
  721. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_bmad_all_hosts.py +0 -0
  722. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_capabilities_policy.py +0 -0
  723. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_adapt.py +0 -0
  724. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_bmad.py +0 -0
  725. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_catalog.py +0 -0
  726. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_chat.py +0 -0
  727. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_configuration.py +0 -0
  728. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_discovery.py +0 -0
  729. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_hooks_gemini.py +0 -0
  730. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_info.py +0 -0
  731. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_intelligence.py +0 -0
  732. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_pane_width.py +0 -0
  733. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_pkg.py +0 -0
  734. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_quickstart.py +0 -0
  735. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_tap_pins.py +0 -0
  736. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_taps.py +0 -0
  737. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_everyday_loop.py +0 -0
  738. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_integrity_enforce.py +0 -0
  739. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_kind_conformance.py +0 -0
  740. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_property_parsers.py +0 -0
  741. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_run.py +0 -0
  742. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_tap_signing.py +0 -0
  743. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_workspace_scope.py +0 -0
  744. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/README.md +0 -0
  745. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  746. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  747. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  748. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  749. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  750. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  751. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  752. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  753. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  754. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  755. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  756. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  757. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  758. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  759. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  760. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  761. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  762. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  763. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  764. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  765. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  766. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  767. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  768. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/fuzz_frontmatter.py +0 -0
  769. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/fuzz_registry.py +0 -0
  770. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/conftest.py +0 -0
  771. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/test_graph.py +0 -0
  772. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/test_loader.py +0 -0
  773. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/test_retriever.py +0 -0
  774. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/make_fixture.py +0 -0
  775. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/perf/test_benchmarks.py +0 -0
  776. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/smoke.sh +0 -0
  777. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_a11y_check.py +0 -0
  778. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_action_pin_lockstep.py +0 -0
  779. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_adapters.py +0 -0
  780. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_adapters_multi.py +0 -0
  781. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_adapters_runner.py +0 -0
  782. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_agents.py +0 -0
  783. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_ai.py +0 -0
  784. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_aihost.py +0 -0
  785. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_bmad_core.py +0 -0
  786. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_boost_first_offer.py +0 -0
  787. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_bootstrap.py +0 -0
  788. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_bot_pr_dco.py +0 -0
  789. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_branch_current.py +0 -0
  790. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_browse.py +0 -0
  791. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_builtin.py +0 -0
  792. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_capabilities.py +0 -0
  793. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_catalog.py +0 -0
  794. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_catalogbundle.py +0 -0
  795. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_chat.py +0 -0
  796. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_anchors.py +0 -0
  797. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_dco.py +0 -0
  798. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_licenses.py +0 -0
  799. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_reproducible.py +0 -0
  800. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_clean_internal_cache.py +0 -0
  801. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_cli_update_shards.py +0 -0
  802. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_cliparse.py +0 -0
  803. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_codeql_analysis_key.py +0 -0
  804. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_command_reference_fresh.py +0 -0
  805. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_community_health_files.py +0 -0
  806. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_compact.py +0 -0
  807. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_complete.py +0 -0
  808. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_complete_rc_block.py +0 -0
  809. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_content_dedupe.py +0 -0
  810. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_content_identity.py +0 -0
  811. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_crash_redaction.py +0 -0
  812. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dedup_trust.py +0 -0
  813. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_demo_index.py +0 -0
  814. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense.py +0 -0
  815. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
  816. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_embed_dedupe.py +0 -0
  817. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_entry_reuse.py +0 -0
  818. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_entry_vectors.py +0 -0
  819. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_fallback.py +0 -0
  820. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_fix_hint.py +0 -0
  821. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_progress.py +0 -0
  822. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_quantized.py +0 -0
  823. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_ready_order.py +0 -0
  824. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_shard_real_schema.py +0 -0
  825. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  826. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_shards.py +0 -0
  827. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_status.py +0 -0
  828. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_status_cheap.py +0 -0
  829. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_vector_dedupe.py +0 -0
  830. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dependabot_config.py +0 -0
  831. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_distill_merge.py +0 -0
  832. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_docs_pages_linked.py +0 -0
  833. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_docsite_chrome.py +0 -0
  834. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_doctor_output_polish.py +0 -0
  835. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_ed25519.py +0 -0
  836. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_embed.py +0 -0
  837. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_embed_local.py +0 -0
  838. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_embed_truncated_response.py +0 -0
  839. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_entry_key.py +0 -0
  840. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_errors_and_cli_table.py +0 -0
  841. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_baseline.py +0 -0
  842. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_corpus.py +0 -0
  843. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_faithfulness.py +0 -0
  844. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_gate.py +0 -0
  845. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_grading.py +0 -0
  846. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_metrics.py +0 -0
  847. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_stats_summary.py +0 -0
  848. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_tools.py +0 -0
  849. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_tools_probe.py +0 -0
  850. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  851. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_faithfulness.py +0 -0
  852. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_frontmatter.py +0 -0
  853. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_fuzz_targets.py +0 -0
  854. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  855. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitleaks_config.py +0 -0
  856. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitutil.py +0 -0
  857. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitutil_lfs.py +0 -0
  858. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitutil_sparse.py +0 -0
  859. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gstack_coexistence.py +0 -0
  860. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_hook_settings_hosts.py +0 -0
  861. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_hookhost.py +0 -0
  862. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_imperative.py +0 -0
  863. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_import_budget.py +0 -0
  864. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_injectscan.py +0 -0
  865. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_install_permission_error.py +0 -0
  866. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_installscan.py +0 -0
  867. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_integrity.py +0 -0
  868. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_journal.py +0 -0
  869. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_langchain_packaging.py +0 -0
  870. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_link_ownership.py +0 -0
  871. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_localembed.py +0 -0
  872. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_localembed_e2e.py +0 -0
  873. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_lockfile.py +0 -0
  874. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_logs.py +0 -0
  875. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_marketing_counts.py +0 -0
  876. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcp.py +0 -0
  877. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcp_install_scan.py +0 -0
  878. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcp_read.py +0 -0
  879. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcpdecl.py +0 -0
  880. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcphost.py +0 -0
  881. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_measure_registry.py +0 -0
  882. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_minisign.py +0 -0
  883. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutation_hardening.py +0 -0
  884. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutation_shards.py +0 -0
  885. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutation_subfile_shards.py +0 -0
  886. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutmut_source_paths.py +0 -0
  887. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_near_duplicate_collapse.py +0 -0
  888. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_nethttp.py +0 -0
  889. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_normalize_sdist.py +0 -0
  890. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_output.py +0 -0
  891. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_page_budget.py +0 -0
  892. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_paths.py +0 -0
  893. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_perf_gate.py +0 -0
  894. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_pkg_confusions.py +0 -0
  895. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_pkg_injection.py +0 -0
  896. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_pkg_secrets.py +0 -0
  897. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_platform_pins.py +0 -0
  898. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_policy.py +0 -0
  899. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_post_deploy_smoke.py +0 -0
  900. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_project_mcp_sidecar.py +0 -0
  901. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_projectlock.py +0 -0
  902. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_provenance.py +0 -0
  903. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_publish_golden_dataset.py +0 -0
  904. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rag.py +0 -0
  905. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rag_fastpath.py +0 -0
  906. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rag_fusion.py +0 -0
  907. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registries_fresh.py +0 -0
  908. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry_categories.py +0 -0
  909. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry_control_chars.py +0 -0
  910. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry_parallel.py +0 -0
  911. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_release_guard.py +0 -0
  912. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_release_preflight.py +0 -0
  913. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_required_checks.py +0 -0
  914. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rerank_cache.py +0 -0
  915. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_resolve.py +0 -0
  916. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
  917. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_roadmap_fresh.py +0 -0
  918. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rules.py +0 -0
  919. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_scale_corpus.py +0 -0
  920. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_scopes.py +0 -0
  921. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_secretscan.py +0 -0
  922. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_selfupdate.py +0 -0
  923. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_serve.py +0 -0
  924. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_serve_docs.py +0 -0
  925. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shard_plan.py +0 -0
  926. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards.py +0 -0
  927. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards_incremental.py +0 -0
  928. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards_ingest.py +0 -0
  929. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards_matrix.py +0 -0
  930. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_smoke_covers_every_command.py +0 -0
  931. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_spdx_headers.py +0 -0
  932. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_spin.py +0 -0
  933. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_stackprobe.py +0 -0
  934. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_staleness.py +0 -0
  935. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_store.py +0 -0
  936. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_store_materialize.py +0 -0
  937. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_sync_blocked_links.py +0 -0
  938. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  939. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_tap_pins.py +0 -0
  940. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_token_parity.py +0 -0
  941. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_toolchain_lock.py +0 -0
  942. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_trustaudit.py +0 -0
  943. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_typedvalue.py +0 -0
  944. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_typosquat.py +0 -0
  945. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_updatediff.py +0 -0
  946. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_util.py +0 -0
  947. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_version.py +0 -0
  948. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_version_tags.py +0 -0
  949. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_vex.py +0 -0
  950. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_visual_harness_flags.py +0 -0
  951. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_concurrency.py +0 -0
  952. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  953. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  954. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_timeouts.py +0 -0
  955. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflows.py +0 -0
  956. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  957. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/a11y_check.mjs +0 -0
  958. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/console_check.mjs +0 -0
  959. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/package-lock.json +0 -0
  960. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/package.json +0 -0
  961. {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/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.89
3
+ Version: 1.2.90
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.89'
22
- __version_tuple__ = version_tuple = (1, 2, 89)
21
+ __version__ = version = '1.2.90'
22
+ __version_tuple__ = version_tuple = (1, 2, 90)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -129,12 +129,15 @@ def _add(args) -> int:
129
129
  if event not in hookhost.events(host):
130
130
  out.warn("'%s' is not a known %s hook event — adding anyway"
131
131
  % (event, hookhost.event_label(host)))
132
- cs.add_hook(scope, event, args.name, args.command,
133
- matcher=args.matcher, timeout=args.timeout, host=host)
132
+ snapshot = cs.add_hook(scope, event, args.name, args.command,
133
+ matcher=args.matcher, timeout=args.timeout,
134
+ host=host)
134
135
  journal.log("hook-add", args.name, scope=scope, event=event, host=host)
135
136
  out.ok("added %s hook '%s' (%s) → %s"
136
137
  % (event, args.name, _where(host, scope), args.command))
137
138
  out.dim(" settings: %s" % cs.settings_path(scope, host=host))
139
+ if snapshot is not None:
140
+ out.dim(" backup: %s" % snapshot)
138
141
  return 0
139
142
 
140
143
 
@@ -28,6 +28,7 @@ from ..core import (
28
28
  gitutil,
29
29
  imperative,
30
30
  journal,
31
+ jsonstate,
31
32
  lockfile,
32
33
  paths,
33
34
  registry,
@@ -95,17 +96,26 @@ def _bump_patch(v: str) -> str:
95
96
 
96
97
  def _load_state(fname: str, default: dict) -> dict:
97
98
  p = paths.state_dir() / fname
98
- if not p.exists():
99
- return json.loads(json.dumps(default))
100
- try:
101
- return json.loads(p.read_text(encoding="utf-8"))
102
- except (json.JSONDecodeError, OSError):
99
+ data, err = jsonstate.read_object(p)
100
+ if err:
101
+ # stderr unconditionally: some callers (`context status --json`) read
102
+ # this before deciding whether they're printing JSON to stdout, and a
103
+ # warning has no business inside that payload.
104
+ out.warn("%s — reading as the default; the file is left on disk but "
105
+ "the next write here replaces it" % err, stream=sys.stderr)
106
+ if data is None:
103
107
  return json.loads(json.dumps(default))
108
+ return data
104
109
 
105
110
 
106
111
  def _save_state(fname: str, data: dict) -> None:
107
112
  paths.ensure_dirs()
108
- (paths.state_dir() / fname).write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
113
+ p = paths.state_dir() / fname
114
+ if jsonstate.is_corrupt(p):
115
+ dest = jsonstate.quarantine(p)
116
+ out.warn("%s was corrupt and has been moved to %s before writing "
117
+ "the new file" % (p, dest), stream=sys.stderr)
118
+ p.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
109
119
 
110
120
 
111
121
  def _save_generated_fallback(name: str, text: str, reason: str) -> None:
@@ -266,7 +266,7 @@ _DRIFT_ROLE = {"in-sync": "success", "local-edits": "warn",
266
266
  "quarantined": "muted"}
267
267
 
268
268
 
269
- def _drift_hint(name: str, status: str) -> str:
269
+ def _drift_hint(name: str, status: str, tap: str = "") -> str:
270
270
  if status == "quarantined":
271
271
  return "boost quarantine --release %s to restore" % name
272
272
  if status == "upstream-moved":
@@ -274,7 +274,10 @@ def _drift_hint(name: str, status: str) -> str:
274
274
  if status == "local-edits":
275
275
  return "boost reinstall %s to discard local edits" % name
276
276
  if status == "source-missing":
277
- return "boost update"
277
+ # `boost update` only refreshes configured taps. When the entry's
278
+ # tap has been untapped, that command is a guaranteed no-op — the
279
+ # only remedy that can actually restore the source is re-tapping it.
280
+ return "boost update" if registry.is_tapped(tap) else "boost tap %s" % tap
278
281
  if status == "store-missing":
279
282
  return "boost heal"
280
283
  return ""
@@ -861,7 +864,7 @@ def cmd_drift(argv):
861
864
  status = (_drift_status(name, entry) if kind == "skill"
862
865
  else _drift_status_materialized(kind, name, entry))
863
866
  rows.append({"name": name, "kind": kind, "status": status,
864
- "hint": _drift_hint(name, status)})
867
+ "hint": _drift_hint(name, status, entry.get("tap", ""))})
865
868
  if args.json:
866
869
  print(json.dumps({"skills": rows}))
867
870
  return 0
@@ -9,12 +9,14 @@ import platform
9
9
  import shutil
10
10
  import stat
11
11
  import urllib.parse
12
+ from typing import Any
12
13
 
13
14
  from .. import cliparse
14
15
  from ..core import (
15
16
  catalog,
16
17
  complete,
17
18
  journal,
19
+ jsonstate,
18
20
  lockfile,
19
21
  paths,
20
22
  registry,
@@ -258,15 +260,20 @@ def cmd_profile(argv) -> int:
258
260
  p.error("%s needs a profile NAME" % args.action)
259
261
 
260
262
  if args.action == "list":
261
- profiles = []
263
+ profiles: list[dict[str, Any]] = []
262
264
  for f in sorted(paths.profiles_dir().glob("*.json")):
263
- try:
264
- data = json.loads(f.read_text(encoding="utf-8"))
265
- except (json.JSONDecodeError, OSError):
265
+ data, _err = jsonstate.read_object(f)
266
+ if data is None:
267
+ # Surfaced rather than skipped: a corrupt profile used to be
268
+ # invisible here yet still block `profile delete` (it parsed
269
+ # the file again as an existence check) — see `delete` below.
270
+ profiles.append({"name": f.stem, "skills": None,
271
+ "saved": None, "unreadable": True})
266
272
  continue
267
273
  profiles.append({"name": data.get("name", f.stem),
268
274
  "skills": len(data.get("skills", {})),
269
- "saved": data.get("saved", "?")})
275
+ "saved": data.get("saved", "?"),
276
+ "unreadable": False})
270
277
  if args.json:
271
278
  print(json.dumps(profiles, indent=2))
272
279
  return 0
@@ -274,8 +281,11 @@ def cmd_profile(argv) -> int:
274
281
  out.info("no profiles saved")
275
282
  out.info(out.role("snapshot the current setup: `boost profile save daily`", "muted"))
276
283
  return 0
277
- rows = [(pr["name"], str(pr["skills"]), util.rel_time(pr["saved"]))
278
- for pr in profiles]
284
+ rows = [(pr["name"],
285
+ str(pr["skills"]) if not pr["unreadable"] else "?",
286
+ util.rel_time(pr["saved"]) if not pr["unreadable"]
287
+ else out.role("(unreadable)", "danger"))
288
+ for pr in profiles]
279
289
  out.table(rows, headers=("PROFILE", "SKILLS", "SAVED"))
280
290
  return 0
281
291
 
@@ -347,7 +357,9 @@ def cmd_profile(argv) -> int:
347
357
  return 0
348
358
 
349
359
  if args.action == "delete":
350
- _load_profile(args.name) # existence check
360
+ if not _profile_path(args.name).exists():
361
+ raise BoostError("no profile named %s" % args.name,
362
+ hint="list profiles with `boost profile list`")
351
363
  if not out.confirm("delete profile %s?" % args.name):
352
364
  out.info("cancelled")
353
365
  return 1
@@ -32,10 +32,11 @@ from __future__ import annotations
32
32
 
33
33
  import contextlib
34
34
  import json
35
+ import sys
35
36
  from pathlib import Path
36
37
 
37
38
  from ..errors import BoostError
38
- from . import hookhost, paths, util
39
+ from . import hookhost, jsonstate, output, paths, util
39
40
 
40
41
  SCOPES = ("global", "project")
41
42
  MARKER = "# boost:"
@@ -66,27 +67,39 @@ def _history_dir() -> Path:
66
67
 
67
68
  def load(scope: str, project_dir: Path | None = None,
68
69
  host: str = hookhost.CLAUDE) -> dict:
69
- """Parse a scope's settings.json ({} if missing or corrupt)."""
70
+ """Parse a scope's settings.json ({} if missing or corrupt).
71
+
72
+ A file that exists but fails to parse is warned about by name: it stays
73
+ on disk untouched by this read, but `save` treats an empty `{}` as this
74
+ scope's *whole* settings from here on, so silently swallowing the error
75
+ is how a hooks-only settings.json used to eat the user's `permissions`
76
+ and `model` keys on the next `hooks add`.
77
+ """
70
78
  p = settings_path(scope, project_dir, host)
71
- if not p.exists():
72
- return {}
73
- try:
74
- data = json.loads(p.read_text(encoding="utf-8"))
75
- except (json.JSONDecodeError, OSError):
76
- return {}
77
- return data if isinstance(data, dict) else {}
79
+ data, err = jsonstate.read_object(p)
80
+ if err:
81
+ output.warn(
82
+ "%s — reading as empty; the file is left on disk but the next "
83
+ "write here replaces its contents (a snapshot lands in %s "
84
+ "first)" % (err, _history_dir()), stream=sys.stderr)
85
+ return data if data is not None else {}
78
86
 
79
87
 
80
88
  def save(scope: str, data: dict, project_dir: Path | None = None,
81
- host: str = hookhost.CLAUDE) -> None:
89
+ host: str = hookhost.CLAUDE) -> Path | None:
82
90
  """Write a scope's settings.json, snapshotting the prior version first.
83
91
 
84
92
  Snapshots are named ``<host prefix><scope>-<stamp>.json``. Claude's prefix
85
93
  is empty, so its history filenames are exactly what they always were and a
86
94
  Gemini write cannot land on top of one.
95
+
96
+ Returns the snapshot path, or None when there was no prior file to
97
+ snapshot — callers that just replaced a scope's settings (`hooks add`)
98
+ use this to tell the user where the previous version went.
87
99
  """
88
100
  p = settings_path(scope, project_dir, host)
89
101
  p.parent.mkdir(parents=True, exist_ok=True)
102
+ dest = None
90
103
  if p.exists():
91
104
  hist = _history_dir()
92
105
  hist.mkdir(parents=True, exist_ok=True)
@@ -100,6 +113,7 @@ def save(scope: str, data: dict, project_dir: Path | None = None,
100
113
  dest.write_text(p.read_text(encoding="utf-8"), encoding="utf-8")
101
114
  _prune_history()
102
115
  p.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
116
+ return dest
103
117
 
104
118
 
105
119
  def _prune_history() -> None:
@@ -135,7 +149,7 @@ def _hook_name(command: str) -> str | None:
135
149
  def add_hook(scope: str, event: str, name: str, command: str,
136
150
  matcher: str | None = None, timeout: int = 10,
137
151
  project_dir: Path | None = None,
138
- host: str = hookhost.CLAUDE) -> None:
152
+ host: str = hookhost.CLAUDE) -> Path | None:
139
153
  """Idempotently install a boost-managed hook (replaces same-named entry).
140
154
 
141
155
  ``timeout`` is in **seconds** whatever the host; ``hookhost.hook_entry``
@@ -143,6 +157,9 @@ def add_hook(scope: str, event: str, name: str, command: str,
143
157
  must already be spelled the way ``host`` spells it — translating is the
144
158
  command layer's job, because a Claude event with no Gemini counterpart has
145
159
  to be refused out loud rather than silently dropped here.
160
+
161
+ Returns `save`'s snapshot path (or None) so the caller can tell the user
162
+ where the pre-edit settings.json went.
146
163
  """
147
164
  data = load(scope, project_dir, host)
148
165
  event_list = data.setdefault("hooks", {}).setdefault(event, [])
@@ -154,7 +171,7 @@ def add_hook(scope: str, event: str, name: str, command: str,
154
171
  block["hooks"] = [hookhost.hook_entry(host, _tag(command, name), timeout,
155
172
  name=name)]
156
173
  event_list.append(block)
157
- save(scope, data, project_dir, host)
174
+ return save(scope, data, project_dir, host)
158
175
 
159
176
 
160
177
  def remove_hook(scope: str, event: str, name: str,
@@ -4,10 +4,11 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  import json
7
+ import sys
7
8
  from copy import deepcopy
8
9
  from typing import Any
9
10
 
10
- from . import paths, typedvalue, util
11
+ from . import jsonstate, output, paths, typedvalue, util
11
12
 
12
13
  DEFAULTS = {
13
14
  "agents": {
@@ -201,13 +202,20 @@ def _stat_stamp(p: Any) -> tuple:
201
202
  return (str(p), st.st_mtime_ns, st.st_size)
202
203
 
203
204
 
205
+ def _warn_corrupt(err: str) -> None:
206
+ output.warn(
207
+ "%s — reading as empty for this command; the file on disk is left "
208
+ "untouched, but the next `config set`/`config unset` will move it "
209
+ "aside to '<name>.corrupt' before writing a fresh one" % err,
210
+ stream=sys.stderr)
211
+
212
+
204
213
  def _read() -> dict:
205
214
  p = paths.config_path()
206
- if not p.exists():
207
- return deepcopy(DEFAULTS)
208
- try:
209
- user = json.loads(p.read_text(encoding="utf-8"))
210
- except (json.JSONDecodeError, OSError):
215
+ user, err = jsonstate.read_object(p)
216
+ if err:
217
+ _warn_corrupt(err)
218
+ if user is None:
211
219
  return deepcopy(DEFAULTS)
212
220
  return _merge(DEFAULTS, user)
213
221
 
@@ -217,16 +225,14 @@ def _read_raw() -> dict:
217
225
 
218
226
  A missing or corrupt file reads as no overrides — the same "absent" the
219
227
  merged view falls back to, so a caller walking this dict never has to
220
- special-case the file not existing.
228
+ special-case the file not existing. Corruption is warned about, not
229
+ silenced: see :func:`_warn_corrupt`.
221
230
  """
222
231
  p = paths.config_path()
223
- if not p.exists():
224
- return {}
225
- try:
226
- data = json.loads(p.read_text(encoding="utf-8"))
227
- except (json.JSONDecodeError, OSError):
228
- return {}
229
- return data if isinstance(data, dict) else {}
232
+ data, err = jsonstate.read_object(p)
233
+ if err:
234
+ _warn_corrupt(err)
235
+ return data if data is not None else {}
230
236
 
231
237
 
232
238
  def _cached() -> dict:
@@ -249,10 +255,21 @@ def load() -> dict:
249
255
 
250
256
 
251
257
  def save(cfg: dict) -> None:
252
- """Atomically write `cfg` to `~/.boost/config.json`, creating dirs first."""
258
+ """Atomically write `cfg` to `~/.boost/config.json`, creating dirs first.
259
+
260
+ A config.json that exists but fails to parse is quarantined to
261
+ `config.json.corrupt` first, so this never overwrites bytes the read path
262
+ already warned about with a fresh file built from an in-memory view that
263
+ silently dropped them — see `jsonstate.quarantine`.
264
+ """
253
265
  paths.ensure_dirs()
266
+ p = paths.config_path()
267
+ if jsonstate.is_corrupt(p):
268
+ dest = jsonstate.quarantine(p)
269
+ output.warn("%s was corrupt and has been moved to %s before writing "
270
+ "the new config" % (p, dest), stream=sys.stderr)
254
271
  util.atomic_write_text(
255
- paths.config_path(), json.dumps(cfg, indent=2, sort_keys=False) + "\n")
272
+ p, json.dumps(cfg, indent=2, sort_keys=False) + "\n")
256
273
 
257
274
 
258
275
  def get(dotted: str, default=None):
@@ -0,0 +1,76 @@
1
+ # Copyright the boost contributors.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Corruption-aware read/quarantine for boost's small JSON state files.
4
+
5
+ Several files under ``~/.boost`` and each agent's dotdir (``config.json``,
6
+ ``settings.json``, ``context.json``, a saved profile, ...) are read as "the
7
+ merged view, or defaults/empty if the file is missing" and then, on the next
8
+ write, replaced outright. Before this module every one of those read sites
9
+ folded "missing" and "exists but fails to parse" into the same branch, so a
10
+ truncated write or a hand-edited trailing comma degraded to an empty object
11
+ with no warning — and the next save then overwrote the corrupt bytes with a
12
+ fresh file built from that empty view, discarding whatever was still sitting
13
+ on disk. :func:`read_object` keeps those two cases apart so a caller can warn
14
+ on the one that means something was actually lost; :func:`quarantine` gives a
15
+ writer a way to get the bad bytes out of the way, rather than over them,
16
+ before it writes the replacement.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import json
21
+ from pathlib import Path
22
+
23
+
24
+ def read_object(path: Path) -> tuple[dict | None, str | None]:
25
+ """Parse `path` as a JSON object.
26
+
27
+ Returns ``(data, None)`` when the file is missing (``data`` is ``None``)
28
+ or holds a valid JSON object. Returns ``(None, message)`` when the file
29
+ exists but can't be read as one — unreadable, invalid JSON, or valid JSON
30
+ that isn't an object — where ``message`` names the file and the
31
+ underlying error so a caller can warn instead of quietly treating
32
+ corruption the same as "nothing here yet".
33
+ """
34
+ if not path.exists():
35
+ return None, None
36
+ try:
37
+ text = path.read_text(encoding="utf-8")
38
+ except OSError as exc:
39
+ return None, "%s: %s" % (path, exc)
40
+ try:
41
+ data = json.loads(text)
42
+ except json.JSONDecodeError as exc:
43
+ return None, "%s: invalid JSON (%s)" % (path, exc)
44
+ if not isinstance(data, dict):
45
+ return None, "%s: expected a JSON object, found %s" % (
46
+ path, type(data).__name__)
47
+ return data, None
48
+
49
+
50
+ def is_corrupt(path: Path) -> bool:
51
+ """True when `path` exists but :func:`read_object` can't parse it.
52
+
53
+ A missing file is not corrupt — callers that only care about "is there a
54
+ bad file sitting here" (rather than the error text) use this instead of
55
+ unpacking the tuple.
56
+ """
57
+ _, err = read_object(path)
58
+ return err is not None
59
+
60
+
61
+ def quarantine(path: Path) -> Path:
62
+ """Move a corrupt `path` aside so a fresh write can land on its name
63
+ without destroying the bad bytes underneath it.
64
+
65
+ Picks `<name>.corrupt`, or `<name>.corrupt.N` for the first `N >= 2` that
66
+ doesn't already exist, so repeated corruption never overwrites an earlier
67
+ quarantined copy. Returns the destination. Caller's job to have already
68
+ established `path` is worth quarantining; this itself doesn't parse it.
69
+ """
70
+ dest = path.with_name(path.name + ".corrupt")
71
+ n = 2
72
+ while dest.exists():
73
+ dest = path.with_name("%s.corrupt.%d" % (path.name, n))
74
+ n += 1
75
+ path.rename(dest)
76
+ return dest
@@ -182,6 +182,18 @@ def get(name: str) -> Tap:
182
182
  else "list taps with `boost taps`")
183
183
 
184
184
 
185
+ def is_tapped(name: str) -> bool:
186
+ """True if `name` is a currently configured tap's exact ``Tap.name``.
187
+
188
+ Exact match only, unlike ``get()``'s shorthand/ambiguity tiering: a lock
189
+ entry's ``tap`` field always records the full ``owner/repo`` name a skill
190
+ was installed from, so callers checking "is this entry's tap still
191
+ tapped?" want a plain membership test, not a fuzzy lookup that could
192
+ raise on an unrelated ambiguous shorthand.
193
+ """
194
+ return any(t.name == name for t in list_taps())
195
+
196
+
185
197
  def add(spec: str, curated: bool = False, at: str | None = None) -> Tap:
186
198
  """Parse `spec`, shallow-clone it, and record the tap in config.
187
199
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.89
3
+ Version: 1.2.90
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -81,6 +81,7 @@ boost_cli/core/injectscan.py
81
81
  boost_cli/core/installscan.py
82
82
  boost_cli/core/integrity.py
83
83
  boost_cli/core/journal.py
84
+ boost_cli/core/jsonstate.py
84
85
  boost_cli/core/localembed.py
85
86
  boost_cli/core/lockfile.py
86
87
  boost_cli/core/logs.py
@@ -826,6 +827,7 @@ tests/unit/test_distill_merge.py
826
827
  tests/unit/test_docs_pages_linked.py
827
828
  tests/unit/test_docsite_chrome.py
828
829
  tests/unit/test_doctor_output_polish.py
830
+ tests/unit/test_drift_hint.py
829
831
  tests/unit/test_ed25519.py
830
832
  tests/unit/test_embed.py
831
833
  tests/unit/test_embed_local.py
@@ -860,6 +862,7 @@ tests/unit/test_install_permission_error.py
860
862
  tests/unit/test_installscan.py
861
863
  tests/unit/test_integrity.py
862
864
  tests/unit/test_journal.py
865
+ tests/unit/test_jsonstate.py
863
866
  tests/unit/test_langchain_packaging.py
864
867
  tests/unit/test_link_ownership.py
865
868
  tests/unit/test_localembed.py
@@ -203,6 +203,42 @@ plain `upgrade` has already been tried and refused.
203
203
 
204
204
  ---
205
205
 
206
+ ## A corrupt config/settings/state file
207
+
208
+ boost keeps several small JSON files — `~/.boost/config.json`, each agent's
209
+ `settings.json` (hooks), `~/.boost/state/context.json`/`focus.json`, and a
210
+ saved `boost profile`. If one of these exists but fails to parse (a truncated
211
+ write, a hand-edited trailing comma), the read that notices prints a warning
212
+ to stderr naming the file and the JSON error, then falls back to that file's
213
+ empty/default state for the current command — the bad bytes are left on disk,
214
+ untouched, by the read itself.
215
+
216
+ **The next write to that file is what matters.** Rather than silently
217
+ building a fresh file from the empty/default view and overwriting the corrupt
218
+ one — losing whatever was in it, with no way back — boost moves the corrupt
219
+ file aside first:
220
+
221
+ - `~/.claude/settings.json` (and `~/.gemini/settings.json`) already snapshot
222
+ the *previous* version into `~/.boost/state/claude-settings-history/` on
223
+ every write, corrupt or not, so a corrupt file is preserved there too.
224
+ `boost hooks add` prints that snapshot's path (`backup: ...`) whenever one
225
+ is written, so you don't have to know the history directory exists to use
226
+ it.
227
+ - `~/.boost/config.json` and the `context.json`/`focus.json` state files have
228
+ no such standing history, so the write itself quarantines a corrupt file to
229
+ `<name>.json.corrupt` (or `.corrupt.2`, `.corrupt.3`, ... if that name is
230
+ already taken by an earlier corruption) before writing the new one, and
231
+ says so on stderr.
232
+ - `boost profile list` marks a corrupt profile `(unreadable)` instead of
233
+ hiding it, and `boost profile delete <name>` only checks that the file
234
+ exists — not that it parses — so a corrupt profile can still be deleted.
235
+
236
+ None of this recovers a corrupt file's *content* automatically — it recovers
237
+ the bytes so you can look at them (`<name>.json.corrupt`, or the newest file
238
+ under `claude-settings-history/`) and hand-merge anything worth keeping.
239
+
240
+ ---
241
+
206
242
  ## Environment variables
207
243
 
208
244
  Everything that changes boost's runtime behaviour, in one place:
Binary file
@@ -2,15 +2,15 @@
2
2
  id: audit-corrupt-settings-config-state-json-silently-read-as-empty-th
3
3
  board: code
4
4
  section: dx
5
- status: planned
5
+ status: shipped
6
6
  category: Safety · Bug
7
7
  complexity: M
8
8
  impact: High
9
9
  wow: 2
10
10
  note: a trailing comma in settings.json costs the permissions/model block on the next hooks add
11
11
  order: 203
12
- owner:
13
- pr:
12
+ owner: loop/corrupt-json-state
13
+ pr: 714
14
14
  title: "Corrupt settings/config/state JSON silently read as empty, then clobbered on the next write"
15
15
  ---
16
16
  One shared load pattern across four surfaces: a JSON file that exists but does not parse is read as <code>{}</code> (<code>except (JSONDecodeError, OSError)</code> at <code>boost_cli/core/claude_settings.py:74-75</code> and <code>boost_cli/core/config.py:129</code>/<code>196-203</code>/<code>246-250</code>), and the next write replaces it. Verified worst case: with a trailing comma in <code>~/.claude/settings.json</code>, <code>hooks add SessionStart &hellip;</code> prints <em>&ldquo;&#10003; added SessionStart hook&rdquo;</em> exit 0 and the file afterwards holds <em>only</em> <code>{"hooks": &hellip;}</code> &mdash; the user's <code>permissions</code> and <code>model</code> keys are gone, no warning. With a corrupt <code>~/.boost/config.json</code>, <code>config list</code> silently prints the defaults, and <code>config set ai.enabled true</code> rewrites the file to defaults-plus-that-key &mdash; a 20-tap list unrecoverable, <b>no backup</b>. <code>context status</code>/<code>context map</code> and <code>focus --status</code> do the same to <code>state/context.json</code>/<code>focus.json</code>; a corrupt profile is invisible to <code>profile list</code> yet <code>profile delete broken</code> <em>refuses</em> with exit 1, because the existence check parses the file before deleting.
@@ -20,3 +20,7 @@ Verification narrowed the hooks half: <code>claude_settings.save</code> already
20
20
  Fix centrally, per the verified recommendation: when a JSON state file exists but fails to parse, warn on read naming the file and the JSON error, and before any save either refuse with a BoostError and a fix-it hint or move the bad file to <code>&lt;name&gt;.corrupt</code> and say so. <code>hooks add</code> should print the claude-settings-history snapshot path it already writes; <code>profile delete</code> should check <code>_profile_path(name).exists()</code> instead of parsing; <code>profile list</code> should show an <em>(unreadable)</em> marker. Docs: note the corrupt-file behaviour in <code>docs/DEBUGGING.md</code> (config/logging section).
21
21
 
22
22
  Found by the 2026-08 CLI audit (cluster <code>corrupt-json-clobbered</code>); repro in the audit log. Verified 2026-08-31: all four surfaces reproduced.
23
+
24
+ <b>2026-09-02, PR open.</b> New <code>core/jsonstate.py</code> (<code>read_object</code>/<code>is_corrupt</code>/<code>quarantine</code>) centralizes the read-vs-corrupt distinction; <code>config.py</code>, <code>claude_settings.py</code> and <code>commands/intelligence.py</code>'s <code>_load_state</code>/<code>_save_state</code> (context/focus) all warn on a corrupt read and quarantine to <code>&lt;name&gt;.corrupt</code> (or reuse the existing history snapshot, for hooks) before the next write. <code>hooks add</code> prints the snapshot path; <code>profile delete</code> checks existence instead of parsing; <code>profile list</code> marks a corrupt profile <em>(unreadable)</em>. <code>docs/DEBUGGING.md</code> has a new section. All four surfaces from the audit are covered. Held <code>inflight</code> at PR-open time because this session's sandbox has no PyPI egress, so the mutation/lint toolchain (mutmut, vulture, xenon, interrogate, refurb, codespell, actionlint, zizmor) could not be installed to run <code>make check</code> locally &mdash; ruff, mypy, pyright and pytest (unit+functional, no coverage) were run directly against the changed files and passed clean.
25
+
26
+ <b>Shipped.</b> PR #714's branch was briefly behind <code>main</code> (a train of 8 other PRs landed while CI ran); merged <code>main</code> in, re-verified locally, and CI ran clean end to end on the merged head: <code>lint</code>, <code>check</code>, the full OS&times;Python test matrix, <code>evals</code>, all six <code>mutation-shard</code> jobs plus the <code>mutation</code> gate, <code>smoke</code>/<code>install-smoke</code>, <code>dco</code>, <code>vale</code>, <code>lighthouse</code>, CodeQL and the security scanners &mdash; 41/41 checks green, no merge conflict.
@@ -2,15 +2,15 @@
2
2
  id: audit-drift-findings
3
3
  board: code
4
4
  section: health
5
- status: planned
5
+ status: inflight
6
6
  category: CLI · Bug
7
7
  complexity: S
8
8
  impact: Med
9
9
  wow: 1
10
- note: source-missing hint is `boost update` — a guaranteed no-op once the tap is untapped
10
+ note: fix up in #719, awaiting CI + review — sandbox couldn't run the full mutation/eval/smoke gate locally (no PyPI egress)
11
11
  order: 264
12
- owner:
13
- pr:
12
+ owner: loop/drift-source-missing-hint
13
+ pr: 719
14
14
  title: "boost drift: CLI audit findings (2026-08)"
15
15
  ---
16
16
  <b>drift hints <code>boost update</code> for source-missing items whose tap was untapped — a
@@ -6666,7 +6666,7 @@ excerpts at <code>:159-164</code>) to match. Found by the 2026-08 CLI audit (clu
6666
6666
  </article>
6667
6667
 
6668
6668
  <article class="cap rcard" id="audit-drift-findings">
6669
- <div class="head"><span class="pill planned">Planned</span><span class="cat">CLI · Bug</span></div>
6669
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">CLI · Bug</span></div>
6670
6670
  <h3>boost drift: CLI audit findings (2026-08)</h3>
6671
6671
  <p><b>drift hints <code>boost update</code> for source-missing items whose tap was untapped — a
6672
6672
  guaranteed no-op.</b> After <code>untap Aaronontheweb/dotnet-cursor-rules</code>, drift reports
@@ -6690,7 +6690,7 @@ entry's tap into <code>_drift_hint</code> (<code>quality.py:255-258</code>) and
6690
6690
  <span class="m">Complexity <b>S</b></span>
6691
6691
  <span class="m">Impact <b>Med</b></span>
6692
6692
  <span class="m">Wow <b class="wow">★</b></span>
6693
- <span class="m">source-missing hint is `boost update` — a guaranteed no-op once the tap is untapped</span>
6693
+ <span class="m">fix up in</span>
6694
6694
  </div>
6695
6695
  </article>
6696
6696
 
@@ -11635,15 +11635,20 @@ Found by the 2026-08 CLI audit (cluster <code>config-policy-set-validation</code
11635
11635
  </article>
11636
11636
 
11637
11637
  <article class="cap rcard" id="audit-corrupt-settings-config-state-json-silently-read-as-empty-th">
11638
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Safety · Bug</span></div>
11638
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Safety · Bug</span></div>
11639
11639
  <h3>Corrupt settings/config/state JSON silently read as empty, then clobbered on the next write</h3>
11640
+ <details class="cardbody"><summary>Write-up</summary>
11640
11641
  <p>One shared load pattern across four surfaces: a JSON file that exists but does not parse is read as <code>{}</code> (<code>except (JSONDecodeError, OSError)</code> at <code>boost_cli/core/claude_settings.py:74-75</code> and <code>boost_cli/core/config.py:129</code>/<code>196-203</code>/<code>246-250</code>), and the next write replaces it. Verified worst case: with a trailing comma in <code>~/.claude/settings.json</code>, <code>hooks add SessionStart &hellip;</code> prints <em>&ldquo;&#10003; added SessionStart hook&rdquo;</em> exit 0 and the file afterwards holds <em>only</em> <code>{"hooks": &hellip;}</code> &mdash; the user's <code>permissions</code> and <code>model</code> keys are gone, no warning. With a corrupt <code>~/.boost/config.json</code>, <code>config list</code> silently prints the defaults, and <code>config set ai.enabled true</code> rewrites the file to defaults-plus-that-key &mdash; a 20-tap list unrecoverable, <b>no backup</b>. <code>context status</code>/<code>context map</code> and <code>focus --status</code> do the same to <code>state/context.json</code>/<code>focus.json</code>; a corrupt profile is invisible to <code>profile list</code> yet <code>profile delete broken</code> <em>refuses</em> with exit 1, because the existence check parses the file before deleting.
11641
11642
 
11642
11643
  Verification narrowed the hooks half: <code>claude_settings.save</code> already snapshots the prior file into <code>~/.boost/state/claude-settings-history/</code> before every write (confirmed byte-for-byte), so that path is recoverable &mdash; but silently, and nothing tells the user. <code>config.json</code> has no such net: that loss is real. Degrading a corrupt file to defaults on <em>read</em> is arguably deliberate (the <code>config.py</code> comment says so); silently <em>overwriting</em> it on the next write is documented nowhere and destroys user data. The roadmap's atomic-lock-file-writes item covers the lock file only &mdash; related pattern, not a duplicate.
11643
11644
 
11644
11645
  Fix centrally, per the verified recommendation: when a JSON state file exists but fails to parse, warn on read naming the file and the JSON error, and before any save either refuse with a BoostError and a fix-it hint or move the bad file to <code>&lt;name&gt;.corrupt</code> and say so. <code>hooks add</code> should print the claude-settings-history snapshot path it already writes; <code>profile delete</code> should check <code>_profile_path(name).exists()</code> instead of parsing; <code>profile list</code> should show an <em>(unreadable)</em> marker. Docs: note the corrupt-file behaviour in <code>docs/DEBUGGING.md</code> (config/logging section).
11645
11646
 
11646
- Found by the 2026-08 CLI audit (cluster <code>corrupt-json-clobbered</code>); repro in the audit log. Verified 2026-08-31: all four surfaces reproduced.</p>
11647
+ Found by the 2026-08 CLI audit (cluster <code>corrupt-json-clobbered</code>); repro in the audit log. Verified 2026-08-31: all four surfaces reproduced.
11648
+
11649
+ <b>2026-09-02, PR open.</b> New <code>core/jsonstate.py</code> (<code>read_object</code>/<code>is_corrupt</code>/<code>quarantine</code>) centralizes the read-vs-corrupt distinction; <code>config.py</code>, <code>claude_settings.py</code> and <code>commands/intelligence.py</code>'s <code>_load_state</code>/<code>_save_state</code> (context/focus) all warn on a corrupt read and quarantine to <code>&lt;name&gt;.corrupt</code> (or reuse the existing history snapshot, for hooks) before the next write. <code>hooks add</code> prints the snapshot path; <code>profile delete</code> checks existence instead of parsing; <code>profile list</code> marks a corrupt profile <em>(unreadable)</em>. <code>docs/DEBUGGING.md</code> has a new section. All four surfaces from the audit are covered. Held <code>inflight</code> at PR-open time because this session's sandbox has no PyPI egress, so the mutation/lint toolchain (mutmut, vulture, xenon, interrogate, refurb, codespell, actionlint, zizmor) could not be installed to run <code>make check</code> locally &mdash; ruff, mypy, pyright and pytest (unit+functional, no coverage) were run directly against the changed files and passed clean.
11650
+
11651
+ <b>Shipped.</b> PR #714's branch was briefly behind <code>main</code> (a train of 8 other PRs landed while CI ran); merged <code>main</code> in, re-verified locally, and CI ran clean end to end on the merged head: <code>lint</code>, <code>check</code>, the full OS&times;Python test matrix, <code>evals</code>, all six <code>mutation-shard</code> jobs plus the <code>mutation</code> gate, <code>smoke</code>/<code>install-smoke</code>, <code>dco</code>, <code>vale</code>, <code>lighthouse</code>, CodeQL and the security scanners &mdash; 41/41 checks green, no merge conflict.</p></details>
11647
11652
  <div class="meta">
11648
11653
  <span class="m">Complexity <b>M</b></span>
11649
11654
  <span class="m hi">Impact <b>High</b></span>