boost-skill-cli 1.2.14__tar.gz → 1.2.16__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.14 → boost_skill_cli-1.2.16}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/configuration.py +3 -1
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/dense.py +10 -2
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/mcp.py +2 -1
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/paths.py +1 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/rag.py +182 -26
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/rag-architecture.md +15 -0
- boost_skill_cli-1.2.16/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +49 -0
- boost_skill_cli-1.2.16/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +37 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap.html +79 -1
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_retrieval.py +7 -1
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_configuration.py +10 -2
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_clean_internal_cache.py +1 -0
- boost_skill_cli-1.2.16/tests/unit/test_dense_ready_order.py +40 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcp.py +5 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_rag.py +28 -12
- boost_skill_cli-1.2.16/tests/unit/test_rag_fastpath.py +279 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_rag_fusion.py +7 -4
- boost_skill_cli-1.2.16/tests/unit/test_rerank_cache.py +128 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.gitattributes +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.gitignore +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/.vale.ini +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/LICENSE +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/Makefile +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/README.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/codecov.yml +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/index.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/README.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/examples/README.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/index.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/noxfile.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/setup.cfg +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/README.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/boost.css +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/boost.js +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/style/demo.html +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.14 → boost_skill_cli-1.2.16}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.16'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 16)
|
|
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.",
|
|
@@ -263,8 +263,16 @@ def status() -> dict:
|
|
|
263
263
|
|
|
264
264
|
|
|
265
265
|
def ready() -> bool:
|
|
266
|
-
"""True when a usable, provider-matched vector index exists on disk.
|
|
267
|
-
|
|
266
|
+
"""True when a usable, provider-matched vector index exists on disk.
|
|
267
|
+
|
|
268
|
+
The stat comes first, deliberately: on a machine with no vector store —
|
|
269
|
+
every BM25-only install — this must answer False without importing the
|
|
270
|
+
backend, because ``have_backend()`` drags in numpy via sqlite_vec
|
|
271
|
+
(~120 ms measured) and every cold ``boost search`` asks.
|
|
272
|
+
"""
|
|
273
|
+
if not db_path().exists():
|
|
274
|
+
return False
|
|
275
|
+
if not have_backend() or not embed.available():
|
|
268
276
|
return False
|
|
269
277
|
con = _connect()
|
|
270
278
|
if con is None:
|
|
@@ -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
|
})
|
|
@@ -19,6 +19,7 @@ import contextlib
|
|
|
19
19
|
import hashlib
|
|
20
20
|
import json
|
|
21
21
|
import math
|
|
22
|
+
import os
|
|
22
23
|
import re
|
|
23
24
|
import sqlite3
|
|
24
25
|
from collections import defaultdict
|
|
@@ -445,12 +446,16 @@ def _load_raw() -> dict | None:
|
|
|
445
446
|
p = index_path()
|
|
446
447
|
key = str(p)
|
|
447
448
|
try:
|
|
448
|
-
|
|
449
|
+
st = p.stat()
|
|
449
450
|
except OSError:
|
|
450
451
|
_CACHE.pop(key, None)
|
|
451
452
|
return None
|
|
453
|
+
# (mtime_ns, size), not bare mtime: a rewrite landing inside one mtime
|
|
454
|
+
# tick would otherwise serve the previous index from this cache forever —
|
|
455
|
+
# the same stamp `catalog._cached_tap` already uses, for the same reason.
|
|
456
|
+
stamp = (st.st_mtime_ns, st.st_size)
|
|
452
457
|
cached = _CACHE.get(key)
|
|
453
|
-
if isinstance(cached, tuple) and cached[0] ==
|
|
458
|
+
if isinstance(cached, tuple) and cached[0] == stamp:
|
|
454
459
|
return cached[1] # type: ignore[return-value]
|
|
455
460
|
try:
|
|
456
461
|
data = json.loads(p.read_text(encoding="utf-8"))
|
|
@@ -458,7 +463,7 @@ def _load_raw() -> dict | None:
|
|
|
458
463
|
return None
|
|
459
464
|
if not isinstance(data, dict) or data.get("version") != INDEX_VERSION:
|
|
460
465
|
return None
|
|
461
|
-
_CACHE[key] = (
|
|
466
|
+
_CACHE[key] = (stamp, data)
|
|
462
467
|
return data
|
|
463
468
|
|
|
464
469
|
|
|
@@ -699,16 +704,97 @@ def dedupe_by_content(hits: list[Hit], limit: int) -> list[Hit]:
|
|
|
699
704
|
# Same body already shown. Keep its rank, but prefer a better source.
|
|
700
705
|
kept = out[seen]
|
|
701
706
|
if source_rank(hit["entry"]) < source_rank(kept["entry"]):
|
|
702
|
-
#
|
|
703
|
-
#
|
|
704
|
-
#
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
"snippet": kept["snippet"],
|
|
708
|
-
"content": digest})
|
|
707
|
+
# Copy the kept hit wholesale and swap only the entry: a literal
|
|
708
|
+
# rebuild here would silently drop anything else the caller
|
|
709
|
+
# carried on the hit (retrieve defers snippet windowing through
|
|
710
|
+
# this function, so the carry is load-bearing, not hygiene).
|
|
711
|
+
out[seen] = cast(Hit, {**kept, "entry": hit["entry"]})
|
|
709
712
|
return out[:limit]
|
|
710
713
|
|
|
711
714
|
|
|
715
|
+
def _windowed(hits: list[Hit], terms: Sequence[str]) -> list[Hit]:
|
|
716
|
+
"""Window each hit's raw stored snip onto the query terms.
|
|
717
|
+
|
|
718
|
+
Deferred to the hits actually returned: ranking carries the raw ``snip``
|
|
719
|
+
through dedupe, and only the survivors pay ``_passage`` — the eager
|
|
720
|
+
version computed 39,726 windows on a real machine to display 60.
|
|
721
|
+
"""
|
|
722
|
+
return [cast(Hit, {**h, "snippet": _passage(h["snippet"], terms)})
|
|
723
|
+
for h in hits]
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
def _retrieve_from_index(docs: list[dict], scores: dict[int, float],
|
|
727
|
+
terms: list[str], k: int, kind: str | None,
|
|
728
|
+
) -> list[Hit] | None:
|
|
729
|
+
"""Rank from the index's own doc metadata — no full-catalogue parse.
|
|
730
|
+
|
|
731
|
+
The slow path builds a ``live`` map by parsing every tap cache on the
|
|
732
|
+
machine (458 files, ~100 MB, 0.32 s measured) to serve two needs: filter
|
|
733
|
+
docs whose entry is gone, and hand back real entry dicts. On a fresh index
|
|
734
|
+
both are answerable cheaper: every doc of a still-configured tap is live
|
|
735
|
+
by construction (``ensure()`` rebuilds on staleness), and only the final
|
|
736
|
+
``k`` survivors need materialising — so only *their* taps' caches load.
|
|
737
|
+
|
|
738
|
+
Ranking, dedupe and tie-breaks use index-side values (``n``/``h``/``k``)
|
|
739
|
+
that ``build()`` copied from the same cache entries the slow path reads,
|
|
740
|
+
plus a shadow entry carrying the two fields ``source_rank`` consults
|
|
741
|
+
(``tap``, ``curated``) from one ``registry.list_taps()`` snapshot — never
|
|
742
|
+
a second config read, and never :func:`registry.get`, which raises for a
|
|
743
|
+
concurrently-untapped name.
|
|
744
|
+
|
|
745
|
+
Returns ``None`` when any survivor's entry cannot be materialised (a tap
|
|
746
|
+
cache vanished or moved under a stat-fresh index): the caller reruns the
|
|
747
|
+
query through the explicit-entries path, whose output is the contract.
|
|
748
|
+
Byte-identical-or-fall-back, never approximate.
|
|
749
|
+
"""
|
|
750
|
+
taps = {t.name: t for t in registry.list_taps()}
|
|
751
|
+
best: dict[tuple[str, str], tuple[float, str, str, str]] = {}
|
|
752
|
+
for doc_id, score in scores.items():
|
|
753
|
+
d = docs[doc_id]
|
|
754
|
+
if kind is not None and d["k"] != kind:
|
|
755
|
+
continue
|
|
756
|
+
if d["t"] not in taps: # untapped repos stop ranking, stale or not
|
|
757
|
+
continue
|
|
758
|
+
key = (d["t"], d["f"])
|
|
759
|
+
prev = best.get(key)
|
|
760
|
+
if prev is None or score > prev[0]:
|
|
761
|
+
best[key] = (score, d["snip"], d.get("h", ""), d["n"])
|
|
762
|
+
ranked = sorted(best.items(),
|
|
763
|
+
key=lambda kv: (-kv[1][0], kv[1][3], kv[0]))
|
|
764
|
+
# The shadow entry carries exactly what downstream code reads before
|
|
765
|
+
# materialisation: `source_rank` consults tap + curated, and the loop
|
|
766
|
+
# below reads tap + skill_md. Nothing else — an extra field here would
|
|
767
|
+
# be dead weight pretending to be contract.
|
|
768
|
+
hits: list[Hit] = [
|
|
769
|
+
{"entry": {"tap": key[0], "skill_md": key[1],
|
|
770
|
+
"curated": taps[key[0]].curated},
|
|
771
|
+
"score": score, "content": digest,
|
|
772
|
+
"snippet": snip} # type: ignore[typeddict-item]
|
|
773
|
+
for key, (score, snip, digest, _name) in ranked]
|
|
774
|
+
# The FULL ranked list flows through dedupe, exactly as the slow path's
|
|
775
|
+
# does: a curated duplicate at rank 3,000 legally replaces the displayed
|
|
776
|
+
# source of survivor #1, so the promotion scan cannot be truncated.
|
|
777
|
+
survivors = dedupe_by_content(hits, len(hits))
|
|
778
|
+
loaded: dict[str, dict[tuple[str, str], dict]] = {}
|
|
779
|
+
out: list[Hit] = []
|
|
780
|
+
for hit in survivors:
|
|
781
|
+
if len(out) == k:
|
|
782
|
+
break
|
|
783
|
+
tap_name = hit["entry"]["tap"]
|
|
784
|
+
tap = taps.get(tap_name)
|
|
785
|
+
if tap is None: # promoted source raced an untap
|
|
786
|
+
return None
|
|
787
|
+
if tap_name not in loaded:
|
|
788
|
+
loaded[tap_name] = {entry_key(e): e
|
|
789
|
+
for e in catalog.load_tap(tap)}
|
|
790
|
+
entry = loaded[tap_name].get((tap_name, hit["entry"]["skill_md"]))
|
|
791
|
+
if entry is None:
|
|
792
|
+
return None
|
|
793
|
+
out.append(cast(Hit, {**hit, "entry": entry,
|
|
794
|
+
"snippet": _passage(hit["snippet"], terms)}))
|
|
795
|
+
return out
|
|
796
|
+
|
|
797
|
+
|
|
712
798
|
def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
713
799
|
entries: list[dict] | None = None) -> list[Hit]:
|
|
714
800
|
"""Top-k full-content hits for ``query``. ``[]`` if the index is empty."""
|
|
@@ -718,11 +804,20 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
718
804
|
terms = tokenize(query)
|
|
719
805
|
if not terms:
|
|
720
806
|
return []
|
|
721
|
-
entries = catalog.all_entries() if entries is None else entries
|
|
722
|
-
live = {entry_key(e): e for e in entries}
|
|
723
807
|
docs = raw["docs"]
|
|
808
|
+
scores = _bm25(terms, raw, read_postings(terms))
|
|
809
|
+
if entries is None:
|
|
810
|
+
fast = _retrieve_from_index(docs, scores, terms, k, kind)
|
|
811
|
+
if fast is not None:
|
|
812
|
+
return fast
|
|
813
|
+
# An entry vanished between index and cache: answer from the full
|
|
814
|
+
# catalogue exactly as before the fast path existed. One side effect
|
|
815
|
+
# rides along only here now — load_tap's rescan of old-CACHE_FORMAT
|
|
816
|
+
# caches, which otherwise happens on tap operations and build().
|
|
817
|
+
entries = catalog.all_entries()
|
|
818
|
+
live = {entry_key(e): e for e in entries}
|
|
724
819
|
best: dict[tuple[str, str], tuple[float, str, str]] = {}
|
|
725
|
-
for doc_id, score in
|
|
820
|
+
for doc_id, score in scores.items():
|
|
726
821
|
d = docs[doc_id]
|
|
727
822
|
if kind is not None and d["k"] != kind:
|
|
728
823
|
continue
|
|
@@ -742,9 +837,52 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
742
837
|
# or they still consume the slots they were removed from.
|
|
743
838
|
hits: list[Hit] = [
|
|
744
839
|
{"entry": live[key], "score": score, "content": digest,
|
|
745
|
-
"snippet":
|
|
840
|
+
"snippet": snip} # type: ignore[typeddict-item]
|
|
746
841
|
for key, (score, snip, digest) in ranked]
|
|
747
|
-
return dedupe_by_content(hits, k)
|
|
842
|
+
return _windowed(dedupe_by_content(hits, k), terms)
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
def rerank_cache_path() -> Path:
|
|
846
|
+
"""Where cached rerank orders live; in ``paths.INTERNAL_CACHE_FILES``."""
|
|
847
|
+
return paths.cache_dir() / "rerank_cache.json"
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
#: FIFO cap on cached rerank orders. 200 entries is a few days of real use at
|
|
851
|
+
#: a few KB total; the point is bounding the file, not maximising hits.
|
|
852
|
+
RERANK_CACHE_CAP = 200
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
def _rerank_cache_load() -> dict:
|
|
856
|
+
"""The cache as a dict, ``{}`` for missing/corrupt — never an error."""
|
|
857
|
+
try:
|
|
858
|
+
data = json.loads(rerank_cache_path().read_text(encoding="utf-8"))
|
|
859
|
+
except (OSError, json.JSONDecodeError):
|
|
860
|
+
return {}
|
|
861
|
+
return data if isinstance(data, dict) else {}
|
|
862
|
+
|
|
863
|
+
|
|
864
|
+
def _rerank_cache_get(key: str) -> list | None:
|
|
865
|
+
"""A cached name order for ``key``, or None on any doubt at all."""
|
|
866
|
+
order = _rerank_cache_load().get(key)
|
|
867
|
+
return order if isinstance(order, list) and order else None
|
|
868
|
+
|
|
869
|
+
|
|
870
|
+
def _rerank_cache_put(key: str, order: list) -> None:
|
|
871
|
+
"""Store ``order``, evicting oldest-inserted beyond the cap.
|
|
872
|
+
|
|
873
|
+
JSON objects round-trip in insertion order, so the dict itself is the
|
|
874
|
+
FIFO — no timestamps to tie-break. Best-effort on purpose: a read-only
|
|
875
|
+
cache dir loses the cache, never the search, and a concurrent writer
|
|
876
|
+
clobbering this write costs a future miss, not corruption.
|
|
877
|
+
"""
|
|
878
|
+
cache = _rerank_cache_load()
|
|
879
|
+
cache.pop(key, None)
|
|
880
|
+
cache[key] = order
|
|
881
|
+
while len(cache) > RERANK_CACHE_CAP:
|
|
882
|
+
cache.pop(next(iter(cache)))
|
|
883
|
+
with contextlib.suppress(OSError):
|
|
884
|
+
paths.ensure_dirs()
|
|
885
|
+
util.atomic_write_text(rerank_cache_path(), json.dumps(cache))
|
|
748
886
|
|
|
749
887
|
|
|
750
888
|
#: The label `rerank` returns when the LLM pass actually ran. Every other value
|
|
@@ -766,6 +904,15 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
|
|
|
766
904
|
answered, so a confident "BM25 full-content" sent debugging somewhere else.
|
|
767
905
|
|
|
768
906
|
The default keeps direct callers unchanged; ``search`` passes the real one.
|
|
907
|
+
|
|
908
|
+
Repeat calls answer from a small on-disk cache keyed on a hash of exactly
|
|
909
|
+
what the LLM would see — query, limit, and the candidate listing — so it
|
|
910
|
+
self-invalidates on any reindex, ranking drift, or snippet change without
|
|
911
|
+
ever inspecting why. Only the parsed name order is stored; a hit replays
|
|
912
|
+
through the same deterministic reorder below, and keeps the LLM_RANKER
|
|
913
|
+
label because it *is* the LLM's ordering. ``BOOST_NO_RERANK_CACHE=1``
|
|
914
|
+
bypasses both read and write (the Tier 2a eval sets it, so a graded
|
|
915
|
+
rerank is always live).
|
|
769
916
|
"""
|
|
770
917
|
top = hits[:max(limit, 15)]
|
|
771
918
|
if not ai.available():
|
|
@@ -774,17 +921,26 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
|
|
|
774
921
|
"- %s [%s]: %s" % (h["entry"]["name"], h["entry"].get("kind", "skill"),
|
|
775
922
|
(h["snippet"] or h["entry"].get("description", ""))[:180])
|
|
776
923
|
for h in top)
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
"
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
924
|
+
caching = not os.environ.get("BOOST_NO_RERANK_CACHE")
|
|
925
|
+
cache_key = hashlib.sha256(
|
|
926
|
+
("%s\n%d\n%s" % (query, limit, listing)).encode("utf-8", "replace")
|
|
927
|
+
).hexdigest()
|
|
928
|
+
order = _rerank_cache_get(cache_key) if caching else None
|
|
929
|
+
if order is None:
|
|
930
|
+
reply = ai.ask(
|
|
931
|
+
"Task: %s\n\nCandidate skills (name, kind, best matching text):\n%s\n\n"
|
|
932
|
+
"Order the skill names best-match-first for the task. "
|
|
933
|
+
"Reply with ONLY a JSON array of names." % (query, listing),
|
|
934
|
+
system="You rank AI coding skills by how well they fit a task.",
|
|
935
|
+
max_tokens=400)
|
|
936
|
+
order = _json_array(reply)
|
|
937
|
+
if not order:
|
|
938
|
+
# The model answered but not with a JSON array, so the ordering
|
|
939
|
+
# falls back to whatever retrieval produced — and so must the
|
|
940
|
+
# label. Not cached: a degrade reply is a retry, not an answer.
|
|
941
|
+
return hits[:limit], engine
|
|
942
|
+
if caching:
|
|
943
|
+
_rerank_cache_put(cache_key, [str(n) for n in order])
|
|
788
944
|
by_name = {h["entry"]["name"]: h for h in hits}
|
|
789
945
|
picked = [by_name[str(n)] for n in order if str(n) in by_name]
|
|
790
946
|
rest = [h for h in hits if h["entry"]["name"]
|
|
@@ -213,6 +213,7 @@ docs/roadmap/items/ci-time-is-now-runner-queueing.md
|
|
|
213
213
|
docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
|
|
214
214
|
docs/roadmap/items/code-scanning-rule-can-be-restored.md
|
|
215
215
|
docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
|
|
216
|
+
docs/roadmap/items/cold-search-reads-the-whole-catalogue.md
|
|
216
217
|
docs/roadmap/items/command-carousel-page.md
|
|
217
218
|
docs/roadmap/items/command-reference-docs-site.md
|
|
218
219
|
docs/roadmap/items/completions-complete-only-command-names.md
|
|
@@ -399,6 +400,7 @@ docs/roadmap/items/shareable-catalogue-bundle.md
|
|
|
399
400
|
docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
|
|
400
401
|
docs/roadmap/items/single-imperative-rule-extractor.md
|
|
401
402
|
docs/roadmap/items/single-tech-stack-prober.md
|
|
403
|
+
docs/roadmap/items/smart-rerank-pays-per-novel-query.md
|
|
402
404
|
docs/roadmap/items/split-oversized-command-modules.md
|
|
403
405
|
docs/roadmap/items/startup-and-import-time-budget-x-importtime.md
|
|
404
406
|
docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md
|
|
@@ -615,6 +617,7 @@ tests/unit/test_dense.py
|
|
|
615
617
|
tests/unit/test_dense_embed_dedupe.py
|
|
616
618
|
tests/unit/test_dense_fallback.py
|
|
617
619
|
tests/unit/test_dense_fix_hint.py
|
|
620
|
+
tests/unit/test_dense_ready_order.py
|
|
618
621
|
tests/unit/test_dense_shard_real_schema.py
|
|
619
622
|
tests/unit/test_dense_shard_unreadable_vectors.py
|
|
620
623
|
tests/unit/test_dense_shards.py
|
|
@@ -684,6 +687,7 @@ tests/unit/test_projectlock.py
|
|
|
684
687
|
tests/unit/test_provenance.py
|
|
685
688
|
tests/unit/test_publish_golden_dataset.py
|
|
686
689
|
tests/unit/test_rag.py
|
|
690
|
+
tests/unit/test_rag_fastpath.py
|
|
687
691
|
tests/unit/test_rag_fusion.py
|
|
688
692
|
tests/unit/test_registries_fresh.py
|
|
689
693
|
tests/unit/test_registry.py
|
|
@@ -692,6 +696,7 @@ tests/unit/test_registry_control_chars.py
|
|
|
692
696
|
tests/unit/test_release_guard.py
|
|
693
697
|
tests/unit/test_release_preflight.py
|
|
694
698
|
tests/unit/test_required_checks.py
|
|
699
|
+
tests/unit/test_rerank_cache.py
|
|
695
700
|
tests/unit/test_resolve.py
|
|
696
701
|
tests/unit/test_roadmap_fresh.py
|
|
697
702
|
tests/unit/test_rules.py
|
|
@@ -135,6 +135,21 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
|
|
|
135
135
|
Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
|
|
136
136
|
dict-of-postings scan — comfortably sub-second per query in Python.
|
|
137
137
|
|
|
138
|
+
**Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
|
|
139
|
+
`entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
|
|
140
|
+
the index's own doc metadata and materialises real catalog entries only for the
|
|
141
|
+
final `k` survivors, loading only *their* taps' caches (`_retrieve_from_index`).
|
|
142
|
+
The previous shape parsed every tap cache on the machine per query
|
|
143
|
+
(`catalog.all_entries()`: 458 files / ~100 MB / 0.32 s measured at 71.6k
|
|
144
|
+
entries) and computed a display snippet for every scored doc (39,726 calls to
|
|
145
|
+
serve 60). Snippet windowing now runs on returned hits only, on both paths.
|
|
146
|
+
The contract is byte-identical-or-fall-back: any survivor whose entry cannot be
|
|
147
|
+
materialised (a tap cache vanished under a stat-fresh index) reruns the query
|
|
148
|
+
through the explicit-`entries` path rather than approximating. An explicit
|
|
149
|
+
`entries=` list (the eval harness, `boost chat`) keeps today's exact path.
|
|
150
|
+
`dense.ready()` stats the store before importing the backend for the same
|
|
151
|
+
cold-path reason. Measured end to end: 0.94 s → 0.49 s cold at 458 taps.
|
|
152
|
+
|
|
138
153
|
### 6b. Two-stage pipeline — upgrade `boost_search` / `catalog.search` **in place**
|
|
139
154
|
|
|
140
155
|
No parallel MCP tool (per decision). The upgraded flow:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cold-search-reads-the-whole-catalogue
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Performance · Search
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: 0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use
|
|
11
|
+
order: 122
|
|
12
|
+
owner: loop/search-perf
|
|
13
|
+
pr:
|
|
14
|
+
title: A cold search materialises 71,600 entries to print five
|
|
15
|
+
---
|
|
16
|
+
Profiled cold <code>boost search</code> at real scale (458 taps, 71,600
|
|
17
|
+
entries): 0.94 s, of which <b>0.32 s</b> is <code>catalog.all_entries()</code>
|
|
18
|
+
parsing every tap cache on the machine (~100 MB of JSON) to build a
|
|
19
|
+
<code>live</code> map whose entries are only <i>displayed</i> for the final k
|
|
20
|
+
hits, <b>0.11 s</b> is <code>_passage</code> windowing a snippet for all
|
|
21
|
+
39,726 scored docs to show 60, and <b>0.12 s</b> is <code>dense.ready()</code>
|
|
22
|
+
importing numpy via sqlite_vec just to answer "no vector store". BM25 scoring
|
|
23
|
+
itself: 18 ms. The engine was fine; the packaging around it was the cost.<br><br>
|
|
24
|
+
Shipped: <code>rag.retrieve(entries=None)</code> now ranks off the index's own
|
|
25
|
+
doc metadata (name/hash/kind/length all live there already), runs the full
|
|
26
|
+
ranked list through <code>dedupe_by_content</code> with shadow entries carrying
|
|
27
|
+
the two fields <code>source_rank</code> reads, and materialises real entries
|
|
28
|
+
for just the survivors' taps — with a <b>byte-identical-or-fall-back</b>
|
|
29
|
+
contract: any survivor that fails to materialise reruns the query through the
|
|
30
|
+
explicit-<code>entries</code> path (the eval-gate path, unchanged). Snippets
|
|
31
|
+
window on returned hits only, on both paths; <code>dense.ready()</code> stats
|
|
32
|
+
before importing; <code>_load_raw</code> keys its cache on
|
|
33
|
+
<code>(mtime_ns, size)</code>. Measured after: <b>0.94 s → 0.49 s cold</b>.
|
|
34
|
+
Complement of the shipped <i>cache-the-catalog-entry-set-across-rag-queries</i>
|
|
35
|
+
(PR 114), which memoised <code>all_entries</code> per process — warm repeats
|
|
36
|
+
were already amortised; this removes the cold-start read entirely.<br><br>
|
|
37
|
+
Analysed and deliberately <b>deferred</b>: moving the per-doc
|
|
38
|
+
<code>snip</code> out of <code>rag_index.json</code> into the postings SQLite.
|
|
39
|
+
<i>bm25-index-is-one-json-blob</i> declined it at 743 entries (14% of the
|
|
40
|
+
JSON); at 71.6k the premise inverts — snips are ~76% (46 MB → 11.4 MB slim,
|
|
41
|
+
103 ms → 37 ms parse) — but an adversarial design review found the v6→v7
|
|
42
|
+
in-place migration can clobber a concurrently rebuilt pair without a
|
|
43
|
+
build-id pairing token, and a mixed-version machine (pipx CLI + long-running
|
|
44
|
+
MCP serve) thrashes full 71k-file reindexes across the version boundary.
|
|
45
|
+
66 ms does not buy that; if the recorded (tap, skill_md)-keyed postings
|
|
46
|
+
follow-up ever lands, fold the snip move into that single format bump.
|
|
47
|
+
Residual known cost: the "semantic search is off" hint imports the backend
|
|
48
|
+
(~0.1 s) on machines with the extra installed but no store built — the one
|
|
49
|
+
state where that line is the advice.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: smart-rerank-pays-per-novel-query
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Performance · MCP
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 3
|
|
10
|
+
note: MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one
|
|
11
|
+
order: 123
|
|
12
|
+
owner: loop/search-perf
|
|
13
|
+
pr:
|
|
14
|
+
title: The smart rerank pays the LLM again for a search it already answered
|
|
15
|
+
---
|
|
16
|
+
The MCP <code>boost_search</code> path passes <code>smart=True</code> on every
|
|
17
|
+
call and <i>mcp-search-cost-was-understated</i> measured it at 11.7-17.0 s —
|
|
18
|
+
nearly all of it the LLM rerank, paid again in full for a byte-identical
|
|
19
|
+
repeat of the previous search. Agents retry searches constantly (a session
|
|
20
|
+
restart, a re-planned task, a second agent asking the same question), so the
|
|
21
|
+
honest "10-15 seconds" cost doctrine was billing every ask at first-ask
|
|
22
|
+
prices.<br><br>
|
|
23
|
+
Shipped: <code>rag.rerank</code> keeps a small FIFO cache
|
|
24
|
+
(<code>~/.boost/cache/rerank_cache.json</code>, 200 entries, registered in
|
|
25
|
+
<code>paths.INTERNAL_CACHE_FILES</code> so <code>boost clean</code> spares
|
|
26
|
+
it) keyed on a sha256 of <b>exactly what the LLM sees</b> — query, limit, and
|
|
27
|
+
the candidate listing — so it self-invalidates on any reindex, ranking drift,
|
|
28
|
+
or snippet change without inspecting why. Only the parsed name order is
|
|
29
|
+
stored; a hit replays through the same deterministic reorder as a live reply
|
|
30
|
+
and keeps the <code>Claude relevance</code> label, because it is the LLM's
|
|
31
|
+
ordering. Degrade replies are never cached. <code>BOOST_NO_RERANK_CACHE=1</code>
|
|
32
|
+
bypasses read and write — the Tier 2a eval sets it, so a graded rerank is
|
|
33
|
+
always live. Both MCP cost surfaces (server instructions and the
|
|
34
|
+
<code>boost_search</code> description) now state the repeat-search cost, pinned
|
|
35
|
+
by the same agreement test that keeps them from drifting apart. Sibling of
|
|
36
|
+
<i>cold-search-reads-the-whole-catalogue</i>, which took the retrieval half of
|
|
37
|
+
the same search from 0.94 s to 0.49 s.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>262</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -6849,6 +6849,51 @@ was a comment. A comment cannot fail a build.</p>
|
|
|
6849
6849
|
<span class="m">a comment in the sibling file predicted this exact failure</span>
|
|
6850
6850
|
</div>
|
|
6851
6851
|
</article>
|
|
6852
|
+
|
|
6853
|
+
<article class="cap rcard" id="cold-search-reads-the-whole-catalogue">
|
|
6854
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Performance · Search</span></div>
|
|
6855
|
+
<h3>A cold search materialises 71,600 entries to print five</h3>
|
|
6856
|
+
<p>Profiled cold <code>boost search</code> at real scale (458 taps, 71,600
|
|
6857
|
+
entries): 0.94 s, of which <b>0.32 s</b> is <code>catalog.all_entries()</code>
|
|
6858
|
+
parsing every tap cache on the machine (~100 MB of JSON) to build a
|
|
6859
|
+
<code>live</code> map whose entries are only <i>displayed</i> for the final k
|
|
6860
|
+
hits, <b>0.11 s</b> is <code>_passage</code> windowing a snippet for all
|
|
6861
|
+
39,726 scored docs to show 60, and <b>0.12 s</b> is <code>dense.ready()</code>
|
|
6862
|
+
importing numpy via sqlite_vec just to answer "no vector store". BM25 scoring
|
|
6863
|
+
itself: 18 ms. The engine was fine; the packaging around it was the cost.<br><br>
|
|
6864
|
+
Shipped: <code>rag.retrieve(entries=None)</code> now ranks off the index's own
|
|
6865
|
+
doc metadata (name/hash/kind/length all live there already), runs the full
|
|
6866
|
+
ranked list through <code>dedupe_by_content</code> with shadow entries carrying
|
|
6867
|
+
the two fields <code>source_rank</code> reads, and materialises real entries
|
|
6868
|
+
for just the survivors' taps — with a <b>byte-identical-or-fall-back</b>
|
|
6869
|
+
contract: any survivor that fails to materialise reruns the query through the
|
|
6870
|
+
explicit-<code>entries</code> path (the eval-gate path, unchanged). Snippets
|
|
6871
|
+
window on returned hits only, on both paths; <code>dense.ready()</code> stats
|
|
6872
|
+
before importing; <code>_load_raw</code> keys its cache on
|
|
6873
|
+
<code>(mtime_ns, size)</code>. Measured after: <b>0.94 s → 0.49 s cold</b>.
|
|
6874
|
+
Complement of the shipped <i>cache-the-catalog-entry-set-across-rag-queries</i>
|
|
6875
|
+
(PR 114), which memoised <code>all_entries</code> per process — warm repeats
|
|
6876
|
+
were already amortised; this removes the cold-start read entirely.<br><br>
|
|
6877
|
+
Analysed and deliberately <b>deferred</b>: moving the per-doc
|
|
6878
|
+
<code>snip</code> out of <code>rag_index.json</code> into the postings SQLite.
|
|
6879
|
+
<i>bm25-index-is-one-json-blob</i> declined it at 743 entries (14% of the
|
|
6880
|
+
JSON); at 71.6k the premise inverts — snips are ~76% (46 MB → 11.4 MB slim,
|
|
6881
|
+
103 ms → 37 ms parse) — but an adversarial design review found the v6→v7
|
|
6882
|
+
in-place migration can clobber a concurrently rebuilt pair without a
|
|
6883
|
+
build-id pairing token, and a mixed-version machine (pipx CLI + long-running
|
|
6884
|
+
MCP serve) thrashes full 71k-file reindexes across the version boundary.
|
|
6885
|
+
66 ms does not buy that; if the recorded (tap, skill_md)-keyed postings
|
|
6886
|
+
follow-up ever lands, fold the snip move into that single format bump.
|
|
6887
|
+
Residual known cost: the "semantic search is off" hint imports the backend
|
|
6888
|
+
(~0.1 s) on machines with the extra installed but no store built — the one
|
|
6889
|
+
state where that line is the advice.</p>
|
|
6890
|
+
<div class="meta">
|
|
6891
|
+
<span class="m">Complexity <b>M</b></span>
|
|
6892
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
6893
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
6894
|
+
<span class="m">0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use</span>
|
|
6895
|
+
</div>
|
|
6896
|
+
</article>
|
|
6852
6897
|
<!-- /ROADMAP:cards -->
|
|
6853
6898
|
|
|
6854
6899
|
</div>
|
|
@@ -8772,6 +8817,39 @@ fuzzy filter.</p>
|
|
|
8772
8817
|
<span class="m">search rows learned kind/tap/installed with a stated drop order; browse got its gradient, an empty state, a badge rail, a list scrollbar and a session chip</span>
|
|
8773
8818
|
</div>
|
|
8774
8819
|
</article>
|
|
8820
|
+
|
|
8821
|
+
<article class="cap rcard" id="smart-rerank-pays-per-novel-query">
|
|
8822
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Performance · MCP</span></div>
|
|
8823
|
+
<h3>The smart rerank pays the LLM again for a search it already answered</h3>
|
|
8824
|
+
<p>The MCP <code>boost_search</code> path passes <code>smart=True</code> on every
|
|
8825
|
+
call and <i>mcp-search-cost-was-understated</i> measured it at 11.7-17.0 s —
|
|
8826
|
+
nearly all of it the LLM rerank, paid again in full for a byte-identical
|
|
8827
|
+
repeat of the previous search. Agents retry searches constantly (a session
|
|
8828
|
+
restart, a re-planned task, a second agent asking the same question), so the
|
|
8829
|
+
honest "10-15 seconds" cost doctrine was billing every ask at first-ask
|
|
8830
|
+
prices.<br><br>
|
|
8831
|
+
Shipped: <code>rag.rerank</code> keeps a small FIFO cache
|
|
8832
|
+
(<code>~/.boost/cache/rerank_cache.json</code>, 200 entries, registered in
|
|
8833
|
+
<code>paths.INTERNAL_CACHE_FILES</code> so <code>boost clean</code> spares
|
|
8834
|
+
it) keyed on a sha256 of <b>exactly what the LLM sees</b> — query, limit, and
|
|
8835
|
+
the candidate listing — so it self-invalidates on any reindex, ranking drift,
|
|
8836
|
+
or snippet change without inspecting why. Only the parsed name order is
|
|
8837
|
+
stored; a hit replays through the same deterministic reorder as a live reply
|
|
8838
|
+
and keeps the <code>Claude relevance</code> label, because it is the LLM's
|
|
8839
|
+
ordering. Degrade replies are never cached. <code>BOOST_NO_RERANK_CACHE=1</code>
|
|
8840
|
+
bypasses read and write — the Tier 2a eval sets it, so a graded rerank is
|
|
8841
|
+
always live. Both MCP cost surfaces (server instructions and the
|
|
8842
|
+
<code>boost_search</code> description) now state the repeat-search cost, pinned
|
|
8843
|
+
by the same agreement test that keeps them from drifting apart. Sibling of
|
|
8844
|
+
<i>cold-search-reads-the-whole-catalogue</i>, which took the retrieval half of
|
|
8845
|
+
the same search from 0.94 s to 0.49 s.</p>
|
|
8846
|
+
<div class="meta">
|
|
8847
|
+
<span class="m">Complexity <b>S</b></span>
|
|
8848
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
8849
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
8850
|
+
<span class="m">MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one</span>
|
|
8851
|
+
</div>
|
|
8852
|
+
</article>
|
|
8775
8853
|
<!-- /ROADMAP:cards -->
|
|
8776
8854
|
|
|
8777
8855
|
</div>
|
|
@@ -50,6 +50,7 @@ import argparse
|
|
|
50
50
|
import hashlib
|
|
51
51
|
import json
|
|
52
52
|
import math
|
|
53
|
+
import os
|
|
53
54
|
import sys
|
|
54
55
|
from collections.abc import Callable, Iterable, Sequence
|
|
55
56
|
from pathlib import Path
|
|
@@ -306,7 +307,12 @@ def hybrid_ranker(k: int) -> Ranker:
|
|
|
306
307
|
|
|
307
308
|
|
|
308
309
|
def rerank_ranker(k: int) -> Ranker:
|
|
309
|
-
"""BM25 shortlist reordered by the LLM rerank stage (Tier 2a).
|
|
310
|
+
"""BM25 shortlist reordered by the LLM rerank stage (Tier 2a).
|
|
311
|
+
|
|
312
|
+
The rerank cache is disabled for the whole run: a graded rerank must be
|
|
313
|
+
live, or the eval silently measures a stale cached order.
|
|
314
|
+
"""
|
|
315
|
+
os.environ["BOOST_NO_RERANK_CACHE"] = "1"
|
|
310
316
|
def rank(q: str) -> list[str]:
|
|
311
317
|
hits = rag.retrieve(q, k=max(k * 4, 60))
|
|
312
318
|
reranked, _label = rag.rerank(q, hits, limit=max(k, 15))
|