boost-skill-cli 1.2.20__tar.gz → 1.2.21__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.20 → boost_skill_cli-1.2.21}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/discovery.py +19 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/rag.py +65 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/rag-architecture.md +14 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-has-no-stemming.md +28 -10
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap.html +27 -9
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_discovery.py +23 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rag.py +123 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.gitattributes +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.gitignore +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/.vale.ini +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/LICENSE +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/Makefile +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/codecov.yml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/index.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/examples/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/index.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/noxfile.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/setup.cfg +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/boost.css +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/boost.js +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/style/demo.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/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.21'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 21)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -176,10 +176,29 @@ def cmd_search(argv):
|
|
|
176
176
|
installed=e["name"] in installed, lay=lay))
|
|
177
177
|
out.info(out.role("%d match%s · ranked by %s"
|
|
178
178
|
% (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
|
|
179
|
+
if use_rag:
|
|
180
|
+
_note_stem_expansions(query)
|
|
179
181
|
_hint_semantic_search(engine)
|
|
180
182
|
return 0
|
|
181
183
|
|
|
182
184
|
|
|
185
|
+
def _note_stem_expansions(query: str) -> None:
|
|
186
|
+
"""Say when a query term was widened to the word actually indexed.
|
|
187
|
+
|
|
188
|
+
Staying quiet would be a worse answer than the old empty one: the user
|
|
189
|
+
asked for `brainstorm` and is looking at results for `brainstorming`, and
|
|
190
|
+
only one of those is a word they typed.
|
|
191
|
+
"""
|
|
192
|
+
subs = rag.stem_expansions(rag.tokenize(query))
|
|
193
|
+
if not subs:
|
|
194
|
+
return
|
|
195
|
+
said = ", ".join("%r" % term for term in subs)
|
|
196
|
+
shown = ", ".join("%r" % term for term in subs.values())
|
|
197
|
+
out.info(out.role(out.truncate(
|
|
198
|
+
"no exact match for %s — showing %s" % (said, shown),
|
|
199
|
+
max(0, out.term_width() - 2)), "muted"))
|
|
200
|
+
|
|
201
|
+
|
|
183
202
|
def _hint_semantic_search(engine: str) -> None:
|
|
184
203
|
"""Say that a better engine exists, when BM25 answered alone.
|
|
185
204
|
|
|
@@ -383,6 +383,65 @@ def read_postings(terms: Sequence[str]) -> dict[str, list[list[int]]]:
|
|
|
383
383
|
return dict(out) # noqa: FURB123 out is a defaultdict; .copy() would keep the factory
|
|
384
384
|
|
|
385
385
|
|
|
386
|
+
# A query term shorter than this expands to noise: `cal` prefixes `calendar`,
|
|
387
|
+
# `calculate` and `callbacks` alike, and picking one of them for the user is a
|
|
388
|
+
# guess rather than a correction.
|
|
389
|
+
STEM_MIN_LEN = 4
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def stem_expansions(terms: Sequence[str]) -> dict[str, str]:
|
|
393
|
+
"""Map each term that indexes *nothing* to the commonest term it prefixes.
|
|
394
|
+
|
|
395
|
+
`tokenize` is exact-match, so a query term and its own inflection are
|
|
396
|
+
unrelated strings: `boost search brainstorm` returned zero matches while
|
|
397
|
+
`brainstorming` returned the skill, and `boost chat` had the same hole.
|
|
398
|
+
Measured over the 461 tap caches on one real machine, 4,663 of 29,607 item
|
|
399
|
+
names (15.7%) were unreachable by an attested stem — `pattern` missed 474
|
|
400
|
+
names ending `-patterns`, `skill` missed 252 ending `-skills`.
|
|
401
|
+
|
|
402
|
+
**A term that has postings is never expanded.** That is the whole safety
|
|
403
|
+
argument: this can only ever add signal where `_bm25` scored exactly none
|
|
404
|
+
(it skips a term with no posting list), so a query whose terms all exist
|
|
405
|
+
ranks byte-identically and the retrieval floors cannot move. It is also why
|
|
406
|
+
this is a fallback rather than a stemmer — a real stemmer conflates terms
|
|
407
|
+
that both exist, which changes established rankings and needs an index
|
|
408
|
+
format bump and a regenerated baseline.
|
|
409
|
+
|
|
410
|
+
Returns ``{}`` — never raises — when the store is missing or unreadable,
|
|
411
|
+
matching :func:`read_postings`.
|
|
412
|
+
"""
|
|
413
|
+
uniq = [t for t in dict.fromkeys(terms) if len(t) >= STEM_MIN_LEN]
|
|
414
|
+
if not uniq:
|
|
415
|
+
return {}
|
|
416
|
+
indexed = read_postings(uniq)
|
|
417
|
+
missing = [t for t in uniq if not indexed.get(t)]
|
|
418
|
+
if not missing:
|
|
419
|
+
return {}
|
|
420
|
+
try:
|
|
421
|
+
con = sqlite3.connect("file:%s?mode=ro" % postings_path(), uri=True)
|
|
422
|
+
except sqlite3.Error:
|
|
423
|
+
return {}
|
|
424
|
+
out: dict[str, str] = {}
|
|
425
|
+
try:
|
|
426
|
+
for term in missing:
|
|
427
|
+
# `tokenize` emits only [a-z0-9]+, and "~" sorts above every
|
|
428
|
+
# character it can produce — so this half-open range is exactly the
|
|
429
|
+
# terms beginning with `term`, and it rides the postings_term index
|
|
430
|
+
# instead of scanning. Ties break on the term itself so the choice
|
|
431
|
+
# is deterministic across machines.
|
|
432
|
+
row = con.execute(
|
|
433
|
+
"SELECT term FROM postings WHERE term > ? AND term < ? "
|
|
434
|
+
"GROUP BY term ORDER BY COUNT(*) DESC, term LIMIT 1",
|
|
435
|
+
(term, term + "~")).fetchone()
|
|
436
|
+
if row:
|
|
437
|
+
out[term] = row[0]
|
|
438
|
+
except sqlite3.Error:
|
|
439
|
+
return {}
|
|
440
|
+
finally:
|
|
441
|
+
con.close()
|
|
442
|
+
return out
|
|
443
|
+
|
|
444
|
+
|
|
386
445
|
def _all_postings() -> dict[str, list[list[int]]]:
|
|
387
446
|
"""Every posting — only the incremental rebuild path needs this."""
|
|
388
447
|
try:
|
|
@@ -804,6 +863,12 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
804
863
|
terms = tokenize(query)
|
|
805
864
|
if not terms:
|
|
806
865
|
return []
|
|
866
|
+
# Substitute before scoring, not after: the expanded term has to reach the
|
|
867
|
+
# snippet windowing too, or the hit is highlighted on a word it does not
|
|
868
|
+
# contain.
|
|
869
|
+
substitutions = stem_expansions(terms)
|
|
870
|
+
if substitutions:
|
|
871
|
+
terms = [substitutions.get(t, t) for t in terms]
|
|
807
872
|
docs = raw["docs"]
|
|
808
873
|
scores = _bm25(terms, raw, read_postings(terms))
|
|
809
874
|
if entries is None:
|
|
@@ -135,6 +135,20 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
|
|
|
135
135
|
Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
|
|
136
136
|
dict-of-postings scan — comfortably sub-second per query in Python.
|
|
137
137
|
|
|
138
|
+
**Tokenization is exact-match, and `stem_expansions` is the one concession to that.**
|
|
139
|
+
A query term and its own inflection are unrelated strings, so `boost search brainstorm`
|
|
140
|
+
returned nothing while `brainstorming` returned the skill. Measured over 461 tap caches,
|
|
141
|
+
4,663 of 29,607 item names (15.7%) were unreachable by an attested stem — `pattern` missed
|
|
142
|
+
474 names ending `-patterns`. Before scoring, any term with **no** posting list is replaced
|
|
143
|
+
by the commonest term it prefixes, found with an index-backed range scan over the postings
|
|
144
|
+
table. A term that *has* postings is never touched: expansion only ever adds signal where
|
|
145
|
+
`_bm25` scored exactly none, so a query whose terms all exist ranks byte-identically and the
|
|
146
|
+
retrieval floors cannot move. That is what makes it a fallback rather than a stemmer — a real
|
|
147
|
+
stemmer conflates terms that both exist, which changes established rankings and would need an
|
|
148
|
+
index-format bump and a regenerated baseline. Terms shorter than `STEM_MIN_LEN` (4) are left
|
|
149
|
+
alone, because a three-letter prefix expands to a guess. `boost search` states the
|
|
150
|
+
substitution rather than silently answering a different question.
|
|
151
|
+
|
|
138
152
|
**Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
|
|
139
153
|
`entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
|
|
140
154
|
the index's own doc metadata and materialises real catalog entries only for the
|
{boost_skill_cli-1.2.20 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-has-no-stemming.md
RENAMED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: bm25-has-no-stemming
|
|
3
3
|
board: code
|
|
4
4
|
section: pipeline
|
|
5
|
-
status:
|
|
5
|
+
status: inflight
|
|
6
6
|
category: Search · Retrieval
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 4
|
|
10
|
-
note:
|
|
10
|
+
note: a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still
|
|
11
11
|
order: 127
|
|
12
|
-
owner:
|
|
12
|
+
owner: loop/bm25-stem-fallback
|
|
13
13
|
pr:
|
|
14
14
|
title: <code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it
|
|
15
15
|
---
|
|
@@ -41,10 +41,28 @@ BM25 path — which is what every user without the extra runs, what
|
|
|
41
41
|
<code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
|
|
42
42
|
easily reproduce a plain user's result.
|
|
43
43
|
|
|
44
|
-
<b>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
<b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
|
|
45
|
+
whole query returns zero hits — was drafted and rejected, because it does not fix the reported
|
|
46
|
+
case. <code>boost chat “what helps me brainstorm”</code> already returns non-empty
|
|
47
|
+
results from its other words, so a zero-hit trigger never fires and chat stays broken.
|
|
48
|
+
Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
|
|
49
|
+
term it prefixes, found by an index-backed range scan (<code>term > ? AND term < ?</code>,
|
|
50
|
+
upper bound <code>term + "~"</code> because <code>~</code> outranks every character
|
|
51
|
+
<code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
|
|
52
|
+
<code>analy</code> → <code>analyze</code>). Measured after: <code>search brainstorm</code>
|
|
53
|
+
returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
|
|
54
|
+
|
|
55
|
+
<b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
|
|
56
|
+
<em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
|
|
57
|
+
no posting list, so expansion can only add signal where there was exactly none — meaning any
|
|
58
|
+
query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
|
|
59
|
+
<code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
|
|
60
|
+
<code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
|
|
61
|
+
rewrites a query that already worked and fails. Nine hand-written mutants were run against the
|
|
62
|
+
new lines and all nine died, including that one.
|
|
63
|
+
|
|
64
|
+
<b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
|
|
65
|
+
inflection — a user typing <code>patterns</code> still will not reach an item named
|
|
66
|
+
<code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
|
|
67
|
+
Closing that means conflating terms that both exist, which changes established rankings and costs
|
|
68
|
+
an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.
|
|
@@ -7055,7 +7055,7 @@ state where that line is the advice.</p>
|
|
|
7055
7055
|
</article>
|
|
7056
7056
|
|
|
7057
7057
|
<article class="cap rcard" id="bm25-has-no-stemming">
|
|
7058
|
-
<div class="head"><span class="pill
|
|
7058
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Retrieval</span></div>
|
|
7059
7059
|
<h3><code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it</h3>
|
|
7060
7060
|
<p><b>The symptom, in two commands against the same five-skill tap.</b>
|
|
7061
7061
|
<code>boost search brainstorming</code> returns the skill.
|
|
@@ -7085,18 +7085,36 @@ BM25 path — which is what every user without the extra runs, what
|
|
|
7085
7085
|
<code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
|
|
7086
7086
|
easily reproduce a plain user's result.
|
|
7087
7087
|
|
|
7088
|
-
<b>
|
|
7089
|
-
|
|
7090
|
-
|
|
7091
|
-
|
|
7092
|
-
|
|
7093
|
-
|
|
7094
|
-
|
|
7088
|
+
<b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
|
|
7089
|
+
whole query returns zero hits — was drafted and rejected, because it does not fix the reported
|
|
7090
|
+
case. <code>boost chat “what helps me brainstorm”</code> already returns non-empty
|
|
7091
|
+
results from its other words, so a zero-hit trigger never fires and chat stays broken.
|
|
7092
|
+
Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
|
|
7093
|
+
term it prefixes, found by an index-backed range scan (<code>term > ? AND term < ?</code>,
|
|
7094
|
+
upper bound <code>term + "~"</code> because <code>~</code> outranks every character
|
|
7095
|
+
<code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
|
|
7096
|
+
<code>analy</code> → <code>analyze</code>). Measured after: <code>search brainstorm</code>
|
|
7097
|
+
returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
|
|
7098
|
+
|
|
7099
|
+
<b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
|
|
7100
|
+
<em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
|
|
7101
|
+
no posting list, so expansion can only add signal where there was exactly none — meaning any
|
|
7102
|
+
query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
|
|
7103
|
+
<code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
|
|
7104
|
+
<code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
|
|
7105
|
+
rewrites a query that already worked and fails. Nine hand-written mutants were run against the
|
|
7106
|
+
new lines and all nine died, including that one.
|
|
7107
|
+
|
|
7108
|
+
<b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
|
|
7109
|
+
inflection — a user typing <code>patterns</code> still will not reach an item named
|
|
7110
|
+
<code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
|
|
7111
|
+
Closing that means conflating terms that both exist, which changes established rankings and costs
|
|
7112
|
+
an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.</p>
|
|
7095
7113
|
<div class="meta">
|
|
7096
7114
|
<span class="m">Complexity <b>M</b></span>
|
|
7097
7115
|
<span class="m hi">Impact <b>High</b></span>
|
|
7098
7116
|
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
7099
|
-
<span class="m">
|
|
7117
|
+
<span class="m">a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still</span>
|
|
7100
7118
|
</div>
|
|
7101
7119
|
</article>
|
|
7102
7120
|
<!-- /ROADMAP:cards -->
|
|
@@ -128,6 +128,29 @@ class TestSearch:
|
|
|
128
128
|
# integer heuristic score — assert the shape, not a magic constant.
|
|
129
129
|
assert isinstance(data[0]["score"], float) and data[0]["score"] > 0
|
|
130
130
|
|
|
131
|
+
def test_a_stem_query_reaches_the_inflected_skill_and_says_so(
|
|
132
|
+
self, boost, tapped):
|
|
133
|
+
"""`boost search brainstorm` used to return nothing at all while
|
|
134
|
+
`brainstorming` returned the skill, and send the user off to search the
|
|
135
|
+
whole of GitHub for something already in their catalogue."""
|
|
136
|
+
r = boost("search", "brainstorm")
|
|
137
|
+
assert "brainstorming" in r.out
|
|
138
|
+
assert "no matches" not in r.out
|
|
139
|
+
# The widening is stated, not silent — the user asked for one word and
|
|
140
|
+
# is being shown results for another.
|
|
141
|
+
assert "no exact match for 'brainstorm'" in r.out
|
|
142
|
+
assert "brainstorming" in r.out
|
|
143
|
+
|
|
144
|
+
def test_an_exact_query_is_not_annotated(self, boost, tapped):
|
|
145
|
+
r = boost("search", "brainstorming")
|
|
146
|
+
assert "brainstorming" in r.out
|
|
147
|
+
assert "no exact match" not in r.out
|
|
148
|
+
|
|
149
|
+
def test_a_query_matching_nothing_is_not_annotated_either(self, boost, tapped):
|
|
150
|
+
r = boost("search", "zzzznothing")
|
|
151
|
+
assert "no exact match" not in r.out
|
|
152
|
+
assert "no matches for 'zzzznothing'" in r.out
|
|
153
|
+
|
|
131
154
|
def test_no_taps_fails_with_hint(self, boost):
|
|
132
155
|
r = boost("search", "anything", expect=1)
|
|
133
156
|
assert "no taps configured — nothing to search" in r.err
|
|
@@ -431,6 +431,129 @@ class TestBuildAndRetrieve:
|
|
|
431
431
|
assert len(snip) <= rag.SNIP_WIDTH + 2 # windowed, not whole chunk
|
|
432
432
|
|
|
433
433
|
|
|
434
|
+
@pytest.fixture()
|
|
435
|
+
def stem_corpus(tmp_path, monkeypatch, sandbox):
|
|
436
|
+
"""A corpus with deliberately paired singular/plural vocabulary.
|
|
437
|
+
|
|
438
|
+
`pattern` AND `patterns` both exist as terms, which is what lets the
|
|
439
|
+
never-expand-an-existing-token invariant be tested: a build that dropped
|
|
440
|
+
that guard would expand `pattern` to `patterns` and change a query that
|
|
441
|
+
already worked.
|
|
442
|
+
"""
|
|
443
|
+
root = tmp_path / "stems"
|
|
444
|
+
items = {
|
|
445
|
+
"alpha": "pattern matching for structured logs.",
|
|
446
|
+
"beta": "patterns and antipatterns in distributed systems.",
|
|
447
|
+
"gamma": "webhook delivery retries.",
|
|
448
|
+
"delta": "webhooks and callbacks delivery.",
|
|
449
|
+
"epsilon": "delivered payloads and receipts to analyze.",
|
|
450
|
+
}
|
|
451
|
+
entries = []
|
|
452
|
+
for name, body in items.items():
|
|
453
|
+
(root / name).mkdir(parents=True)
|
|
454
|
+
(root / name / "SKILL.md").write_text(
|
|
455
|
+
"---\nname: %s\n---\n\n%s\n" % (name, body), encoding="utf-8")
|
|
456
|
+
entries.append(_entry(name, skill_md="%s/SKILL.md" % name))
|
|
457
|
+
monkeypatch.setattr(rag, "_tap_paths", lambda: {"acme/skills": root})
|
|
458
|
+
monkeypatch.setattr(rag, "_tap_commits", lambda: {"acme__skills": "c1"})
|
|
459
|
+
rag.build(entries=entries, force=True)
|
|
460
|
+
return entries
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
class TestStemExpansions:
|
|
464
|
+
"""`boost search brainstorm` found nothing while `brainstorming` found the
|
|
465
|
+
skill: `tokenize` is exact-match, so a query term and its own inflection are
|
|
466
|
+
unrelated strings. Measured over the 461 tap caches on one real machine,
|
|
467
|
+
4,663 of 29,607 item names (15.7%) were unreachable by an attested stem —
|
|
468
|
+
`pattern` missed 474 names ending `-patterns`, `skill` missed 252.
|
|
469
|
+
"""
|
|
470
|
+
|
|
471
|
+
def test_a_term_that_has_postings_is_never_expanded(self, stem_corpus):
|
|
472
|
+
"""The invariant the whole design rests on.
|
|
473
|
+
|
|
474
|
+
Expansion may only ever add signal where there was exactly none, which
|
|
475
|
+
is what makes it unable to move a ranking that already worked — and so
|
|
476
|
+
unable to move the eval floors. `pattern` and `patterns` both exist
|
|
477
|
+
here, so a build that dropped the guard would rewrite `pattern` into
|
|
478
|
+
`patterns` and this fails.
|
|
479
|
+
"""
|
|
480
|
+
assert rag.stem_expansions(["pattern"]) == {}
|
|
481
|
+
assert rag.stem_expansions(["webhook"]) == {}
|
|
482
|
+
assert rag.stem_expansions(["pattern", "webhook", "delivery"]) == {}
|
|
483
|
+
|
|
484
|
+
def test_only_the_missing_term_of_a_mixed_query_is_expanded(self, stem_corpus):
|
|
485
|
+
assert rag.stem_expansions(["pattern", "callback"]) == {
|
|
486
|
+
"callback": "callbacks"}
|
|
487
|
+
|
|
488
|
+
def test_picks_the_commonest_expansion_not_the_first_alphabetically(
|
|
489
|
+
self, stem_corpus):
|
|
490
|
+
"""`delivery` is in two documents and `delivered` in one, and
|
|
491
|
+
`delivered` sorts first — so ordering by document count is the only way
|
|
492
|
+
to land on `delivery`."""
|
|
493
|
+
assert rag.stem_expansions(["deliver"]) == {"deliver": "delivery"}
|
|
494
|
+
|
|
495
|
+
@pytest.mark.parametrize("term,expected", [
|
|
496
|
+
("cal", {}), # 3 chars: below the floor
|
|
497
|
+
("call", {"call": "callbacks"}), # 4 chars: exactly at it
|
|
498
|
+
("callb", {"callb": "callbacks"}),
|
|
499
|
+
])
|
|
500
|
+
def test_the_minimum_term_length_boundary(self, stem_corpus, term, expected):
|
|
501
|
+
"""Short prefixes expand to noise, so there is a floor; these pin it at
|
|
502
|
+
exactly 4, which a mutant moving it either way breaks."""
|
|
503
|
+
assert rag.stem_expansions([term]) == expected
|
|
504
|
+
|
|
505
|
+
def test_a_term_whose_next_character_is_z_is_still_found(self, stem_corpus):
|
|
506
|
+
"""`z` is the highest character `tokenize` can emit, so an upper bound
|
|
507
|
+
of ``term + "z"`` silently excludes exactly the terms that continue
|
|
508
|
+
with one — `analy` would never reach `analyze`. The bound is `~`,
|
|
509
|
+
which sorts above every character a token can contain.
|
|
510
|
+
"""
|
|
511
|
+
assert rag.stem_expansions(["analy"]) == {"analy": "analyze"}
|
|
512
|
+
|
|
513
|
+
def test_a_term_that_prefixes_nothing_stays_missing(self, stem_corpus):
|
|
514
|
+
assert rag.stem_expansions(["zzzznothing"]) == {}
|
|
515
|
+
|
|
516
|
+
def test_the_upper_bound_does_not_leak_past_the_prefix(self, stem_corpus):
|
|
517
|
+
"""`camel` sorts after `call` but is not a `call`-prefixed term, so a
|
|
518
|
+
range whose upper bound is wrong would drag in neighbours."""
|
|
519
|
+
assert rag.stem_expansions(["calm"]) == {}
|
|
520
|
+
|
|
521
|
+
def test_no_postings_file_yields_no_expansions(self, sandbox):
|
|
522
|
+
assert rag.stem_expansions(["callback"]) == {}
|
|
523
|
+
|
|
524
|
+
def test_duplicate_terms_are_asked_once_and_answered_once(self, stem_corpus):
|
|
525
|
+
assert rag.stem_expansions(["callback", "callback"]) == {
|
|
526
|
+
"callback": "callbacks"}
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
class TestRetrieveUsesStemExpansions:
|
|
530
|
+
def test_a_singular_query_reaches_the_plural_item(self, stem_corpus):
|
|
531
|
+
"""The reported symptom, in miniature: `callbacks` is indexed, the user
|
|
532
|
+
types `callback`, and before this the answer was nothing at all."""
|
|
533
|
+
hits = rag.retrieve("callback", entries=stem_corpus)
|
|
534
|
+
assert [h["entry"]["name"] for h in hits] == ["delta"]
|
|
535
|
+
|
|
536
|
+
def test_the_snippet_highlights_the_term_that_actually_matched(
|
|
537
|
+
self, stem_corpus):
|
|
538
|
+
hits = rag.retrieve("callback", entries=stem_corpus)
|
|
539
|
+
assert "callbacks" in hits[0]["snippet"].lower()
|
|
540
|
+
|
|
541
|
+
def test_a_query_whose_terms_all_exist_is_untouched(self, stem_corpus):
|
|
542
|
+
names = [h["entry"]["name"]
|
|
543
|
+
for h in rag.retrieve("pattern", entries=stem_corpus)]
|
|
544
|
+
assert names == ["alpha"] # not beta, which owns `patterns`
|
|
545
|
+
|
|
546
|
+
def test_a_mixed_query_keeps_the_existing_term_and_fixes_the_other(
|
|
547
|
+
self, stem_corpus):
|
|
548
|
+
names = {h["entry"]["name"]
|
|
549
|
+
for h in rag.retrieve("pattern callback", entries=stem_corpus)}
|
|
550
|
+
assert names == {"alpha", "delta"}
|
|
551
|
+
|
|
552
|
+
def test_a_query_that_matches_nothing_at_all_still_returns_nothing(
|
|
553
|
+
self, stem_corpus):
|
|
554
|
+
assert rag.retrieve("zzzznothing", entries=stem_corpus) == []
|
|
555
|
+
|
|
556
|
+
|
|
434
557
|
class TestBm25Math:
|
|
435
558
|
"""Pin the exact BM25 arithmetic (k1=1.2, b=0.75) so formula mutants die."""
|
|
436
559
|
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|