boost-skill-cli 1.0.319__tar.gz → 1.0.321__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.319/boost_skill_cli.egg-info → boost_skill_cli-1.0.321}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/rag.py +40 -16
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- boost_skill_cli-1.0.321/docs/roadmap/items/bm25-index-is-one-json-blob.md +101 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +13 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap.html +73 -3
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/baseline.json +8 -8
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_rag.py +22 -5
- boost_skill_cli-1.0.319/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -45
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.gitattributes +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.gitignore +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/.vale.ini +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/LICENSE +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/Makefile +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/README.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/codecov.yml +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/index.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/README.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/examples/README.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/index.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/noxfile.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/setup.cfg +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/README.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/boost.css +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/boost.js +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/style/demo.html +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.319 → boost_skill_cli-1.0.321}/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.321'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 321)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -33,7 +33,7 @@ from . import ai, catalog, frontmatter, gitutil, paths, registry, util
|
|
|
33
33
|
# v2: `snip` stores a larger head of the matched chunk (not just SNIP_WIDTH
|
|
34
34
|
# chars) so `retrieve` can window it onto the query terms; bump forces a
|
|
35
35
|
# one-time reindex.
|
|
36
|
-
INDEX_VERSION =
|
|
36
|
+
INDEX_VERSION = 4
|
|
37
37
|
ENGINE = "bm25"
|
|
38
38
|
|
|
39
39
|
# Chunking defaults (documented in docs/rag-architecture.md §4).
|
|
@@ -162,25 +162,49 @@ def index_path() -> Path:
|
|
|
162
162
|
return paths.cache_dir() / "rag_index.json"
|
|
163
163
|
|
|
164
164
|
|
|
165
|
+
def surface(entry: dict) -> str:
|
|
166
|
+
"""The item's own identifying text, indexed alongside its body.
|
|
167
|
+
|
|
168
|
+
A chunked index got name matching for free: the name sat in whichever chunk
|
|
169
|
+
happened to contain it. One document per entry has to state it, and the
|
|
170
|
+
de-hyphenated form matters because `tokenize` does not split on hyphens —
|
|
171
|
+
without it the query "code reviewer" cannot match the item `code-reviewer`.
|
|
172
|
+
"""
|
|
173
|
+
name = entry.get("name", "")
|
|
174
|
+
return " ".join([name, name.replace("-", " ").replace("_", " "),
|
|
175
|
+
entry.get("description") or ""])
|
|
176
|
+
|
|
177
|
+
|
|
165
178
|
def _make_docs(entries: List[dict], tap_paths: Dict[str, Path]) -> List[dict]:
|
|
166
|
-
"""
|
|
179
|
+
"""Tokenize every entry into ONE scored document.
|
|
180
|
+
|
|
181
|
+
Chunking cost far more than it bought. Each 1000-char window carried its own
|
|
182
|
+
copy of the shared per-doc fields and its own `snip`, which is how a 743-entry
|
|
183
|
+
corpus became 3,740 documents and how the roadmap item measured a real
|
|
184
|
+
83-tap install at 132 MB and 8-13 s of `json.loads` on *every cold search* —
|
|
185
|
+
against 31-70 ms of actual BM25 scoring.
|
|
186
|
+
|
|
187
|
+
The one thing chunking genuinely provided was locality: a term only had to
|
|
188
|
+
beat the length normalisation of its own window, not of an entire long
|
|
189
|
+
document. BM25's `b` parameter already handles that, and `retrieve` was
|
|
190
|
+
collapsing chunks back to one hit per entry anyway (max score across
|
|
191
|
+
chunks), so the extra documents were discarded at query time.
|
|
192
|
+
"""
|
|
167
193
|
docs: List[dict] = []
|
|
168
194
|
for e in entries:
|
|
169
195
|
body = read_body(e, tap_paths)
|
|
170
|
-
|
|
171
|
-
for
|
|
172
|
-
tf
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
"tf": dict(tf), # noqa: FURB123 tf is a defaultdict; .copy() would keep the factory
|
|
183
|
-
})
|
|
196
|
+
tf: Dict[str, int] = defaultdict(int)
|
|
197
|
+
for tok in tokenize(surface(e) + "\n" + body):
|
|
198
|
+
tf[tok] += 1
|
|
199
|
+
if not tf:
|
|
200
|
+
continue
|
|
201
|
+
docs.append({
|
|
202
|
+
"n": e["name"], "t": e["tap"], "f": e["skill_md"],
|
|
203
|
+
"k": e.get("kind", "skill"),
|
|
204
|
+
"c": 0, "l": sum(tf.values()),
|
|
205
|
+
"snip": body[:SNIP_STORE].strip(), # windowed at retrieve time
|
|
206
|
+
"tf": dict(tf), # noqa: FURB123 tf is a defaultdict; .copy() would keep the factory
|
|
207
|
+
})
|
|
184
208
|
return docs
|
|
185
209
|
|
|
186
210
|
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: bm25-index-is-one-json-blob
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Search · Index
|
|
7
|
+
complexity: L
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: 2.5 GB RSS per search at 50k items
|
|
11
|
+
order: 72
|
|
12
|
+
owner: loop/unchunked-bm25-index
|
|
13
|
+
pr:
|
|
14
|
+
title: The BM25 index is one JSON blob, and it stops working between 10k and 50k items
|
|
15
|
+
---
|
|
16
|
+
<code>rag.py</code> persists the whole index as a single JSON file and
|
|
17
|
+
<code>json.loads</code> it on every invocation. <code>_CACHE</code>
|
|
18
|
+
(<code>rag.py:275</code>) is process-local, so a long-lived MCP server amortises
|
|
19
|
+
the cost but <b>every cold <code>boost search</code> pays it in full</b>.
|
|
20
|
+
Measured on a synthetic corpus of real repo prose, 10k items → 50k items:<br>
|
|
21
|
+
index on disk 52.7 MB → <b>270 MB</b>;<br>
|
|
22
|
+
<code>json.loads</code> per search 2.0–2.9 s → <b>12.2–13.6 s</b>;<br>
|
|
23
|
+
peak RSS 702 MB → <b>2.49 GB</b>;<br>
|
|
24
|
+
BM25 scoring itself 31 ms → 70 ms — cold start dominates by ~200×.
|
|
25
|
+
On a real 83-tap install the index is already 132 MB at 11.1k entries. Scaling
|
|
26
|
+
that shape to 50k gives ~594 MB and ~5.7 GB resident. <b>Target RSS, not
|
|
27
|
+
bytes</b>: Python object overhead was measured at a consistent 9.5–9.6× file
|
|
28
|
+
size across three independent runs, which is what OOM-kills an 8 GB machine
|
|
29
|
+
while the disk figure still looks survivable.
|
|
30
|
+
Two cheap wins come first and are worth landing on their own.
|
|
31
|
+
<b>(1) Stop chunking.</b> An unchunked index with the item's surface
|
|
32
|
+
(name + de-hyphenated name + description) counted alongside the body scored
|
|
33
|
+
<code>recall@10 0.742 / hit@1 0.429</code> at <b>41 MB and 0.43 s</b> to load,
|
|
34
|
+
versus the live chunked index's <code>0.720 / 0.407</code> at <b>132 MB and
|
|
35
|
+
8–13 s</b> — better on every metric, 3.2× smaller, 20× faster to load.
|
|
36
|
+
<b>(2) Get postings out of JSON.</b> FTS5 is compiled into CPython's bundled
|
|
37
|
+
sqlite (verified: 3.53.4, <code>ENABLE_FTS5</code>), so there is a
|
|
38
|
+
zero-dependency path — but probe it at runtime, because that is a per-build
|
|
39
|
+
property, not a guarantee. A compact mmap-able binary postings format is the
|
|
40
|
+
alternative. Either way <code>snip</code> text (46.7 MB of the 132 MB) belongs
|
|
41
|
+
out of the hot path.
|
|
42
|
+
Also note <code>build()</code>'s incremental path is O(entire corpus): reusing
|
|
43
|
+
unchanged taps runs <code>_kept_docs</code> → <code>_postings_to_doc_tf</code>,
|
|
44
|
+
which inverts every posting in the index — measured 35 s and 1.72 GB RSS at
|
|
45
|
+
11.1k entries to reindex a single changed file.
|
|
46
|
+
|
|
47
|
+
<b>Win (1) is shipped, and the “better on every metric” claim did not survive
|
|
48
|
+
re-measurement.</b> On the pinned 6-tap corpus unchunking is a <em>trade</em>, not a free win, and
|
|
49
|
+
which way it falls depends entirely on the shape of the query.
|
|
50
|
+
|
|
51
|
+
On the keyword golden set — which grades items by <b>name</b> — recall@10 fell
|
|
52
|
+
1.000 → <b>0.978</b> and nDCG 0.895 → 0.882, while hit@1 rose 0.780 → <b>0.791</b>.
|
|
53
|
+
On the 50 natural-language queries in <code>golden-natural.jsonl</code>, over identical data, every
|
|
54
|
+
metric improved and not marginally: recall 0.690 → <b>0.750</b>, hit@1 0.240 → <b>0.340</b>,
|
|
55
|
+
MRR 0.382 → 0.474, nDCG 0.446 → 0.524. That +0.100 hit@1 is 5 of 50 queries, which is at
|
|
56
|
+
the edge of what 50 queries can resolve — worth stating rather than rounding up.
|
|
57
|
+
|
|
58
|
+
Index cost on the same corpus: <b>5.3 MB → 2.1 MB</b> and 3,740 documents → 743, one per
|
|
59
|
+
entry, with load time 0.032 s → 0.015 s. The card's headline figures are from an 83-tap install
|
|
60
|
+
where the constant factors are far larger; this is the small-scale confirmation of the same shape,
|
|
61
|
+
not a substitute for it.
|
|
62
|
+
|
|
63
|
+
Chunking's one real contribution was locality — a term only had to beat the length
|
|
64
|
+
normalisation of its own 1000-char window. BM25's <code>b</code> already does that, and
|
|
65
|
+
<code>retrieve</code> collapsed chunks back to one hit per entry regardless, so the extra documents
|
|
66
|
+
were built, stored, re-parsed on every cold search and then discarded. What chunking <em>did</em>
|
|
67
|
+
provide for free was name matching, since the name sat in whichever chunk contained it; one document
|
|
68
|
+
per entry has to state the surface explicitly, so <code>rag.surface</code> indexes the name, its
|
|
69
|
+
de-hyphenated form (<code>tokenize</code> does not split hyphens, so “code reviewer”
|
|
70
|
+
would otherwise never match <code>code-reviewer</code>) and the description alongside the body.
|
|
71
|
+
|
|
72
|
+
<b>Still open:</b> win (2), getting postings out of JSON — the FTS5 probe and the mmap-able
|
|
73
|
+
binary format are both untouched, as is moving <code>snip</code> text off the hot path. So is
|
|
74
|
+
<code>build()</code>'s O(entire-corpus) incremental path, which still inverts every posting to
|
|
75
|
+
reindex one changed file.
|
|
76
|
+
|
|
77
|
+
<b>Where the bytes are now, measured after win (1).</b> This card sends win (2) after two targets:
|
|
78
|
+
postings, and <code>snip</code> text (“46.7 MB of the 132 MB”, ~35%). That split was a
|
|
79
|
+
property of the <em>chunked</em> index, where every 1000-char window carried its own snippet. With
|
|
80
|
+
one document per entry the balance moves sharply, measured on the pinned 6-tap corpus at 2.05 MB
|
|
81
|
+
total: <b>postings 1.31 MB (64%)</b>, doc metadata 0.46 MB (22%), <b>snips 0.29 MB (14%)</b>, over
|
|
82
|
+
743 documents and 15,639 distinct terms.
|
|
83
|
+
|
|
84
|
+
So unchunking already collected most of the snippet win, and <b>postings are now the dominant lever
|
|
85
|
+
by a wide margin</b>. Anyone picking up win (2) should size it against 64%, not chase snip at an
|
|
86
|
+
assumed 35%.
|
|
87
|
+
|
|
88
|
+
<b>FTS5 probe result.</b> Confirmed present on both interpreters available here — CPython 3.14
|
|
89
|
+
(bundled SQLite 3.53.4) and the macOS system Python 3.9 (SQLite 3.54.0). That supports the card's
|
|
90
|
+
design instruction rather than replacing it: it is still a per-build property, so the runtime probe
|
|
91
|
+
stays required. A distro CPython compiled without <code>ENABLE_FTS5</code> is the case the probe
|
|
92
|
+
exists for.
|
|
93
|
+
|
|
94
|
+
<b>On the incremental path.</b> The O(entire-corpus) reindex noted above is not separable from win
|
|
95
|
+
(2). <code>_kept_docs</code> calls <code>_postings_to_doc_tf</code> because per-document term
|
|
96
|
+
frequencies exist <em>only</em> inside the postings on disk, so recovering them for the unchanged
|
|
97
|
+
taps means scanning every posting whatever the filter. Narrowing the inversion to kept doc ids saves
|
|
98
|
+
memory but not the scan, and in the common case (one tap of many changed) nearly every document is
|
|
99
|
+
kept, so it saves little of that either. Denormalising <code>tf</code> back into the documents would
|
|
100
|
+
fix it directly but roughly duplicates the 64% that postings already occupy. The real fix is the
|
|
101
|
+
storage format, which is win (2) — worth treating them as one item rather than two.
|
|
@@ -260,3 +260,16 @@ The set is deliberately <b>not</b> wired into <code>make eval</code> or the requ
|
|
|
260
260
|
the <code>[rag]</code> extra and a built store, and its purpose is comparing engines rather than
|
|
261
261
|
flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.
|
|
262
262
|
|
|
263
|
+
|
|
264
|
+
<b>Step 4 is shipped too.</b> <code>rag.rrf_fuse</code> landed in <code>#360</code> with
|
|
265
|
+
<code>RRF_K = 60</code>, fusing on ranks exactly as described above, and
|
|
266
|
+
<code>retrieve_any</code> reports <code>hybrid RRF</code> when both engines are built. Recording it
|
|
267
|
+
here because this card still read as though only step 1 were done, and the next loop scanning for
|
|
268
|
+
work would have rebuilt it. The step's own instruction — “ship the k=60 default, benchmark
|
|
269
|
+
it, and tune only if the eval says so” — was followed: the benchmark is
|
|
270
|
+
<code>tests/eval/golden-natural.jsonl</code>, and k=60 is untouched.
|
|
271
|
+
|
|
272
|
+
<b>Steps 2, 3, 5 and 6 remain open.</b> Note that step 6 (publish the eval) is now partly answered by
|
|
273
|
+
the gate work in <code>#365</code>, which floors four metrics instead of recall alone and keys
|
|
274
|
+
baselines to their query set, so BM25-vs-dense-vs-hybrid comparisons are at least falsifiable. What
|
|
275
|
+
step 6 still wants is the published write-up rather than the instrument.
|
|
@@ -846,7 +846,21 @@ before concluding the local model is enough.
|
|
|
846
846
|
|
|
847
847
|
The set is deliberately <b>not</b> wired into <code>make eval</code> or the required gate: it needs
|
|
848
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
|
|
849
|
+
flooring one. Run it with <code>--golden tests/eval/golden-natural.jsonl</code>.
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
<b>Step 4 is shipped too.</b> <code>rag.rrf_fuse</code> landed in <code>#360</code> with
|
|
853
|
+
<code>RRF_K = 60</code>, fusing on ranks exactly as described above, and
|
|
854
|
+
<code>retrieve_any</code> reports <code>hybrid RRF</code> when both engines are built. Recording it
|
|
855
|
+
here because this card still read as though only step 1 were done, and the next loop scanning for
|
|
856
|
+
work would have rebuilt it. The step's own instruction — “ship the k=60 default, benchmark
|
|
857
|
+
it, and tune only if the eval says so” — was followed: the benchmark is
|
|
858
|
+
<code>tests/eval/golden-natural.jsonl</code>, and k=60 is untouched.
|
|
859
|
+
|
|
860
|
+
<b>Steps 2, 3, 5 and 6 remain open.</b> Note that step 6 (publish the eval) is now partly answered by
|
|
861
|
+
the gate work in <code>#365</code>, which floors four metrics instead of recall alone and keys
|
|
862
|
+
baselines to their query set, so BM25-vs-dense-vs-hybrid comparisons are at least falsifiable. What
|
|
863
|
+
step 6 still wants is the published write-up rather than the instrument.</p>
|
|
850
864
|
<div class="meta">
|
|
851
865
|
<span class="m">Complexity <b>L</b></span>
|
|
852
866
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -3436,7 +3450,7 @@ that were never the same from being merged by accident.</p>
|
|
|
3436
3450
|
</article>
|
|
3437
3451
|
|
|
3438
3452
|
<article class="cap rcard" id="bm25-index-is-one-json-blob">
|
|
3439
|
-
<div class="head"><span class="pill
|
|
3453
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Index</span></div>
|
|
3440
3454
|
<h3>The BM25 index is one JSON blob, and it stops working between 10k and 50k items</h3>
|
|
3441
3455
|
<p><code>rag.py</code> persists the whole index as a single JSON file and
|
|
3442
3456
|
<code>json.loads</code> it on every invocation. <code>_CACHE</code>
|
|
@@ -3467,7 +3481,63 @@ out of the hot path.
|
|
|
3467
3481
|
Also note <code>build()</code>'s incremental path is O(entire corpus): reusing
|
|
3468
3482
|
unchanged taps runs <code>_kept_docs</code> → <code>_postings_to_doc_tf</code>,
|
|
3469
3483
|
which inverts every posting in the index — measured 35 s and 1.72 GB RSS at
|
|
3470
|
-
11.1k entries to reindex a single changed file
|
|
3484
|
+
11.1k entries to reindex a single changed file.
|
|
3485
|
+
|
|
3486
|
+
<b>Win (1) is shipped, and the “better on every metric” claim did not survive
|
|
3487
|
+
re-measurement.</b> On the pinned 6-tap corpus unchunking is a <em>trade</em>, not a free win, and
|
|
3488
|
+
which way it falls depends entirely on the shape of the query.
|
|
3489
|
+
|
|
3490
|
+
On the keyword golden set — which grades items by <b>name</b> — recall@10 fell
|
|
3491
|
+
1.000 → <b>0.978</b> and nDCG 0.895 → 0.882, while hit@1 rose 0.780 → <b>0.791</b>.
|
|
3492
|
+
On the 50 natural-language queries in <code>golden-natural.jsonl</code>, over identical data, every
|
|
3493
|
+
metric improved and not marginally: recall 0.690 → <b>0.750</b>, hit@1 0.240 → <b>0.340</b>,
|
|
3494
|
+
MRR 0.382 → 0.474, nDCG 0.446 → 0.524. That +0.100 hit@1 is 5 of 50 queries, which is at
|
|
3495
|
+
the edge of what 50 queries can resolve — worth stating rather than rounding up.
|
|
3496
|
+
|
|
3497
|
+
Index cost on the same corpus: <b>5.3 MB → 2.1 MB</b> and 3,740 documents → 743, one per
|
|
3498
|
+
entry, with load time 0.032 s → 0.015 s. The card's headline figures are from an 83-tap install
|
|
3499
|
+
where the constant factors are far larger; this is the small-scale confirmation of the same shape,
|
|
3500
|
+
not a substitute for it.
|
|
3501
|
+
|
|
3502
|
+
Chunking's one real contribution was locality — a term only had to beat the length
|
|
3503
|
+
normalisation of its own 1000-char window. BM25's <code>b</code> already does that, and
|
|
3504
|
+
<code>retrieve</code> collapsed chunks back to one hit per entry regardless, so the extra documents
|
|
3505
|
+
were built, stored, re-parsed on every cold search and then discarded. What chunking <em>did</em>
|
|
3506
|
+
provide for free was name matching, since the name sat in whichever chunk contained it; one document
|
|
3507
|
+
per entry has to state the surface explicitly, so <code>rag.surface</code> indexes the name, its
|
|
3508
|
+
de-hyphenated form (<code>tokenize</code> does not split hyphens, so “code reviewer”
|
|
3509
|
+
would otherwise never match <code>code-reviewer</code>) and the description alongside the body.
|
|
3510
|
+
|
|
3511
|
+
<b>Still open:</b> win (2), getting postings out of JSON — the FTS5 probe and the mmap-able
|
|
3512
|
+
binary format are both untouched, as is moving <code>snip</code> text off the hot path. So is
|
|
3513
|
+
<code>build()</code>'s O(entire-corpus) incremental path, which still inverts every posting to
|
|
3514
|
+
reindex one changed file.
|
|
3515
|
+
|
|
3516
|
+
<b>Where the bytes are now, measured after win (1).</b> This card sends win (2) after two targets:
|
|
3517
|
+
postings, and <code>snip</code> text (“46.7 MB of the 132 MB”, ~35%). That split was a
|
|
3518
|
+
property of the <em>chunked</em> index, where every 1000-char window carried its own snippet. With
|
|
3519
|
+
one document per entry the balance moves sharply, measured on the pinned 6-tap corpus at 2.05 MB
|
|
3520
|
+
total: <b>postings 1.31 MB (64%)</b>, doc metadata 0.46 MB (22%), <b>snips 0.29 MB (14%)</b>, over
|
|
3521
|
+
743 documents and 15,639 distinct terms.
|
|
3522
|
+
|
|
3523
|
+
So unchunking already collected most of the snippet win, and <b>postings are now the dominant lever
|
|
3524
|
+
by a wide margin</b>. Anyone picking up win (2) should size it against 64%, not chase snip at an
|
|
3525
|
+
assumed 35%.
|
|
3526
|
+
|
|
3527
|
+
<b>FTS5 probe result.</b> Confirmed present on both interpreters available here — CPython 3.14
|
|
3528
|
+
(bundled SQLite 3.53.4) and the macOS system Python 3.9 (SQLite 3.54.0). That supports the card's
|
|
3529
|
+
design instruction rather than replacing it: it is still a per-build property, so the runtime probe
|
|
3530
|
+
stays required. A distro CPython compiled without <code>ENABLE_FTS5</code> is the case the probe
|
|
3531
|
+
exists for.
|
|
3532
|
+
|
|
3533
|
+
<b>On the incremental path.</b> The O(entire-corpus) reindex noted above is not separable from win
|
|
3534
|
+
(2). <code>_kept_docs</code> calls <code>_postings_to_doc_tf</code> because per-document term
|
|
3535
|
+
frequencies exist <em>only</em> inside the postings on disk, so recovering them for the unchanged
|
|
3536
|
+
taps means scanning every posting whatever the filter. Narrowing the inversion to kept doc ids saves
|
|
3537
|
+
memory but not the scan, and in the common case (one tap of many changed) nearly every document is
|
|
3538
|
+
kept, so it saves little of that either. Denormalising <code>tf</code> back into the documents would
|
|
3539
|
+
fix it directly but roughly duplicates the 64% that postings already occupy. The real fix is the
|
|
3540
|
+
storage format, which is win (2) — worth treating them as one item rather than two.</p>
|
|
3471
3541
|
<div class="meta">
|
|
3472
3542
|
<span class="m">Complexity <b>L</b></span>
|
|
3473
3543
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
"nDCG@k": 0.8098096631332409
|
|
12
12
|
},
|
|
13
13
|
"BM25 full-content": {
|
|
14
|
-
"recall@k":
|
|
15
|
-
"hit@1": 0.
|
|
16
|
-
"MRR": 0.
|
|
17
|
-
"nDCG@k": 0.
|
|
14
|
+
"recall@k": 0.978021978021978,
|
|
15
|
+
"hit@1": 0.7912087912087912,
|
|
16
|
+
"MRR": 0.8542124542124542,
|
|
17
|
+
"nDCG@k": 0.8823506423411086
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
},
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"nDCG@k": 0.19698368469243419
|
|
30
30
|
},
|
|
31
31
|
"BM25 full-content": {
|
|
32
|
-
"recall@k": 0.
|
|
33
|
-
"hit@1": 0.
|
|
34
|
-
"MRR": 0.
|
|
35
|
-
"nDCG@k": 0.
|
|
32
|
+
"recall@k": 0.75,
|
|
33
|
+
"hit@1": 0.34,
|
|
34
|
+
"MRR": 0.47449253613769743,
|
|
35
|
+
"nDCG@k": 0.5243426877966659
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -605,18 +605,35 @@ class TestMakeDocs:
|
|
|
605
605
|
docs = rag._make_docs([e], {})
|
|
606
606
|
assert docs[0]["snip"] == "Q" * rag.SNIP_STORE
|
|
607
607
|
|
|
608
|
-
def
|
|
608
|
+
def test_one_document_per_entry_however_long_the_body(self, monkeypatch):
|
|
609
|
+
# Inverted deliberately. This asserted `len(docs) > 1`, the chunking the
|
|
610
|
+
# index no longer does: each window carried its own copy of the shared
|
|
611
|
+
# fields and its own snippet, and `retrieve` collapsed them back to one
|
|
612
|
+
# hit per entry anyway, so the extra documents were built, stored,
|
|
613
|
+
# re-parsed on every cold search, and then discarded.
|
|
609
614
|
monkeypatch.setattr(rag, "read_body", lambda e, tp: "widget " * 400)
|
|
610
|
-
|
|
611
|
-
docs
|
|
612
|
-
assert
|
|
615
|
+
docs = rag._make_docs([_entry("n")], {})
|
|
616
|
+
assert len(docs) == 1
|
|
617
|
+
assert docs[0]["tf"]["widget"] == 400
|
|
618
|
+
|
|
619
|
+
def test_the_entry_surface_is_indexed_with_the_body(self, monkeypatch):
|
|
620
|
+
# A chunked index matched names for free — the name sat in whatever
|
|
621
|
+
# chunk contained it. One doc per entry has to state the surface, or
|
|
622
|
+
# searching for an item by its own name stops working.
|
|
623
|
+
monkeypatch.setattr(rag, "read_body", lambda e, tp: "unrelated prose")
|
|
624
|
+
docs = rag._make_docs(
|
|
625
|
+
[_entry("code-reviewer", desc="reviews diffs")], {})
|
|
626
|
+
tf = docs[0]["tf"]
|
|
627
|
+
assert "reviewer" in tf, "the de-hyphenated name must be searchable"
|
|
628
|
+
assert "diffs" in tf, "the description must be searchable"
|
|
613
629
|
|
|
614
630
|
def test_empty_chunk_is_skipped_not_break(self, monkeypatch):
|
|
615
631
|
body = ("the " * 220) + "\n\n" + ("widget " * 130)
|
|
616
632
|
monkeypatch.setattr(rag, "read_body", lambda e, tp: body)
|
|
617
633
|
e = _entry("n")
|
|
618
634
|
docs = rag._make_docs([e], {})
|
|
619
|
-
#
|
|
635
|
+
# An all-stopword passage contributes no terms; the entry still yields
|
|
636
|
+
# its one document, carrying the terms from the rest of the body.
|
|
620
637
|
assert len(docs) == 1
|
|
621
638
|
assert "widget" in docs[0]["tf"]
|
|
622
639
|
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: bm25-index-is-one-json-blob
|
|
3
|
-
board: code
|
|
4
|
-
section: pipeline
|
|
5
|
-
status: planned
|
|
6
|
-
category: Search · Index
|
|
7
|
-
complexity: L
|
|
8
|
-
impact: High
|
|
9
|
-
wow: 5
|
|
10
|
-
note: 2.5 GB RSS per search at 50k items
|
|
11
|
-
order: 72
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
14
|
-
title: The BM25 index is one JSON blob, and it stops working between 10k and 50k items
|
|
15
|
-
---
|
|
16
|
-
<code>rag.py</code> persists the whole index as a single JSON file and
|
|
17
|
-
<code>json.loads</code> it on every invocation. <code>_CACHE</code>
|
|
18
|
-
(<code>rag.py:275</code>) is process-local, so a long-lived MCP server amortises
|
|
19
|
-
the cost but <b>every cold <code>boost search</code> pays it in full</b>.
|
|
20
|
-
Measured on a synthetic corpus of real repo prose, 10k items → 50k items:<br>
|
|
21
|
-
index on disk 52.7 MB → <b>270 MB</b>;<br>
|
|
22
|
-
<code>json.loads</code> per search 2.0–2.9 s → <b>12.2–13.6 s</b>;<br>
|
|
23
|
-
peak RSS 702 MB → <b>2.49 GB</b>;<br>
|
|
24
|
-
BM25 scoring itself 31 ms → 70 ms — cold start dominates by ~200×.
|
|
25
|
-
On a real 83-tap install the index is already 132 MB at 11.1k entries. Scaling
|
|
26
|
-
that shape to 50k gives ~594 MB and ~5.7 GB resident. <b>Target RSS, not
|
|
27
|
-
bytes</b>: Python object overhead was measured at a consistent 9.5–9.6× file
|
|
28
|
-
size across three independent runs, which is what OOM-kills an 8 GB machine
|
|
29
|
-
while the disk figure still looks survivable.
|
|
30
|
-
Two cheap wins come first and are worth landing on their own.
|
|
31
|
-
<b>(1) Stop chunking.</b> An unchunked index with the item's surface
|
|
32
|
-
(name + de-hyphenated name + description) counted alongside the body scored
|
|
33
|
-
<code>recall@10 0.742 / hit@1 0.429</code> at <b>41 MB and 0.43 s</b> to load,
|
|
34
|
-
versus the live chunked index's <code>0.720 / 0.407</code> at <b>132 MB and
|
|
35
|
-
8–13 s</b> — better on every metric, 3.2× smaller, 20× faster to load.
|
|
36
|
-
<b>(2) Get postings out of JSON.</b> FTS5 is compiled into CPython's bundled
|
|
37
|
-
sqlite (verified: 3.53.4, <code>ENABLE_FTS5</code>), so there is a
|
|
38
|
-
zero-dependency path — but probe it at runtime, because that is a per-build
|
|
39
|
-
property, not a guarantee. A compact mmap-able binary postings format is the
|
|
40
|
-
alternative. Either way <code>snip</code> text (46.7 MB of the 132 MB) belongs
|
|
41
|
-
out of the hot path.
|
|
42
|
-
Also note <code>build()</code>'s incremental path is O(entire corpus): reusing
|
|
43
|
-
unchanged taps runs <code>_kept_docs</code> → <code>_postings_to_doc_tf</code>,
|
|
44
|
-
which inverts every posting in the index — measured 35 s and 1.72 GB RSS at
|
|
45
|
-
11.1k entries to reindex a single changed file.
|
|
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
|