boost-skill-cli 1.0.317__tar.gz → 1.0.319__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.317 → boost_skill_cli-1.0.319}/CLAUDE.md +20 -7
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/Makefile +16 -7
- {boost_skill_cli-1.0.317/boost_skill_cli.egg-info → boost_skill_cli-1.0.319}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/dense.py +25 -16
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/rag.py +46 -13
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +33 -4
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +32 -2
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap.html +65 -5
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_retrieval.py +132 -15
- boost_skill_cli-1.0.319/tests/eval/baseline.json +40 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense.py +6 -2
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense_fallback.py +14 -13
- boost_skill_cli-1.0.319/tests/unit/test_entry_key.py +103 -0
- boost_skill_cli-1.0.319/tests/unit/test_eval_baseline.py +182 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_rag.py +32 -31
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_rag_fusion.py +3 -2
- boost_skill_cli-1.0.317/tests/eval/baseline.json +0 -17
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.gitattributes +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.gitignore +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/.vale.ini +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/LICENSE +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/README.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/codecov.yml +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/index.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/README.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/examples/README.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/index.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/noxfile.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/setup.cfg +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/README.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/boost.css +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/boost.js +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/style/demo.html +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.317 → boost_skill_cli-1.0.319}/tests/visual/visual_check.mjs +0 -0
|
@@ -47,20 +47,33 @@ It is five gates and **all must pass**:
|
|
|
47
47
|
| Gate | Command | Threshold |
|
|
48
48
|
|------------|------------------------------------------------|-----------|
|
|
49
49
|
| `lint` | `ruff check boost_cli tests` + `mypy` | zero errors |
|
|
50
|
-
| `eval` | `ensure_eval_corpus.sh` + `eval_retrieval.py --build -k 10
|
|
50
|
+
| `eval` | `ensure_eval_corpus.sh` + `eval_retrieval.py --build -k 10` with four floors | BM25 recall@k **≥ 0.85**, hit@1 ≥ 0.65, MRR ≥ 0.74, nDCG@k ≥ 0.78 |
|
|
51
51
|
| `test` | `pytest tests/unit tests/functional --cov` | **80%** coverage (`fail_under = 80`) |
|
|
52
52
|
| `smoke` | `bash tests/smoke.sh` | 0 failed |
|
|
53
53
|
| `mutation` | `python3 scripts/mutation_gate.py --run --min 80` | **80%** of `boost_cli/core` mutants killed |
|
|
54
54
|
|
|
55
55
|
The `eval` gate is the Tier 1 retrieval-quality check: it runs boost's RAG
|
|
56
|
-
engines over the golden set (`tests/eval/golden.jsonl`) and floors
|
|
57
|
-
|
|
56
|
+
engines over the golden set (`tests/eval/golden.jsonl`) and floors **four**
|
|
57
|
+
metrics on BM25 — recall@k, hit@1, MRR and nDCG@k. Flooring recall alone was a
|
|
58
|
+
hole rather than a simplification: a ranker that finds the right answer every
|
|
59
|
+
time and never ranks it first scores recall@10 1.000 with hit@1 0.000, and
|
|
60
|
+
passed. The golden set grades real catalog items **by name**, so it needs a
|
|
58
61
|
corpus: `scripts/ensure_eval_corpus.sh` first taps the pinned repo list in
|
|
59
62
|
`tests/eval/taps.txt` (the minimal set covering all golden targets — `boost tap
|
|
60
|
-
--defaults` is NOT enough, it omits every rule/workflow repo).
|
|
61
|
-
BM25
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
--defaults` is NOT enough, it omits every rule/workflow repo). Measured over
|
|
64
|
+
that corpus BM25 scores 1.000 / 0.780 / 0.860 / 0.895, and each floor sits about
|
|
65
|
+
0.12 under its measured value — loose enough that upstream drift can't flake the
|
|
66
|
+
build, tight enough to catch a collapse. Regression-vs-baseline stays relaxed
|
|
67
|
+
(`--regression-eps 1`) because the corpus tracks upstream HEAD rather than
|
|
68
|
+
pinned commits, so the absolute floors are the real gate.
|
|
69
|
+
|
|
70
|
+
**Baselines are keyed by query set** (`name@content-digest`), so one file holds
|
|
71
|
+
both `golden.jsonl` and `golden-natural.jsonl` without either overwriting the
|
|
72
|
+
other. Before that, running the natural-language set printed eight confident
|
|
73
|
+
"REGRESSION vs baseline" lines that were only the gap between two different
|
|
74
|
+
question sets. Add `--floor NAME=VALUE` (repeatable) to gate any metric; a
|
|
75
|
+
misspelled metric name is a hard error rather than a silently skipped floor.
|
|
76
|
+
Edit `taps.txt` → regenerate `tests/eval/baseline.json`. It runs in CI's
|
|
64
77
|
`lint` job (pure-stdlib BM25, no `ANTHROPIC_API_KEY`; needs network to tap). The
|
|
65
78
|
opt-in evals stay out of `check` and all degrade cleanly:
|
|
66
79
|
|
|
@@ -98,15 +98,24 @@ dist-check:
|
|
|
98
98
|
$(VENV)/bin/check-wheel-contents dist/*.whl
|
|
99
99
|
$(VENV)/bin/pyroma --min 8 dist/*.tar.gz
|
|
100
100
|
|
|
101
|
-
# Tier 1 retrieval quality gate
|
|
102
|
-
#
|
|
103
|
-
#
|
|
104
|
-
#
|
|
105
|
-
#
|
|
106
|
-
#
|
|
101
|
+
# Tier 1 retrieval quality gate over a pinned corpus (tests/eval/taps.txt).
|
|
102
|
+
# Part of `check` and required in CI (the lint job). Taps the pinned repos into
|
|
103
|
+
# a sandboxed $(EVAL_HOME) first (network on the first run; a sentinel skips
|
|
104
|
+
# re-tapping after), then floors FOUR metrics on BM25, not just recall.
|
|
105
|
+
#
|
|
106
|
+
# recall@k alone could not fail this build for a ranker that found the right
|
|
107
|
+
# answer every time and never ranked it first — recall@10 1.000 with hit@1
|
|
108
|
+
# 0.000 passed. Measured on this corpus BM25 scores 1.000 / 0.780 / 0.860 /
|
|
109
|
+
# 0.895, so each floor sits ~0.12 below its measured value: loose enough that
|
|
110
|
+
# upstream repo drift cannot flake the build, tight enough that a collapse
|
|
111
|
+
# fails it. Regression-vs-baseline stays relaxed (--regression-eps 1) because
|
|
112
|
+
# the corpus tracks upstream HEAD rather than pinned commits; the absolute
|
|
113
|
+
# floors are the real gate, and they are drift-tolerant by construction.
|
|
107
114
|
eval:
|
|
108
115
|
PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
|
|
109
|
-
BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_retrieval.py --build -k 10
|
|
116
|
+
BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_retrieval.py --build -k 10 \
|
|
117
|
+
--fail-under 0.85 --floor hit@1=0.65 --floor MRR=0.74 --floor nDCG@k=0.78 \
|
|
118
|
+
--regression-eps 1
|
|
110
119
|
|
|
111
120
|
# Tier 2a: LLM rerank lift over BM25 on the same golden set. Opt-in and
|
|
112
121
|
# key-gated — needs the `claude` CLI on PATH or ANTHROPIC_API_KEY; skips
|
|
@@ -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.319'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 319)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -18,9 +18,9 @@ from pathlib import Path
|
|
|
18
18
|
from typing import Dict, List, Optional, Tuple
|
|
19
19
|
|
|
20
20
|
from . import catalog, embed, paths
|
|
21
|
-
from .rag import Hit, chunk, read_body
|
|
21
|
+
from .rag import Hit, chunk, entry_key, read_body
|
|
22
22
|
|
|
23
|
-
INDEX_VERSION =
|
|
23
|
+
INDEX_VERSION = 2
|
|
24
24
|
_BATCH = 128 # texts per embedding request
|
|
25
25
|
_POOL = 8 # chunk over-fetch factor for KNN before per-entry reduce
|
|
26
26
|
|
|
@@ -64,7 +64,7 @@ def _connect() -> Optional[sqlite3.Connection]:
|
|
|
64
64
|
def _ensure_schema(con: sqlite3.Connection, dim: int) -> None:
|
|
65
65
|
con.execute(
|
|
66
66
|
"CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY AUTOINCREMENT,"
|
|
67
|
-
" name TEXT, tap TEXT, kind TEXT, cix INTEGER, snip TEXT)")
|
|
67
|
+
" name TEXT, tap TEXT, path TEXT, kind TEXT, cix INTEGER, snip TEXT)")
|
|
68
68
|
con.execute("CREATE INDEX IF NOT EXISTS chunks_tap ON chunks(tap)")
|
|
69
69
|
con.execute("CREATE TABLE IF NOT EXISTS meta (k TEXT PRIMARY KEY, v TEXT)")
|
|
70
70
|
con.execute(
|
|
@@ -283,7 +283,14 @@ def build(entries: Optional[List[dict]] = None,
|
|
|
283
283
|
return None
|
|
284
284
|
try:
|
|
285
285
|
meta = _read_meta(con)
|
|
286
|
-
|
|
286
|
+
# The stored INDEX_VERSION has to be part of this. `_ensure_schema` uses
|
|
287
|
+
# CREATE TABLE IF NOT EXISTS, so it cannot add a column to a store built
|
|
288
|
+
# by an older boost — leaving the build to fail on the first INSERT with
|
|
289
|
+
# "table chunks has no column named path". `status()` already treated a
|
|
290
|
+
# version change as a reason to rebuild; only the build path did not.
|
|
291
|
+
same_version = meta.get("version") == INDEX_VERSION
|
|
292
|
+
same_backend = (same_version
|
|
293
|
+
and meta.get("provider") == prov
|
|
287
294
|
and meta.get("model") == mdl
|
|
288
295
|
and meta.get("dim") == dim)
|
|
289
296
|
if force or not same_backend:
|
|
@@ -323,7 +330,7 @@ def build(entries: Optional[List[dict]] = None,
|
|
|
323
330
|
con.commit()
|
|
324
331
|
total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
325
332
|
return {
|
|
326
|
-
"entries": len({(e
|
|
333
|
+
"entries": len({entry_key(e) for e in entries}),
|
|
327
334
|
"chunks": total,
|
|
328
335
|
"added": added,
|
|
329
336
|
"taps": len(commits),
|
|
@@ -384,10 +391,10 @@ def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
|
|
|
384
391
|
continue
|
|
385
392
|
for (e, ci, text), vec in zip(batch, vecs):
|
|
386
393
|
cur = con.execute(
|
|
387
|
-
"INSERT INTO chunks (name, tap, kind, cix, snip) "
|
|
388
|
-
"VALUES (?, ?, ?, ?, ?)",
|
|
389
|
-
(e["name"], e["tap"], e
|
|
390
|
-
text[:200].strip()))
|
|
394
|
+
"INSERT INTO chunks (name, tap, path, kind, cix, snip) "
|
|
395
|
+
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
396
|
+
(e["name"], e["tap"], e["skill_md"],
|
|
397
|
+
e.get("kind", "skill"), ci, text[:200].strip()))
|
|
391
398
|
con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
|
|
392
399
|
(cur.lastrowid, mod.serialize_float32(vec)))
|
|
393
400
|
added += 1
|
|
@@ -423,31 +430,33 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
|
|
|
423
430
|
if not knn:
|
|
424
431
|
return []
|
|
425
432
|
by_id = {r[0]: (r[1], r[2], r[3], r[4]) for r in con.execute(
|
|
426
|
-
"SELECT id,
|
|
433
|
+
"SELECT id, tap, path, kind, snip FROM chunks WHERE id IN (%s)" # noqa: S608 interpolates only `?` placeholders; ids are bound params
|
|
427
434
|
% ",".join("?" * len(knn)), [rid for rid, _d in knn])}
|
|
428
435
|
finally:
|
|
429
436
|
con.close()
|
|
430
437
|
|
|
431
438
|
entries = catalog.all_entries() if entries is None else entries
|
|
432
|
-
live = {(e
|
|
439
|
+
live = {entry_key(e): e for e in entries}
|
|
433
440
|
best: Dict[Tuple[str, str], Tuple[float, str]] = {}
|
|
434
441
|
for rid, dist in knn:
|
|
435
442
|
meta = by_id.get(rid)
|
|
436
443
|
if meta is None:
|
|
437
444
|
continue
|
|
438
|
-
|
|
445
|
+
tap, path, ckind, snip = meta
|
|
439
446
|
if kind is not None and ckind != kind:
|
|
440
447
|
continue
|
|
441
|
-
key = (
|
|
448
|
+
key = (tap, path)
|
|
442
449
|
if key not in live:
|
|
443
450
|
continue
|
|
444
451
|
score = 1.0 - dist # cosine distance -> similarity
|
|
445
452
|
prev = best.get(key)
|
|
446
453
|
if prev is None or score > prev[0]:
|
|
447
454
|
best[key] = (score, snip)
|
|
448
|
-
|
|
455
|
+
# Tie-break on the displayed name (see rag.retrieve for why).
|
|
456
|
+
ranked = sorted(best.items(),
|
|
457
|
+
key=lambda kv: (-kv[1][0], live[kv[0]]["name"], kv[0]))
|
|
449
458
|
hits: List[Hit] = [
|
|
450
|
-
{"entry": live[
|
|
459
|
+
{"entry": live[key], "score": score,
|
|
451
460
|
"snippet": snip} # type: ignore[typeddict-item]
|
|
452
|
-
for
|
|
461
|
+
for key, (score, snip) in ranked[:k]]
|
|
453
462
|
return hits
|
|
@@ -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 = 3
|
|
37
37
|
ENGINE = "bm25"
|
|
38
38
|
|
|
39
39
|
# Chunking defaults (documented in docs/rag-architecture.md §4).
|
|
@@ -175,7 +175,8 @@ def _make_docs(entries: List[dict], tap_paths: Dict[str, Path]) -> List[dict]:
|
|
|
175
175
|
if not tf:
|
|
176
176
|
continue
|
|
177
177
|
docs.append({
|
|
178
|
-
"n": e["name"], "t": e["tap"], "
|
|
178
|
+
"n": e["name"], "t": e["tap"], "f": e["skill_md"],
|
|
179
|
+
"k": e.get("kind", "skill"),
|
|
179
180
|
"c": ci, "l": sum(tf.values()),
|
|
180
181
|
"snip": piece[:SNIP_STORE].strip(), # windowed at retrieve time
|
|
181
182
|
"tf": dict(tf), # noqa: FURB123 tf is a defaultdict; .copy() would keep the factory
|
|
@@ -226,7 +227,7 @@ def build(entries: Optional[List[dict]] = None, force: bool = False) -> dict:
|
|
|
226
227
|
_save(docs, commits)
|
|
227
228
|
reindexed = sorted({e["tap"] for e in fresh})
|
|
228
229
|
return {
|
|
229
|
-
"entries": len({(e
|
|
230
|
+
"entries": len({entry_key(e) for e in entries}),
|
|
230
231
|
"docs": len(docs),
|
|
231
232
|
"taps": len(commits),
|
|
232
233
|
"reindexed": reindexed,
|
|
@@ -242,7 +243,7 @@ def _save(docs: List[dict], commits: Dict[str, str]) -> None:
|
|
|
242
243
|
for term, tf in d["tf"].items():
|
|
243
244
|
postings[term].append([doc_id, tf])
|
|
244
245
|
total_len += d["l"]
|
|
245
|
-
meta_docs.append({"n": d["n"], "t": d["t"], "k": d["k"],
|
|
246
|
+
meta_docs.append({"n": d["n"], "t": d["t"], "f": d["f"], "k": d["k"],
|
|
246
247
|
"c": d["c"], "l": d["l"], "snip": d["snip"]})
|
|
247
248
|
payload = {
|
|
248
249
|
"version": INDEX_VERSION,
|
|
@@ -365,6 +366,34 @@ def _passage(text: str, terms: Sequence[str], width: int = SNIP_WIDTH) -> str:
|
|
|
365
366
|
return lead + snip + tail
|
|
366
367
|
|
|
367
368
|
|
|
369
|
+
def entry_key(entry: dict) -> Tuple[str, str]:
|
|
370
|
+
"""Identity of a catalog entry: the tap it came from and its file.
|
|
371
|
+
|
|
372
|
+
NOT ``(name, tap)``, which both engines used and which is not unique. On the
|
|
373
|
+
pinned 6-tap eval corpus 743 entries collapse to 694 such pairs; on a real
|
|
374
|
+
83-tap install the roadmap item measures 1,557 of 11,147 (14.0%) colliding,
|
|
375
|
+
worst case ``('survivorforge/cursor-rules', 'rule')`` x47. One tap can
|
|
376
|
+
legitimately ship two different files under one name —
|
|
377
|
+
|
|
378
|
+
docs/rules/backend/nodejs/express-mongodb/admin-interface-rule.mdc
|
|
379
|
+
docs/rules/backend/nodejs/fullstack-mern-guide/admin-interface-rule.mdc
|
|
380
|
+
|
|
381
|
+
— and keying on the name made the second shadow the first in a dict
|
|
382
|
+
comprehension, so a query matching the first's body was reported under the
|
|
383
|
+
second's name and description. ``skill_md`` is the tap-relative path, so
|
|
384
|
+
``(tap, skill_md)`` is 743/743 and 11,147/11,147 distinct respectively.
|
|
385
|
+
|
|
386
|
+
Deliberately strict. An earlier draft fell back to the name when
|
|
387
|
+
``skill_md`` was missing, on the theory that a malformed row should not
|
|
388
|
+
crash a search. It is the worse failure: the index side and the entry side
|
|
389
|
+
then degrade differently, the keys stop matching, and retrieval silently
|
|
390
|
+
returns *nothing* — which takes far longer to diagnose than a KeyError
|
|
391
|
+
naming the field. Every catalog entry has ``skill_md`` (743/743 on the eval
|
|
392
|
+
corpus), and INDEX_VERSION rejects any index built without it.
|
|
393
|
+
"""
|
|
394
|
+
return (entry["tap"], entry["skill_md"])
|
|
395
|
+
|
|
396
|
+
|
|
368
397
|
def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
|
|
369
398
|
entries: Optional[List[dict]] = None) -> List[Hit]:
|
|
370
399
|
"""Top-k full-content hits for ``query``. ``[]`` if the index is empty."""
|
|
@@ -375,24 +404,28 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
|
|
|
375
404
|
if not terms:
|
|
376
405
|
return []
|
|
377
406
|
entries = catalog.all_entries() if entries is None else entries
|
|
378
|
-
live = {(e
|
|
407
|
+
live = {entry_key(e): e for e in entries}
|
|
379
408
|
docs = raw["docs"]
|
|
380
409
|
best: Dict[Tuple[str, str], Tuple[float, str]] = {}
|
|
381
410
|
for doc_id, score in _bm25(terms, raw).items():
|
|
382
411
|
d = docs[doc_id]
|
|
383
412
|
if kind is not None and d["k"] != kind:
|
|
384
413
|
continue
|
|
385
|
-
key = (d["
|
|
414
|
+
key = (d["t"], d["f"])
|
|
386
415
|
if key not in live:
|
|
387
416
|
continue
|
|
388
417
|
prev = best.get(key)
|
|
389
418
|
if prev is None or score > prev[0]:
|
|
390
419
|
best[key] = (score, d["snip"])
|
|
391
|
-
|
|
420
|
+
# Tie-break on the displayed name, not the identity key: the key is now
|
|
421
|
+
# (tap, path), and ordering by it would silently reshuffle equal-scoring
|
|
422
|
+
# results relative to every previous release.
|
|
423
|
+
ranked = sorted(best.items(),
|
|
424
|
+
key=lambda kv: (-kv[1][0], live[kv[0]]["name"], kv[0]))
|
|
392
425
|
hits: List[Hit] = [
|
|
393
|
-
{"entry": live[
|
|
426
|
+
{"entry": live[key], "score": score,
|
|
394
427
|
"snippet": _passage(snip, terms)} # type: ignore[typeddict-item]
|
|
395
|
-
for
|
|
428
|
+
for key, (score, snip) in ranked[:k]]
|
|
396
429
|
return hits
|
|
397
430
|
|
|
398
431
|
|
|
@@ -435,9 +468,9 @@ def rrf_fuse(rankings: List[List[Hit]], limit: int = 60) -> List[Hit]:
|
|
|
435
468
|
calibration step that has to be fitted and re-fitted per corpus; rank
|
|
436
469
|
fusion sidesteps it entirely and is the respected zero-tuning default.
|
|
437
470
|
|
|
438
|
-
Entries are identified by ``
|
|
439
|
-
|
|
440
|
-
|
|
471
|
+
Entries are identified by ``entry_key`` — the same key both engines dedupe
|
|
472
|
+
on — and the first ranking's hit object wins, so the caller passes BM25
|
|
473
|
+
first and keeps its query-term-highlighted snippet for display.
|
|
441
474
|
|
|
442
475
|
The returned ``score`` is the fused rank score, not a BM25 score: it exists
|
|
443
476
|
to order these hits against each other, and comparing it to a raw BM25
|
|
@@ -448,7 +481,7 @@ def rrf_fuse(rankings: List[List[Hit]], limit: int = 60) -> List[Hit]:
|
|
|
448
481
|
for hits in rankings:
|
|
449
482
|
for rank, hit in enumerate(hits, start=1):
|
|
450
483
|
entry = hit["entry"]
|
|
451
|
-
key = (entry
|
|
484
|
+
key = entry_key(entry)
|
|
452
485
|
scores[key] = scores.get(key, 0.0) + 1.0 / (RRF_K + rank)
|
|
453
486
|
chosen.setdefault(key, hit)
|
|
454
487
|
ordered = sorted(scores, key=lambda key: (-scores[key], key[0], key[1]))
|
|
@@ -493,7 +493,9 @@ tests/unit/test_docsite_chrome.py
|
|
|
493
493
|
tests/unit/test_ed25519.py
|
|
494
494
|
tests/unit/test_embed.py
|
|
495
495
|
tests/unit/test_embed_local.py
|
|
496
|
+
tests/unit/test_entry_key.py
|
|
496
497
|
tests/unit/test_errors_and_cli_table.py
|
|
498
|
+
tests/unit/test_eval_baseline.py
|
|
497
499
|
tests/unit/test_eval_faithfulness.py
|
|
498
500
|
tests/unit/test_eval_gate.py
|
|
499
501
|
tests/unit/test_eval_metrics.py
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: eval-corpus-cannot-see-real-retrieval
|
|
3
3
|
board: code
|
|
4
4
|
section: internals
|
|
5
|
-
status:
|
|
5
|
+
status: inflight
|
|
6
6
|
category: Quality · Eval
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 4
|
|
10
10
|
note: gate reports 1.000 while users get 0.720
|
|
11
11
|
order: 70
|
|
12
|
-
owner:
|
|
12
|
+
owner: loop/eval-corpus-falsifiable
|
|
13
13
|
pr:
|
|
14
14
|
title: The eval gate reports a perfect score on a corpus 4× smaller than a real user's
|
|
15
15
|
---
|
|
@@ -57,6 +57,35 @@ different axes, same conclusion: the number the gate reports is not a number abo
|
|
|
57
57
|
What it does <b>not</b> fix is the corpus-size half, which is this card's own finding and remains
|
|
58
58
|
open — 50 queries over 6 taps cannot speak to an 83-tap install. The two are complementary
|
|
59
59
|
rather than overlapping, and combining them (natural-language queries over a realistically sized
|
|
60
|
-
corpus) is the instrument this group actually wants.
|
|
61
|
-
|
|
60
|
+
corpus) is the instrument this group actually wants.
|
|
61
|
+
|
|
62
|
+
<b>Two of the three blindnesses are now closed, and the third was never true of the committed
|
|
63
|
+
harness.</b> <b>(1) recall-only flooring</b> is fixed: <code>--floor NAME=VALUE</code> is repeatable
|
|
64
|
+
and gates any metric, and <code>make eval</code> now floors all four — measured BM25 on the
|
|
65
|
+
pinned corpus is 1.000 / 0.780 / 0.860 / 0.895, with each floor about 0.12 under its measured value
|
|
66
|
+
so upstream drift cannot flake the build. A misspelled metric name is a hard error rather than a
|
|
67
|
+
silently skipped floor, since a floor that never fires is worse than no floor.
|
|
68
|
+
|
|
69
|
+
<b>(3) the kind oracle does not exist in <code>scripts/eval_retrieval.py</code>.</b> Checked
|
|
70
|
+
directly: every ranker — <code>catalog_ranker</code>, <code>bm25_ranker</code>,
|
|
71
|
+
<code>dense_ranker</code>, <code>hybrid_ranker</code> — is called with the query alone, and
|
|
72
|
+
there is no <code>kind=</code> argument anywhere in <code>scripts/</code> or <code>evals/</code>,
|
|
73
|
+
before or after <code>#360</code>. The golden set's <code>kind</code> field feeds the per-kind
|
|
74
|
+
<em>reporting</em> slices in <code>_aggregate</code> and nothing else, so the +0.073 figure quoted
|
|
75
|
+
above cannot have come from this harness. Recording it here rather than silently deleting the claim,
|
|
76
|
+
because the number was real in whatever script measured it.
|
|
77
|
+
|
|
78
|
+
<b>A defect the card did not predict:</b> the baseline was not keyed to the query set that produced
|
|
79
|
+
it. Running the natural-language set printed eight confident <code>REGRESSION vs baseline</code>
|
|
80
|
+
lines — BM25 recall 1.000→0.690, hit@1 0.780→0.240 — which were not
|
|
81
|
+
regressions but the gap between two different question sets, and <code>--save-baseline</code> on the
|
|
82
|
+
natural set would have silently overwritten the keyword set's numbers with them. Baselines are now
|
|
83
|
+
keyed by <code>name@content-digest</code>, so editing a query in place invalidates its baseline
|
|
84
|
+
rather than quietly re-grading against numbers that no longer describe it.
|
|
85
|
+
|
|
86
|
+
<b>Still open:</b> the corpus-size half (23 taps versus a real 83) and
|
|
87
|
+
<code>--regression-eps 1</code>, which is a symptom of the corpus tracking upstream HEAD rather than
|
|
88
|
+
pinned commits. Pinning <code>taps.txt</code> by commit SHA is the change that would make
|
|
89
|
+
regression-vs-baseline meaningful again; the absolute floors added here are drift-tolerant by
|
|
90
|
+
construction and do not depend on it.
|
|
62
91
|
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: near-duplicate-items-eat-the-result-slots
|
|
3
3
|
board: code
|
|
4
4
|
section: pipeline
|
|
5
|
-
status:
|
|
5
|
+
status: inflight
|
|
6
6
|
category: Search · Ranking
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 4
|
|
10
10
|
note: 56.3% of entries share a name
|
|
11
11
|
order: 71
|
|
12
|
-
owner:
|
|
12
|
+
owner: loop/entry-key-collision
|
|
13
13
|
pr:
|
|
14
14
|
title: Near-duplicate items consume the top-10, and it gets worse with every tap
|
|
15
15
|
---
|
|
@@ -61,3 +61,33 @@ the fix at deduplication before ranking rather than at the fusion rule.
|
|
|
61
61
|
Worth re-measuring on the 83-tap install with the same script (<code>rrf_fuse</code> is public) to
|
|
62
62
|
turn this bound into a curve.
|
|
63
63
|
|
|
64
|
+
|
|
65
|
+
<b>The key half is shipped; the ranking half is not.</b> This card names two things to get right,
|
|
66
|
+
and the second — <code>(tap, name)</code> is not a unique key — turned out to be a
|
|
67
|
+
correctness bug rather than a ranking one, so it was fixed first and separately.
|
|
68
|
+
|
|
69
|
+
Both engines built <code>live = {(name, tap): entry}</code> as a dict comprehension, so the last
|
|
70
|
+
entry silently won. Reproduced on the pinned 6-tap corpus: 743 entries collapse to 694 pairs, leaving
|
|
71
|
+
<b>49 entries (6.6%) unreachable</b> — the card's 14.0% at 83 taps, at small scale. It is not
|
|
72
|
+
only that a copy is hidden: a query matching a shadowed entry's <em>body</em> was reported under the
|
|
73
|
+
surviving entry's name, description and path. The clearest pair, same tap and same name, is two
|
|
74
|
+
genuinely different rules:
|
|
75
|
+
<code>docs/rules/backend/nodejs/express-mongodb/admin-interface-rule.mdc</code> and
|
|
76
|
+
<code>docs/rules/backend/nodejs/fullstack-mern-guide/admin-interface-rule.mdc</code>.
|
|
77
|
+
|
|
78
|
+
<code>rag.entry_key</code> is now the single identity function shared by BM25, dense and RRF, keyed
|
|
79
|
+
on <code>(tap, skill_md)</code> — 743/743 distinct here and 11,147/11,147 on the 83-tap
|
|
80
|
+
install, exactly as this card predicted. Both index versions are bumped, and <code>dense.build</code>
|
|
81
|
+
now wipes on a version change: it compared only provider/model/dim, and since
|
|
82
|
+
<code>_ensure_schema</code> uses <code>CREATE TABLE IF NOT EXISTS</code> an existing store would have
|
|
83
|
+
crashed on the first insert with “no column named path”.
|
|
84
|
+
|
|
85
|
+
Measured cost: <b>none</b>. Over the pinned corpus BM25 scores 1.000 / 0.780 / 0.860 / 0.895 both
|
|
86
|
+
before and after, so recovering 49 entries did not disturb ranking. Several fixtures were modelling
|
|
87
|
+
data a real catalog cannot produce — every entry sharing <code>skill_md="s"</code>, two skills
|
|
88
|
+
at one path — and were corrected.
|
|
89
|
+
|
|
90
|
+
<b>Still open:</b> the ranking half. Clustering on content hash, picking a winner with a quality
|
|
91
|
+
prior, and the 83-tap re-measurement of the fusion bound are all untouched. Note the two are
|
|
92
|
+
independent: dedup <em>merges</em> copies that are genuinely the same, whereas this fix stops copies
|
|
93
|
+
that were never the same from being merged by accident.
|
|
@@ -1707,7 +1707,7 @@ a one-line <code>logger.debug(...)</code> in each except branch.</p>
|
|
|
1707
1707
|
</article>
|
|
1708
1708
|
|
|
1709
1709
|
<article class="cap rcard" id="eval-corpus-cannot-see-real-retrieval">
|
|
1710
|
-
<div class="head"><span class="pill
|
|
1710
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Quality · Eval</span></div>
|
|
1711
1711
|
<h3>The eval gate reports a perfect score on a corpus 4× smaller than a real user's</h3>
|
|
1712
1712
|
<p><code>make eval</code> reports BM25 <code>recall@10 = 1.000</code> against the
|
|
1713
1713
|
pinned 23-tap corpus in <code>tests/eval/taps.txt</code>. Run the same script
|
|
@@ -1753,8 +1753,37 @@ different axes, same conclusion: the number the gate reports is not a number abo
|
|
|
1753
1753
|
What it does <b>not</b> fix is the corpus-size half, which is this card's own finding and remains
|
|
1754
1754
|
open — 50 queries over 6 taps cannot speak to an 83-tap install. The two are complementary
|
|
1755
1755
|
rather than overlapping, and combining them (natural-language queries over a realistically sized
|
|
1756
|
-
corpus) is the instrument this group actually wants.
|
|
1757
|
-
|
|
1756
|
+
corpus) is the instrument this group actually wants.
|
|
1757
|
+
|
|
1758
|
+
<b>Two of the three blindnesses are now closed, and the third was never true of the committed
|
|
1759
|
+
harness.</b> <b>(1) recall-only flooring</b> is fixed: <code>--floor NAME=VALUE</code> is repeatable
|
|
1760
|
+
and gates any metric, and <code>make eval</code> now floors all four — measured BM25 on the
|
|
1761
|
+
pinned corpus is 1.000 / 0.780 / 0.860 / 0.895, with each floor about 0.12 under its measured value
|
|
1762
|
+
so upstream drift cannot flake the build. A misspelled metric name is a hard error rather than a
|
|
1763
|
+
silently skipped floor, since a floor that never fires is worse than no floor.
|
|
1764
|
+
|
|
1765
|
+
<b>(3) the kind oracle does not exist in <code>scripts/eval_retrieval.py</code>.</b> Checked
|
|
1766
|
+
directly: every ranker — <code>catalog_ranker</code>, <code>bm25_ranker</code>,
|
|
1767
|
+
<code>dense_ranker</code>, <code>hybrid_ranker</code> — is called with the query alone, and
|
|
1768
|
+
there is no <code>kind=</code> argument anywhere in <code>scripts/</code> or <code>evals/</code>,
|
|
1769
|
+
before or after <code>#360</code>. The golden set's <code>kind</code> field feeds the per-kind
|
|
1770
|
+
<em>reporting</em> slices in <code>_aggregate</code> and nothing else, so the +0.073 figure quoted
|
|
1771
|
+
above cannot have come from this harness. Recording it here rather than silently deleting the claim,
|
|
1772
|
+
because the number was real in whatever script measured it.
|
|
1773
|
+
|
|
1774
|
+
<b>A defect the card did not predict:</b> the baseline was not keyed to the query set that produced
|
|
1775
|
+
it. Running the natural-language set printed eight confident <code>REGRESSION vs baseline</code>
|
|
1776
|
+
lines — BM25 recall 1.000→0.690, hit@1 0.780→0.240 — which were not
|
|
1777
|
+
regressions but the gap between two different question sets, and <code>--save-baseline</code> on the
|
|
1778
|
+
natural set would have silently overwritten the keyword set's numbers with them. Baselines are now
|
|
1779
|
+
keyed by <code>name@content-digest</code>, so editing a query in place invalidates its baseline
|
|
1780
|
+
rather than quietly re-grading against numbers that no longer describe it.
|
|
1781
|
+
|
|
1782
|
+
<b>Still open:</b> the corpus-size half (23 taps versus a real 83) and
|
|
1783
|
+
<code>--regression-eps 1</code>, which is a symptom of the corpus tracking upstream HEAD rather than
|
|
1784
|
+
pinned commits. Pinning <code>taps.txt</code> by commit SHA is the change that would make
|
|
1785
|
+
regression-vs-baseline meaningful again; the absolute floors added here are drift-tolerant by
|
|
1786
|
+
construction and do not depend on it.</p>
|
|
1758
1787
|
<div class="meta">
|
|
1759
1788
|
<span class="m">Complexity <b>M</b></span>
|
|
1760
1789
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -3318,7 +3347,7 @@ deliberate, and idempotence was the piece missing from it.</p>
|
|
|
3318
3347
|
</article>
|
|
3319
3348
|
|
|
3320
3349
|
<article class="cap rcard" id="near-duplicate-items-eat-the-result-slots">
|
|
3321
|
-
<div class="head"><span class="pill
|
|
3350
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Ranking</span></div>
|
|
3322
3351
|
<h3>Near-duplicate items consume the top-10, and it gets worse with every tap</h3>
|
|
3323
3352
|
<p>Measured on a real 83-tap install: 11,147 catalog entries carry only 6,997
|
|
3324
3353
|
unique names — <b>1.593 copies per name, and 56.3% of entries share a name with
|
|
@@ -3366,7 +3395,38 @@ multiplies them. If the amplification appears at 83 taps it will be because both
|
|
|
3366
3395
|
the fix at deduplication before ranking rather than at the fusion rule.
|
|
3367
3396
|
|
|
3368
3397
|
Worth re-measuring on the 83-tap install with the same script (<code>rrf_fuse</code> is public) to
|
|
3369
|
-
turn this bound into a curve
|
|
3398
|
+
turn this bound into a curve.
|
|
3399
|
+
|
|
3400
|
+
|
|
3401
|
+
<b>The key half is shipped; the ranking half is not.</b> This card names two things to get right,
|
|
3402
|
+
and the second — <code>(tap, name)</code> is not a unique key — turned out to be a
|
|
3403
|
+
correctness bug rather than a ranking one, so it was fixed first and separately.
|
|
3404
|
+
|
|
3405
|
+
Both engines built <code>live = {(name, tap): entry}</code> as a dict comprehension, so the last
|
|
3406
|
+
entry silently won. Reproduced on the pinned 6-tap corpus: 743 entries collapse to 694 pairs, leaving
|
|
3407
|
+
<b>49 entries (6.6%) unreachable</b> — the card's 14.0% at 83 taps, at small scale. It is not
|
|
3408
|
+
only that a copy is hidden: a query matching a shadowed entry's <em>body</em> was reported under the
|
|
3409
|
+
surviving entry's name, description and path. The clearest pair, same tap and same name, is two
|
|
3410
|
+
genuinely different rules:
|
|
3411
|
+
<code>docs/rules/backend/nodejs/express-mongodb/admin-interface-rule.mdc</code> and
|
|
3412
|
+
<code>docs/rules/backend/nodejs/fullstack-mern-guide/admin-interface-rule.mdc</code>.
|
|
3413
|
+
|
|
3414
|
+
<code>rag.entry_key</code> is now the single identity function shared by BM25, dense and RRF, keyed
|
|
3415
|
+
on <code>(tap, skill_md)</code> — 743/743 distinct here and 11,147/11,147 on the 83-tap
|
|
3416
|
+
install, exactly as this card predicted. Both index versions are bumped, and <code>dense.build</code>
|
|
3417
|
+
now wipes on a version change: it compared only provider/model/dim, and since
|
|
3418
|
+
<code>_ensure_schema</code> uses <code>CREATE TABLE IF NOT EXISTS</code> an existing store would have
|
|
3419
|
+
crashed on the first insert with “no column named path”.
|
|
3420
|
+
|
|
3421
|
+
Measured cost: <b>none</b>. Over the pinned corpus BM25 scores 1.000 / 0.780 / 0.860 / 0.895 both
|
|
3422
|
+
before and after, so recovering 49 entries did not disturb ranking. Several fixtures were modelling
|
|
3423
|
+
data a real catalog cannot produce — every entry sharing <code>skill_md="s"</code>, two skills
|
|
3424
|
+
at one path — and were corrected.
|
|
3425
|
+
|
|
3426
|
+
<b>Still open:</b> the ranking half. Clustering on content hash, picking a winner with a quality
|
|
3427
|
+
prior, and the 83-tap re-measurement of the fusion bound are all untouched. Note the two are
|
|
3428
|
+
independent: dedup <em>merges</em> copies that are genuinely the same, whereas this fix stops copies
|
|
3429
|
+
that were never the same from being merged by accident.</p>
|
|
3370
3430
|
<div class="meta">
|
|
3371
3431
|
<span class="m">Complexity <b>M</b></span>
|
|
3372
3432
|
<span class="m hi">Impact <b>High</b></span>
|