boost-skill-cli 1.2.15__tar.gz → 1.2.17__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.
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/CLAUDE.md +41 -2
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/configuration.py +3 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/discovery.py +14 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/quality.py +14 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/dense.py +314 -37
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/mcp.py +2 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/paths.py +1 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/rag.py +73 -11
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
- boost_skill_cli-1.2.17/docs/roadmap/items/dense-search-rescans-every-vector.md +94 -0
- boost_skill_cli-1.2.17/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +37 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap.html +124 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/eval_retrieval.py +7 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_configuration.py +10 -2
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_discovery.py +10 -10
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_clean_internal_cache.py +1 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense.py +7 -7
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_embed_dedupe.py +9 -9
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_fallback.py +7 -7
- boost_skill_cli-1.2.17/tests/unit/test_dense_quantized.py +376 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_shards.py +56 -22
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_status.py +11 -2
- boost_skill_cli-1.2.17/tests/unit/test_dense_status_cheap.py +281 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mcp.py +5 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_rag.py +7 -7
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_rag_fusion.py +7 -4
- boost_skill_cli-1.2.17/tests/unit/test_rerank_cache.py +128 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.gitattributes +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.gitignore +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/.vale.ini +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/LICENSE +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/Makefile +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/codecov.yml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/index.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/examples/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/index.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/noxfile.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/setup.cfg +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/style/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/style/boost.css +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/style/boost.js +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/style/demo.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.17}/tests/visual/visual_check.mjs +0 -0
|
@@ -350,8 +350,47 @@ reports `hybrid RRF`; it degrades to whichever single engine is ready, and to
|
|
|
350
350
|
BM25 alone otherwise. `dense.status()` names which of the three links (extra,
|
|
351
351
|
backend, built store) is missing, and `dense.fix_hint()` maps that to the one
|
|
352
352
|
next action — both `boost doctor` and `boost search` read that same table, so
|
|
353
|
-
they can't give contradictory advice.
|
|
354
|
-
|
|
353
|
+
they can't give contradictory advice.
|
|
354
|
+
|
|
355
|
+
**The dense store ranks twice, and `vec0` is why.** `sqlite-vec` has no ANN
|
|
356
|
+
index: a float32 `MATCH` scores *every* vector in the store, which on a real
|
|
357
|
+
750,416-chunk / 1024-d install is 3.08 GB and **28.2 s per query** — it was ~85%
|
|
358
|
+
of a 33.9 s `boost search`. So a query runs a coarse pass over
|
|
359
|
+
`vec_chunks_bin` (binary-quantized, one bit per dimension — 114 MB, Hamming) and
|
|
360
|
+
re-ranks the top `RESCORE_POOL` (2048) on their exact float32 vectors from
|
|
361
|
+
`vec_raw`. Measured: **28.2 s → 1.05 s at recall@60 = 1.000** — the same rows in
|
|
362
|
+
the same order. Both stages are required: the binary pass alone recovers 0.667
|
|
363
|
+
of the true top 60, so deleting the rescore as an "optimization" is a quality
|
|
364
|
+
regression, and `tests/unit/test_dense_quantized.py` fails if it goes.
|
|
365
|
+
`vec_raw` is an ordinary rowid-keyed table on purpose — `id IN (...)` against a
|
|
366
|
+
vec0 table plans as a full scan (256 point lookups measured 3.2 s), so the
|
|
367
|
+
rescore would cost more than the thing it replaced.
|
|
368
|
+
|
|
369
|
+
Consequences for code you write here:
|
|
370
|
+
|
|
371
|
+
- **`dim` must be a multiple of 8** for `bit[N]`, so `_quantizable()` gates the
|
|
372
|
+
layout and a non-conforming width keeps the old float32 `vec_chunks`. The
|
|
373
|
+
toy 3-d fixtures elsewhere in the suite are what keep that fallback covered;
|
|
374
|
+
`tests/unit/test_dense_quantized.py` uses 8-d.
|
|
375
|
+
- **`dense.quantize()` migrates in place and re-embeds nothing** — it re-encodes
|
|
376
|
+
vectors already on disk. It counts rows into `vec_raw` and refuses to drop
|
|
377
|
+
`vec_chunks` unless the copy is complete, because re-embedding 750k chunks is
|
|
378
|
+
a bill, not an inconvenience. `boost reindex --dense` runs it; `boost doctor`
|
|
379
|
+
names a ready-but-unquantized store. **It costs disk**: a plain table pays
|
|
380
|
+
overflow-page overhead on 4 KB blobs that vec0's packed storage does not, so
|
|
381
|
+
the measured trade is **3.40 GB → 3.87 GB (+14%), in 1360 s**, peaking at
|
|
382
|
+
~2× while both copies coexist. Don't describe it as size-neutral — an earlier
|
|
383
|
+
draft of this section did, from prediction rather than measurement.
|
|
384
|
+
- **Nothing on the search path may count `chunks`.** `SELECT COUNT(*)` scans the
|
|
385
|
+
`chunks_tap` covering index — 8,419 pages / 34.5 MB, measured 1.94 s — and
|
|
386
|
+
both `ready()` and `status()` did it on every search, the latter only to word
|
|
387
|
+
one muted hint. The total now comes from `meta["chunks"]`, emptiness from a
|
|
388
|
+
`LIMIT 1` probe, and the scan only when `status(count=True)` asks. A store
|
|
389
|
+
that never recorded a total reports `chunks: None`, **not 0**: `fix_hint`
|
|
390
|
+
reads a zero as an unfinished install and would send that user to the one
|
|
391
|
+
remedy that re-embeds everything.
|
|
392
|
+
|
|
393
|
+
`core/ai.py` wraps the opt-in LLM-assisted paths (`search --smart`, `explain`, `distill`, `infer`,
|
|
355
394
|
`absorb`, `evolve`, `simulate`, …), shelling out to the `claude` CLI or
|
|
356
395
|
`ANTHROPIC_API_KEY` when available and degrading to heuristics when not.
|
|
357
396
|
|
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.17'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 17)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1305,7 +1305,9 @@ REGISTRY.register(
|
|
|
1305
1305
|
"either: take what fits, discard the rest, the task stays yours. It costs "
|
|
1306
1306
|
"10-15 seconds — an LLM reranks every match, which is what makes the top "
|
|
1307
1307
|
"result worth acting on rather than skimming. Worth budgeting for, not a "
|
|
1308
|
-
"surprise
|
|
1308
|
+
"surprise — and only a novel search pays it: repeating an identical "
|
|
1309
|
+
"search skips the LLM and answers from a local cache. "
|
|
1310
|
+
"Coming back empty is a real answer too, not a "
|
|
1309
1311
|
"wasted turn: it means build it yourself, now knowing nothing already "
|
|
1310
1312
|
"covers it — and on a machine with nothing tapped yet it says so and names "
|
|
1311
1313
|
"the one command that fixes it, rather than reporting a miss.",
|
|
@@ -316,6 +316,10 @@ def cmd_reindex(argv):
|
|
|
316
316
|
else:
|
|
317
317
|
out.ok("embedded %d passages (%s) into the dense vector store"
|
|
318
318
|
% (dense_stats["chunks"], dense_stats["provider"]))
|
|
319
|
+
if dense_stats.get("quantized"):
|
|
320
|
+
out.ok("quantized %d existing vectors — dense search no longer "
|
|
321
|
+
"scans the whole store on every query"
|
|
322
|
+
% dense_stats["quantized"])
|
|
319
323
|
journal.log("reindex", "%d passages" % stats["docs"],
|
|
320
324
|
entries=stats["entries"])
|
|
321
325
|
return 0
|
|
@@ -328,7 +332,16 @@ def _reindex_dense(force):
|
|
|
328
332
|
from ..core import dense, embed
|
|
329
333
|
if not dense.have_backend() or not embed.available():
|
|
330
334
|
return None
|
|
331
|
-
|
|
335
|
+
# Convert a pre-quantization store first, so a user who reindexes gets the
|
|
336
|
+
# speedup without having to know the word "quantize". It re-encodes vectors
|
|
337
|
+
# already on disk — no provider call, no cost — and `build` below then adds
|
|
338
|
+
# only what changed. Doing it after would quantize, then write float32 rows
|
|
339
|
+
# into a store that no longer has a float32 table.
|
|
340
|
+
migrated = dense.quantize()
|
|
341
|
+
stats = dense.build(force=force)
|
|
342
|
+
if migrated and isinstance(stats, dict):
|
|
343
|
+
stats = stats | {"quantized": migrated["chunks"]}
|
|
344
|
+
return stats
|
|
332
345
|
|
|
333
346
|
|
|
334
347
|
def cmd_index(argv):
|
|
@@ -599,12 +599,25 @@ def _report_search_engine(bad) -> None:
|
|
|
599
599
|
# Local import: the dense/embedding engines are opt-in and stay out of
|
|
600
600
|
# startup for every other command (scripts/import_budget.py enforces it).
|
|
601
601
|
from ..core import dense
|
|
602
|
-
|
|
602
|
+
# count=True: doctor prints the chunk total, and a health check is the one
|
|
603
|
+
# caller that can afford the scan when a legacy store never recorded it.
|
|
604
|
+
# `boost search`'s hint deliberately does not (see `dense._chunk_total`).
|
|
605
|
+
st = dense.status(count=True)
|
|
603
606
|
|
|
604
607
|
if st["ready"]:
|
|
605
608
|
out.ok("semantic search active — %s %s (%d-d), %d chunk%s across %d tap%s"
|
|
606
609
|
% (st["provider"], st["model"], st["dim"] or 0,
|
|
607
610
|
st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
|
|
611
|
+
if not st["quantized"]:
|
|
612
|
+
# Ready but slow, which no other line here would say. `vec0` has no
|
|
613
|
+
# ANN index, so an unquantized store re-scans every vector on every
|
|
614
|
+
# query — 28.2 s measured at 750,416 chunks. The remedy costs no
|
|
615
|
+
# embedding calls, so it is worth naming rather than leaving the
|
|
616
|
+
# user to wonder why the search they enabled feels broken.
|
|
617
|
+
out.warn("the vector store predates binary quantization, so every "
|
|
618
|
+
"query scans all %d vectors — `boost reindex --dense` "
|
|
619
|
+
"converts it offline (no re-embedding, no API cost)"
|
|
620
|
+
% st["chunks"])
|
|
608
621
|
return
|
|
609
622
|
|
|
610
623
|
fix = dense.fix_hint(st["reason"], st)
|
|
@@ -62,15 +62,105 @@ def _connect() -> sqlite3.Connection | None:
|
|
|
62
62
|
return con
|
|
63
63
|
|
|
64
64
|
|
|
65
|
+
# How many binary candidates the exact rescore re-ranks. `vec0` has no ANN
|
|
66
|
+
# index — a `MATCH` is a full scan — so this is the only knob that decides how
|
|
67
|
+
# much of the store a query touches.
|
|
68
|
+
#
|
|
69
|
+
# Measured on a real 750,416-chunk / 1024-d store: 2048 gives recall@60 of
|
|
70
|
+
# 1.000 against a full float32 scan, for 0.35 s of rescore. 4096 costs 0.57 s
|
|
71
|
+
# and returns the same 60 rows, so the extra candidates are pure overhead.
|
|
72
|
+
RESCORE_POOL = 2048
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _quantizable(dim: int) -> bool:
|
|
76
|
+
"""Whether ``dim`` can be binary-quantized at all.
|
|
77
|
+
|
|
78
|
+
`bit[N]` packs eight dimensions per byte, so sqlite-vec rejects any N that
|
|
79
|
+
is not a multiple of 8. Every real embedding width is (384, 768, 1024,
|
|
80
|
+
1536); the toy 3-d vectors in the unit suite are not, which is what keeps
|
|
81
|
+
the float32 path exercised rather than dead.
|
|
82
|
+
"""
|
|
83
|
+
return bool(dim) and dim % 8 == 0
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _has_table(con: sqlite3.Connection, name: str) -> bool:
|
|
87
|
+
try:
|
|
88
|
+
return con.execute("SELECT 1 FROM sqlite_master WHERE name = ? LIMIT 1",
|
|
89
|
+
(name,)).fetchone() is not None
|
|
90
|
+
except sqlite3.DatabaseError:
|
|
91
|
+
return False
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def quantized(con: sqlite3.Connection) -> bool:
|
|
95
|
+
"""True when this store holds the two-stage (binary + exact) layout.
|
|
96
|
+
|
|
97
|
+
Both halves are required and neither is useful alone: `vec_chunks_bin`
|
|
98
|
+
ranks, `vec_raw` re-ranks. A store carrying only one is a half-finished
|
|
99
|
+
migration, and answering True for it would route queries into a rescore
|
|
100
|
+
with nothing to rescore against.
|
|
101
|
+
"""
|
|
102
|
+
return _has_table(con, "vec_chunks_bin") and _has_table(con, "vec_raw")
|
|
103
|
+
|
|
104
|
+
|
|
65
105
|
def _ensure_schema(con: sqlite3.Connection, dim: int) -> None:
|
|
66
106
|
con.execute(
|
|
67
107
|
"CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY AUTOINCREMENT,"
|
|
68
108
|
" name TEXT, tap TEXT, path TEXT, kind TEXT, cix INTEGER, snip TEXT)")
|
|
69
109
|
con.execute("CREATE INDEX IF NOT EXISTS chunks_tap ON chunks(tap)")
|
|
70
110
|
con.execute("CREATE TABLE IF NOT EXISTS meta (k TEXT PRIMARY KEY, v TEXT)")
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
111
|
+
if _quantizable(dim):
|
|
112
|
+
# Two relations, because one cannot do both jobs. `vec0` is the only
|
|
113
|
+
# thing that can run a KNN, and it cannot fetch a row by rowid: an
|
|
114
|
+
# `id IN (...)` against it plans as `SCAN ... VIRTUAL TABLE`, and 256
|
|
115
|
+
# single-row lookups measured 3.2 s. A plain rowid-keyed table is the
|
|
116
|
+
# opposite — useless for KNN, O(log n) per row — so the coarse pass
|
|
117
|
+
# lives in `vec_chunks_bin` and the exact rescore reads `vec_raw`.
|
|
118
|
+
con.execute("CREATE VIRTUAL TABLE IF NOT EXISTS vec_chunks_bin USING "
|
|
119
|
+
"vec0(embedding bit[%d])" % dim)
|
|
120
|
+
con.execute("CREATE TABLE IF NOT EXISTS vec_raw "
|
|
121
|
+
"(id INTEGER PRIMARY KEY, embedding BLOB)")
|
|
122
|
+
else:
|
|
123
|
+
con.execute(
|
|
124
|
+
"CREATE VIRTUAL TABLE IF NOT EXISTS vec_chunks USING "
|
|
125
|
+
"vec0(embedding float[%d] distance_metric=cosine)" % dim)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _store_vector(con: sqlite3.Connection, rowid: int | None,
|
|
129
|
+
blob: bytes) -> None:
|
|
130
|
+
"""Write one chunk's vector into whichever layout this store uses.
|
|
131
|
+
|
|
132
|
+
Quantization happens in SQL rather than in Python: `vec_quantize_binary`
|
|
133
|
+
is the same function the query side calls on the query vector, so the two
|
|
134
|
+
can never disagree about how a float becomes a bit.
|
|
135
|
+
|
|
136
|
+
``rowid`` is a caller's ``cursor.lastrowid``, which sqlite3 types as
|
|
137
|
+
optional. It is None only if the INSERT that produced it did not happen, so
|
|
138
|
+
this refuses rather than storing a vector nothing can join back to — an
|
|
139
|
+
orphan in `vec_raw` outlives every tap deletion, since those are scoped
|
|
140
|
+
through `chunks.tap`.
|
|
141
|
+
"""
|
|
142
|
+
if rowid is None:
|
|
143
|
+
raise BoostError("vector store insert produced no row id")
|
|
144
|
+
if quantized(con):
|
|
145
|
+
con.execute("INSERT INTO vec_chunks_bin (rowid, embedding) "
|
|
146
|
+
"VALUES (?, vec_quantize_binary(vec_f32(?)))", (rowid, blob))
|
|
147
|
+
con.execute("INSERT INTO vec_raw (id, embedding) VALUES (?, ?)",
|
|
148
|
+
(rowid, blob))
|
|
149
|
+
else:
|
|
150
|
+
con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
|
|
151
|
+
(rowid, blob))
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _drop_vectors(con: sqlite3.Connection, ids: list[int]) -> None:
|
|
155
|
+
"""Remove these chunk ids from every vector relation the store has."""
|
|
156
|
+
for i in ids:
|
|
157
|
+
# vec0 deletes one rowid at a time; the plain table takes a set.
|
|
158
|
+
for tbl in ("vec_chunks", "vec_chunks_bin"):
|
|
159
|
+
if _has_table(con, tbl):
|
|
160
|
+
con.execute("DELETE FROM %s WHERE rowid = ?" % tbl, (i,)) # noqa: S608 table name from a literal tuple
|
|
161
|
+
if ids and _has_table(con, "vec_raw"):
|
|
162
|
+
con.execute("DELETE FROM vec_raw WHERE id IN (%s)" # noqa: S608 interpolates only `?` placeholders
|
|
163
|
+
% ",".join("?" * len(ids)), ids)
|
|
74
164
|
|
|
75
165
|
|
|
76
166
|
def _read_meta(con: sqlite3.Connection) -> dict[str, object]:
|
|
@@ -95,6 +185,10 @@ def _write_meta(con: sqlite3.Connection, meta: dict[str, object]) -> None:
|
|
|
95
185
|
def _wipe(con: sqlite3.Connection) -> None:
|
|
96
186
|
con.execute("DROP TABLE IF EXISTS chunks")
|
|
97
187
|
con.execute("DROP TABLE IF EXISTS vec_chunks")
|
|
188
|
+
# Both halves of the quantized layout, or a --force rebuild leaves the old
|
|
189
|
+
# vectors behind to be merged with the new ones under reused rowids.
|
|
190
|
+
con.execute("DROP TABLE IF EXISTS vec_chunks_bin")
|
|
191
|
+
con.execute("DROP TABLE IF EXISTS vec_raw")
|
|
98
192
|
|
|
99
193
|
|
|
100
194
|
def _chunk_texts(entry: dict, tap_paths: dict[str, Path] | None
|
|
@@ -103,7 +197,51 @@ def _chunk_texts(entry: dict, tap_paths: dict[str, Path] | None
|
|
|
103
197
|
return chunk(body) or [body]
|
|
104
198
|
|
|
105
199
|
|
|
106
|
-
def
|
|
200
|
+
def _chunk_total(con: sqlite3.Connection, meta: dict,
|
|
201
|
+
*, exact: bool) -> tuple[int | None, bool]:
|
|
202
|
+
"""``(count-or-None, has-any-rows)`` — O(1) unless ``exact`` is asked for.
|
|
203
|
+
|
|
204
|
+
Counting `chunks` was the single most expensive thing a `boost search` did.
|
|
205
|
+
Every BM25-only search ends in a hint that calls :func:`status`, and
|
|
206
|
+
`SELECT COUNT(*) FROM chunks` scans the whole `chunks_tap` covering index:
|
|
207
|
+
measured on a real 445-tap store, 8,419 pages / 34.5 MB inside a 3.4 GB
|
|
208
|
+
file, 1.94 s with those pages already warm and the dominant term in a
|
|
209
|
+
33.9 s cold search — about 79% of a warm one, to choose the wording of a
|
|
210
|
+
single muted line.
|
|
211
|
+
|
|
212
|
+
The hot path never actually needed the number. It needs to know whether the
|
|
213
|
+
store has *any* rows, which is one indexed probe, and one `fix_hint` branch
|
|
214
|
+
wants the total, which a store built after this change records in `meta` —
|
|
215
|
+
9 pages, read anyway.
|
|
216
|
+
|
|
217
|
+
Three sources, cheapest first:
|
|
218
|
+
|
|
219
|
+
* ``meta["chunks"]``, stamped by :func:`build` and :func:`import_shard`;
|
|
220
|
+
* a ``LIMIT 1`` existence probe, which answers the `empty` reason exactly
|
|
221
|
+
and leaves the total unknown;
|
|
222
|
+
* the full scan, only when a caller says it can afford one (`boost doctor`).
|
|
223
|
+
|
|
224
|
+
Returning ``None`` for "not recorded" rather than ``0`` is the load-bearing
|
|
225
|
+
part: a legacy store has vectors the user paid to embed, and reporting zero
|
|
226
|
+
would route it to advice that re-embeds all of them.
|
|
227
|
+
"""
|
|
228
|
+
recorded = meta.get("chunks")
|
|
229
|
+
if isinstance(recorded, int) and not isinstance(recorded, bool) and recorded >= 0:
|
|
230
|
+
return recorded, recorded > 0
|
|
231
|
+
try:
|
|
232
|
+
if exact:
|
|
233
|
+
n = int(con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0])
|
|
234
|
+
return n, n > 0
|
|
235
|
+
# Stops at the first row: a b-tree descent, not a walk.
|
|
236
|
+
row = con.execute("SELECT 1 FROM chunks LIMIT 1").fetchone()
|
|
237
|
+
except sqlite3.DatabaseError:
|
|
238
|
+
# No `chunks` table at all — nothing built, which is the ordinary
|
|
239
|
+
# empty case rather than the corrupt one. Exact by definition.
|
|
240
|
+
return 0, False
|
|
241
|
+
return None, row is not None
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def _recorded_meta(*, count: bool = False) -> dict:
|
|
107
245
|
"""What an existing store says it was built with, read WITHOUT sqlite-vec.
|
|
108
246
|
|
|
109
247
|
Deliberately not routed through :func:`_connect`, which loads the extension
|
|
@@ -121,11 +259,8 @@ def _recorded_meta() -> dict:
|
|
|
121
259
|
return {}
|
|
122
260
|
try:
|
|
123
261
|
meta = _read_meta(con)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
"SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
127
|
-
except sqlite3.DatabaseError:
|
|
128
|
-
meta["_chunks"] = 0
|
|
262
|
+
meta["_chunks"], meta["_nonempty"] = _chunk_total(con, meta, exact=count)
|
|
263
|
+
meta["_quantized"] = quantized(con)
|
|
129
264
|
return meta
|
|
130
265
|
except sqlite3.DatabaseError:
|
|
131
266
|
# A truncated or non-sqlite file: report "no store", never raise into
|
|
@@ -186,17 +321,33 @@ def fix_hint(reason: str, status: dict | None = None) -> str:
|
|
|
186
321
|
# there is nothing a key would revive, and "build it" is the real next
|
|
187
322
|
# step. A store built by the local model has no env var and correctly
|
|
188
323
|
# falls through — that user does need the package back.
|
|
189
|
-
|
|
324
|
+
count = status.get("chunks")
|
|
325
|
+
# `None` is "a store is here and never recorded its total" — a legacy
|
|
326
|
+
# store, not an unfinished one. Only a *known* zero means there are no
|
|
327
|
+
# vectors to revive; reading unknown as zero would send exactly the
|
|
328
|
+
# user this branch exists to protect to the re-embed-everything answer.
|
|
329
|
+
if env and (count is None or count > 0):
|
|
330
|
+
n = f"{int(count):,} vectors" if count else "vectors"
|
|
190
331
|
return ("set the key it was built with: `export %s=...` — "
|
|
191
332
|
"reinstalling the extra swaps in the local model and "
|
|
192
|
-
"forces all %s
|
|
193
|
-
% (env, "{:,}".format(int(status["chunks"]))))
|
|
333
|
+
"forces all %s to be re-embedded" % (env, n))
|
|
194
334
|
return _FIX.get(reason, "see `boost reindex --dense`")
|
|
195
335
|
|
|
196
336
|
|
|
197
|
-
def status() -> dict:
|
|
337
|
+
def status(*, count: bool = False) -> dict:
|
|
198
338
|
"""Why dense retrieval is, or is not, serving queries.
|
|
199
339
|
|
|
340
|
+
``count`` buys an exact ``chunks`` total at the price of scanning the store
|
|
341
|
+
(see :func:`_chunk_total`). It is off by default because the caller that
|
|
342
|
+
runs on every single search — `boost search`'s one-line hint — does not use
|
|
343
|
+
the number, while paying for it made that scan ~79% of a warm search and
|
|
344
|
+
the bulk of a cold one. `boost doctor` prints the total, so it asks.
|
|
345
|
+
|
|
346
|
+
With ``count=True`` the total is always an int. Without it, ``chunks`` is
|
|
347
|
+
``None`` whenever a pre-existing store never recorded its own total;
|
|
348
|
+
``chunks_exact`` says which you got, and ``reason`` is still exact either
|
|
349
|
+
way — emptiness comes from a cheap probe, not from the count.
|
|
350
|
+
|
|
200
351
|
Pure inspection — never builds, never embeds, never needs the extra. Three
|
|
201
352
|
independent things must line up (the ``[rag]`` extra, an embeddings key, a
|
|
202
353
|
built store whose space matches the live one) and every one of them fails
|
|
@@ -210,13 +361,17 @@ def status() -> dict:
|
|
|
210
361
|
"""
|
|
211
362
|
have_be = have_backend()
|
|
212
363
|
prov, mdl, dim = embed.provider(), embed.model(), embed.dimension()
|
|
213
|
-
meta = _recorded_meta()
|
|
364
|
+
meta = _recorded_meta(count=count)
|
|
214
365
|
b_prov = meta.get("provider")
|
|
215
366
|
b_mdl = meta.get("model")
|
|
216
367
|
b_dim = meta.get("dim")
|
|
217
368
|
b_ver = meta.get("version")
|
|
218
369
|
commits = meta.get("commits")
|
|
219
|
-
|
|
370
|
+
raw_chunks = meta.get("_chunks")
|
|
371
|
+
chunks = int(raw_chunks) if isinstance(raw_chunks, int) else None
|
|
372
|
+
# Emptiness is answered by the probe, never by the count — that is what
|
|
373
|
+
# lets the count stay unknown without any reason becoming a guess.
|
|
374
|
+
nonempty = bool(meta.get("_nonempty"))
|
|
220
375
|
store_exists = bool(meta)
|
|
221
376
|
|
|
222
377
|
# Order matters: report the *first* missing link, so the message names the
|
|
@@ -235,7 +390,7 @@ def status() -> dict:
|
|
|
235
390
|
reason = "model-changed"
|
|
236
391
|
elif b_dim != dim:
|
|
237
392
|
reason = "dim-changed"
|
|
238
|
-
elif
|
|
393
|
+
elif not nonempty:
|
|
239
394
|
reason = "empty"
|
|
240
395
|
else:
|
|
241
396
|
reason = None
|
|
@@ -255,6 +410,11 @@ def status() -> dict:
|
|
|
255
410
|
"built_provider": b_prov, "built_model": b_mdl,
|
|
256
411
|
"built_dim": b_dim, "built_version": b_ver,
|
|
257
412
|
"chunks": chunks,
|
|
413
|
+
"chunks_exact": chunks is not None,
|
|
414
|
+
# Ready-but-unquantized is a real state and the only one that is fast
|
|
415
|
+
# to fix and expensive to leave: correct answers, at a full scan per
|
|
416
|
+
# query. Nothing else in this dict distinguishes it.
|
|
417
|
+
"quantized": bool(meta.get("_quantized")),
|
|
258
418
|
"taps": len(commits) if isinstance(commits, dict) else 0,
|
|
259
419
|
"ready": reason is None,
|
|
260
420
|
"reason": reason,
|
|
@@ -291,11 +451,11 @@ def ready() -> bool:
|
|
|
291
451
|
return False
|
|
292
452
|
if meta.get("dim") != embed.dimension():
|
|
293
453
|
return False
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
return
|
|
454
|
+
# Existence, not a total: this runs on every search that has a store to
|
|
455
|
+
# consult, and counting `chunks` walks its whole covering index — 34.5
|
|
456
|
+
# MB on a real 445-tap store — to answer a yes/no question. `LIMIT 1`
|
|
457
|
+
# stops at the first row. See `_chunk_total` for the measurements.
|
|
458
|
+
return _chunk_total(con, meta, exact=False)[1]
|
|
299
459
|
finally:
|
|
300
460
|
con.close()
|
|
301
461
|
|
|
@@ -363,10 +523,14 @@ def build(entries: list[dict] | None = None,
|
|
|
363
523
|
failed_safe = {t.replace("/", "__") for t in failed_taps}
|
|
364
524
|
recorded = {safe: c for safe, c in commits.items()
|
|
365
525
|
if safe not in failed_safe}
|
|
526
|
+
# Counted before the meta write, not after, so the total can be stamped
|
|
527
|
+
# into `meta` — that is what lets every later `status()` skip the scan
|
|
528
|
+
# (see `_chunk_total`). The build already paid for this count.
|
|
529
|
+
total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
366
530
|
_write_meta(con, {"version": INDEX_VERSION, "provider": prov,
|
|
367
|
-
"model": mdl, "dim": dim, "commits": recorded
|
|
531
|
+
"model": mdl, "dim": dim, "commits": recorded,
|
|
532
|
+
"chunks": total})
|
|
368
533
|
con.commit()
|
|
369
|
-
total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
370
534
|
return {
|
|
371
535
|
"entries": len({entry_key(e) for e in entries}),
|
|
372
536
|
"chunks": total,
|
|
@@ -428,10 +592,15 @@ def export_shard(tap: str) -> dict:
|
|
|
428
592
|
expected = _tap_chunk_count(con, tap)
|
|
429
593
|
chunks = []
|
|
430
594
|
try:
|
|
595
|
+
# `vec_raw` on a quantized store is an ordinary table, so this
|
|
596
|
+
# join needs no extension at all — which is the failure this
|
|
597
|
+
# function's docstring describes, gone rather than worked around.
|
|
598
|
+
vt = "vec_raw v ON v.id = c.id" if quantized(con) \
|
|
599
|
+
else "vec_chunks v ON v.rowid = c.id"
|
|
431
600
|
rows = con.execute(
|
|
432
|
-
"SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding "
|
|
433
|
-
"FROM chunks c JOIN
|
|
434
|
-
|
|
601
|
+
"SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding " # noqa: S608 relation name from a literal pair
|
|
602
|
+
"FROM chunks c JOIN %s WHERE c.tap = ? ORDER BY c.id" % vt,
|
|
603
|
+
(tap,)).fetchall()
|
|
435
604
|
except sqlite3.Error as exc:
|
|
436
605
|
# Only a tap that HAS chunks can have unreadable ones. With none,
|
|
437
606
|
# the vector relation not resolving says nothing about this tap —
|
|
@@ -534,15 +703,18 @@ def import_shard(shard: dict, commit: str) -> tuple[bool, str]:
|
|
|
534
703
|
(c.get("name"), c.get("tap"), c.get("path"), c.get("kind"),
|
|
535
704
|
c.get("cix"), c.get("snip")))
|
|
536
705
|
blob = base64.b64decode(c["embedding"])
|
|
537
|
-
con.
|
|
538
|
-
(cur.lastrowid, blob))
|
|
706
|
+
_store_vector(con, cur.lastrowid, blob)
|
|
539
707
|
commits = meta.get("commits")
|
|
540
708
|
commits = dict(commits) if isinstance(commits, dict) else {}
|
|
541
709
|
commits[str(shard.get("tap") or "").replace("/", "__")] = commit
|
|
542
710
|
_write_meta(con, {"version": INDEX_VERSION,
|
|
543
711
|
"provider": shard.get("provider"),
|
|
544
712
|
"model": shard.get("model"), "dim": dim,
|
|
545
|
-
"commits": commits
|
|
713
|
+
"commits": commits,
|
|
714
|
+
# Keep the recorded total true after a merge, or the
|
|
715
|
+
# next `status()` serves a stale number forever.
|
|
716
|
+
"chunks": con.execute(
|
|
717
|
+
"SELECT COUNT(*) FROM chunks").fetchone()[0]})
|
|
546
718
|
con.commit()
|
|
547
719
|
_ = mod # extension loaded by _connect; kept for symmetry
|
|
548
720
|
return True, "imported %d chunks" % len(shard.get("chunks") or [])
|
|
@@ -564,8 +736,7 @@ def _delete_taps(con: sqlite3.Connection, taps: list[str]) -> None:
|
|
|
564
736
|
for tap in taps:
|
|
565
737
|
ids = [r[0] for r in
|
|
566
738
|
con.execute("SELECT id FROM chunks WHERE tap = ?", (tap,))]
|
|
567
|
-
|
|
568
|
-
con.execute("DELETE FROM vec_chunks WHERE rowid = ?", (i,))
|
|
739
|
+
_drop_vectors(con, ids)
|
|
569
740
|
con.execute("DELETE FROM chunks WHERE tap = ?", (tap,))
|
|
570
741
|
|
|
571
742
|
|
|
@@ -626,12 +797,121 @@ def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
|
|
|
626
797
|
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
627
798
|
(e["name"], e["tap"], e["skill_md"],
|
|
628
799
|
e.get("kind", "skill"), ci, text[:200].strip()))
|
|
629
|
-
con.
|
|
630
|
-
(cur.lastrowid, mod.serialize_float32(vec)))
|
|
800
|
+
_store_vector(con, cur.lastrowid, mod.serialize_float32(vec))
|
|
631
801
|
added += 1
|
|
632
802
|
return added, failed_taps
|
|
633
803
|
|
|
634
804
|
|
|
805
|
+
def quantize() -> dict | None:
|
|
806
|
+
"""Convert an existing float32 store to the two-stage layout, in place.
|
|
807
|
+
|
|
808
|
+
Offline and free: it re-reads vectors the user already paid to embed and
|
|
809
|
+
re-encodes them locally. No provider is called, no text is re-chunked, and
|
|
810
|
+
nothing is lost — `vec_raw` receives the *same* float32 blobs `vec_chunks`
|
|
811
|
+
held, so dropping `vec_chunks` relocates the data rather than discarding it.
|
|
812
|
+
|
|
813
|
+
It costs disk, in two ways worth stating plainly. While it runs the copy
|
|
814
|
+
sits beside the original, so the file grows to roughly twice the store
|
|
815
|
+
before the ``DROP`` and ``VACUUM``. And it does not come all the way back:
|
|
816
|
+
an ordinary table pays overflow-page overhead on 4 KB blobs that vec0's
|
|
817
|
+
packed storage does not, so `vec_raw` lands ~12% larger than the
|
|
818
|
+
`vec_chunks` it replaces, and the binary index adds its own 114 MB.
|
|
819
|
+
Measured end to end on a real 750,416-chunk store: **3.40 GB -> 3.87 GB**,
|
|
820
|
+
a 14% permanent increase, in 1360 s. That is the price of the 19-27x query
|
|
821
|
+
speedup, and it is a trade rather than a free win.
|
|
822
|
+
|
|
823
|
+
Returns None when there is nothing to do (no store, no backend, a
|
|
824
|
+
non-quantizable width, or a store already converted).
|
|
825
|
+
"""
|
|
826
|
+
if not db_path().exists():
|
|
827
|
+
return None
|
|
828
|
+
con = _connect()
|
|
829
|
+
if con is None:
|
|
830
|
+
return None
|
|
831
|
+
try:
|
|
832
|
+
meta = _read_meta(con)
|
|
833
|
+
dim = meta.get("dim")
|
|
834
|
+
if not isinstance(dim, int) or not _quantizable(dim):
|
|
835
|
+
return None
|
|
836
|
+
if quantized(con) or not _has_table(con, "vec_chunks"):
|
|
837
|
+
return None
|
|
838
|
+
before = _chunk_total(con, {}, exact=True)[0] or 0
|
|
839
|
+
_ensure_schema(con, dim)
|
|
840
|
+
con.execute("INSERT INTO vec_raw (id, embedding) "
|
|
841
|
+
"SELECT rowid, embedding FROM vec_chunks")
|
|
842
|
+
con.execute("INSERT INTO vec_chunks_bin (rowid, embedding) "
|
|
843
|
+
"SELECT rowid, vec_quantize_binary(vec_f32(embedding)) "
|
|
844
|
+
"FROM vec_chunks")
|
|
845
|
+
moved = con.execute("SELECT COUNT(*) FROM vec_raw").fetchone()[0]
|
|
846
|
+
# Verify before destroying. A short copy means the drop below would be
|
|
847
|
+
# the one step in this function that loses vectors, and re-embedding
|
|
848
|
+
# 750,416 chunks is a bill, not an inconvenience.
|
|
849
|
+
if moved != before:
|
|
850
|
+
con.rollback()
|
|
851
|
+
raise BoostError(
|
|
852
|
+
"quantize copied %d of %d vectors — store left unchanged"
|
|
853
|
+
% (moved, before),
|
|
854
|
+
hint="rebuild instead: `boost reindex --dense --force`")
|
|
855
|
+
con.execute("DROP TABLE IF EXISTS vec_chunks")
|
|
856
|
+
_write_meta(con, {"chunks": before})
|
|
857
|
+
con.commit()
|
|
858
|
+
finally:
|
|
859
|
+
con.close()
|
|
860
|
+
# Outside the transaction: VACUUM cannot run inside one, and without it the
|
|
861
|
+
# freed float32 pages stay allocated to the file.
|
|
862
|
+
con2 = _connect()
|
|
863
|
+
if con2 is not None:
|
|
864
|
+
try:
|
|
865
|
+
con2.execute("VACUUM")
|
|
866
|
+
except sqlite3.DatabaseError:
|
|
867
|
+
pass # a bigger file is a cosmetic loss, not a failure
|
|
868
|
+
finally:
|
|
869
|
+
con2.close()
|
|
870
|
+
return {"chunks": before, "bytes": db_path().stat().st_size}
|
|
871
|
+
|
|
872
|
+
|
|
873
|
+
def _knn(con: sqlite3.Connection, qblob: bytes,
|
|
874
|
+
pool: int) -> list[tuple[int, float]]:
|
|
875
|
+
"""``(chunk_id, cosine_distance)`` for the ``pool`` nearest chunks.
|
|
876
|
+
|
|
877
|
+
Two-stage on a quantized store, one stage on a legacy one, and the answer
|
|
878
|
+
is the same either way — which is the whole point. `vec0` has no ANN index,
|
|
879
|
+
so a float32 `MATCH` computes a distance against every vector in the store:
|
|
880
|
+
on a real 750,416-chunk / 1024-d install that is 3.08 GB read and 28.2 s of
|
|
881
|
+
arithmetic **per query**, and it was ~85% of a 33.9 s `boost search`.
|
|
882
|
+
|
|
883
|
+
Binary quantization makes the same comparison 32x smaller — one bit per
|
|
884
|
+
dimension, 128 bytes instead of 4096, 114 MB instead of 3.08 GB — and
|
|
885
|
+
Hamming distance over it is a popcount. That pass alone takes 0.70 s, but
|
|
886
|
+
it is an *approximation*: measured against a full float32 scan it recovers
|
|
887
|
+
only 0.667 of the true top 60, which is a quality regression no amount of
|
|
888
|
+
speed pays for.
|
|
889
|
+
|
|
890
|
+
So it is a filter, not an answer. The 2048 nearest binary candidates are
|
|
891
|
+
re-ranked on their exact float32 vectors, which restores the true ordering
|
|
892
|
+
— measured recall@60 of **1.000**, the same rows in the same order — for
|
|
893
|
+
0.35 s more. Together: 28.2 s -> 1.05 s, 27x, with identical results.
|
|
894
|
+
"""
|
|
895
|
+
if quantized(con):
|
|
896
|
+
cand = [r[0] for r in con.execute(
|
|
897
|
+
"SELECT rowid FROM vec_chunks_bin "
|
|
898
|
+
"WHERE embedding MATCH vec_quantize_binary(vec_f32(?)) "
|
|
899
|
+
"ORDER BY distance LIMIT ?", (qblob, max(pool, RESCORE_POOL)))]
|
|
900
|
+
if not cand:
|
|
901
|
+
return []
|
|
902
|
+
# Exact cosine over the candidates only. `vec_raw` is an ordinary
|
|
903
|
+
# rowid-keyed table precisely so this `IN` is an index lookup; the same
|
|
904
|
+
# clause against a vec0 table plans as a full scan (see _ensure_schema).
|
|
905
|
+
return con.execute(
|
|
906
|
+
"SELECT id, vec_distance_cosine(embedding, ?) AS d FROM vec_raw " # noqa: S608 interpolates only `?` placeholders
|
|
907
|
+
"WHERE id IN (%s) ORDER BY d LIMIT ?"
|
|
908
|
+
% ",".join("?" * len(cand)), (qblob, *cand, pool)).fetchall()
|
|
909
|
+
return con.execute(
|
|
910
|
+
"SELECT rowid, distance FROM vec_chunks "
|
|
911
|
+
"WHERE embedding MATCH ? ORDER BY distance LIMIT ?",
|
|
912
|
+
(qblob, pool)).fetchall()
|
|
913
|
+
|
|
914
|
+
|
|
635
915
|
def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
636
916
|
entries: list[dict] | None = None) -> list[Hit] | None:
|
|
637
917
|
"""Top-k dense hits for ``query``, or None to signal 'fall back to BM25'."""
|
|
@@ -647,10 +927,7 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
647
927
|
try:
|
|
648
928
|
pool = max(k * _POOL, 200)
|
|
649
929
|
try:
|
|
650
|
-
knn = con.
|
|
651
|
-
"SELECT rowid, distance FROM vec_chunks "
|
|
652
|
-
"WHERE embedding MATCH ? ORDER BY distance LIMIT ?",
|
|
653
|
-
(mod.serialize_float32(qv[0]), pool)).fetchall()
|
|
930
|
+
knn = _knn(con, mod.serialize_float32(qv[0]), pool)
|
|
654
931
|
except sqlite3.OperationalError:
|
|
655
932
|
# Some sqlite3/sqlite-vec combinations (observed on Windows)
|
|
656
933
|
# reject this exact query shape ("a LIMIT or 'k = ?' constraint
|
|
@@ -194,7 +194,8 @@ INSTRUCTIONS = (
|
|
|
194
194
|
"what exists. Both are read-only and install nothing. boost_list is "
|
|
195
195
|
"instant. boost_search costs 10-15 seconds: it retrieves, then an LLM "
|
|
196
196
|
"reranks every match, which is what makes the top result worth acting on "
|
|
197
|
-
"rather than skimming ten
|
|
197
|
+
"rather than skimming ten. Only a novel search pays it — repeating an "
|
|
198
|
+
"identical search skips the LLM and answers from a local cache.\n"
|
|
198
199
|
"\n"
|
|
199
200
|
"WORTH THE SECONDS (boost_search — boost_list is free, call it whenever). "
|
|
200
201
|
"Two signals, both readable from the request itself rather than from work "
|
|
@@ -85,6 +85,7 @@ INTERNAL_CACHE_FILES = frozenset({
|
|
|
85
85
|
"rag_index.json", # rag.index_path() — BM25 index
|
|
86
86
|
"rag_postings.sqlite", # rag.postings_path() — BM25 postings
|
|
87
87
|
"rag_vectors.sqlite", # dense.db_path() — dense vectors
|
|
88
|
+
"rerank_cache.json", # rag.rerank_cache_path() — LLM rerank orders
|
|
88
89
|
"discovery.json", # discovery._discovery_path()
|
|
89
90
|
"_names.txt", # complete.names_file() — shell completion
|
|
90
91
|
})
|