boost-skill-cli 1.2.72__tar.gz → 1.2.74__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.2.72/boost_skill_cli.egg-info → boost_skill_cli-1.2.74}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/discovery.py +9 -1
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/dense.py +45 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/rag.py +108 -8
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/commands.html +4 -3
- boost_skill_cli-1.2.74/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +146 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap.html +79 -3
- boost_skill_cli-1.2.74/scripts/measure_near_duplicate_bound.py +179 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_discovery.py +10 -0
- boost_skill_cli-1.2.74/tests/unit/test_dense_entry_vectors.py +121 -0
- boost_skill_cli-1.2.74/tests/unit/test_near_duplicate_collapse.py +191 -0
- boost_skill_cli-1.2.74/tests/unit/test_retrieve_any_near_duplicates.py +93 -0
- boost_skill_cli-1.2.72/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -69
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.gitattributes +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.gitignore +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/.vale.ini +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/DCO +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/LICENSE +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/Makefile +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/README.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/codecov.yml +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/index.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-absorb-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-adapt-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-attest-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-audit-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-bmad-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-browse-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-bundle-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-catalog-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-changelog-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-chat-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-cohort-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-completions-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-config-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-context-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-create-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-deps-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-discover-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-doctor-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-drift-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-edit-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-evolve-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-explain-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-export-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-health-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-import-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-index-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-install-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-lint-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-log-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-mcp-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-onboard-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-outdated-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-policy-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-preview-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-profile-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-protocol-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-pulse-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-recommend-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-reindex-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-replay-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-root-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-run-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-schedule-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-search-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-simulate-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-sync-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-tag-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-tap-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-taps-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-test-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-trust-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-unpin-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-untap-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-update-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-verify-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/audit-who-findings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/README.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/examples/README.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/index.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/noxfile.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/eval_tools.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/setup.cfg +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/style/README.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/style/boost.css +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/style/boost.js +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/style/demo.html +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/eval/tool_calls.jsonl +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_bot_pr_dco.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_cli_update_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dense_vector_dedupe.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_tools.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_eval_tools_probe.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_gstack_coexistence.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mcp_read.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_shards_ingest.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.72 → boost_skill_cli-1.2.74}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.74'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 74)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -96,6 +96,12 @@ def cmd_search(argv):
|
|
|
96
96
|
help="rerank the top hits with Claude")
|
|
97
97
|
p.add_argument("--limit", type=util.positive_int, default=15,
|
|
98
98
|
help="max results (default 15)")
|
|
99
|
+
p.add_argument("--collapse-near-duplicates", action="store_true",
|
|
100
|
+
dest="collapse_dupes",
|
|
101
|
+
help="collapse near-identical entries (translations, "
|
|
102
|
+
"paraphrases) via dense embeddings — opt-in, needs a "
|
|
103
|
+
"built dense index; threshold not yet validated "
|
|
104
|
+
"against a real corpus, see the roadmap")
|
|
99
105
|
p.add_argument("--json", action="store_true", dest="as_json",
|
|
100
106
|
help="machine-readable output")
|
|
101
107
|
args = p.parse_args(argv)
|
|
@@ -127,7 +133,9 @@ def cmd_search(argv):
|
|
|
127
133
|
# retrieve_any, not retrieve: this picks the dense backend when one is
|
|
128
134
|
# built and floors to BM25 otherwise, so the CLI and the MCP server
|
|
129
135
|
# answer from the same engine instead of the CLI being BM25-only.
|
|
130
|
-
hits, engine = rag.retrieve_any(
|
|
136
|
+
hits, engine = rag.retrieve_any(
|
|
137
|
+
query, k=max(60, args.limit * 4),
|
|
138
|
+
collapse_near_duplicates=args.collapse_dupes)
|
|
131
139
|
scored = [(h["entry"], h["score"]) for h in (hits or [])]
|
|
132
140
|
else:
|
|
133
141
|
scored = catalog.search(query)
|
|
@@ -1561,6 +1561,51 @@ def _knn(con: sqlite3.Connection, qblob: bytes,
|
|
|
1561
1561
|
return _expand(con, ranked, pool)
|
|
1562
1562
|
|
|
1563
1563
|
|
|
1564
|
+
def entry_vectors(entry_keys: list[tuple[str, str]],
|
|
1565
|
+
) -> dict[tuple[str, str], bytes]:
|
|
1566
|
+
"""Raw float32 embedding for each entry's first chunk, keyed by ``(tap, path)``.
|
|
1567
|
+
|
|
1568
|
+
Feeds `rag.collapse_near_duplicate_hits`, whose clustering needs one
|
|
1569
|
+
representative vector per *entry* rather than per chunk. The lowest-``cix``
|
|
1570
|
+
chunk is that representative: `rag.chunk` always emits the name+description
|
|
1571
|
+
chunk first, which is enough signal to place a translation or a paraphrase
|
|
1572
|
+
near its original without reading the rest of the body.
|
|
1573
|
+
|
|
1574
|
+
Only a quantized store answers this cheaply: `vec_raw` is a plain
|
|
1575
|
+
rowid-keyed table, so looking vectors up by id is an index probe (see
|
|
1576
|
+
`_knn`'s comment on why the same lookup against a `vec0` table plans as a
|
|
1577
|
+
full scan instead). A legacy float32 store returns ``{}``, and near-dup
|
|
1578
|
+
collapsing degrades to a no-op there — the same way every other feature on
|
|
1579
|
+
that path degrades, rather than paying a full-scan cost per entry.
|
|
1580
|
+
"""
|
|
1581
|
+
if not entry_keys:
|
|
1582
|
+
return {}
|
|
1583
|
+
con = _connect()
|
|
1584
|
+
if con is None:
|
|
1585
|
+
return {}
|
|
1586
|
+
try:
|
|
1587
|
+
if not quantized(con):
|
|
1588
|
+
return {}
|
|
1589
|
+
col = _vid_col(con)
|
|
1590
|
+
vids: dict[tuple[str, str], int] = {}
|
|
1591
|
+
for tap, path in entry_keys:
|
|
1592
|
+
row = con.execute(
|
|
1593
|
+
"SELECT %s FROM chunks WHERE tap = ? AND path = ? " # noqa: S608 col is a literal from _vid_col; tap/path are bound
|
|
1594
|
+
"ORDER BY cix LIMIT 1" % col, (tap, path)).fetchone()
|
|
1595
|
+
if row is not None and row[0] is not None:
|
|
1596
|
+
vids[(tap, path)] = row[0]
|
|
1597
|
+
if not vids:
|
|
1598
|
+
return {}
|
|
1599
|
+
ids = sorted(set(vids.values()))
|
|
1600
|
+
rows = con.execute(
|
|
1601
|
+
"SELECT id, embedding FROM vec_raw WHERE id IN (%s)" # noqa: S608 interpolates only `?` placeholders; ids are bound
|
|
1602
|
+
% ",".join("?" * len(ids)), ids).fetchall()
|
|
1603
|
+
blobs = dict(rows)
|
|
1604
|
+
return {key: blobs[vid] for key, vid in vids.items() if vid in blobs}
|
|
1605
|
+
finally:
|
|
1606
|
+
con.close()
|
|
1607
|
+
|
|
1608
|
+
|
|
1564
1609
|
def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
1565
1610
|
entries: list[dict] | None = None) -> list[Hit] | None:
|
|
1566
1611
|
"""Top-k dense hits for ``query``, or None to signal 'fall back to BM25'."""
|
|
@@ -17,6 +17,7 @@ no AI -> the BM25 order is returned as-is.
|
|
|
17
17
|
"""
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
+
import array
|
|
20
21
|
import contextlib
|
|
21
22
|
import hashlib
|
|
22
23
|
import json
|
|
@@ -773,6 +774,91 @@ def dedupe_by_content(hits: list[Hit], limit: int) -> list[Hit]:
|
|
|
773
774
|
return out[:limit]
|
|
774
775
|
|
|
775
776
|
|
|
777
|
+
#: Cosine-similarity floor for two entries to collapse as near-duplicates.
|
|
778
|
+
#:
|
|
779
|
+
#: Deliberately conservative and deliberately unproven. `dedupe_by_content`
|
|
780
|
+
#: above shipped only after one count settled its safety: of 14,153 distinct
|
|
781
|
+
#: bodies, the clusters spanning more than one *name* numbered zero, so
|
|
782
|
+
#: collapsing on content hash could not merge two different skills. No
|
|
783
|
+
#: equivalent count exists yet for near-identical clustering — the measurement
|
|
784
|
+
#: the roadmap card asks for is "over a real corpus, at the chosen threshold,
|
|
785
|
+
#: count clusters spanning more than one meaning" and nobody has run it. Until
|
|
786
|
+
#: someone does, `collapse_near_duplicate_hits` stays reachable only opt-in
|
|
787
|
+
#: (see `retrieve_any`'s `collapse_near_duplicates` parameter), so the default
|
|
788
|
+
#: search path is unaffected by a threshold nobody has validated.
|
|
789
|
+
NEAR_DUPLICATE_THRESHOLD = 0.97
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
def _decode_vector(blob: bytes) -> array.array:
|
|
793
|
+
"""A stored float32 embedding blob as a sequence of floats."""
|
|
794
|
+
vec = array.array("f")
|
|
795
|
+
vec.frombytes(blob)
|
|
796
|
+
return vec
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
def _cosine(a: array.array, b: array.array) -> float:
|
|
800
|
+
"""Cosine similarity of two float32 vectors, 0.0 for any comparison that
|
|
801
|
+
cannot be trusted: a dimension mismatch (different embedding models) or
|
|
802
|
+
either side being the zero vector. An ambiguous comparison must never read
|
|
803
|
+
as a match, the same rule a missing content hash follows above.
|
|
804
|
+
"""
|
|
805
|
+
if not a or not b or len(a) != len(b):
|
|
806
|
+
return 0.0
|
|
807
|
+
dot = sum(x * y for x, y in zip(a, b, strict=True))
|
|
808
|
+
norm_a = math.sqrt(sum(x * x for x in a))
|
|
809
|
+
norm_b = math.sqrt(sum(x * x for x in b))
|
|
810
|
+
if 0.0 in (norm_a, norm_b):
|
|
811
|
+
return 0.0
|
|
812
|
+
return dot / (norm_a * norm_b)
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
def collapse_near_duplicate_hits(hits: list[Hit],
|
|
816
|
+
vectors: dict[tuple[str, str], bytes],
|
|
817
|
+
limit: int,
|
|
818
|
+
threshold: float = NEAR_DUPLICATE_THRESHOLD,
|
|
819
|
+
) -> list[Hit]:
|
|
820
|
+
"""Collapse entries whose embeddings are near-identical, then take ``limit``.
|
|
821
|
+
|
|
822
|
+
Runs on the output of :func:`dedupe_by_content`, on the same contract —
|
|
823
|
+
keep the earliest rank slot, promote a better source into it — for the
|
|
824
|
+
residual that survives byte-identical dedup: the same skill translated or
|
|
825
|
+
paraphrased across mirrors. Observed on a real 466-tap install: the query
|
|
826
|
+
``exa search`` returned ten rows that were all one skill in Japanese,
|
|
827
|
+
Chinese, and five English variants, none sharing a body digest, so
|
|
828
|
+
``dedupe_by_content`` correctly kept every one of them apart.
|
|
829
|
+
|
|
830
|
+
``vectors`` maps ``entry_key(hit["entry"])`` to a raw float32 embedding
|
|
831
|
+
blob, looked up by the caller (:func:`boost_cli.core.dense.entry_vectors`)
|
|
832
|
+
rather than fetched here — this stays pure so it is cheap to test with
|
|
833
|
+
synthetic vectors, and clustering ``hits`` is O(n * clusters), never
|
|
834
|
+
O(n^2) against the whole store.
|
|
835
|
+
|
|
836
|
+
A hit with no vector — no dense store built, or the entry never got one —
|
|
837
|
+
is never merged into anything: two unknowns must not collapse into each
|
|
838
|
+
other, the same rule :func:`dedupe_by_content` follows for a missing
|
|
839
|
+
content hash.
|
|
840
|
+
"""
|
|
841
|
+
out: list[Hit] = []
|
|
842
|
+
reps: list[array.array | None] = [] # parallel to `out`
|
|
843
|
+
for hit in hits:
|
|
844
|
+
blob = vectors.get(entry_key(hit["entry"]))
|
|
845
|
+
vec = _decode_vector(blob) if blob else None
|
|
846
|
+
merge_at = None
|
|
847
|
+
if vec is not None:
|
|
848
|
+
for i, rep in enumerate(reps):
|
|
849
|
+
if rep is not None and _cosine(vec, rep) >= threshold:
|
|
850
|
+
merge_at = i
|
|
851
|
+
break
|
|
852
|
+
if merge_at is None:
|
|
853
|
+
out.append(hit)
|
|
854
|
+
reps.append(vec)
|
|
855
|
+
continue
|
|
856
|
+
kept = out[merge_at]
|
|
857
|
+
if source_rank(hit["entry"]) < source_rank(kept["entry"]):
|
|
858
|
+
out[merge_at] = cast(Hit, {**kept, "entry": hit["entry"]})
|
|
859
|
+
return out[:limit]
|
|
860
|
+
|
|
861
|
+
|
|
776
862
|
def _windowed(hits: list[Hit], terms: Sequence[str]) -> list[Hit]:
|
|
777
863
|
"""Window each hit's raw stored snip onto the query terms.
|
|
778
864
|
|
|
@@ -1087,7 +1173,8 @@ def _with_content(hits: list[Hit]) -> list[Hit]:
|
|
|
1087
1173
|
|
|
1088
1174
|
|
|
1089
1175
|
def retrieve_any(query: str, k: int = 60, kind: str | None = None,
|
|
1090
|
-
entries: list[dict] | None = None
|
|
1176
|
+
entries: list[dict] | None = None,
|
|
1177
|
+
collapse_near_duplicates: bool = False,
|
|
1091
1178
|
) -> tuple[list[Hit] | None, str]:
|
|
1092
1179
|
"""Fuse BM25 and dense when both are available; floor to whichever is.
|
|
1093
1180
|
|
|
@@ -1107,6 +1194,12 @@ def retrieve_any(query: str, k: int = 60, kind: str | None = None,
|
|
|
1107
1194
|
Both engines are over-fetched to ``RRF_K`` before fusing. Fusing only the
|
|
1108
1195
|
top-k of each would discard exactly the candidates the other engine was
|
|
1109
1196
|
going to promote, which is most of the value.
|
|
1197
|
+
|
|
1198
|
+
``collapse_near_duplicates`` runs :func:`collapse_near_duplicate_hits` over
|
|
1199
|
+
the result, on top of the byte-identical dedup every branch below already
|
|
1200
|
+
does — off by default (see :data:`NEAR_DUPLICATE_THRESHOLD` for why) and a
|
|
1201
|
+
no-op whenever no dense store is built, since that is the only source of
|
|
1202
|
+
the embeddings the collapse needs.
|
|
1110
1203
|
"""
|
|
1111
1204
|
from . import dense
|
|
1112
1205
|
pool = max(k, RRF_K)
|
|
@@ -1127,13 +1220,20 @@ def retrieve_any(query: str, k: int = 60, kind: str | None = None,
|
|
|
1127
1220
|
# no reason to treat them as one.
|
|
1128
1221
|
if dense_hits and bm25_hits:
|
|
1129
1222
|
fused = rrf_fuse([bm25_hits, dense_hits], limit=max(k, RRF_K))
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1223
|
+
hits, engine = dedupe_by_content(_with_content(fused), k), \
|
|
1224
|
+
"hybrid RRF (BM25 + dense)"
|
|
1225
|
+
elif dense_hits:
|
|
1226
|
+
hits, engine = dedupe_by_content(_with_content(dense_hits), k), \
|
|
1227
|
+
"dense vectors"
|
|
1228
|
+
elif bm25_hits is not None:
|
|
1229
|
+
hits, engine = bm25_hits[:k], "BM25 full-content" # already deduped
|
|
1230
|
+
else:
|
|
1231
|
+
return None, ""
|
|
1232
|
+
if collapse_near_duplicates and hits and dense.ready():
|
|
1233
|
+
vectors = dense.entry_vectors([entry_key(h["entry"]) for h in hits])
|
|
1234
|
+
if vectors:
|
|
1235
|
+
hits = collapse_near_duplicate_hits(hits, vectors, k)
|
|
1236
|
+
return hits, engine
|
|
1137
1237
|
|
|
1138
1238
|
|
|
1139
1239
|
def search(query: str, limit: int = 10, kind: str | None = None,
|
|
@@ -657,6 +657,7 @@ scripts/eval_stats_summary.py
|
|
|
657
657
|
scripts/eval_tools.py
|
|
658
658
|
scripts/import_budget.py
|
|
659
659
|
scripts/lock_toolchain.py
|
|
660
|
+
scripts/measure_near_duplicate_bound.py
|
|
660
661
|
scripts/measure_registry.py
|
|
661
662
|
scripts/mutation_gate.py
|
|
662
663
|
scripts/mutation_shards.py
|
|
@@ -803,6 +804,7 @@ tests/unit/test_dense.py
|
|
|
803
804
|
tests/unit/test_dense_boilerplate_cluster.py
|
|
804
805
|
tests/unit/test_dense_embed_dedupe.py
|
|
805
806
|
tests/unit/test_dense_entry_reuse.py
|
|
807
|
+
tests/unit/test_dense_entry_vectors.py
|
|
806
808
|
tests/unit/test_dense_fallback.py
|
|
807
809
|
tests/unit/test_dense_fix_hint.py
|
|
808
810
|
tests/unit/test_dense_progress.py
|
|
@@ -869,6 +871,7 @@ tests/unit/test_mutation_hardening.py
|
|
|
869
871
|
tests/unit/test_mutation_shards.py
|
|
870
872
|
tests/unit/test_mutation_subfile_shards.py
|
|
871
873
|
tests/unit/test_mutmut_source_paths.py
|
|
874
|
+
tests/unit/test_near_duplicate_collapse.py
|
|
872
875
|
tests/unit/test_nethttp.py
|
|
873
876
|
tests/unit/test_normalize_sdist.py
|
|
874
877
|
tests/unit/test_output.py
|
|
@@ -898,6 +901,7 @@ tests/unit/test_release_preflight.py
|
|
|
898
901
|
tests/unit/test_required_checks.py
|
|
899
902
|
tests/unit/test_rerank_cache.py
|
|
900
903
|
tests/unit/test_resolve.py
|
|
904
|
+
tests/unit/test_retrieve_any_near_duplicates.py
|
|
901
905
|
tests/unit/test_roadmap_fresh.py
|
|
902
906
|
tests/unit/test_rules.py
|
|
903
907
|
tests/unit/test_scale_corpus.py
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
</div>
|
|
118
118
|
<div class="group" data-group="find">
|
|
119
119
|
<div class="group-h">Find & search</div>
|
|
120
|
-
<a class="cmd-link" href="#cmd-search" data-search="search search skills across tap registries (ai-ranked) --smart --limit limit --json query">search</a>
|
|
120
|
+
<a class="cmd-link" href="#cmd-search" data-search="search search skills across tap registries (ai-ranked) --smart --limit limit --collapse-near-duplicates --json query">search</a>
|
|
121
121
|
<a class="cmd-link" href="#cmd-reindex" data-search="reindex build/refresh the full-content search index build or refresh the full-content search index --force --dense --export-shard tap --import-shard file --fetch-shards --json">reindex</a>
|
|
122
122
|
<a class="cmd-link" href="#cmd-discover" data-search="discover search github for skill repos you have not tapped yet search github for skill repositories you have not tapped yet --limit limit --json --local query">discover</a>
|
|
123
123
|
<a class="cmd-link" href="#cmd-recommend" data-search="recommend suggest skills based on your project's tech stack --path path --limit limit --json">recommend</a>
|
|
@@ -397,10 +397,10 @@
|
|
|
397
397
|
</div>
|
|
398
398
|
</section>
|
|
399
399
|
<h2 class="group-h" id="grp-find">Find & search</h2>
|
|
400
|
-
<section class="cmd" id="cmd-search" data-search="search search skills across tap registries (ai-ranked) --smart --limit limit --json query">
|
|
400
|
+
<section class="cmd" id="cmd-search" data-search="search search skills across tap registries (ai-ranked) --smart --limit limit --collapse-near-duplicates --json query">
|
|
401
401
|
<h3><span class="cname">search</span><span class="gtag">find</span></h3>
|
|
402
402
|
<p class="summary">Search skills across tap registries (AI-ranked)</p>
|
|
403
|
-
<pre class="syn">boost search [--smart] [--limit LIMIT] [--json] query [query ...]</pre>
|
|
403
|
+
<pre class="syn">boost search [--smart] [--limit LIMIT] [--collapse-near-duplicates] [--json] query [query ...]</pre>
|
|
404
404
|
<div class="args-h">Arguments</div>
|
|
405
405
|
<div class="args">
|
|
406
406
|
<div class="arg"><code>query</code><span>search terms</span></div>
|
|
@@ -409,6 +409,7 @@
|
|
|
409
409
|
<div class="args">
|
|
410
410
|
<div class="arg"><code>--smart</code><span>rerank the top hits with Claude</span></div>
|
|
411
411
|
<div class="arg"><code>--limit LIMIT</code><span>max results (default 15)</span></div>
|
|
412
|
+
<div class="arg"><code>--collapse-near-duplicates</code><span>collapse near-identical entries (translations, paraphrases) via dense embeddings — opt-in, needs a built dense index; threshold not yet validated against a real corpus, see the roadmap</span></div>
|
|
412
413
|
<div class="arg"><code>--json</code><span>machine-readable output</span></div>
|
|
413
414
|
</div>
|
|
414
415
|
</section>
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: near-identical-copies-still-eat-the-slots
|
|
3
|
+
board: code
|
|
4
|
+
section: planned
|
|
5
|
+
status: inflight
|
|
6
|
+
owner: loop/near-dup-bound
|
|
7
|
+
category: Search · Ranking
|
|
8
|
+
complexity: M
|
|
9
|
+
impact: High
|
|
10
|
+
wow: 4
|
|
11
|
+
note: shipped opt-in (#639); bound measured (#645) and it refutes the zero-clusters test -- default-on now waits on a name-confusability veto
|
|
12
|
+
order: 131
|
|
13
|
+
title: Near-identical copies survive content-hash dedup and take the whole result page
|
|
14
|
+
---
|
|
15
|
+
<a href="#near-duplicate-items-eat-the-result-slots">Content-hash dedup</a> shipped and worked:
|
|
16
|
+
<code>rag.dedupe_by_content</code> took duplicate result slots from <b>4.94 to 0.60 per query</b>
|
|
17
|
+
over a 77-tap corpus. That card closed naming one thing still open — <em>near-identical
|
|
18
|
+
rather than byte-identical clustering, where <code>core/typosquat.py</code>'s confusion machinery
|
|
19
|
+
would apply</em> — and buried it under a <code>shipped</code> status where nobody would claim
|
|
20
|
+
it. This card is that remainder, with a measurement that makes it look considerably worse than
|
|
21
|
+
“refinement”.
|
|
22
|
+
|
|
23
|
+
<b>Observed on a real 466-tap install</b> with hybrid RRF serving (658,131 chunks): for the query
|
|
24
|
+
<code>exa search</code>, every one of the top ten rows is <code>exa-search</code>, and the
|
|
25
|
+
descriptions are what give the
|
|
26
|
+
shape away — one Japanese (<code>Exa MCPによるウェブ、コード、企業調査</code>), two Chinese
|
|
27
|
+
(<code>通过Exa MCP进行神经搜索</code>), five English variants of <code>Neural search via Exa MCP</code>,
|
|
28
|
+
plus <code>Use Exa MCP for current web…</code> and <code>AI-powered web search…</code>.
|
|
29
|
+
All ten are <code>★ curated</code>. The footer reads
|
|
30
|
+
<code>51 matches · ranked by hybrid RRF (BM25 + dense)</code>.
|
|
31
|
+
|
|
32
|
+
<b>Every one of those passed dedup correctly.</b> They are not byte-identical: they are the same
|
|
33
|
+
skill in Japanese, in Chinese, and in five English phrasings across different registries. The body
|
|
34
|
+
digest differs, so <code>dedupe_by_content</code> keeps them all — which is exactly the
|
|
35
|
+
behaviour <code>#366</code> proved must be preserved, since two entries sharing a name can be
|
|
36
|
+
genuinely different rules. The shipped fix is not misbehaving. It simply does not reach this shape.
|
|
37
|
+
|
|
38
|
+
<b>What the 0.60 residual actually was.</b> The prior card described its leftover as “entries
|
|
39
|
+
sharing a <em>name</em> whose bodies genuinely differ, which must stay separate” — true
|
|
40
|
+
as stated, and it reads as a rounding error. At 466 taps the same residual is a full result page.
|
|
41
|
+
The gap between 0.60 and 10.0 is worth understanding before designing anything: the 77-tap
|
|
42
|
+
measurement used 50 natural-language queries averaged, and an <em>average</em> hides the shape here.
|
|
43
|
+
Duplicate pressure was already known to be a step function of <em>which</em> registries are tapped
|
|
44
|
+
rather than how many; near-identical pressure looks like a step function of <b>which query</b> —
|
|
45
|
+
harmless across a query set, total on any query that lands on a widely-mirrored skill. Re-measure
|
|
46
|
+
per-query maxima, not means.
|
|
47
|
+
|
|
48
|
+
<b>The hard part is the safety proof, not the clustering.</b> Content hashing was adoptable because
|
|
49
|
+
one count settled it: of 14,153 distinct bodies, clusters spanning more than one name numbered
|
|
50
|
+
<b>zero</b>, so collapsing could not merge two different skills. Near-identical clustering has no
|
|
51
|
+
such free proof — any similarity threshold loose enough to merge a Japanese translation with
|
|
52
|
+
its English original is loose enough to merge two genuinely different skills that share boilerplate.
|
|
53
|
+
Establish the equivalent bound first (over a real corpus, at the chosen threshold, count clusters
|
|
54
|
+
spanning more than one <em>meaning</em>) or the fix trades a visible problem for a silent one.
|
|
55
|
+
|
|
56
|
+
<b>Three things to get right.</b> <em>Translations are the motivating case and the hardest</em>: they
|
|
57
|
+
share almost no tokens with the original, so token-overlap similarity will not find them while an
|
|
58
|
+
embedding will — and the vectors are already on disk, which makes this cheaper here than it
|
|
59
|
+
would be anywhere else. <em>Collapse before <code>k</code></em>, and at both the
|
|
60
|
+
<code>retrieve</code> and <code>retrieve_any</code> seams, for the reason the shipped dedup already
|
|
61
|
+
documents: fusion reintroduces copies either engine dropped, because the copies are distinct
|
|
62
|
+
<code>(tap, skill_md)</code> keys and RRF has no reason to treat them as one. <em>The existing
|
|
63
|
+
quality prior carries over unchanged</em> — <code>rag.source_rank</code> orders on the user's
|
|
64
|
+
<code>curated</code> flag first and shipped <code>confidence</code> second, and choosing among
|
|
65
|
+
near-identical copies is the same question as choosing among identical ones: where should the user
|
|
66
|
+
install from.
|
|
67
|
+
|
|
68
|
+
<b>Not to be confused with <code>#629</code></b>, which deduplicated vector <em>storage</em> (one
|
|
69
|
+
row per distinct embedding, 39.7% repeats reclaimed). That is a disk-size fix beneath the index and
|
|
70
|
+
changes no ranking; this is about which rows reach the user's screen.
|
|
71
|
+
|
|
72
|
+
<b>What shipped, and what did not.</b> <code>rag.collapse_near_duplicate_hits</code> is the same
|
|
73
|
+
"keep the earliest rank slot, promote a better source" contract as <code>dedupe_by_content</code>,
|
|
74
|
+
run over cosine similarity of the entries' first-chunk embeddings
|
|
75
|
+
(<code>dense.entry_vectors</code>, an index probe through <code>chunks_entry</code> on a quantized
|
|
76
|
+
store) instead of a body hash, at the <code>retrieve_any</code> seam before <code>k</code> is
|
|
77
|
+
applied. It is covered by unit tests down to the arithmetic (<code>_cosine</code>'s dimension-
|
|
78
|
+
mismatch and zero-vector guards), the clustering contract (rank order, quality-prior promotion,
|
|
79
|
+
limit-after-collapse), the <code>dense.entry_vectors</code> lookup against a real quantized
|
|
80
|
+
sqlite-vec store, and the <code>retrieve_any</code>/<code>boost search
|
|
81
|
+
--collapse-near-duplicates</code> wiring in both directions (on and off).
|
|
82
|
+
|
|
83
|
+
It ships <b>opt-in and off by default</b> — <code>retrieve_any(..., collapse_near_duplicates=True)</code>
|
|
84
|
+
or <code>boost search --collapse-near-duplicates</code> — rather than replacing
|
|
85
|
+
<code>dedupe_by_content</code>'s output on the default path. Two things this card asks for are still
|
|
86
|
+
open, and both need a real embedding backend (a built dense index, over a real multi-tap corpus)
|
|
87
|
+
that the environment this was implemented in cannot reach — no network path to an embeddings
|
|
88
|
+
provider or to the local ONNX model download, confirmed rather than assumed: <code>huggingface.co</code>
|
|
89
|
+
and <code>pypi.org</code> both refuse at the network policy layer. <b>First</b>, the safety proof
|
|
90
|
+
this card itself demands before defaulting the mechanism on — “over a real corpus, at
|
|
91
|
+
the chosen threshold, count clusters spanning more than one meaning” — has not been run;
|
|
92
|
+
<code>NEAR_DUPLICATE_THRESHOLD = 0.97</code> is a starting point, not a validated floor. <b>Second</b>,
|
|
93
|
+
re-measuring the <code>exa search</code> case (and per-query maxima generally) against the fix needs
|
|
94
|
+
that same corpus and index. Whoever runs that measurement should flip the CLI flag's default, fold
|
|
95
|
+
the corpus count into this card's evidence, and only then consider this shipped.
|
|
96
|
+
|
|
97
|
+
<b>The bound has now been measured, and it says the acceptance test in this card is the wrong
|
|
98
|
+
one.</b> <code>scripts/measure_near_duplicate_bound.py</code> runs the count this card asks for
|
|
99
|
+
against the pinned 20-repo eval corpus (10,152 entries, 104,271 chunks, <code>BAAI/bge-small-en-v1.5</code>
|
|
100
|
+
at 384-d). Those entries reduce to <b>5,714 distinct chunk-0 vectors</b> — 44% of entries
|
|
101
|
+
already share a chunk-0 embedding byte for byte — and at
|
|
102
|
+
<code>NEAR_DUPLICATE_THRESHOLD = 0.97</code>, 162 pairs clear the threshold and <b>56 clusters span
|
|
103
|
+
more than one name</b>. Sweeping the threshold moves that number but never to zero: 0.96 → 91,
|
|
104
|
+
0.97 → 56, 0.98 → 28, 0.99 → 13, 0.995 → 8, 0.999 → 4.
|
|
105
|
+
|
|
106
|
+
<b>Four of those 56 are not the threshold's doing at all.</b> They are clusters of a single vector
|
|
107
|
+
shared by several names, so they cluster at <em>any</em> threshold, which is why the sweep bottoms
|
|
108
|
+
out at 4 rather than 0. The largest is the same at every threshold and is worth naming: <b>28
|
|
109
|
+
differently-named agents from one tap</b> (<code>affaan-m/ECC</code> — <code>architect</code>,
|
|
110
|
+
<code>code-reviewer</code>, <code>chief-of-staff</code>, <code>database-reviewer</code>,
|
|
111
|
+
<code>e2e-runner</code>, …) whose chunk 0 is the same Spanish preamble
|
|
112
|
+
(<code>No cambiar rol, persona ni identidad…</code>) in every file. Chunk 0 is
|
|
113
|
+
<code>name + description + opening of body</code>, and where a registry opens every file with
|
|
114
|
+
identical boilerplate, the name does not move the vector enough to separate them. <b>A floor exists
|
|
115
|
+
that no threshold can reach under</b>, so “count must be zero” was never achievable.
|
|
116
|
+
|
|
117
|
+
<b>Worse for the test: most of the other 52 are the feature working.</b> Hand-classifying all 56 at
|
|
118
|
+
0.97, roughly two-thirds are genuinely one skill under two names — twelve are pure
|
|
119
|
+
hyphen-versus-underscore renderings of one integration (<code>zoho-mail</code> /
|
|
120
|
+
<code>zoho_mail</code>, <code>google_maps</code> / <code>google-maps</code>,
|
|
121
|
+
<code>anthropic_administrator</code> / <code>anthropic-administrator</code>), and the rest are
|
|
122
|
+
suffix variants of one document (<code>tdd</code> / <code>tdd-guide</code>,
|
|
123
|
+
<code>rust-review</code> / <code>rust-reviewer</code>, <code>testing-patterns</code> /
|
|
124
|
+
<code>code-showcase-testing-patterns</code>). Collapsing those is precisely what this card exists to
|
|
125
|
+
do. A metric that counts them as violations would reject every threshold that works.
|
|
126
|
+
|
|
127
|
+
<b>The dangerous merges have a shape, and this card already named it.</b> The ~20 clusters that are
|
|
128
|
+
real false merges are dominated by <em>near-miss brand names</em>: <code>coinmarketcal</code> with
|
|
129
|
+
<code>coinmarketcap</code>, <code>bugbug</code> with <code>bugsnag</code>, <code>parsehub</code>
|
|
130
|
+
with <code>parseur</code>, <code>linkhut</code> with <code>linkup</code>,
|
|
131
|
+
<code>mx-technologies</code> with <code>mx-toolbox</code>,
|
|
132
|
+
<code>salesforce-marketing-cloud</code> with <code>salesforce-service-cloud</code>. These are
|
|
133
|
+
distinct products whose descriptions are boilerplate around a swapped word. That is the
|
|
134
|
+
<code>core/typosquat.py</code> confusion shape this card's opening paragraph pointed at, arrived at
|
|
135
|
+
independently from the other end: the guard this needs is not a tighter cosine floor but a
|
|
136
|
+
<em>name-confusability veto</em> — refuse to collapse two entries whose names are a confusable
|
|
137
|
+
edit apart, however close their vectors sit.
|
|
138
|
+
|
|
139
|
+
<b>So the default stays off, for a better-supported reason than before.</b> The measurement does not
|
|
140
|
+
say 0.97 is too loose; it says similarity alone cannot separate <code>tdd</code>/<code>tdd-guide</code>
|
|
141
|
+
(collapse) from <code>coinmarketcal</code>/<code>coinmarketcap</code> (never collapse), because both
|
|
142
|
+
pairs sit in the same cosine band. Flipping the default needs the confusability veto first, and a
|
|
143
|
+
re-count with it applied. <b>And this bound is space-specific</b>: it was measured in
|
|
144
|
+
<code>bge-small</code> 384-d, while a keyed production install is <code>voyage-4</code> at 1024-d.
|
|
145
|
+
Cosine thresholds do not transfer between embedding spaces — rerun the script against each
|
|
146
|
+
space before trusting a number in it.
|
|
@@ -1063,7 +1063,7 @@ checks fails on every invocation is the more expensive half of this card.</p></d
|
|
|
1063
1063
|
</article>
|
|
1064
1064
|
|
|
1065
1065
|
<article class="cap rcard" id="near-identical-copies-still-eat-the-slots">
|
|
1066
|
-
<div class="head"><span class="pill
|
|
1066
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Ranking</span></div>
|
|
1067
1067
|
<h3>Near-identical copies survive content-hash dedup and take the whole result page</h3>
|
|
1068
1068
|
<p><a href="#near-duplicate-items-eat-the-result-slots">Content-hash dedup</a> shipped and worked:
|
|
1069
1069
|
<code>rag.dedupe_by_content</code> took duplicate result slots from <b>4.94 to 0.60 per query</b>
|
|
@@ -1120,12 +1120,88 @@ install from.
|
|
|
1120
1120
|
|
|
1121
1121
|
<b>Not to be confused with <code>#629</code></b>, which deduplicated vector <em>storage</em> (one
|
|
1122
1122
|
row per distinct embedding, 39.7% repeats reclaimed). That is a disk-size fix beneath the index and
|
|
1123
|
-
changes no ranking; this is about which rows reach the user's screen
|
|
1123
|
+
changes no ranking; this is about which rows reach the user's screen.
|
|
1124
|
+
|
|
1125
|
+
<b>What shipped, and what did not.</b> <code>rag.collapse_near_duplicate_hits</code> is the same
|
|
1126
|
+
"keep the earliest rank slot, promote a better source" contract as <code>dedupe_by_content</code>,
|
|
1127
|
+
run over cosine similarity of the entries' first-chunk embeddings
|
|
1128
|
+
(<code>dense.entry_vectors</code>, an index probe through <code>chunks_entry</code> on a quantized
|
|
1129
|
+
store) instead of a body hash, at the <code>retrieve_any</code> seam before <code>k</code> is
|
|
1130
|
+
applied. It is covered by unit tests down to the arithmetic (<code>_cosine</code>'s dimension-
|
|
1131
|
+
mismatch and zero-vector guards), the clustering contract (rank order, quality-prior promotion,
|
|
1132
|
+
limit-after-collapse), the <code>dense.entry_vectors</code> lookup against a real quantized
|
|
1133
|
+
sqlite-vec store, and the <code>retrieve_any</code>/<code>boost search
|
|
1134
|
+
--collapse-near-duplicates</code> wiring in both directions (on and off).
|
|
1135
|
+
|
|
1136
|
+
It ships <b>opt-in and off by default</b> — <code>retrieve_any(..., collapse_near_duplicates=True)</code>
|
|
1137
|
+
or <code>boost search --collapse-near-duplicates</code> — rather than replacing
|
|
1138
|
+
<code>dedupe_by_content</code>'s output on the default path. Two things this card asks for are still
|
|
1139
|
+
open, and both need a real embedding backend (a built dense index, over a real multi-tap corpus)
|
|
1140
|
+
that the environment this was implemented in cannot reach — no network path to an embeddings
|
|
1141
|
+
provider or to the local ONNX model download, confirmed rather than assumed: <code>huggingface.co</code>
|
|
1142
|
+
and <code>pypi.org</code> both refuse at the network policy layer. <b>First</b>, the safety proof
|
|
1143
|
+
this card itself demands before defaulting the mechanism on — “over a real corpus, at
|
|
1144
|
+
the chosen threshold, count clusters spanning more than one meaning” — has not been run;
|
|
1145
|
+
<code>NEAR_DUPLICATE_THRESHOLD = 0.97</code> is a starting point, not a validated floor. <b>Second</b>,
|
|
1146
|
+
re-measuring the <code>exa search</code> case (and per-query maxima generally) against the fix needs
|
|
1147
|
+
that same corpus and index. Whoever runs that measurement should flip the CLI flag's default, fold
|
|
1148
|
+
the corpus count into this card's evidence, and only then consider this shipped.
|
|
1149
|
+
|
|
1150
|
+
<b>The bound has now been measured, and it says the acceptance test in this card is the wrong
|
|
1151
|
+
one.</b> <code>scripts/measure_near_duplicate_bound.py</code> runs the count this card asks for
|
|
1152
|
+
against the pinned 20-repo eval corpus (10,152 entries, 104,271 chunks, <code>BAAI/bge-small-en-v1.5</code>
|
|
1153
|
+
at 384-d). Those entries reduce to <b>5,714 distinct chunk-0 vectors</b> — 44% of entries
|
|
1154
|
+
already share a chunk-0 embedding byte for byte — and at
|
|
1155
|
+
<code>NEAR_DUPLICATE_THRESHOLD = 0.97</code>, 162 pairs clear the threshold and <b>56 clusters span
|
|
1156
|
+
more than one name</b>. Sweeping the threshold moves that number but never to zero: 0.96 → 91,
|
|
1157
|
+
0.97 → 56, 0.98 → 28, 0.99 → 13, 0.995 → 8, 0.999 → 4.
|
|
1158
|
+
|
|
1159
|
+
<b>Four of those 56 are not the threshold's doing at all.</b> They are clusters of a single vector
|
|
1160
|
+
shared by several names, so they cluster at <em>any</em> threshold, which is why the sweep bottoms
|
|
1161
|
+
out at 4 rather than 0. The largest is the same at every threshold and is worth naming: <b>28
|
|
1162
|
+
differently-named agents from one tap</b> (<code>affaan-m/ECC</code> — <code>architect</code>,
|
|
1163
|
+
<code>code-reviewer</code>, <code>chief-of-staff</code>, <code>database-reviewer</code>,
|
|
1164
|
+
<code>e2e-runner</code>, …) whose chunk 0 is the same Spanish preamble
|
|
1165
|
+
(<code>No cambiar rol, persona ni identidad…</code>) in every file. Chunk 0 is
|
|
1166
|
+
<code>name + description + opening of body</code>, and where a registry opens every file with
|
|
1167
|
+
identical boilerplate, the name does not move the vector enough to separate them. <b>A floor exists
|
|
1168
|
+
that no threshold can reach under</b>, so “count must be zero” was never achievable.
|
|
1169
|
+
|
|
1170
|
+
<b>Worse for the test: most of the other 52 are the feature working.</b> Hand-classifying all 56 at
|
|
1171
|
+
0.97, roughly two-thirds are genuinely one skill under two names — twelve are pure
|
|
1172
|
+
hyphen-versus-underscore renderings of one integration (<code>zoho-mail</code> /
|
|
1173
|
+
<code>zoho_mail</code>, <code>google_maps</code> / <code>google-maps</code>,
|
|
1174
|
+
<code>anthropic_administrator</code> / <code>anthropic-administrator</code>), and the rest are
|
|
1175
|
+
suffix variants of one document (<code>tdd</code> / <code>tdd-guide</code>,
|
|
1176
|
+
<code>rust-review</code> / <code>rust-reviewer</code>, <code>testing-patterns</code> /
|
|
1177
|
+
<code>code-showcase-testing-patterns</code>). Collapsing those is precisely what this card exists to
|
|
1178
|
+
do. A metric that counts them as violations would reject every threshold that works.
|
|
1179
|
+
|
|
1180
|
+
<b>The dangerous merges have a shape, and this card already named it.</b> The ~20 clusters that are
|
|
1181
|
+
real false merges are dominated by <em>near-miss brand names</em>: <code>coinmarketcal</code> with
|
|
1182
|
+
<code>coinmarketcap</code>, <code>bugbug</code> with <code>bugsnag</code>, <code>parsehub</code>
|
|
1183
|
+
with <code>parseur</code>, <code>linkhut</code> with <code>linkup</code>,
|
|
1184
|
+
<code>mx-technologies</code> with <code>mx-toolbox</code>,
|
|
1185
|
+
<code>salesforce-marketing-cloud</code> with <code>salesforce-service-cloud</code>. These are
|
|
1186
|
+
distinct products whose descriptions are boilerplate around a swapped word. That is the
|
|
1187
|
+
<code>core/typosquat.py</code> confusion shape this card's opening paragraph pointed at, arrived at
|
|
1188
|
+
independently from the other end: the guard this needs is not a tighter cosine floor but a
|
|
1189
|
+
<em>name-confusability veto</em> — refuse to collapse two entries whose names are a confusable
|
|
1190
|
+
edit apart, however close their vectors sit.
|
|
1191
|
+
|
|
1192
|
+
<b>So the default stays off, for a better-supported reason than before.</b> The measurement does not
|
|
1193
|
+
say 0.97 is too loose; it says similarity alone cannot separate <code>tdd</code>/<code>tdd-guide</code>
|
|
1194
|
+
(collapse) from <code>coinmarketcal</code>/<code>coinmarketcap</code> (never collapse), because both
|
|
1195
|
+
pairs sit in the same cosine band. Flipping the default needs the confusability veto first, and a
|
|
1196
|
+
re-count with it applied. <b>And this bound is space-specific</b>: it was measured in
|
|
1197
|
+
<code>bge-small</code> 384-d, while a keyed production install is <code>voyage-4</code> at 1024-d.
|
|
1198
|
+
Cosine thresholds do not transfer between embedding spaces — rerun the script against each
|
|
1199
|
+
space before trusting a number in it.</p>
|
|
1124
1200
|
<div class="meta">
|
|
1125
1201
|
<span class="m">Complexity <b>M</b></span>
|
|
1126
1202
|
<span class="m hi">Impact <b>High</b></span>
|
|
1127
1203
|
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
1128
|
-
<span class="m">
|
|
1204
|
+
<span class="m">shipped opt-in (#639); bound measured (#645) and it refutes the zero-clusters test -- default-on now waits on a name-confusability veto</span>
|
|
1129
1205
|
</div>
|
|
1130
1206
|
</article>
|
|
1131
1207
|
<!-- /ROADMAP:cards -->
|