boost-skill-cli 1.0.313__tar.gz → 1.0.314__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.0.313/boost_skill_cli.egg-info → boost_skill_cli-1.0.314}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/rag.py +68 -14
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +66 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap.html +67 -1
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_retrieval.py +22 -3
- boost_skill_cli-1.0.314/tests/eval/golden-natural.jsonl +84 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_discovery.py +7 -2
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_rag.py +18 -7
- boost_skill_cli-1.0.314/tests/unit/test_rag_fusion.py +210 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.gitattributes +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.gitignore +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/.vale.ini +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/LICENSE +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/Makefile +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/README.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/codecov.yml +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/index.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/README.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/examples/README.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/index.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/noxfile.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/setup.cfg +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/README.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/boost.css +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/boost.js +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/style/demo.html +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.313 → boost_skill_cli-1.0.314}/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.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.314'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 314)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -421,10 +421,48 @@ def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str
|
|
|
421
421
|
return (picked + rest)[:limit], "Claude relevance"
|
|
422
422
|
|
|
423
423
|
|
|
424
|
+
# The damping constant from the original reciprocal-rank-fusion paper. It is
|
|
425
|
+
# why plain RRF needs no tuning: large enough that the top few ranks are close
|
|
426
|
+
# together, so one engine's confident #1 cannot bury the other engine's #2.
|
|
427
|
+
RRF_K = 60
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def rrf_fuse(rankings: List[List[Hit]], limit: int = 60) -> List[Hit]:
|
|
431
|
+
"""Fuse ranked hit lists by reciprocal rank: ``sum 1/(RRF_K + rank)``.
|
|
432
|
+
|
|
433
|
+
Fuses on **ranks, not scores**, which is the whole point. A BM25 score and
|
|
434
|
+
a cosine similarity are on incomparable scales, so blending them needs a
|
|
435
|
+
calibration step that has to be fitted and re-fitted per corpus; rank
|
|
436
|
+
fusion sidesteps it entirely and is the respected zero-tuning default.
|
|
437
|
+
|
|
438
|
+
Entries are identified by ``(name, tap)`` — the same key both engines
|
|
439
|
+
already dedupe on — and the first ranking's hit object wins, so the caller
|
|
440
|
+
passes BM25 first and keeps its query-term-highlighted snippet for display.
|
|
441
|
+
|
|
442
|
+
The returned ``score`` is the fused rank score, not a BM25 score: it exists
|
|
443
|
+
to order these hits against each other, and comparing it to a raw BM25
|
|
444
|
+
score from elsewhere would be meaningless.
|
|
445
|
+
"""
|
|
446
|
+
scores: Dict[Tuple[str, str], float] = {}
|
|
447
|
+
chosen: Dict[Tuple[str, str], Hit] = {}
|
|
448
|
+
for hits in rankings:
|
|
449
|
+
for rank, hit in enumerate(hits, start=1):
|
|
450
|
+
entry = hit["entry"]
|
|
451
|
+
key = (entry["name"], entry["tap"])
|
|
452
|
+
scores[key] = scores.get(key, 0.0) + 1.0 / (RRF_K + rank)
|
|
453
|
+
chosen.setdefault(key, hit)
|
|
454
|
+
ordered = sorted(scores, key=lambda key: (-scores[key], key[0], key[1]))
|
|
455
|
+
fused: List[Hit] = [
|
|
456
|
+
{"entry": chosen[key]["entry"], "score": scores[key],
|
|
457
|
+
"snippet": chosen[key]["snippet"]} # type: ignore[typeddict-item]
|
|
458
|
+
for key in ordered[:limit]]
|
|
459
|
+
return fused
|
|
460
|
+
|
|
461
|
+
|
|
424
462
|
def retrieve_any(query: str, k: int = 60, kind: Optional[str] = None,
|
|
425
463
|
entries: Optional[List[dict]] = None
|
|
426
464
|
) -> Tuple[Optional[List[Hit]], str]:
|
|
427
|
-
"""
|
|
465
|
+
"""Fuse BM25 and dense when both are available; floor to whichever is.
|
|
428
466
|
|
|
429
467
|
Returns ``(hits, engine_label)``; ``hits`` is ``None`` only when no index of
|
|
430
468
|
any kind exists so the caller can fall back to ``catalog.search``.
|
|
@@ -432,21 +470,37 @@ def retrieve_any(query: str, k: int = 60, kind: Optional[str] = None,
|
|
|
432
470
|
Public because every retrieval entry point must make the same engine
|
|
433
471
|
choice: `cmd_search` calling ``retrieve`` directly meant the CLI could
|
|
434
472
|
never use a built dense index, while the MCP path could.
|
|
473
|
+
|
|
474
|
+
This used to *prefer* dense whenever it was ready. The golden-set eval
|
|
475
|
+
retired that: over 91 queries BM25 and local dense tie on hit@1, with the
|
|
476
|
+
recall and MRR gaps inside the noise floor, while human-phrased queries
|
|
477
|
+
separate them sharply in opposite directions. Preferring either one hands
|
|
478
|
+
half the queries to the engine that is worse at them, so they are fused.
|
|
479
|
+
|
|
480
|
+
Both engines are over-fetched to ``RRF_K`` before fusing. Fusing only the
|
|
481
|
+
top-k of each would discard exactly the candidates the other engine was
|
|
482
|
+
going to promote, which is most of the value.
|
|
435
483
|
"""
|
|
436
484
|
from . import dense
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
485
|
+
pool = max(k, RRF_K)
|
|
486
|
+
dense_hits = dense.retrieve(query, k=pool, kind=kind,
|
|
487
|
+
entries=entries) if dense.ready() else None
|
|
488
|
+
# An empty list is not the same answer as None. ``dense.retrieve`` returns
|
|
489
|
+
# ``[]`` whenever every KNN neighbour was dropped for a kind mismatch or
|
|
490
|
+
# for no longer being live, which is a *thin index*, not a verdict on the
|
|
491
|
+
# query — and taking it as final short-circuits the documented "everything
|
|
492
|
+
# degrades to BM25" contract, so `boost search` answered "no results" while
|
|
493
|
+
# a perfectly good BM25 index sat unused. Only a non-empty dense result
|
|
494
|
+
# counts as a ranking to fuse.
|
|
495
|
+
bm25_hits = retrieve(query, k=pool, kind=kind,
|
|
496
|
+
entries=entries) if ready() else None
|
|
497
|
+
if dense_hits and bm25_hits:
|
|
498
|
+
return (rrf_fuse([bm25_hits, dense_hits], limit=k),
|
|
499
|
+
"hybrid RRF (BM25 + dense)")
|
|
500
|
+
if dense_hits:
|
|
501
|
+
return dense_hits[:k], "dense vectors"
|
|
502
|
+
if bm25_hits is not None:
|
|
503
|
+
return bm25_hits[:k], "BM25 full-content"
|
|
450
504
|
return None, ""
|
|
451
505
|
|
|
452
506
|
|
|
@@ -421,6 +421,7 @@ tests/bdd/features/steps/mcp_steps.py
|
|
|
421
421
|
tests/bdd/features/steps/quality_steps.py
|
|
422
422
|
tests/eval/baseline.json
|
|
423
423
|
tests/eval/explain.jsonl
|
|
424
|
+
tests/eval/golden-natural.jsonl
|
|
424
425
|
tests/eval/golden.jsonl
|
|
425
426
|
tests/eval/recommend.jsonl
|
|
426
427
|
tests/eval/taps.txt
|
|
@@ -534,6 +535,7 @@ tests/unit/test_project_mcp_sidecar.py
|
|
|
534
535
|
tests/unit/test_projectlock.py
|
|
535
536
|
tests/unit/test_provenance.py
|
|
536
537
|
tests/unit/test_rag.py
|
|
538
|
+
tests/unit/test_rag_fusion.py
|
|
537
539
|
tests/unit/test_registries_fresh.py
|
|
538
540
|
tests/unit/test_registry.py
|
|
539
541
|
tests/unit/test_registry_categories.py
|
|
@@ -194,3 +194,69 @@ A rerun stored all 3740, and two 30-batch replays never reproduced a failure, so
|
|
|
194
194
|
resource pressure rather than a defect — the retry path (no commit recorded for a failed tap)
|
|
195
195
|
did its job. The figures above come from a complete index.
|
|
196
196
|
|
|
197
|
+
<b>Step 4 shipped, measured against the same 91 queries.</b> <code>retrieve_any</code> no longer
|
|
198
|
+
picks an engine; it over-fetches <code>RRF_K</code>=60 from each and fuses by reciprocal rank,
|
|
199
|
+
<code>1/(60+rank)</code> summed, keyed on <code>(name, tap)</code> — the key both engines
|
|
200
|
+
already dedupe on. Adding a <code>hybrid</code> column to the eval:
|
|
201
|
+
<code>catalog.search</code> hit@1 0.714; BM25 hit@1 0.780, recall 1.000, MRR 0.860, nDCG 0.895;
|
|
202
|
+
dense hit@1 0.780, recall 0.956, MRR 0.853, nDCG 0.876; <b>hybrid hit@1 0.813, recall 0.978, MRR
|
|
203
|
+
0.883, nDCG 0.905</b>.
|
|
204
|
+
|
|
205
|
+
Hybrid leads on <code>hit@1</code>, MRR and nDCG, and gives up 2 queries of recall to BM25.
|
|
206
|
+
<b>Neither difference is significant</b> by the bar set above: +3 net queries on hit@1 and −2
|
|
207
|
+
on recall, both inside the ~6-query floor for <em>p</em><0.05 at this <em>n</em>. So the case for
|
|
208
|
+
fusing is not "it scores higher" — it is that fusing is the only option that is <em>at or near
|
|
209
|
+
best on both query shapes</em>, where preferring either engine is measurably wrong for half of them.
|
|
210
|
+
|
|
211
|
+
<b>This reverses a deliberate earlier decision</b>, and that is worth flagging rather than burying:
|
|
212
|
+
<code>test_a_non_empty_dense_result_is_still_final</code> existed precisely to stop
|
|
213
|
+
<code>retrieve_any</code> "always running BM25 too". Its premise was that a dense hit is the better
|
|
214
|
+
answer, which the tie above retires. The other half of that fix — an <em>empty</em> dense
|
|
215
|
+
result is a thin index, not a verdict, and must fall through to BM25 — still stands and is
|
|
216
|
+
still tested.
|
|
217
|
+
|
|
218
|
+
<b>One honest counter-observation.</b> On two hand-picked human-phrased queries, fusion at k=3
|
|
219
|
+
<em>lost</em> the best dense hit: <code>"my app is slow"</code> dropped
|
|
220
|
+
<code>performance-optimization</code> and <code>"I need to make my website accessible"</code>
|
|
221
|
+
dropped <code>accessibility-guidelines</code>, in both cases because a junk BM25 rank-1 outweighed a
|
|
222
|
+
good dense rank-2. That is exactly the tradeoff this card predicted — "rank fusion discards
|
|
223
|
+
confidence" — and it is an anecdote at n=2 against a measured win at n=91, so it did not block
|
|
224
|
+
shipping. It is the strongest argument for the query set step 6 still needs, and the first thing to
|
|
225
|
+
re-measure once that exists.
|
|
226
|
+
|
|
227
|
+
<b>Step 6's real deliverable, and it settles the question.</b> The missing piece was never a number
|
|
228
|
+
— it was a query set of the shape this feature exists for.
|
|
229
|
+
<code>tests/eval/golden-natural.jsonl</code> is 50 queries written from each target's own
|
|
230
|
+
<code>description</code> and nothing else, phrased as a user problem, with the target's distinctive
|
|
231
|
+
name tokens deliberately excluded (a query containing "docker" finds <code>docker-expert</code> by
|
|
232
|
+
string match and measures nothing). The whole set was written <em>before</em> any engine was run
|
|
233
|
+
against it and scored once, so it could not be selected to flatter a result already seen. A
|
|
234
|
+
mechanical check caught five queries that had leaked a name token and they were rewritten.
|
|
235
|
+
|
|
236
|
+
Over the same corpus at k=10, 50 queries: <code>catalog.search</code> recall 0.330 hit@1 0.080;
|
|
237
|
+
<b>BM25 recall 0.690 hit@1 0.240</b>; <b>dense recall 0.760 hit@1 0.420</b>;
|
|
238
|
+
<b>hybrid RRF recall 0.820 hit@1 0.420</b> MRR 0.559 nDCG 0.614.
|
|
239
|
+
|
|
240
|
+
<b>BM25 collapses on this shape</b> — hit@1 falls from 0.780 on the keyword set to
|
|
241
|
+
<b>0.240</b> here, recall from 1.000 to 0.690. And dense beats it by <b>+9 net queries</b> on hit@1
|
|
242
|
+
(21 of 50 against 12), which clears the ~6-query significance floor this card set. <b>That is the
|
|
243
|
+
first significant retrieval difference anyone has measured in this repo</b>, and it is in the
|
|
244
|
+
opposite direction from the keyword set.
|
|
245
|
+
|
|
246
|
+
So the two sets together say something neither says alone. On keyword queries BM25 and dense tie and
|
|
247
|
+
hybrid edges ahead; on natural queries BM25 is far behind and hybrid is at-or-above dense on every
|
|
248
|
+
metric. <b>Hybrid is the only engine that is at or near best on both shapes</b> — which is
|
|
249
|
+
precisely the argument step 4 was shipped on, now with a significant margin behind it rather than
|
|
250
|
+
+3 queries inside the noise.
|
|
251
|
+
|
|
252
|
+
One caveat the slice exposes: <code>skill</code> queries score hit@1 0.459 against
|
|
253
|
+
<code>workflow</code> 0.308. The workflows in this corpus are overwhelmingly
|
|
254
|
+
<code><technology>-expert</code> agents, so a problem-phrased query has to bridge from a
|
|
255
|
+
symptom to a product name with no shared vocabulary at all — the hardest case, and the one
|
|
256
|
+
where a larger embedding model would most likely show its value. Worth re-running against Voyage
|
|
257
|
+
before concluding the local model is enough.
|
|
258
|
+
|
|
259
|
+
The set is deliberately <b>not</b> wired into <code>make eval</code> or the required gate: it needs
|
|
260
|
+
the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
|
|
261
|
+
flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.
|
|
262
|
+
|
|
@@ -780,7 +780,73 @@ is, at best, tied for them.
|
|
|
780
780
|
<b>Method note.</b> The first indexing pass reported 3 taps failed to embed (2716 of 3740 passages).
|
|
781
781
|
A rerun stored all 3740, and two 30-batch replays never reproduced a failure, so it was transient
|
|
782
782
|
resource pressure rather than a defect — the retry path (no commit recorded for a failed tap)
|
|
783
|
-
did its job. The figures above come from a complete index
|
|
783
|
+
did its job. The figures above come from a complete index.
|
|
784
|
+
|
|
785
|
+
<b>Step 4 shipped, measured against the same 91 queries.</b> <code>retrieve_any</code> no longer
|
|
786
|
+
picks an engine; it over-fetches <code>RRF_K</code>=60 from each and fuses by reciprocal rank,
|
|
787
|
+
<code>1/(60+rank)</code> summed, keyed on <code>(name, tap)</code> — the key both engines
|
|
788
|
+
already dedupe on. Adding a <code>hybrid</code> column to the eval:
|
|
789
|
+
<code>catalog.search</code> hit@1 0.714; BM25 hit@1 0.780, recall 1.000, MRR 0.860, nDCG 0.895;
|
|
790
|
+
dense hit@1 0.780, recall 0.956, MRR 0.853, nDCG 0.876; <b>hybrid hit@1 0.813, recall 0.978, MRR
|
|
791
|
+
0.883, nDCG 0.905</b>.
|
|
792
|
+
|
|
793
|
+
Hybrid leads on <code>hit@1</code>, MRR and nDCG, and gives up 2 queries of recall to BM25.
|
|
794
|
+
<b>Neither difference is significant</b> by the bar set above: +3 net queries on hit@1 and −2
|
|
795
|
+
on recall, both inside the ~6-query floor for <em>p</em><0.05 at this <em>n</em>. So the case for
|
|
796
|
+
fusing is not "it scores higher" — it is that fusing is the only option that is <em>at or near
|
|
797
|
+
best on both query shapes</em>, where preferring either engine is measurably wrong for half of them.
|
|
798
|
+
|
|
799
|
+
<b>This reverses a deliberate earlier decision</b>, and that is worth flagging rather than burying:
|
|
800
|
+
<code>test_a_non_empty_dense_result_is_still_final</code> existed precisely to stop
|
|
801
|
+
<code>retrieve_any</code> "always running BM25 too". Its premise was that a dense hit is the better
|
|
802
|
+
answer, which the tie above retires. The other half of that fix — an <em>empty</em> dense
|
|
803
|
+
result is a thin index, not a verdict, and must fall through to BM25 — still stands and is
|
|
804
|
+
still tested.
|
|
805
|
+
|
|
806
|
+
<b>One honest counter-observation.</b> On two hand-picked human-phrased queries, fusion at k=3
|
|
807
|
+
<em>lost</em> the best dense hit: <code>"my app is slow"</code> dropped
|
|
808
|
+
<code>performance-optimization</code> and <code>"I need to make my website accessible"</code>
|
|
809
|
+
dropped <code>accessibility-guidelines</code>, in both cases because a junk BM25 rank-1 outweighed a
|
|
810
|
+
good dense rank-2. That is exactly the tradeoff this card predicted — "rank fusion discards
|
|
811
|
+
confidence" — and it is an anecdote at n=2 against a measured win at n=91, so it did not block
|
|
812
|
+
shipping. It is the strongest argument for the query set step 6 still needs, and the first thing to
|
|
813
|
+
re-measure once that exists.
|
|
814
|
+
|
|
815
|
+
<b>Step 6's real deliverable, and it settles the question.</b> The missing piece was never a number
|
|
816
|
+
— it was a query set of the shape this feature exists for.
|
|
817
|
+
<code>tests/eval/golden-natural.jsonl</code> is 50 queries written from each target's own
|
|
818
|
+
<code>description</code> and nothing else, phrased as a user problem, with the target's distinctive
|
|
819
|
+
name tokens deliberately excluded (a query containing "docker" finds <code>docker-expert</code> by
|
|
820
|
+
string match and measures nothing). The whole set was written <em>before</em> any engine was run
|
|
821
|
+
against it and scored once, so it could not be selected to flatter a result already seen. A
|
|
822
|
+
mechanical check caught five queries that had leaked a name token and they were rewritten.
|
|
823
|
+
|
|
824
|
+
Over the same corpus at k=10, 50 queries: <code>catalog.search</code> recall 0.330 hit@1 0.080;
|
|
825
|
+
<b>BM25 recall 0.690 hit@1 0.240</b>; <b>dense recall 0.760 hit@1 0.420</b>;
|
|
826
|
+
<b>hybrid RRF recall 0.820 hit@1 0.420</b> MRR 0.559 nDCG 0.614.
|
|
827
|
+
|
|
828
|
+
<b>BM25 collapses on this shape</b> — hit@1 falls from 0.780 on the keyword set to
|
|
829
|
+
<b>0.240</b> here, recall from 1.000 to 0.690. And dense beats it by <b>+9 net queries</b> on hit@1
|
|
830
|
+
(21 of 50 against 12), which clears the ~6-query significance floor this card set. <b>That is the
|
|
831
|
+
first significant retrieval difference anyone has measured in this repo</b>, and it is in the
|
|
832
|
+
opposite direction from the keyword set.
|
|
833
|
+
|
|
834
|
+
So the two sets together say something neither says alone. On keyword queries BM25 and dense tie and
|
|
835
|
+
hybrid edges ahead; on natural queries BM25 is far behind and hybrid is at-or-above dense on every
|
|
836
|
+
metric. <b>Hybrid is the only engine that is at or near best on both shapes</b> — which is
|
|
837
|
+
precisely the argument step 4 was shipped on, now with a significant margin behind it rather than
|
|
838
|
+
+3 queries inside the noise.
|
|
839
|
+
|
|
840
|
+
One caveat the slice exposes: <code>skill</code> queries score hit@1 0.459 against
|
|
841
|
+
<code>workflow</code> 0.308. The workflows in this corpus are overwhelmingly
|
|
842
|
+
<code><technology>-expert</code> agents, so a problem-phrased query has to bridge from a
|
|
843
|
+
symptom to a product name with no shared vocabulary at all — the hardest case, and the one
|
|
844
|
+
where a larger embedding model would most likely show its value. Worth re-running against Voyage
|
|
845
|
+
before concluding the local model is enough.
|
|
846
|
+
|
|
847
|
+
The set is deliberately <b>not</b> wired into <code>make eval</code> or the required gate: it needs
|
|
848
|
+
the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
|
|
849
|
+
flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.</p>
|
|
784
850
|
<div class="meta">
|
|
785
851
|
<span class="m">Complexity <b>L</b></span>
|
|
786
852
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -145,6 +145,22 @@ def dense_ranker(k: int) -> Ranker:
|
|
|
145
145
|
[h["entry"]["name"] for h in (dense.retrieve(q, k=max(k * 4, 60)) or [])])
|
|
146
146
|
|
|
147
147
|
|
|
148
|
+
def hybrid_ranker(k: int) -> Ranker:
|
|
149
|
+
"""BM25 and dense fused by reciprocal rank (rag.rrf_fuse).
|
|
150
|
+
|
|
151
|
+
Measured as its own engine rather than inferred from the other two: a
|
|
152
|
+
hybrid win must not be creditable to whichever component did not earn it,
|
|
153
|
+
which is why each engine is also reported alone.
|
|
154
|
+
"""
|
|
155
|
+
def rank(q: str) -> List[str]:
|
|
156
|
+
pool = max(k * 4, 60)
|
|
157
|
+
b = rag.retrieve(q, k=pool)
|
|
158
|
+
d = dense.retrieve(q, k=pool) or []
|
|
159
|
+
return _dedupe([h["entry"]["name"]
|
|
160
|
+
for h in rag.rrf_fuse([b, d], limit=pool)])
|
|
161
|
+
return rank
|
|
162
|
+
|
|
163
|
+
|
|
148
164
|
def rerank_ranker(k: int) -> Ranker:
|
|
149
165
|
"""BM25 shortlist reordered by the LLM rerank stage (Tier 2a)."""
|
|
150
166
|
def rank(q: str) -> List[str]:
|
|
@@ -369,7 +385,7 @@ def main(argv: Optional[List[str]] = None) -> int:
|
|
|
369
385
|
ap.add_argument("--golden", type=Path, default=DEFAULT_GOLDEN)
|
|
370
386
|
ap.add_argument("-k", type=int, default=10, help="cutoff for @k metrics")
|
|
371
387
|
ap.add_argument("--engines", default="auto",
|
|
372
|
-
help="comma list of catalog,bm25,dense (default: auto)")
|
|
388
|
+
help="comma list of catalog,bm25,dense,hybrid (default: auto)")
|
|
373
389
|
ap.add_argument("--build", action="store_true",
|
|
374
390
|
help="(re)build the BM25 index before evaluating")
|
|
375
391
|
ap.add_argument("--rerank", action="store_true",
|
|
@@ -406,10 +422,13 @@ def main(argv: Optional[List[str]] = None) -> int:
|
|
|
406
422
|
if (args.engines == "auto" or "dense" in wanted) and dense.ready():
|
|
407
423
|
if "dense" not in wanted:
|
|
408
424
|
wanted.append("dense")
|
|
425
|
+
if (args.engines == "auto" or "hybrid" in wanted) and dense.ready():
|
|
426
|
+
if "hybrid" not in wanted:
|
|
427
|
+
wanted.append("hybrid")
|
|
409
428
|
factory = {"catalog": catalog_ranker, "bm25": bm25_ranker,
|
|
410
|
-
"dense": dense_ranker}
|
|
429
|
+
"dense": dense_ranker, "hybrid": hybrid_ranker}
|
|
411
430
|
labels = {"catalog": "catalog.search", "bm25": "BM25 full-content",
|
|
412
|
-
"dense": "dense vectors"}
|
|
431
|
+
"dense": "dense vectors", "hybrid": "hybrid RRF"}
|
|
413
432
|
|
|
414
433
|
results: List[dict] = []
|
|
415
434
|
per_cases: Dict[str, List[dict]] = {}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Natural-language retrieval judgments — the queries golden.jsonl does not contain.
|
|
2
|
+
#
|
|
3
|
+
# WHY THIS FILE EXISTS. golden.jsonl grades catalog items by NAME, and its queries
|
|
4
|
+
# carry the vocabulary of the docs they target ("generate algorithmic art with
|
|
5
|
+
# p5.js flow fields"). That is BM25's home ground: measured over the pinned
|
|
6
|
+
# corpus it scores recall 1.000 there, which CLAUDE.md records as expected. So
|
|
7
|
+
# the set cannot distinguish retrieval engines on the thing the keyless dense
|
|
8
|
+
# work was built for — a user describing a PROBLEM in their own words.
|
|
9
|
+
#
|
|
10
|
+
# METHOD, stated so it can be checked rather than trusted:
|
|
11
|
+
# 1. Every query was written from the target's own `description` field and
|
|
12
|
+
# nothing else. No retrieval was run against any engine while composing —
|
|
13
|
+
# the whole set was written first and scored once, so the queries could not
|
|
14
|
+
# be selected to flatter a result already seen. That ordering is the point;
|
|
15
|
+
# see keyless-semantic-search-for-everyone for why fitting and reporting on
|
|
16
|
+
# one set is the failure mode here.
|
|
17
|
+
# 2. Queries deliberately AVOID the target's distinctive name tokens. A query
|
|
18
|
+
# containing "docker" finds docker-expert by string match and measures
|
|
19
|
+
# nothing. "my containers keep restarting" is the question a user actually
|
|
20
|
+
# has.
|
|
21
|
+
# 3. Where two items genuinely serve one intent (mcp-builder and build-mcp are
|
|
22
|
+
# near-duplicates in this corpus), both are listed relevant. Grading one as
|
|
23
|
+
# wrong would penalise an engine for a corpus duplication, not a retrieval
|
|
24
|
+
# failure.
|
|
25
|
+
#
|
|
26
|
+
# HOW TO RUN. Needs the pinned corpus (scripts/ensure_eval_corpus.sh) and, for
|
|
27
|
+
# the dense/hybrid columns, the [rag] extra plus a built store:
|
|
28
|
+
# python3 scripts/eval_retrieval.py --golden tests/eval/golden-natural.jsonl -k 10
|
|
29
|
+
# NOT wired into `make eval` or the required gate: that gate must stay
|
|
30
|
+
# deterministic and offline-ish, and this set is for comparing engines rather
|
|
31
|
+
# than flooring one. Adding it to the gate would also floor a number nobody has
|
|
32
|
+
# argued for yet.
|
|
33
|
+
#
|
|
34
|
+
# One JSON object per line: {query, relevant[], kind, note}
|
|
35
|
+
{"query": "my writing is too wordy and people skim past the important parts", "relevant": ["write-concisely"], "kind": "skill", "note": "clarity, no shared vocabulary with the name"}
|
|
36
|
+
{"query": "an error surfaces deep in the call stack and I cannot tell what originally triggered it", "relevant": ["root-cause-tracing"], "kind": "skill", "note": "tracing back from a symptom"}
|
|
37
|
+
{"query": "I keep patching symptoms instead of whatever is actually wrong underneath", "relevant": ["why", "root-cause-tracing"], "kind": "skill", "note": "five-whys intent"}
|
|
38
|
+
{"query": "what convention should I follow for the messages I write when recording changes in git", "relevant": ["commit"], "kind": "skill", "note": "conventional commits"}
|
|
39
|
+
{"query": "I keep stashing half-finished work every time I have to switch branches", "relevant": ["git-worktrees"], "kind": "skill", "note": "worktrees without naming them"}
|
|
40
|
+
{"query": "I want to attach review status to a commit without rewriting any history", "relevant": ["git-notes"], "kind": "skill", "note": "metadata on commits"}
|
|
41
|
+
{"query": "check what I changed for injection flaws and leaked credentials before it goes in", "relevant": ["security-auditor"], "kind": "workflow", "note": "vulnerability review"}
|
|
42
|
+
{"query": "am I actually exercising the risky paths or only the easy ones", "relevant": ["test-coverage-reviewer"], "kind": "workflow", "note": "coverage quality"}
|
|
43
|
+
{"query": "read through my diff and tell me what is broken in it", "relevant": ["bug-hunter"], "kind": "workflow", "note": "defect finding"}
|
|
44
|
+
{"query": "does this change follow the conventions the rest of the project uses", "relevant": ["code-reviewer"], "kind": "workflow", "note": "guideline adherence"}
|
|
45
|
+
{"query": "I need a single page covering what went wrong, why it happened and what we will do", "relevant": ["analyse-problem"], "kind": "skill", "note": "A3 report"}
|
|
46
|
+
{"query": "help me lay out everything that might be contributing, grouped into categories", "relevant": ["cause-and-effect"], "kind": "skill", "note": "fishbone"}
|
|
47
|
+
{"query": "I want to run small controlled experiments and keep iterating on the result", "relevant": ["plan-do-check-act"], "kind": "skill", "note": "PDCA"}
|
|
48
|
+
{"query": "drive my locally running site in a real browser and confirm it behaves", "relevant": ["webapp-testing"], "kind": "skill", "note": "playwright without the word"}
|
|
49
|
+
{"query": "get the text out of a scanned document so I can search it", "relevant": ["pdf"], "kind": "skill", "note": "extraction"}
|
|
50
|
+
{"query": "I need to edit a Word file programmatically", "relevant": ["docx"], "kind": "skill", "note": "office format"}
|
|
51
|
+
{"query": "read numbers out of a spreadsheet and write some back", "relevant": ["xlsx"], "kind": "skill", "note": "office format"}
|
|
52
|
+
{"query": "put together a slide deck for a presentation", "relevant": ["pptx"], "kind": "skill", "note": "office format"}
|
|
53
|
+
{"query": "make a short looping animation small enough to post in chat", "relevant": ["slack-gif-creator"], "kind": "skill", "note": "gif constraints"}
|
|
54
|
+
{"query": "make this match our company colours and typefaces", "relevant": ["brand-guidelines"], "kind": "skill", "note": "brand application"}
|
|
55
|
+
{"query": "the interface looks generic and I want it to feel deliberate", "relevant": ["frontend-design"], "kind": "skill", "note": "visual design intent"}
|
|
56
|
+
{"query": "expose an external API as tools an assistant can call", "relevant": ["mcp-builder", "build-mcp"], "kind": "skill", "note": "two near-duplicate items in this corpus"}
|
|
57
|
+
{"query": "the model keeps ignoring part of my instructions", "relevant": ["prompt-engineering"], "kind": "skill", "note": "prompt authoring"}
|
|
58
|
+
{"query": "I am running out of room in the window and important details get dropped", "relevant": ["context-engineering"], "kind": "skill", "note": "context limits"}
|
|
59
|
+
{"query": "I want to package a repeatable procedure so it can be reused later", "relevant": ["skill-creator", "create-skill"], "kind": "skill", "note": "duplicate intent in corpus"}
|
|
60
|
+
{"query": "how do I tell whether my changes to the instructions actually helped", "relevant": ["agent-evaluation"], "kind": "skill", "note": "measuring prompt changes"}
|
|
61
|
+
{"query": "run something automatically every time before code is committed", "relevant": ["create-hook"], "kind": "skill", "note": "git hooks"}
|
|
62
|
+
{"query": "turn this ticket into a proper technical specification", "relevant": ["analyze-issue"], "kind": "skill", "note": "issue to spec"}
|
|
63
|
+
{"query": "open a change request with the right template filled in", "relevant": ["create-pr"], "kind": "skill", "note": "PR creation"}
|
|
64
|
+
{"query": "gather all the unresolved feedback on my change into a task list", "relevant": ["load-pr-comments"], "kind": "skill", "note": "review comments"}
|
|
65
|
+
{"query": "the written guides no longer match what the code does", "relevant": ["update-docs"], "kind": "skill", "note": "stale documentation"}
|
|
66
|
+
{"query": "walk me through writing a guide together step by step", "relevant": ["doc-coauthoring"], "kind": "skill", "note": "structured authoring"}
|
|
67
|
+
{"query": "this needs careful multi-step logic rather than a quick guess", "relevant": ["thought-based-reasoning"], "kind": "skill", "note": "reasoning depth"}
|
|
68
|
+
{"query": "I want several different perspectives to argue about my design before I commit to it", "relevant": ["critique"], "kind": "skill", "note": "multi-judge debate"}
|
|
69
|
+
{"query": "look back over what you just produced and improve on it", "relevant": ["reflect"], "kind": "skill", "note": "self-refinement"}
|
|
70
|
+
{"query": "keep this lesson around so the same mistake is not repeated", "relevant": ["memorize"], "kind": "skill", "note": "persisting insights"}
|
|
71
|
+
{"query": "some of the decisions we recorded are probably out of date now", "relevant": ["decay"], "kind": "skill", "note": "evidence freshness"}
|
|
72
|
+
{"query": "generate visuals from code with a bit of controlled randomness", "relevant": ["algorithmic-art"], "kind": "skill", "note": "creative coding"}
|
|
73
|
+
{"query": "produce a good looking printable document rather than a web page", "relevant": ["canvas-design"], "kind": "skill", "note": "print output"}
|
|
74
|
+
{"query": "apply one consistent look across slides, documents and pages", "relevant": ["theme-factory"], "kind": "skill", "note": "theming"}
|
|
75
|
+
{"query": "what does calling the model actually cost per token", "relevant": ["claude-api"], "kind": "skill", "note": "pricing reference"}
|
|
76
|
+
{"query": "my containers keep restarting and I cannot work out why", "relevant": ["docker-expert"], "kind": "workflow", "note": "avoids the word docker"}
|
|
77
|
+
{"query": "the layout falls apart on a narrow screen", "relevant": ["css-expert"], "kind": "workflow", "note": "responsive layout"}
|
|
78
|
+
{"query": "I want automated tests that click through the app like a person would", "relevant": ["cypress-expert"], "kind": "workflow", "note": "e2e testing"}
|
|
79
|
+
{"query": "our full-text queries have got slow as the index grew", "relevant": ["elasticsearch-expert"], "kind": "workflow", "note": "search performance"}
|
|
80
|
+
{"query": "how should I choose partition and sort keys for this access pattern", "relevant": ["dynamodb-expert"], "kind": "workflow", "note": "key design"}
|
|
81
|
+
{"query": "my shell script fails silently in the pipeline and I never notice", "relevant": ["bash-expert"], "kind": "workflow", "note": "defensive scripting"}
|
|
82
|
+
{"query": "I need to configure a fleet of servers repeatably without doing it by hand", "relevant": ["ansible-expert"], "kind": "workflow", "note": "config management"}
|
|
83
|
+
{"query": "keep database schema versions in step across environments", "relevant": ["flyway-expert"], "kind": "workflow", "note": "migrations"}
|
|
84
|
+
{"query": "background jobs are piling up and not getting processed", "relevant": ["celery-expert", "bullmq-expert"], "kind": "workflow", "note": "two queue libraries, both defensible"}
|
|
@@ -1128,8 +1128,13 @@ class TestReindex:
|
|
|
1128
1128
|
boost("reindex", "--dense")
|
|
1129
1129
|
assert dense.ready() is True
|
|
1130
1130
|
r = boost("search", "brainstorming")
|
|
1131
|
-
|
|
1132
|
-
|
|
1131
|
+
# Both indexes are built here, so retrieve_any fuses rather than
|
|
1132
|
+
# picking: the label names both engines. It used to read "ranked by
|
|
1133
|
+
# dense vectors", from when a ready dense store ended the search —
|
|
1134
|
+
# see rag.retrieve_any for why the golden-set tie retired that.
|
|
1135
|
+
assert "ranked by hybrid RRF (BM25 + dense)" in r.out
|
|
1136
|
+
assert "ranked by BM25 full-content" not in r.out, \
|
|
1137
|
+
"a built dense store must still contribute, not be bypassed"
|
|
1133
1138
|
|
|
1134
1139
|
def test_empty_store_warns_instead_of_reporting_success(
|
|
1135
1140
|
self, boost, tapped, monkeypatch):
|
|
@@ -964,7 +964,10 @@ class TestEngineRouting:
|
|
|
964
964
|
rag._save([{"n": "a", "t": "x/y", "k": "skill", "c": 0, "l": 1,
|
|
965
965
|
"snip": "s", "tf": {"react": 1}}], {})
|
|
966
966
|
|
|
967
|
-
def
|
|
967
|
+
def test_dense_alone_when_bm25_has_no_index(self, sandbox, monkeypatch):
|
|
968
|
+
# Renamed: this never set up a BM25 index, so it was measuring "dense
|
|
969
|
+
# is the only engine available", not a preference between the two.
|
|
970
|
+
# There is no preference any more — with both present they fuse.
|
|
968
971
|
monkeypatch.setattr(dense_mod, "ready", lambda: True)
|
|
969
972
|
picked = [{"entry": {"name": "d", "tap": "x/y"}, "score": 9.0,
|
|
970
973
|
"snippet": "D"}]
|
|
@@ -1018,18 +1021,26 @@ class TestEngineRouting:
|
|
|
1018
1021
|
monkeypatch.setattr(dense_mod, "retrieve", lambda *a, **k: [])
|
|
1019
1022
|
assert rag.search("react", smart=False) is None
|
|
1020
1023
|
|
|
1021
|
-
def
|
|
1022
|
-
|
|
1023
|
-
#
|
|
1024
|
-
#
|
|
1024
|
+
def test_a_non_empty_dense_result_is_now_fused_not_final(self, sandbox,
|
|
1025
|
+
monkeypatch):
|
|
1026
|
+
# SUPERSEDED CONTRACT, deliberately. This used to assert that a real
|
|
1027
|
+
# dense hit ended the search — "the fix must not turn into 'always run
|
|
1028
|
+
# BM25 too'". The golden-set eval retired the premise: dense does not
|
|
1029
|
+
# beat BM25 there (hit@1 0.780 each over 91 queries), so ending the
|
|
1030
|
+
# search on a dense hit hands keyword queries to an engine that is at
|
|
1031
|
+
# best tied for them. Both rankings are now fused by RRF.
|
|
1032
|
+
#
|
|
1033
|
+
# The half of the old fix that still stands is tested above: an EMPTY
|
|
1034
|
+
# dense result is not a verdict, and must still fall through to BM25.
|
|
1025
1035
|
self._bm25_ready()
|
|
1026
1036
|
monkeypatch.setattr(dense_mod, "ready", lambda: True)
|
|
1027
1037
|
monkeypatch.setattr(dense_mod, "retrieve", lambda *a, **k: [
|
|
1028
1038
|
{"entry": {"name": "d", "tap": "x/y"}, "score": 9.0, "snippet": "D"}])
|
|
1029
1039
|
hits, label = rag.search("react", smart=False,
|
|
1030
1040
|
entries=[_entry("a", tap="x/y")])
|
|
1031
|
-
assert
|
|
1032
|
-
assert [h["entry"]["name"] for h in hits]
|
|
1041
|
+
assert "hybrid" in label.lower(), label
|
|
1042
|
+
assert "d" in [h["entry"]["name"] for h in hits], \
|
|
1043
|
+
"the dense hit must survive fusion, not be dropped"
|
|
1033
1044
|
|
|
1034
1045
|
|
|
1035
1046
|
class TestAtomicIndexSave:
|