boost-skill-cli 1.0.337__tar.gz → 1.0.339__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.337/boost_skill_cli.egg-info → boost_skill_cli-1.0.339}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/rag.py +20 -5
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.0.339/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +49 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap.html +46 -1
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/pyproject.toml +6 -0
- boost_skill_cli-1.0.339/tests/unit/test_localembed_e2e.py +170 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_rag.py +8 -3
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_rag_fusion.py +92 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.gitattributes +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.gitignore +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/.vale.ini +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/LICENSE +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/Makefile +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/README.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/codecov.yml +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/index.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/README.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/examples/README.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/index.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/noxfile.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/setup.cfg +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/README.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/boost.css +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/boost.js +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/style/demo.html +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.337 → boost_skill_cli-1.0.339}/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.339'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 339)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -674,11 +674,22 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
|
|
|
674
674
|
return dedupe_by_content(hits, k)
|
|
675
675
|
|
|
676
676
|
|
|
677
|
-
def rerank(query: str, hits: List[Hit], limit: int = 10
|
|
678
|
-
|
|
677
|
+
def rerank(query: str, hits: List[Hit], limit: int = 10,
|
|
678
|
+
engine: str = "BM25 full-content") -> Tuple[List[Hit], str]:
|
|
679
|
+
"""Reorder the shortlist with the LLM bridge; degrade to ``engine`` order.
|
|
680
|
+
|
|
681
|
+
``engine`` is the label from whichever retrieval actually produced ``hits``.
|
|
682
|
+
Both degrade paths below return it rather than a hard-coded string: this
|
|
683
|
+
function does not know how the shortlist was built, and guessing was wrong
|
|
684
|
+
for every user whose dense store worked. Naming a specific wrong engine is
|
|
685
|
+
worse than naming none — the label is the only signal about which engine
|
|
686
|
+
answered, so a confident "BM25 full-content" sent debugging somewhere else.
|
|
687
|
+
|
|
688
|
+
The default keeps direct callers unchanged; ``search`` passes the real one.
|
|
689
|
+
"""
|
|
679
690
|
top = hits[:max(limit, 15)]
|
|
680
691
|
if not ai.available():
|
|
681
|
-
return hits[:limit],
|
|
692
|
+
return hits[:limit], engine
|
|
682
693
|
listing = "\n".join(
|
|
683
694
|
"- %s [%s]: %s" % (h["entry"]["name"], h["entry"].get("kind", "skill"),
|
|
684
695
|
(h["snippet"] or h["entry"].get("description", ""))[:180])
|
|
@@ -691,7 +702,9 @@ def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str
|
|
|
691
702
|
max_tokens=400)
|
|
692
703
|
order = _json_array(reply)
|
|
693
704
|
if not order:
|
|
694
|
-
|
|
705
|
+
# The model answered but not with a JSON array, so the ordering falls
|
|
706
|
+
# back to whatever retrieval produced — and so must the label.
|
|
707
|
+
return hits[:limit], engine
|
|
695
708
|
by_name = {h["entry"]["name"]: h for h in hits}
|
|
696
709
|
picked = [by_name[str(n)] for n in order if str(n) in by_name]
|
|
697
710
|
rest = [h for h in hits if h["entry"]["name"]
|
|
@@ -832,7 +845,9 @@ def search(query: str, limit: int = 10, kind: Optional[str] = None,
|
|
|
832
845
|
if hits is None:
|
|
833
846
|
return None
|
|
834
847
|
if smart:
|
|
835
|
-
|
|
848
|
+
# Hand the retrieval label down rather than dropping it: when the
|
|
849
|
+
# rerank degrades, this is the only thing that knows what actually ran.
|
|
850
|
+
return rerank(query, hits, limit, engine=engine)
|
|
836
851
|
return hits[:limit], engine
|
|
837
852
|
|
|
838
853
|
|
|
@@ -303,6 +303,7 @@ docs/roadmap/items/required-checks-config-drift.md
|
|
|
303
303
|
docs/roadmap/items/retrieval-quality-eval-harness.md
|
|
304
304
|
docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md
|
|
305
305
|
docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md
|
|
306
|
+
docs/roadmap/items/roadmap-page-weight-grows-without-bound.md
|
|
306
307
|
docs/roadmap/items/robust-tag-argument-parsing.md
|
|
307
308
|
docs/roadmap/items/ruff-016-widens-the-default-rule-set.md
|
|
308
309
|
docs/roadmap/items/rule-install-native-materialization.md
|
|
@@ -516,6 +517,7 @@ tests/unit/test_installscan.py
|
|
|
516
517
|
tests/unit/test_integrity.py
|
|
517
518
|
tests/unit/test_journal.py
|
|
518
519
|
tests/unit/test_localembed.py
|
|
520
|
+
tests/unit/test_localembed_e2e.py
|
|
519
521
|
tests/unit/test_lockfile.py
|
|
520
522
|
tests/unit/test_logs.py
|
|
521
523
|
tests/unit/test_marketing_counts.py
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: roadmap-page-weight-grows-without-bound
|
|
3
|
+
board: code
|
|
4
|
+
section: docsite
|
|
5
|
+
status: planned
|
|
6
|
+
category: Docs · Performance
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 2
|
|
10
|
+
note: 302 KB to 410 KB in one session; 164 shipped cards render in full
|
|
11
|
+
order: 76
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>roadmap.html</code> grew 36% in one session and nothing bounds it
|
|
15
|
+
---
|
|
16
|
+
The generated board is <b>407.6 KB, of which 404.7 KB is markup</b> — 189
|
|
17
|
+
<code><article></code> cards rendered eagerly into one DOM. Measured across this session's
|
|
18
|
+
merges it went <b>301.6 KB → 409.9 KB, a 36% rise</b>, monotonically increasing with
|
|
19
|
+
every card documented.
|
|
20
|
+
|
|
21
|
+
<b>The mechanism is that shipped work never stops costing.</b> Sizing the sections: <code>shipped</code>
|
|
22
|
+
17.6 KB / 16 cards, <code>next</code> 1.1 KB / 1, <code>planned</code>
|
|
23
|
+
<b>383.0 KB / 172</b> — but 164 of those 172 carry a <code>shipped</code> pill. They are finished
|
|
24
|
+
items grouped under their original section, each still rendering its full body, and those bodies grow
|
|
25
|
+
because closing an item well means recording what was measured and what turned out to be wrong. The
|
|
26
|
+
board is now mostly an archive that every visitor downloads in full.
|
|
27
|
+
|
|
28
|
+
<b>This is NOT what failed <code>lighthouse</code> on <code>#386</code>, and that is worth stating
|
|
29
|
+
because the correlation is seductive.</b> <code>#388</code> passed the same gate at
|
|
30
|
+
<b>409.9 KB</b> — very slightly <em>larger</em> than <code>#386</code>'s 409.8 KB, which
|
|
31
|
+
failed. A bigger page scoring better rules out page weight as that failure's cause; it was runner
|
|
32
|
+
variance, exactly as <code>lighthouse.yml</code>'s own comment predicts ("a single sample dips into
|
|
33
|
+
the 80s under runner load, which the median absorbs"). The performance floor is
|
|
34
|
+
<code>minScore 0.85</code> against a normal score of ~99–100, so there is real headroom today.
|
|
35
|
+
|
|
36
|
+
<b>The case for doing it anyway is the trend, not the current number.</b> At roughly +6 KB per
|
|
37
|
+
merged card the page crosses 500 KB within a few working sessions, and DOM size is precisely
|
|
38
|
+
what Lighthouse's performance category penalises — so this becomes the cause eventually even though
|
|
39
|
+
it is not the cause now.
|
|
40
|
+
|
|
41
|
+
<b>Likely levers, cheapest first.</b> Collapse shipped card bodies behind
|
|
42
|
+
<code><details></code> so the text ships but does not render — that alone addresses the
|
|
43
|
+
383 KB block and keeps every word searchable in the source. Failing that, render shipped items
|
|
44
|
+
as one-line entries linking to their item file, or paginate by section. All three live in
|
|
45
|
+
<code>scripts/build_roadmap.py</code>; none require touching an item file, which matters because the
|
|
46
|
+
item files are the merge-conflict-free part of this design.
|
|
47
|
+
|
|
48
|
+
<b>Do not raise the Lighthouse floor to fix this.</b> The floor is calibrated and honest; a page that
|
|
49
|
+
outgrows it should be made smaller, not re-graded.
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
112
112
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
113
113
|
<div class="stat"><b>4</b><span>Planned</span></div>
|
|
114
|
-
<div class="stat"><b>
|
|
114
|
+
<div class="stat"><b>190</b><span>Loop finds</span></div>
|
|
115
115
|
<!-- /ROADMAP:stats -->
|
|
116
116
|
</div>
|
|
117
117
|
</section>
|
|
@@ -5215,6 +5215,51 @@ so they were green on CI and red on any machine that had installed it.</p>
|
|
|
5215
5215
|
<span class="m">silent BM25-only is the default outcome</span>
|
|
5216
5216
|
</div>
|
|
5217
5217
|
</article>
|
|
5218
|
+
|
|
5219
|
+
<article class="cap rcard" id="roadmap-page-weight-grows-without-bound">
|
|
5220
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Docs · Performance</span></div>
|
|
5221
|
+
<h3><code>roadmap.html</code> grew 36% in one session and nothing bounds it</h3>
|
|
5222
|
+
<p>The generated board is <b>407.6 KB, of which 404.7 KB is markup</b> — 189
|
|
5223
|
+
<code><article></code> cards rendered eagerly into one DOM. Measured across this session's
|
|
5224
|
+
merges it went <b>301.6 KB → 409.9 KB, a 36% rise</b>, monotonically increasing with
|
|
5225
|
+
every card documented.
|
|
5226
|
+
|
|
5227
|
+
<b>The mechanism is that shipped work never stops costing.</b> Sizing the sections: <code>shipped</code>
|
|
5228
|
+
17.6 KB / 16 cards, <code>next</code> 1.1 KB / 1, <code>planned</code>
|
|
5229
|
+
<b>383.0 KB / 172</b> — but 164 of those 172 carry a <code>shipped</code> pill. They are finished
|
|
5230
|
+
items grouped under their original section, each still rendering its full body, and those bodies grow
|
|
5231
|
+
because closing an item well means recording what was measured and what turned out to be wrong. The
|
|
5232
|
+
board is now mostly an archive that every visitor downloads in full.
|
|
5233
|
+
|
|
5234
|
+
<b>This is NOT what failed <code>lighthouse</code> on <code>#386</code>, and that is worth stating
|
|
5235
|
+
because the correlation is seductive.</b> <code>#388</code> passed the same gate at
|
|
5236
|
+
<b>409.9 KB</b> — very slightly <em>larger</em> than <code>#386</code>'s 409.8 KB, which
|
|
5237
|
+
failed. A bigger page scoring better rules out page weight as that failure's cause; it was runner
|
|
5238
|
+
variance, exactly as <code>lighthouse.yml</code>'s own comment predicts ("a single sample dips into
|
|
5239
|
+
the 80s under runner load, which the median absorbs"). The performance floor is
|
|
5240
|
+
<code>minScore 0.85</code> against a normal score of ~99–100, so there is real headroom today.
|
|
5241
|
+
|
|
5242
|
+
<b>The case for doing it anyway is the trend, not the current number.</b> At roughly +6 KB per
|
|
5243
|
+
merged card the page crosses 500 KB within a few working sessions, and DOM size is precisely
|
|
5244
|
+
what Lighthouse's performance category penalises — so this becomes the cause eventually even though
|
|
5245
|
+
it is not the cause now.
|
|
5246
|
+
|
|
5247
|
+
<b>Likely levers, cheapest first.</b> Collapse shipped card bodies behind
|
|
5248
|
+
<code><details></code> so the text ships but does not render — that alone addresses the
|
|
5249
|
+
383 KB block and keeps every word searchable in the source. Failing that, render shipped items
|
|
5250
|
+
as one-line entries linking to their item file, or paginate by section. All three live in
|
|
5251
|
+
<code>scripts/build_roadmap.py</code>; none require touching an item file, which matters because the
|
|
5252
|
+
item files are the merge-conflict-free part of this design.
|
|
5253
|
+
|
|
5254
|
+
<b>Do not raise the Lighthouse floor to fix this.</b> The floor is calibrated and honest; a page that
|
|
5255
|
+
outgrows it should be made smaller, not re-graded.</p>
|
|
5256
|
+
<div class="meta">
|
|
5257
|
+
<span class="m">Complexity <b>M</b></span>
|
|
5258
|
+
<span class="m">Impact <b>Med</b></span>
|
|
5259
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
5260
|
+
<span class="m">302 KB to 410 KB in one session; 164 shipped cards render in full</span>
|
|
5261
|
+
</div>
|
|
5262
|
+
</article>
|
|
5218
5263
|
<!-- /ROADMAP:cards -->
|
|
5219
5264
|
|
|
5220
5265
|
</div>
|
|
@@ -212,6 +212,12 @@ check_untyped_defs = true
|
|
|
212
212
|
testpaths = ["tests"]
|
|
213
213
|
addopts = "-q -p no:cacheprovider"
|
|
214
214
|
filterwarnings = ["error::DeprecationWarning:boost_cli.*"]
|
|
215
|
+
# Registered so an unknown-mark warning cannot become an error here. The mark
|
|
216
|
+
# only selects; the actual guard is the BOOST_ONNX_E2E env gate on the module,
|
|
217
|
+
# so a plain `pytest` never downloads 133 MB of weights by surprise.
|
|
218
|
+
markers = [
|
|
219
|
+
"onnx: needs onnxruntime + the real pinned BGE weights (opt-in, see tests/unit/test_localembed_e2e.py)",
|
|
220
|
+
]
|
|
215
221
|
|
|
216
222
|
[tool.coverage.run]
|
|
217
223
|
source = ["boost_cli"]
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"""End-to-end: the real ONNX runtime against the real pinned BGE weights.
|
|
2
|
+
|
|
3
|
+
Scope, stated precisely, because the obvious justification for this file is
|
|
4
|
+
wrong. ``test_localembed.py`` runs against a stub that "mimics onnxruntime", and
|
|
5
|
+
the tempting claim is that a stub cannot catch a pooling mistake. It can:
|
|
6
|
+
``TestClsPooling::test_it_takes_the_first_token_not_the_mean`` feeds
|
|
7
|
+
``cls_pool`` a hand-built tensor and pins CLS against the mean directly, in
|
|
8
|
+
microseconds and with no download. That test is *better* at that job than
|
|
9
|
+
anything here. This was checked rather than assumed — swapping ``cls_pool`` to
|
|
10
|
+
mean pooling reddens the stubbed suite immediately.
|
|
11
|
+
|
|
12
|
+
What no stub can do is run the actual graph. A fake session returns whatever
|
|
13
|
+
shape the test declared, so everything downstream of "does onnxruntime accept
|
|
14
|
+
these 133 MB and give back what we expect" is asserted against our own
|
|
15
|
+
assumptions. Three things only real weights prove:
|
|
16
|
+
|
|
17
|
+
* **Integration.** The pinned export loads under the installed onnxruntime, the
|
|
18
|
+
input names we feed match the ones it declares, and the result is 384 finite
|
|
19
|
+
unit-norm floats. Every ORT upgrade re-tests this for free.
|
|
20
|
+
* **Absolute similarity.** Ordering alone is a weak signal — measured here, mean
|
|
21
|
+
pooling *preserves* the near/far ordering while changing every vector. Pinning
|
|
22
|
+
the values catches a model or revision swap that ordering sails through.
|
|
23
|
+
* **Padding.** Batching a short text beside a long one exercises a real
|
|
24
|
+
attention mask; a fake session has none to get wrong.
|
|
25
|
+
|
|
26
|
+
Reference values come from the measurement published on the roadmap card when
|
|
27
|
+
the ONNX path shipped (#354), against these exact pinned weights.
|
|
28
|
+
|
|
29
|
+
Opt-in by design — ``BOOST_ONNX_E2E=1``. Without it this skips, so neither a
|
|
30
|
+
normal ``make test`` nor the mutation gate's in-``mutants/`` run is charged a
|
|
31
|
+
133 MB download. CI sets it in the one job that caches the weights.
|
|
32
|
+
"""
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import math
|
|
36
|
+
import os
|
|
37
|
+
|
|
38
|
+
import pytest
|
|
39
|
+
|
|
40
|
+
from boost_cli.core import localembed
|
|
41
|
+
|
|
42
|
+
pytestmark = [
|
|
43
|
+
pytest.mark.onnx,
|
|
44
|
+
pytest.mark.skipif(os.environ.get("BOOST_ONNX_E2E") != "1",
|
|
45
|
+
reason="real-weights E2E; set BOOST_ONNX_E2E=1"),
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
# Sentences from the published measurement. The first two are near-paraphrases
|
|
49
|
+
# in different vocabulary — no content word in common — which is the case BM25
|
|
50
|
+
# cannot serve and the dense tier exists for. The third is the distractor that
|
|
51
|
+
# BM25 actually returned for this query before the dense tier existed.
|
|
52
|
+
Q_SLOW = "making my application faster"
|
|
53
|
+
NEAR = "application performance tuning"
|
|
54
|
+
FAR = "quantum computing circuit simulation"
|
|
55
|
+
|
|
56
|
+
# Published against these weights: near 0.7691, far 0.5338. The tolerance is
|
|
57
|
+
# wide enough to absorb onnxruntime/platform float differences and narrow enough
|
|
58
|
+
# that a pooling change cannot hide inside it — CLS and mean pooling separate by
|
|
59
|
+
# far more than this on BGE.
|
|
60
|
+
NEAR_SIM, FAR_SIM, TOL = 0.7691, 0.5338, 0.03
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _dot(a, b):
|
|
64
|
+
return sum(x * y for x, y in zip(a, b))
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@pytest.fixture(scope="module")
|
|
68
|
+
def vectors():
|
|
69
|
+
"""Encode the three probe sentences once, with real weights.
|
|
70
|
+
|
|
71
|
+
``importorskip`` rather than a plain import so a machine that opted in but
|
|
72
|
+
lacks the extra skips cleanly instead of erroring. ``ensure_model`` is what
|
|
73
|
+
downloads and verifies; a None return means the fetch failed, which is a
|
|
74
|
+
skip and not a failure — this test is about the model contract, not about
|
|
75
|
+
HuggingFace's uptime.
|
|
76
|
+
"""
|
|
77
|
+
pytest.importorskip("onnxruntime")
|
|
78
|
+
pytest.importorskip("tokenizers")
|
|
79
|
+
if localembed.ensure_model() is None:
|
|
80
|
+
pytest.skip("pinned weights unavailable (download failed)")
|
|
81
|
+
out = localembed.encode([Q_SLOW, NEAR, FAR])
|
|
82
|
+
assert out is not None, "encode returned None with the backend present"
|
|
83
|
+
return dict(zip((Q_SLOW, NEAR, FAR), out))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class TestModelContract:
|
|
87
|
+
def test_dimension_matches_what_embed_advertises(self, vectors):
|
|
88
|
+
# Asserted against `embed.LOCAL_DIM` rather than a literal 384: that
|
|
89
|
+
# constant is what dense.py stores and rebuilds on, so the bug worth
|
|
90
|
+
# catching is the two disagreeing, not either one's value.
|
|
91
|
+
from boost_cli.core import embed
|
|
92
|
+
assert embed.LOCAL_DIM == 384 # the pinned export's hidden size
|
|
93
|
+
for text, vec in vectors.items():
|
|
94
|
+
assert len(vec) == embed.LOCAL_DIM, text
|
|
95
|
+
|
|
96
|
+
def test_vectors_are_l2_normalised(self, vectors):
|
|
97
|
+
# Cosine similarity downstream is a plain dot product, which is only
|
|
98
|
+
# correct on unit vectors.
|
|
99
|
+
for text, vec in vectors.items():
|
|
100
|
+
assert math.isclose(math.sqrt(_dot(vec, vec)), 1.0, abs_tol=1e-5), text
|
|
101
|
+
|
|
102
|
+
def test_every_component_is_finite(self, vectors):
|
|
103
|
+
# A NaN would poison the whole index and compare False against
|
|
104
|
+
# everything, so KNN would return an arbitrary neighbour set.
|
|
105
|
+
for text, vec in vectors.items():
|
|
106
|
+
assert all(math.isfinite(x) for x in vec), text
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class TestSemanticContract:
|
|
110
|
+
"""The part a stub cannot fake, and the reason the tier exists."""
|
|
111
|
+
|
|
112
|
+
def test_paraphrase_outranks_the_distractor(self, vectors):
|
|
113
|
+
# A floor, not a precision instrument: measured against a mean-pooled
|
|
114
|
+
# build, this ordering SURVIVES — so it does not catch pooling and is
|
|
115
|
+
# not claimed to. What it does catch is a model that loaded but is not
|
|
116
|
+
# discriminating at all, which is the failure that makes the whole
|
|
117
|
+
# keyless tier pointless while every shape assertion still passes.
|
|
118
|
+
near = _dot(vectors[Q_SLOW], vectors[NEAR])
|
|
119
|
+
far = _dot(vectors[Q_SLOW], vectors[FAR])
|
|
120
|
+
assert near > far, (
|
|
121
|
+
"'%s' must rank nearer to '%s' than to '%s' (got %.4f vs %.4f)"
|
|
122
|
+
% (Q_SLOW, NEAR, FAR, near, far))
|
|
123
|
+
assert near - far > 0.10, (
|
|
124
|
+
"margin collapsed to %.4f — the model is loading but not "
|
|
125
|
+
"discriminating; suspect pooling or a wrong input name"
|
|
126
|
+
% (near - far))
|
|
127
|
+
|
|
128
|
+
def test_similarities_match_the_published_measurement(self, vectors):
|
|
129
|
+
# This is the one that earns the download. Verified against a mean-pooled
|
|
130
|
+
# build: ordering held, these values moved, and this test was what
|
|
131
|
+
# noticed. Same for a deliberate MODEL_REV repin, where sha256 passes by
|
|
132
|
+
# construction and only the numbers reveal that vectors changed.
|
|
133
|
+
near = _dot(vectors[Q_SLOW], vectors[NEAR])
|
|
134
|
+
far = _dot(vectors[Q_SLOW], vectors[FAR])
|
|
135
|
+
assert math.isclose(near, NEAR_SIM, abs_tol=TOL), (
|
|
136
|
+
"near-pair similarity %.4f drifted from the published %.4f"
|
|
137
|
+
% (near, NEAR_SIM))
|
|
138
|
+
assert math.isclose(far, FAR_SIM, abs_tol=TOL), (
|
|
139
|
+
"far-pair similarity %.4f drifted from the published %.4f"
|
|
140
|
+
% (far, FAR_SIM))
|
|
141
|
+
|
|
142
|
+
def test_a_sentence_is_maximally_similar_to_itself(self, vectors):
|
|
143
|
+
# Sanity floor: a degenerate model that maps everything to one point
|
|
144
|
+
# would pass the ordering test by accident but fails here against the
|
|
145
|
+
# off-diagonal.
|
|
146
|
+
self_sim = _dot(vectors[NEAR], vectors[NEAR])
|
|
147
|
+
cross = _dot(vectors[NEAR], vectors[FAR])
|
|
148
|
+
assert math.isclose(self_sim, 1.0, abs_tol=1e-5)
|
|
149
|
+
assert self_sim > cross + 0.10
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class TestDeterminism:
|
|
153
|
+
def test_encoding_twice_gives_identical_vectors(self, vectors):
|
|
154
|
+
# The store is a cache keyed on content, so a non-deterministic encoder
|
|
155
|
+
# would make every reindex produce a different index for the same input.
|
|
156
|
+
again = localembed.encode([NEAR])
|
|
157
|
+
assert again is not None
|
|
158
|
+
for a, b in zip(again[0], vectors[NEAR]):
|
|
159
|
+
assert math.isclose(a, b, abs_tol=1e-6)
|
|
160
|
+
|
|
161
|
+
def test_batching_does_not_change_a_vector(self, vectors):
|
|
162
|
+
# Padding to the longest row in a batch must not leak into the CLS
|
|
163
|
+
# token. Encoding alone vs. alongside a much longer sentence is the
|
|
164
|
+
# cheapest way to catch an attention-mask mistake.
|
|
165
|
+
alone = localembed.encode([NEAR])
|
|
166
|
+
batched = localembed.encode([NEAR, FAR * 20])
|
|
167
|
+
assert alone is not None and batched is not None
|
|
168
|
+
for a, b in zip(alone[0], batched[0]):
|
|
169
|
+
assert math.isclose(a, b, abs_tol=1e-4), (
|
|
170
|
+
"padding changed the vector — suspect the attention mask")
|
|
@@ -965,18 +965,23 @@ class TestSearchForwarding:
|
|
|
965
965
|
rag.search("q", limit=1, smart=False)
|
|
966
966
|
assert cap["k"] == 60 # max(60, 4)
|
|
967
967
|
|
|
968
|
-
def
|
|
968
|
+
def test_forwards_query_limit_and_engine_to_rerank(self, sandbox, monkeypatch):
|
|
969
|
+
# `engine` joined the signature so a degraded rerank can report what
|
|
970
|
+
# actually retrieved instead of assuming BM25; asserted here because
|
|
971
|
+
# dropping it again would be silent — search would still return a
|
|
972
|
+
# plausible label, just the wrong one.
|
|
969
973
|
self._ready_index()
|
|
970
974
|
monkeypatch.setattr(rag, "retrieve", lambda *a, **k: [_hit("a", 1.0)])
|
|
971
975
|
cap = {}
|
|
972
976
|
|
|
973
|
-
def spyr(query, hits, limit=10):
|
|
974
|
-
cap.update(query=query, limit=limit)
|
|
977
|
+
def spyr(query, hits, limit=10, engine="BM25 full-content"):
|
|
978
|
+
cap.update(query=query, limit=limit, engine=engine)
|
|
975
979
|
return ([], "x")
|
|
976
980
|
monkeypatch.setattr(rag, "rerank", spyr)
|
|
977
981
|
rag.search("theq", limit=5) # smart defaults to True
|
|
978
982
|
assert cap["query"] == "theq"
|
|
979
983
|
assert cap["limit"] == 5
|
|
984
|
+
assert cap["engine"] == "BM25 full-content" # what this index is
|
|
980
985
|
|
|
981
986
|
|
|
982
987
|
class TestIndexPath:
|
|
@@ -209,3 +209,95 @@ class TestRetrieveAnyFuses:
|
|
|
209
209
|
rag.retrieve_any("q", kind="rule", entries=ents)
|
|
210
210
|
assert ("bm25", "rule", ents) in seen
|
|
211
211
|
assert ("dense", "rule", ents) in seen
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class TestRerankPreservesTheEngineLabel:
|
|
215
|
+
"""The engine that actually retrieved must survive the rerank stage.
|
|
216
|
+
|
|
217
|
+
``rerank`` hard-coded ``"BM25 full-content"`` on both of its degrade paths,
|
|
218
|
+
and ``search`` discards ``retrieve_any``'s label whenever ``smart`` is on —
|
|
219
|
+
which is the default, and what the MCP ``boost_search`` tool uses. So a user
|
|
220
|
+
whose dense store and fusion were working perfectly, but who had no
|
|
221
|
+
``ANTHROPIC_API_KEY``, was told they were on BM25.
|
|
222
|
+
|
|
223
|
+
That is the same class of silent misreport the dense-status work existed to
|
|
224
|
+
kill: the label is the only signal a user has about which engine answered,
|
|
225
|
+
and a wrong one sends the investigation somewhere else entirely. Worse here
|
|
226
|
+
than a missing label, because it names a specific wrong engine confidently.
|
|
227
|
+
"""
|
|
228
|
+
|
|
229
|
+
@staticmethod
|
|
230
|
+
def _hits():
|
|
231
|
+
return [_hit("a", 2.0), _hit("b", 1.0)]
|
|
232
|
+
|
|
233
|
+
def test_no_ai_reports_the_engine_that_retrieved(self, monkeypatch):
|
|
234
|
+
# THE regression. Fusion ran, the LLM was absent, and the old code
|
|
235
|
+
# answered "BM25 full-content" — naming an engine that did not rank
|
|
236
|
+
# these hits alone.
|
|
237
|
+
monkeypatch.setattr(rag.ai, "available", lambda: False)
|
|
238
|
+
_out, label = rag.rerank("q", self._hits(), limit=5,
|
|
239
|
+
engine="hybrid RRF (BM25 + dense)")
|
|
240
|
+
assert label == "hybrid RRF (BM25 + dense)"
|
|
241
|
+
|
|
242
|
+
def test_no_ai_reports_dense_when_dense_retrieved(self, monkeypatch):
|
|
243
|
+
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
244
|
+
monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: "not json at all")
|
|
245
|
+
_out, label = rag.rerank("q", self._hits(), limit=5,
|
|
246
|
+
engine="dense vectors")
|
|
247
|
+
assert label == "dense vectors"
|
|
248
|
+
|
|
249
|
+
def test_an_unparseable_reply_keeps_the_engine_too(self, monkeypatch):
|
|
250
|
+
# The second degrade path: the model answered, but not with a JSON
|
|
251
|
+
# array. Ordering falls back, so the label must fall back with it.
|
|
252
|
+
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
253
|
+
monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: "sorry, I can't")
|
|
254
|
+
_out, label = rag.rerank("q", self._hits(), limit=5,
|
|
255
|
+
engine="hybrid RRF (BM25 + dense)")
|
|
256
|
+
assert label == "hybrid RRF (BM25 + dense)"
|
|
257
|
+
|
|
258
|
+
def test_a_successful_rerank_still_says_claude(self, monkeypatch):
|
|
259
|
+
# The LLM really did decide the order here, so crediting the retrieval
|
|
260
|
+
# engine instead would be the same bug pointing the other way.
|
|
261
|
+
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
262
|
+
monkeypatch.setattr(rag.ai, "ask", lambda *_a, **_k: '["b", "a"]')
|
|
263
|
+
out, label = rag.rerank("q", self._hits(), limit=5,
|
|
264
|
+
engine="hybrid RRF (BM25 + dense)")
|
|
265
|
+
assert _names(out) == ["b", "a"]
|
|
266
|
+
assert label == "Claude relevance"
|
|
267
|
+
|
|
268
|
+
def test_the_default_keeps_existing_callers_honest(self, monkeypatch):
|
|
269
|
+
# Back-compat: an omitted engine still reads "BM25 full-content", so
|
|
270
|
+
# this is additive for anything that calls rerank directly.
|
|
271
|
+
monkeypatch.setattr(rag.ai, "available", lambda: False)
|
|
272
|
+
_out, label = rag.rerank("q", self._hits(), limit=5)
|
|
273
|
+
assert label == "BM25 full-content"
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class TestSearchReportsTheTruthEndToEnd:
|
|
277
|
+
"""`search` is where the label is chosen, so the bug is only really fixed
|
|
278
|
+
if it survives the whole path an MCP call takes."""
|
|
279
|
+
|
|
280
|
+
@staticmethod
|
|
281
|
+
def _wire(monkeypatch, engine_hits, ai_ok):
|
|
282
|
+
from boost_cli.core import dense as dense_mod
|
|
283
|
+
monkeypatch.setattr(rag, "ready", lambda: True)
|
|
284
|
+
monkeypatch.setattr(rag, "retrieve", lambda *_a, **_k: list(engine_hits))
|
|
285
|
+
monkeypatch.setattr(dense_mod, "ready", lambda: True)
|
|
286
|
+
monkeypatch.setattr(dense_mod, "retrieve", lambda *_a, **_k: list(engine_hits))
|
|
287
|
+
monkeypatch.setattr(rag.ai, "available", lambda: ai_ok)
|
|
288
|
+
|
|
289
|
+
def test_fused_retrieval_without_a_key_is_not_called_bm25(self, monkeypatch):
|
|
290
|
+
# Exactly the MCP boost_search path: smart defaults on, no key.
|
|
291
|
+
self._wire(monkeypatch, [_hit("a"), _hit("b")], ai_ok=False)
|
|
292
|
+
result = rag.search("q", limit=5)
|
|
293
|
+
assert result is not None
|
|
294
|
+
_hits, label = result
|
|
295
|
+
assert label != "BM25 full-content"
|
|
296
|
+
assert "dense" in label, label
|
|
297
|
+
|
|
298
|
+
def test_smart_off_is_unaffected(self, monkeypatch):
|
|
299
|
+
self._wire(monkeypatch, [_hit("a")], ai_ok=True)
|
|
300
|
+
result = rag.search("q", limit=5, smart=False)
|
|
301
|
+
assert result is not None
|
|
302
|
+
_hits, label = result
|
|
303
|
+
assert "dense" in label, label
|
|
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
|