boost-skill-cli 1.2.15__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.15 → boost_skill_cli-1.2.16}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/configuration.py +3 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/mcp.py +2 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/paths.py +1 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/rag.py +73 -11
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.2.16/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +37 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap.html +34 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_retrieval.py +7 -1
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_configuration.py +10 -2
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_clean_internal_cache.py +1 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcp.py +5 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rag.py +7 -7
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/.gitattributes +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.gitignore +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale.ini +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/LICENSE +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/Makefile +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/codecov.yml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/index.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.15 → 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.15 → boost_skill_cli-1.2.16}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/examples/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/index.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/noxfile.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/setup.cfg +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/boost.css +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/boost.js +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/style/demo.html +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.15 → 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.",
|
|
@@ -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
|
|
@@ -841,6 +842,49 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
841
842
|
return _windowed(dedupe_by_content(hits, k), terms)
|
|
842
843
|
|
|
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))
|
|
886
|
+
|
|
887
|
+
|
|
844
888
|
#: The label `rerank` returns when the LLM pass actually ran. Every other value
|
|
845
889
|
#: is a retrieval engine's own name, i.e. "the rerank did not happen". Callers
|
|
846
890
|
#: that quote what the rerank buys have to be able to tell those apart without
|
|
@@ -860,6 +904,15 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
|
|
|
860
904
|
answered, so a confident "BM25 full-content" sent debugging somewhere else.
|
|
861
905
|
|
|
862
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).
|
|
863
916
|
"""
|
|
864
917
|
top = hits[:max(limit, 15)]
|
|
865
918
|
if not ai.available():
|
|
@@ -868,17 +921,26 @@ def rerank(query: str, hits: list[Hit], limit: int = 10,
|
|
|
868
921
|
"- %s [%s]: %s" % (h["entry"]["name"], h["entry"].get("kind", "skill"),
|
|
869
922
|
(h["snippet"] or h["entry"].get("description", ""))[:180])
|
|
870
923
|
for h in top)
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
"
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
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])
|
|
882
944
|
by_name = {h["entry"]["name"]: h for h in hits}
|
|
883
945
|
picked = [by_name[str(n)] for n in order if str(n) in by_name]
|
|
884
946
|
rest = [h for h in hits if h["entry"]["name"]
|
|
@@ -400,6 +400,7 @@ docs/roadmap/items/shareable-catalogue-bundle.md
|
|
|
400
400
|
docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
|
|
401
401
|
docs/roadmap/items/single-imperative-rule-extractor.md
|
|
402
402
|
docs/roadmap/items/single-tech-stack-prober.md
|
|
403
|
+
docs/roadmap/items/smart-rerank-pays-per-novel-query.md
|
|
403
404
|
docs/roadmap/items/split-oversized-command-modules.md
|
|
404
405
|
docs/roadmap/items/startup-and-import-time-budget-x-importtime.md
|
|
405
406
|
docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md
|
|
@@ -695,6 +696,7 @@ tests/unit/test_registry_control_chars.py
|
|
|
695
696
|
tests/unit/test_release_guard.py
|
|
696
697
|
tests/unit/test_release_preflight.py
|
|
697
698
|
tests/unit/test_required_checks.py
|
|
699
|
+
tests/unit/test_rerank_cache.py
|
|
698
700
|
tests/unit/test_resolve.py
|
|
699
701
|
tests/unit/test_roadmap_fresh.py
|
|
700
702
|
tests/unit/test_rules.py
|
|
@@ -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>
|
|
@@ -8817,6 +8817,39 @@ fuzzy filter.</p>
|
|
|
8817
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>
|
|
8818
8818
|
</div>
|
|
8819
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>
|
|
8820
8853
|
<!-- /ROADMAP:cards -->
|
|
8821
8854
|
|
|
8822
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))
|
{boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/tests/functional/test_cli_configuration.py
RENAMED
|
@@ -1887,7 +1887,7 @@ class TestSearchNamesItsRanker:
|
|
|
1887
1887
|
assert "did NOT run" not in text
|
|
1888
1888
|
|
|
1889
1889
|
def test_rerank_returns_that_label_only_when_the_llm_answered(
|
|
1890
|
-
self, monkeypatch):
|
|
1890
|
+
self, monkeypatch, sandbox):
|
|
1891
1891
|
"""The producer and the consumer of the label must agree.
|
|
1892
1892
|
|
|
1893
1893
|
`rag.LLM_RANKER` exists so this is impossible to drift rather than
|
|
@@ -1910,8 +1910,16 @@ class TestSearchNamesItsRanker:
|
|
|
1910
1910
|
assert label == rag.LLM_RANKER
|
|
1911
1911
|
assert [h["entry"]["name"] for h in order] == ["a", "b"]
|
|
1912
1912
|
|
|
1913
|
+
# Repeating the SAME query now answers from the rerank cache: the
|
|
1914
|
+
# order is still the LLM's, so the label stays with it — no new ask.
|
|
1915
|
+
monkeypatch.setattr(ai, "ask",
|
|
1916
|
+
lambda *a, **k: pytest.fail("cache must answer"))
|
|
1917
|
+
assert rag.rerank("q", hits, engine="BM25 full-content")[1] == \
|
|
1918
|
+
rag.LLM_RANKER
|
|
1919
|
+
|
|
1913
1920
|
# The model replied, but not with an order — the label must fall back
|
|
1914
1921
|
# with the ordering, or it claims a rerank that did not take effect.
|
|
1922
|
+
# A fresh query, so the cache cannot answer for the degraded model.
|
|
1915
1923
|
monkeypatch.setattr(ai, "ask", lambda *a, **k: "sorry, I cannot")
|
|
1916
|
-
assert rag.rerank("
|
|
1924
|
+
assert rag.rerank("q2", hits, engine="BM25 full-content")[1] == \
|
|
1917
1925
|
"BM25 full-content"
|
|
@@ -86,6 +86,7 @@ class TestInternalCacheRegistryHasNoDrift:
|
|
|
86
86
|
owners = {
|
|
87
87
|
"rag.index_path": rag.index_path,
|
|
88
88
|
"rag.postings_path": rag.postings_path,
|
|
89
|
+
"rag.rerank_cache_path": rag.rerank_cache_path,
|
|
89
90
|
"dense.db_path": dense.db_path,
|
|
90
91
|
"discovery._discovery_path": discovery._discovery_path,
|
|
91
92
|
"complete.names_file": complete.names_file,
|
|
@@ -198,6 +198,11 @@ class TestHandleRequest:
|
|
|
198
198
|
assert "10-15 seconds" in mcp.INSTRUCTIONS
|
|
199
199
|
assert "10-15 seconds" in desc["boost_search"]
|
|
200
200
|
assert "a few seconds" not in mcp.INSTRUCTIONS.lower()
|
|
201
|
+
# The repeat-search cost claim is backed by rag's rerank cache; both
|
|
202
|
+
# surfaces must state it, or an agent budgets 15 s for a lookup that
|
|
203
|
+
# would have been free.
|
|
204
|
+
assert "answers from a local cache" in mcp.INSTRUCTIONS
|
|
205
|
+
assert "answers from a local cache" in desc["boost_search"]
|
|
201
206
|
|
|
202
207
|
def test_instructions_still_separate_the_free_tool_from_the_slow_one(self):
|
|
203
208
|
# boost_list really is instant, and collapsing the two costs into one
|
|
@@ -523,14 +523,14 @@ def _hit(name, score, snippet="s", kind="skill", desc="d"):
|
|
|
523
523
|
|
|
524
524
|
|
|
525
525
|
class TestRerank:
|
|
526
|
-
def test_no_ai_returns_bm25_order(self, monkeypatch):
|
|
526
|
+
def test_no_ai_returns_bm25_order(self, monkeypatch, sandbox):
|
|
527
527
|
monkeypatch.setattr(rag.ai, "available", lambda: False)
|
|
528
528
|
hits = [_hit("a", 2.0), _hit("b", 1.0)]
|
|
529
529
|
out, label = rag.rerank("q", hits, limit=5)
|
|
530
530
|
assert [h["entry"]["name"] for h in out] == ["a", "b"]
|
|
531
531
|
assert label == "BM25 full-content"
|
|
532
532
|
|
|
533
|
-
def test_ai_reorders(self, monkeypatch):
|
|
533
|
+
def test_ai_reorders(self, monkeypatch, sandbox):
|
|
534
534
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
535
535
|
monkeypatch.setattr(rag.ai, "ask", lambda *a, **k: '["b", "a"]')
|
|
536
536
|
hits = [_hit("a", 2.0), _hit("b", 1.0)]
|
|
@@ -538,14 +538,14 @@ class TestRerank:
|
|
|
538
538
|
assert [h["entry"]["name"] for h in out] == ["b", "a"]
|
|
539
539
|
assert label == "Claude relevance"
|
|
540
540
|
|
|
541
|
-
def test_ai_partial_order_appends_rest(self, monkeypatch):
|
|
541
|
+
def test_ai_partial_order_appends_rest(self, monkeypatch, sandbox):
|
|
542
542
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
543
543
|
monkeypatch.setattr(rag.ai, "ask", lambda *a, **k: '["b"]')
|
|
544
544
|
hits = [_hit("a", 2.0), _hit("b", 1.0)]
|
|
545
545
|
out, _label = rag.rerank("q", hits, limit=5)
|
|
546
546
|
assert [h["entry"]["name"] for h in out] == ["b", "a"]
|
|
547
547
|
|
|
548
|
-
def test_ai_garbage_reply_degrades(self, monkeypatch):
|
|
548
|
+
def test_ai_garbage_reply_degrades(self, monkeypatch, sandbox):
|
|
549
549
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
550
550
|
monkeypatch.setattr(rag.ai, "ask", lambda *a, **k: "no json here")
|
|
551
551
|
hits = [_hit("a", 2.0), _hit("b", 1.0)]
|
|
@@ -553,13 +553,13 @@ class TestRerank:
|
|
|
553
553
|
assert [h["entry"]["name"] for h in out] == ["a", "b"]
|
|
554
554
|
assert label == "BM25 full-content"
|
|
555
555
|
|
|
556
|
-
def test_limit_truncates(self, monkeypatch):
|
|
556
|
+
def test_limit_truncates(self, monkeypatch, sandbox):
|
|
557
557
|
monkeypatch.setattr(rag.ai, "available", lambda: False)
|
|
558
558
|
hits = [_hit("a", 3.0), _hit("b", 2.0), _hit("c", 1.0)]
|
|
559
559
|
out, _ = rag.rerank("q", hits, limit=2)
|
|
560
560
|
assert len(out) == 2
|
|
561
561
|
|
|
562
|
-
def test_prompt_carries_task_and_candidate_snippets(self, monkeypatch):
|
|
562
|
+
def test_prompt_carries_task_and_candidate_snippets(self, monkeypatch, sandbox):
|
|
563
563
|
captured = {}
|
|
564
564
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
565
565
|
|
|
@@ -1100,7 +1100,7 @@ class TestRetrieveInternals:
|
|
|
1100
1100
|
|
|
1101
1101
|
|
|
1102
1102
|
class TestRerankExact:
|
|
1103
|
-
def test_exact_prompt_and_kwargs(self, monkeypatch):
|
|
1103
|
+
def test_exact_prompt_and_kwargs(self, monkeypatch, sandbox):
|
|
1104
1104
|
cap = {}
|
|
1105
1105
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
1106
1106
|
|
|
@@ -230,7 +230,8 @@ class TestRerankPreservesTheEngineLabel:
|
|
|
230
230
|
def _hits():
|
|
231
231
|
return [_hit("a", 2.0), _hit("b", 1.0)]
|
|
232
232
|
|
|
233
|
-
def test_no_ai_reports_the_engine_that_retrieved(self, monkeypatch
|
|
233
|
+
def test_no_ai_reports_the_engine_that_retrieved(self, monkeypatch,
|
|
234
|
+
sandbox):
|
|
234
235
|
# THE regression. Fusion ran, the LLM was absent, and the old code
|
|
235
236
|
# answered "BM25 full-content" — naming an engine that did not rank
|
|
236
237
|
# these hits alone.
|
|
@@ -239,14 +240,16 @@ class TestRerankPreservesTheEngineLabel:
|
|
|
239
240
|
engine="hybrid RRF (BM25 + dense)")
|
|
240
241
|
assert label == "hybrid RRF (BM25 + dense)"
|
|
241
242
|
|
|
242
|
-
def test_no_ai_reports_dense_when_dense_retrieved(self, monkeypatch
|
|
243
|
+
def test_no_ai_reports_dense_when_dense_retrieved(self, monkeypatch,
|
|
244
|
+
sandbox):
|
|
243
245
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
244
246
|
monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: "not json at all")
|
|
245
247
|
_out, label = rag.rerank("q", self._hits(), limit=5,
|
|
246
248
|
engine="dense vectors")
|
|
247
249
|
assert label == "dense vectors"
|
|
248
250
|
|
|
249
|
-
def test_an_unparseable_reply_keeps_the_engine_too(self, monkeypatch
|
|
251
|
+
def test_an_unparseable_reply_keeps_the_engine_too(self, monkeypatch,
|
|
252
|
+
sandbox):
|
|
250
253
|
# The second degrade path: the model answered, but not with a JSON
|
|
251
254
|
# array. Ordering falls back, so the label must fall back with it.
|
|
252
255
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
@@ -255,7 +258,7 @@ class TestRerankPreservesTheEngineLabel:
|
|
|
255
258
|
engine="hybrid RRF (BM25 + dense)")
|
|
256
259
|
assert label == "hybrid RRF (BM25 + dense)"
|
|
257
260
|
|
|
258
|
-
def test_a_successful_rerank_still_says_claude(self, monkeypatch):
|
|
261
|
+
def test_a_successful_rerank_still_says_claude(self, monkeypatch, sandbox):
|
|
259
262
|
# The LLM really did decide the order here, so crediting the retrieval
|
|
260
263
|
# engine instead would be the same bug pointing the other way.
|
|
261
264
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""The LLM rerank cache: repeat searches must not pay the LLM again.
|
|
2
|
+
|
|
3
|
+
The MCP `boost_search` path passes ``smart=True`` on every call and measured
|
|
4
|
+
11.7-17 s per search, nearly all of it the rerank. The cache keys on a hash of
|
|
5
|
+
*exactly what the LLM sees* (query, limit, candidate listing), so it
|
|
6
|
+
self-invalidates on any reindex, ranking change, snippet change or candidate
|
|
7
|
+
drift — and stores only the parsed name order, so a hit replays through the
|
|
8
|
+
same deterministic reorder code as a live reply.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
|
|
14
|
+
import pytest
|
|
15
|
+
|
|
16
|
+
from boost_cli.core import ai, paths, rag
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _hit(name, score, snippet=""):
|
|
20
|
+
return {"entry": {"name": name, "tap": "acme/skills",
|
|
21
|
+
"skill_md": "%s/SKILL.md" % name},
|
|
22
|
+
"score": score, "snippet": snippet, "content": "h-" + name}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.fixture()
|
|
26
|
+
def asked(monkeypatch, sandbox):
|
|
27
|
+
"""AI available; every ask recorded. Returns the call log."""
|
|
28
|
+
calls: list[str] = []
|
|
29
|
+
|
|
30
|
+
def fake_ask(prompt, *a, **k):
|
|
31
|
+
calls.append(prompt)
|
|
32
|
+
return '["beta", "alpha"]'
|
|
33
|
+
|
|
34
|
+
monkeypatch.setattr(ai, "available", lambda: True)
|
|
35
|
+
monkeypatch.setattr(ai, "ask", fake_ask)
|
|
36
|
+
return calls
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
HITS = [_hit("alpha", 2.0, "alpha snippet"), _hit("beta", 1.0, "beta snippet")]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class TestCacheHit:
|
|
43
|
+
def test_identical_rerank_answers_from_cache(self, asked):
|
|
44
|
+
first, label1 = rag.rerank("find the widget", list(HITS))
|
|
45
|
+
again, label2 = rag.rerank("find the widget", list(HITS))
|
|
46
|
+
assert len(asked) == 1 # one LLM call, not two
|
|
47
|
+
assert label1 == label2 == rag.LLM_RANKER # a hit IS the LLM's order
|
|
48
|
+
assert first == again
|
|
49
|
+
assert [h["entry"]["name"] for h in again][:2] == ["beta", "alpha"]
|
|
50
|
+
|
|
51
|
+
def test_cached_order_applies_to_the_hits_passed_now(self, asked):
|
|
52
|
+
"""The cache stores the ORDER, not the hits: scores sit outside the
|
|
53
|
+
candidate listing, so rescored hits still key to the same entry and
|
|
54
|
+
get the cached order applied to their fresh values."""
|
|
55
|
+
rag.rerank("find the widget", list(HITS))
|
|
56
|
+
rescored = [_hit("alpha", 9.9, "alpha snippet"),
|
|
57
|
+
_hit("beta", 8.8, "beta snippet")]
|
|
58
|
+
again, _ = rag.rerank("find the widget", rescored)
|
|
59
|
+
assert len(asked) == 1
|
|
60
|
+
assert [h["entry"]["name"] for h in again][:2] == ["beta", "alpha"]
|
|
61
|
+
assert again[0]["score"] == 8.8 # fresh hit, cached order
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class TestCacheKey:
|
|
65
|
+
def test_a_different_query_misses(self, asked):
|
|
66
|
+
rag.rerank("find the widget", list(HITS))
|
|
67
|
+
rag.rerank("find the gadget", list(HITS))
|
|
68
|
+
assert len(asked) == 2
|
|
69
|
+
|
|
70
|
+
def test_a_different_candidate_listing_misses(self, asked):
|
|
71
|
+
rag.rerank("find the widget", list(HITS))
|
|
72
|
+
changed = [_hit("alpha", 2.0, "reworded snippet"), HITS[1]]
|
|
73
|
+
rag.rerank("find the widget", changed)
|
|
74
|
+
assert len(asked) == 2
|
|
75
|
+
|
|
76
|
+
def test_a_different_limit_misses(self, asked):
|
|
77
|
+
rag.rerank("find the widget", list(HITS), limit=10)
|
|
78
|
+
rag.rerank("find the widget", list(HITS), limit=5)
|
|
79
|
+
assert len(asked) == 2
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class TestDegradation:
|
|
83
|
+
def test_a_non_array_reply_is_not_cached(self, asked, monkeypatch):
|
|
84
|
+
monkeypatch.setattr(ai, "ask", lambda *a, **k: (asked.append("x"),
|
|
85
|
+
"no json here")[1])
|
|
86
|
+
_hits, label = rag.rerank("q", list(HITS), engine="BM25 full-content")
|
|
87
|
+
assert label == "BM25 full-content" # degrade, as today
|
|
88
|
+
rag.rerank("q", list(HITS))
|
|
89
|
+
assert len(asked) == 2 # second call asks again
|
|
90
|
+
|
|
91
|
+
def test_no_ai_means_no_cache_file(self, sandbox, monkeypatch):
|
|
92
|
+
monkeypatch.setattr(ai, "available", lambda: False)
|
|
93
|
+
_hits, label = rag.rerank("q", list(HITS), engine="dense vectors")
|
|
94
|
+
assert label == "dense vectors"
|
|
95
|
+
assert not rag.rerank_cache_path().exists()
|
|
96
|
+
|
|
97
|
+
def test_corrupt_cache_file_degrades_and_heals(self, asked):
|
|
98
|
+
paths.ensure_dirs()
|
|
99
|
+
rag.rerank_cache_path().write_text("not json{", encoding="utf-8")
|
|
100
|
+
rag.rerank("find the widget", list(HITS))
|
|
101
|
+
assert len(asked) == 1 # worked, asked live
|
|
102
|
+
data = json.loads(rag.rerank_cache_path().read_text(encoding="utf-8"))
|
|
103
|
+
assert len(data) == 1 # rewritten valid
|
|
104
|
+
|
|
105
|
+
def test_kill_switch_bypasses_read_and_write(self, asked, monkeypatch):
|
|
106
|
+
monkeypatch.setenv("BOOST_NO_RERANK_CACHE", "1")
|
|
107
|
+
rag.rerank("find the widget", list(HITS))
|
|
108
|
+
rag.rerank("find the widget", list(HITS))
|
|
109
|
+
assert len(asked) == 2
|
|
110
|
+
assert not rag.rerank_cache_path().exists()
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class TestEviction:
|
|
114
|
+
def test_cache_is_capped_fifo(self, asked, monkeypatch):
|
|
115
|
+
monkeypatch.setattr(rag, "RERANK_CACHE_CAP", 3)
|
|
116
|
+
for q in ("q1", "q2", "q3", "q4"):
|
|
117
|
+
rag.rerank(q, list(HITS))
|
|
118
|
+
data = json.loads(rag.rerank_cache_path().read_text(encoding="utf-8"))
|
|
119
|
+
assert len(data) == 3 # capped
|
|
120
|
+
rag.rerank("q4", list(HITS))
|
|
121
|
+
assert len(asked) == 4 # newest still cached
|
|
122
|
+
rag.rerank("q1", list(HITS))
|
|
123
|
+
assert len(asked) == 5 # oldest was evicted
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class TestRegistration:
|
|
127
|
+
def test_registered_so_boost_clean_spares_it(self):
|
|
128
|
+
assert rag.rerank_cache_path().name in paths.INTERNAL_CACHE_FILES
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.2.15 → boost_skill_cli-1.2.16}/.vale/styles/config/vocabularies/boost/accept.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|