boost-skill-cli 1.2.3__tar.gz → 1.2.4__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.3 → boost_skill_cli-1.2.4}/.vale/styles/config/vocabularies/boost/accept.txt +3 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/CLAUDE.md +19 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/browse.py +27 -6
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/catalog.py +110 -9
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/dense.py +38 -14
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/rag.py +7 -3
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
- boost_skill_cli-1.2.4/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +56 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap.html +54 -1
- boost_skill_cli-1.2.4/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +172 -0
- boost_skill_cli-1.2.4/tests/unit/test_content_identity.py +437 -0
- boost_skill_cli-1.2.4/tests/unit/test_dense_embed_dedupe.py +216 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.gitattributes +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.gitignore +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/.vale.ini +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/LICENSE +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/Makefile +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/README.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/codecov.yml +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/index.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/README.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/examples/README.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/index.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/noxfile.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/setup.cfg +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/style/README.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/style/boost.css +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/style/boost.js +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/style/demo.html +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.3 → boost_skill_cli-1.2.4}/tests/visual/visual_check.mjs +0 -0
|
@@ -182,6 +182,25 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
|
|
|
182
182
|
still ignored, and deliberately: it is an unsafe fix over ~1,000 call sites in
|
|
183
183
|
`boost_cli` alone. Write new code in the modern style; don't bulk-rewrite old
|
|
184
184
|
code in an unrelated PR.
|
|
185
|
+
- **A catalog entry has two identities, and they are not interchangeable.**
|
|
186
|
+
*Row* identity is `(tap, skill_md)` (`rag.entry_key`) — which file, in which
|
|
187
|
+
tap. *Content* identity is `entry["content"]`, a truncated sha256 of
|
|
188
|
+
`name + "\n" + description + "\n" + body` stamped by `catalog._content_digest`
|
|
189
|
+
at scan time. Use the row key to address a row and the digest to ask whether
|
|
190
|
+
two rows are the same thing. The digest must stay byte-identical to what
|
|
191
|
+
`rag.read_body` assembles — `tests/unit/test_content_identity.py` pins the
|
|
192
|
+
parity, because a digest that drifts keeps *looking* right while clustering
|
|
193
|
+
nothing. Name-based keys are wrong at both layers: over 60,047 real entries,
|
|
194
|
+
hashing the body alone merges 259 clusters spanning different names, and
|
|
195
|
+
name+description over-collapses 3,383 clusters of genuinely different prose.
|
|
196
|
+
Consumers must degrade cleanly when `content` is absent (a cache written
|
|
197
|
+
before `CACHE_FORMAT`, or a synthesised entry) — and must never treat two
|
|
198
|
+
absences as a match.
|
|
199
|
+
- **The tap cache is versioned; bump `catalog.CACHE_FORMAT` to backfill.** It is
|
|
200
|
+
how a new entry field reaches 460 caches on a real machine without a re-tap:
|
|
201
|
+
`load_tap` rescans a stale cache *when the clone is still there*, and serves
|
|
202
|
+
the stale entries as-is when it is not. Never make a stale cache an error —
|
|
203
|
+
that trades a missing field for a missing catalogue.
|
|
185
204
|
- **Three item kinds, one scanner.** `core/catalog.scan_dir` indexes `skill`
|
|
186
205
|
(SKILL.md), `rule` (.mdc/.cursorrules/.windsurfrules/.clinerules), and
|
|
187
206
|
`workflow` (commands/agents/workflows Markdown). **All three install**, and
|
|
@@ -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.4'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 4)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -163,16 +163,35 @@ def highlight_positions(query: str, text: str) -> set[int]:
|
|
|
163
163
|
#: (`rule`, 47 distinct) is already the pathological case — a bigger one is a
|
|
164
164
|
#: registry doing something strange, not a user waiting to be helped.
|
|
165
165
|
_FUZZY_BUCKET_CAP = 80
|
|
166
|
+
# Bucket name reserved for rows keyed by content digest. A NUL can't occur in a
|
|
167
|
+
# slugified skill name, so a digested row can never share a fuzzy bucket with a
|
|
168
|
+
# real one — and the fuzzy pass skips this bucket outright, because "95% similar"
|
|
169
|
+
# is a question about prose and asking it of two hex digests is meaningless.
|
|
170
|
+
_DIGEST_SIG = "\x00digest"
|
|
166
171
|
|
|
167
172
|
|
|
168
173
|
def _sig(entry: dict) -> tuple[str, str]:
|
|
169
|
-
"""Identity of a row for dedupe:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
the
|
|
174
|
+
"""Identity of a row for dedupe: the scanner's content digest when it has
|
|
175
|
+
one, else name plus description, normalised.
|
|
176
|
+
|
|
177
|
+
The digest is the right key and the pair is a fallback, not a peer. Keying
|
|
178
|
+
on name+description alone over-collapses: on a real 60,047-entry catalogue
|
|
179
|
+
it merges **3,383 clusters** the digest keeps apart — items that share a
|
|
180
|
+
name and a description while carrying genuinely different prose, one of
|
|
181
|
+
which then becomes unreachable in the browser. It is still the only key
|
|
182
|
+
available for a row from a cache written before `catalog.CACHE_FORMAT`, so
|
|
183
|
+
it stays.
|
|
184
|
+
|
|
185
|
+
Digested and undigested rows can never merge into each other: the two keys
|
|
186
|
+
live in different halves of the tuple, so an unknown is only ever equal to
|
|
187
|
+
another unknown with the same visible metadata.
|
|
188
|
+
|
|
189
|
+
Keying on the name alone was never an option — `code-reviewer` is 75 rows
|
|
190
|
+
with **42 distinct descriptions** on a real catalogue.
|
|
175
191
|
"""
|
|
192
|
+
content = str(entry.get("content", "")).strip()
|
|
193
|
+
if content:
|
|
194
|
+
return (_DIGEST_SIG, content)
|
|
176
195
|
return (str(entry.get("name", "")).strip().lower(),
|
|
177
196
|
str(entry.get("description", "")).strip().lower())
|
|
178
197
|
|
|
@@ -208,6 +227,8 @@ def dedupe(entries, threshold: float = 0.95) -> list[tuple[dict, int]]:
|
|
|
208
227
|
# with different names are different skills however similar the prose.
|
|
209
228
|
by_name: dict[str, list] = {}
|
|
210
229
|
for sig in order:
|
|
230
|
+
if sig[0] == _DIGEST_SIG:
|
|
231
|
+
continue # exact content already decided; see _DIGEST_SIG
|
|
211
232
|
by_name.setdefault(sig[0], []).append(sig)
|
|
212
233
|
absorbed: set[tuple[str, str]] = set()
|
|
213
234
|
for sigs in by_name.values():
|
|
@@ -17,6 +17,7 @@ that ship in the same GitHub registries:
|
|
|
17
17
|
"""
|
|
18
18
|
from __future__ import annotations
|
|
19
19
|
|
|
20
|
+
import hashlib
|
|
20
21
|
import json
|
|
21
22
|
import operator
|
|
22
23
|
import os
|
|
@@ -26,6 +27,14 @@ from pathlib import Path
|
|
|
26
27
|
from ..errors import BoostError
|
|
27
28
|
from . import frontmatter, gitutil, paths, registry, util
|
|
28
29
|
|
|
30
|
+
# Bumped whenever a scan starts recording something the previous scan did not,
|
|
31
|
+
# so 460 caches on a real machine invalidate on read instead of needing a
|
|
32
|
+
# re-tap. `catalogbundle.BUNDLE_FORMAT` and `rag.INDEX_VERSION` self-version for
|
|
33
|
+
# the same reason; the tap cache was the one derived artifact that did not, and
|
|
34
|
+
# without it there was no way to ship a new entry field at all.
|
|
35
|
+
# 1 -- entries carry `content` (see `_content_digest`)
|
|
36
|
+
CACHE_FORMAT = 1
|
|
37
|
+
|
|
29
38
|
KIND_SKILL = "skill"
|
|
30
39
|
KIND_RULE = "rule"
|
|
31
40
|
KIND_WORKFLOW = "workflow"
|
|
@@ -61,6 +70,36 @@ def _description(meta: dict, body: str) -> str:
|
|
|
61
70
|
return ""
|
|
62
71
|
|
|
63
72
|
|
|
73
|
+
def _content_digest(name: str, description: str, body: str) -> str:
|
|
74
|
+
"""Content identity for an item: what it *is*, independent of where it sits.
|
|
75
|
+
|
|
76
|
+
Deliberately not the file bytes and not the body alone. The text hashed here
|
|
77
|
+
is exactly what :func:`rag.read_body` assembles — ``name``, ``description``,
|
|
78
|
+
then the frontmatter-stripped body — because that is the string boost
|
|
79
|
+
already treats as an item's content everywhere it clusters copies, and two
|
|
80
|
+
identity keys that *nearly* agree are worse than one.
|
|
81
|
+
|
|
82
|
+
Measured over a real 460-tap install (60,047 entries), against the two
|
|
83
|
+
alternatives that look reasonable:
|
|
84
|
+
|
|
85
|
+
name+description+body 41,051 clusters 0 span >1 name <- this
|
|
86
|
+
body only 40,372 clusters 259 span >1 name
|
|
87
|
+
name+description 37,668 clusters 2 span >1 name
|
|
88
|
+
|
|
89
|
+
Body-only merges 259 clusters that span different names — the
|
|
90
|
+
``admin-interface-rule`` collision #366 fixed, where one registry ships two
|
|
91
|
+
unrelated rules under one name. Metadata-only over-collapses in the other
|
|
92
|
+
direction: 3,383 clusters of items that share a name and description while
|
|
93
|
+
carrying genuinely different prose. Including all three separates both.
|
|
94
|
+
|
|
95
|
+
Truncated to 16 hex chars to match the index, which stores one of these per
|
|
96
|
+
document; the full digest doubles the index for collision odds that are
|
|
97
|
+
already negligible at 60k items.
|
|
98
|
+
"""
|
|
99
|
+
text = "%s\n%s\n%s" % (name, description, body)
|
|
100
|
+
return hashlib.sha256(text.strip().encode("utf-8", "replace")).hexdigest()[:16]
|
|
101
|
+
|
|
102
|
+
|
|
64
103
|
def _make_entry(root: Path, defining_file: Path, kind: str, default_name: str,
|
|
65
104
|
tap_name: str, curated: bool, meta: dict, body: str) -> dict:
|
|
66
105
|
name = str(meta.get("name") or "").strip() or default_name
|
|
@@ -80,6 +119,11 @@ def _make_entry(root: Path, defining_file: Path, kind: str, default_name: str,
|
|
|
80
119
|
"rel_dir": item_dir.relative_to(root).as_posix() if item_dir != root else ".",
|
|
81
120
|
"skill_md": defining_file.relative_to(root).as_posix(),
|
|
82
121
|
"meta": meta,
|
|
122
|
+
# Free here and nowhere else: the body is already read, parsed and about
|
|
123
|
+
# to be discarded. `rag` used to re-open all 60k files at index time to
|
|
124
|
+
# recompute exactly this (~14 s on a real install) because the entry did
|
|
125
|
+
# not carry it.
|
|
126
|
+
"content": _content_digest(slug, description, body),
|
|
83
127
|
# Lowercased substring-search blob, flattened once at index time so
|
|
84
128
|
# search() never re-walks the frontmatter per query (see _search_blob).
|
|
85
129
|
"search_blob": _search_blob(slug, description, meta),
|
|
@@ -176,6 +220,7 @@ def rebuild_tap(tap: registry.Tap) -> list[dict]:
|
|
|
176
220
|
tap.cache_file.write_text(json.dumps({
|
|
177
221
|
"tap": tap.name,
|
|
178
222
|
"url": tap.url,
|
|
223
|
+
"format": CACHE_FORMAT,
|
|
179
224
|
"generated": util.now_iso(),
|
|
180
225
|
"commit": gitutil.head_commit(tap.path),
|
|
181
226
|
"skills": entries,
|
|
@@ -192,12 +237,21 @@ def rebuild_tap(tap: registry.Tap) -> list[dict]:
|
|
|
192
237
|
# the cached list is shared by reference (matching the index cache). Keying on
|
|
193
238
|
# nanosecond mtime + size catches rewrites a bare second-resolution mtime would
|
|
194
239
|
# miss.
|
|
195
|
-
_ENTRY_CACHE: dict[str, tuple[tuple[int, int], list[dict]]] = {}
|
|
240
|
+
_ENTRY_CACHE: dict[str, tuple[tuple[int, int], list[dict], bool]] = {}
|
|
241
|
+
|
|
196
242
|
|
|
243
|
+
def _cached_tap(tap: registry.Tap) -> tuple[list[dict], bool] | None:
|
|
244
|
+
"""``(skills, is_current)`` for a tap's cache, or ``None`` to force a
|
|
245
|
+
rebuild (file missing, unreadable, or corrupt JSON).
|
|
197
246
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
247
|
+
``is_current`` says whether the cache was written by this scanner. It is
|
|
248
|
+
reported rather than acted on here because the right response depends on
|
|
249
|
+
something this function cannot see: whether the clone is still on disk to
|
|
250
|
+
rescan. A stale cache is not *wrong* — it is missing fields its consumers
|
|
251
|
+
have since learned to want, and every one of them degrades cleanly without
|
|
252
|
+
them — so discarding it unconditionally would trade a missing digest for
|
|
253
|
+
missing entries, which is the worse failure.
|
|
254
|
+
"""
|
|
201
255
|
p = tap.cache_file
|
|
202
256
|
key = str(p)
|
|
203
257
|
try:
|
|
@@ -208,14 +262,16 @@ def _cached_tap(tap: registry.Tap) -> list[dict] | None:
|
|
|
208
262
|
stamp = (st.st_mtime_ns, st.st_size)
|
|
209
263
|
cached = _ENTRY_CACHE.get(key)
|
|
210
264
|
if cached is not None and cached[0] == stamp:
|
|
211
|
-
return cached[1]
|
|
265
|
+
return cached[1], cached[2]
|
|
212
266
|
try:
|
|
213
|
-
|
|
267
|
+
data = json.loads(p.read_text(encoding="utf-8"))
|
|
214
268
|
except (json.JSONDecodeError, OSError):
|
|
215
269
|
_ENTRY_CACHE.pop(key, None)
|
|
216
270
|
return None
|
|
217
|
-
|
|
218
|
-
|
|
271
|
+
skills = data.get("skills", [])
|
|
272
|
+
current = data.get("format") == CACHE_FORMAT
|
|
273
|
+
_ENTRY_CACHE[key] = (stamp, skills, current)
|
|
274
|
+
return skills, current
|
|
219
275
|
|
|
220
276
|
|
|
221
277
|
def load_tap(tap: registry.Tap, rebuild: bool = False) -> list[dict]:
|
|
@@ -223,11 +279,20 @@ def load_tap(tap: registry.Tap, rebuild: bool = False) -> list[dict]:
|
|
|
223
279
|
|
|
224
280
|
`rebuild=True` or a missing/corrupt cache forces a rescan; an
|
|
225
281
|
uncloned tap yields `[]`.
|
|
282
|
+
|
|
283
|
+
A cache written by an older scanner is rescanned *when the clone is still
|
|
284
|
+
there to rescan* — that is what backfills a new entry field across every tap
|
|
285
|
+
on a machine (460 of them on a real install) without asking anyone to re-tap.
|
|
286
|
+
When the clone is gone the stale entries are served as they are: consumers
|
|
287
|
+
all degrade cleanly on a missing field, so refusing to answer would cost the
|
|
288
|
+
user their catalogue to buy a digest.
|
|
226
289
|
"""
|
|
227
290
|
if not rebuild:
|
|
228
291
|
cached = _cached_tap(tap)
|
|
229
292
|
if cached is not None:
|
|
230
|
-
|
|
293
|
+
skills, current = cached
|
|
294
|
+
if current or not tap.is_cloned:
|
|
295
|
+
return skills
|
|
231
296
|
if tap.is_cloned:
|
|
232
297
|
return rebuild_tap(tap)
|
|
233
298
|
return []
|
|
@@ -487,12 +552,48 @@ def resolve_one(name: str, path: str | None = None) -> dict:
|
|
|
487
552
|
% (bare, len(matches), taps[0], paths),
|
|
488
553
|
hint="that registry ships one name twice — pick one with "
|
|
489
554
|
"`--path <one of the above>`, and raise it with the tap")
|
|
555
|
+
# Several taps, one thing. Registries mirror each other constantly, so
|
|
556
|
+
# the common cross-tap collision is N byte-identical copies of one
|
|
557
|
+
# skill — and the within-tap branch above already decided that
|
|
558
|
+
# indistinguishable candidates are boost's problem to resolve, not the
|
|
559
|
+
# user's. Applying the same judgement here removes a dead end (a
|
|
560
|
+
# mirrored skill could not be installed unqualified at all) without
|
|
561
|
+
# touching the genuine-ambiguity error, which still fires whenever the
|
|
562
|
+
# copies actually differ.
|
|
563
|
+
best = _same_thing(matches)
|
|
564
|
+
if best is not None:
|
|
565
|
+
return best
|
|
490
566
|
raise BoostError(
|
|
491
567
|
"%r exists in multiple taps: %s" % (name, ", ".join(taps)),
|
|
492
568
|
hint="qualify it, e.g. `%s:%s`" % (taps[0], bare))
|
|
493
569
|
return matches[0]
|
|
494
570
|
|
|
495
571
|
|
|
572
|
+
def _same_thing(matches: list[dict]) -> dict | None:
|
|
573
|
+
"""The copy to install when every candidate is the same content, else None.
|
|
574
|
+
|
|
575
|
+
Returns None unless *every* candidate carries a digest and they all agree.
|
|
576
|
+
A missing digest is an unknown, never a match: assuming two unknowns equal
|
|
577
|
+
would silently install one skill when the user asked about another, which is
|
|
578
|
+
strictly worse than the error it would be replacing.
|
|
579
|
+
|
|
580
|
+
Ranked by :func:`rag.source_rank` — the user's own ``curated`` flag first,
|
|
581
|
+
the shipped registry confidence second — which exists for exactly this
|
|
582
|
+
decision and is what `dedupe_by_content` already uses to choose between
|
|
583
|
+
identical bodies in search results. Ties break on ``(tap, rel_dir)`` so the
|
|
584
|
+
pick cannot vary between runs.
|
|
585
|
+
"""
|
|
586
|
+
digests = {e.get("content") for e in matches}
|
|
587
|
+
if len(digests) != 1 or not next(iter(digests)):
|
|
588
|
+
return None
|
|
589
|
+
# Local import: `rag` imports this module, so the edge only exists at call
|
|
590
|
+
# time. Same shape as `store.install`'s deferred `gitutil` import.
|
|
591
|
+
from . import rag
|
|
592
|
+
return min(matches, key=lambda e: (rag.source_rank(e),
|
|
593
|
+
str(e.get("tap", "")),
|
|
594
|
+
str(e.get("rel_dir", ""))))
|
|
595
|
+
|
|
596
|
+
|
|
496
597
|
def _meta_text(meta) -> str:
|
|
497
598
|
"""Lowercased, space-joined flatten of a frontmatter dict for substring
|
|
498
599
|
search. Cheaper than ``json.dumps(meta).lower()`` — which built and threw
|
|
@@ -580,23 +580,47 @@ def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
|
|
|
580
580
|
for e in entries:
|
|
581
581
|
for ci, text in enumerate(_chunk_texts(e, tap_paths)):
|
|
582
582
|
rows.append((e, ci, text))
|
|
583
|
+
|
|
584
|
+
# Embed each DISTINCT text once. Registries mirror each other, so one text
|
|
585
|
+
# arrives many times in a single build: 42.9% of 750,416 chunks on a real
|
|
586
|
+
# 460-tap install are repeats, worst case 1,464 identical copies. The
|
|
587
|
+
# provider is deterministic, so the copies were being bought at full price
|
|
588
|
+
# for a byte-identical vector — and `retrieve_any` runs `dedupe_by_content`
|
|
589
|
+
# on every retrieval path, so they were discarded before reaching a result
|
|
590
|
+
# slot. Insertion below is still per row, because `chunks.tap` is what
|
|
591
|
+
# scopes tap deletion and collapsing rows would strand a tap's vectors.
|
|
592
|
+
order: list[str] = []
|
|
593
|
+
seen: set[str] = set()
|
|
594
|
+
for _e, _ci, text in rows:
|
|
595
|
+
if text not in seen:
|
|
596
|
+
seen.add(text)
|
|
597
|
+
order.append(text)
|
|
598
|
+
|
|
599
|
+
vec_of: dict[str, object] = {}
|
|
600
|
+
for start in range(0, len(order), _BATCH):
|
|
601
|
+
batch = order[start:start + _BATCH]
|
|
602
|
+
vecs = embed.embed(batch, input_type="document")
|
|
603
|
+
if not vecs or len(vecs) != len(batch):
|
|
604
|
+
continue # taps are attributed per row below, not per batch
|
|
605
|
+
vec_of.update(zip(batch, vecs, strict=True))
|
|
606
|
+
|
|
583
607
|
added = 0
|
|
584
608
|
failed_taps: set = set()
|
|
585
|
-
for
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
609
|
+
for e, ci, text in rows:
|
|
610
|
+
vec = vec_of.get(text)
|
|
611
|
+
if vec is None:
|
|
612
|
+
# Every tap owning a copy of a text the provider rejected, not just
|
|
613
|
+
# whichever copy happened to sit in the failed batch.
|
|
614
|
+
failed_taps.add(e["tap"])
|
|
590
615
|
continue
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
added += 1
|
|
616
|
+
cur = con.execute(
|
|
617
|
+
"INSERT INTO chunks (name, tap, path, kind, cix, snip) "
|
|
618
|
+
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
619
|
+
(e["name"], e["tap"], e["skill_md"],
|
|
620
|
+
e.get("kind", "skill"), ci, text[:200].strip()))
|
|
621
|
+
con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
|
|
622
|
+
(cur.lastrowid, mod.serialize_float32(vec)))
|
|
623
|
+
added += 1
|
|
600
624
|
return added, failed_taps
|
|
601
625
|
|
|
602
626
|
|
|
@@ -222,9 +222,13 @@ def _make_docs(entries: list[dict], tap_paths: dict[str, Path]) -> list[dict]:
|
|
|
222
222
|
docs: list[dict] = []
|
|
223
223
|
for e in entries:
|
|
224
224
|
body = read_body(e, tap_paths)
|
|
225
|
-
#
|
|
226
|
-
#
|
|
227
|
-
|
|
225
|
+
# The scanner already hashed this exact text (`catalog._content_digest`
|
|
226
|
+
# assembles name + description + body, the same string `read_body`
|
|
227
|
+
# returns), so an entry from a current cache hands the value over. The
|
|
228
|
+
# fallback is not dead code: a cache written before CACHE_FORMAT, or an
|
|
229
|
+
# entry synthesised by a caller rather than scanned, still has to index.
|
|
230
|
+
digest = e.get("content") or hashlib.sha256(
|
|
231
|
+
body.strip().encode("utf-8", "replace")).hexdigest()[:16]
|
|
228
232
|
tf: dict[str, int] = defaultdict(int)
|
|
229
233
|
for tok in tokenize(surface(e) + "\n" + body):
|
|
230
234
|
tf[tok] += 1
|
|
@@ -204,6 +204,7 @@ docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md
|
|
|
204
204
|
docs/roadmap/items/build-provenance-slsa-attestations.md
|
|
205
205
|
docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md
|
|
206
206
|
docs/roadmap/items/capability-manifest-and-least-privilege-policy.md
|
|
207
|
+
docs/roadmap/items/catalogue-entries-carry-no-content-identity.md
|
|
207
208
|
docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md
|
|
208
209
|
docs/roadmap/items/chat-command-grounded-conversational-search.md
|
|
209
210
|
docs/roadmap/items/ci-job-timeout-minutes.md
|
|
@@ -434,6 +435,7 @@ docs/roadmap/items/workspace-scope-install.md
|
|
|
434
435
|
docs/roadmap/items/zip-strict-audit.md
|
|
435
436
|
docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md
|
|
436
437
|
docs/roadmap/items/zizmor-pin-is-a-yanked-release.md
|
|
438
|
+
docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md
|
|
437
439
|
evals/README.md
|
|
438
440
|
evals/__init__.py
|
|
439
441
|
evals/baseline.json
|
|
@@ -596,10 +598,12 @@ tests/unit/test_complete.py
|
|
|
596
598
|
tests/unit/test_complete_rc_block.py
|
|
597
599
|
tests/unit/test_config.py
|
|
598
600
|
tests/unit/test_content_dedupe.py
|
|
601
|
+
tests/unit/test_content_identity.py
|
|
599
602
|
tests/unit/test_crash_redaction.py
|
|
600
603
|
tests/unit/test_dedup_trust.py
|
|
601
604
|
tests/unit/test_demo_index.py
|
|
602
605
|
tests/unit/test_dense.py
|
|
606
|
+
tests/unit/test_dense_embed_dedupe.py
|
|
603
607
|
tests/unit/test_dense_fallback.py
|
|
604
608
|
tests/unit/test_dense_fix_hint.py
|
|
605
609
|
tests/unit/test_dense_shard_real_schema.py
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: catalogue-entries-carry-no-content-identity
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Catalog · Correctness
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: 42.9% of 750,416 embedded chunks are duplicates — one was embedded 1,464 times
|
|
11
|
+
order: 116
|
|
12
|
+
owner: feat/catalogue-content-identity
|
|
13
|
+
pr: 526
|
|
14
|
+
title: A catalog entry knew where it came from, never what it was
|
|
15
|
+
---
|
|
16
|
+
<b>boost collapses duplicate copies at both places a user sees them</b> —
|
|
17
|
+
<code>rag.dedupe_by_content</code> for search results, <code>resolve_one</code> for install
|
|
18
|
+
resolution — and at neither place it <em>pays</em> for them. A catalog entry carried
|
|
19
|
+
<code>(tap, skill_md)</code>, which is row identity and deliberately strict, but nothing that said
|
|
20
|
+
<em>this is the same thing as that</em>. Every consumer needing content identity therefore derived
|
|
21
|
+
its own, and they disagreed.
|
|
22
|
+
|
|
23
|
+
<b>The bill was measurable.</b> On a real 460-tap install <code>rag_vectors.sqlite</code> is
|
|
24
|
+
<b>3.2 GB</b>, and <b>42.9% of its 750,416 chunks are duplicates</b> — one chunk was
|
|
25
|
+
embedded <b>1,464 times</b>. Those embeddings cost API credits and buy nothing:
|
|
26
|
+
<code>retrieve_any</code> runs <code>dedupe_by_content</code> on every retrieval path, so each
|
|
27
|
+
redundant vector is computed, stored, billed, then discarded before it can reach a result slot.
|
|
28
|
+
|
|
29
|
+
<b>Three keys were in play, and the comment was wrong about which one shipped.</b>
|
|
30
|
+
<code>dedupe_by_content</code>'s docstring says clustering is “on the body, never the name”
|
|
31
|
+
and offers as proof that no cluster spans more than one name. Both are artefacts: the code hashes
|
|
32
|
+
<code>read_body()</code>, which <em>prepends</em> name and description, so zero name-spanning clusters
|
|
33
|
+
is guaranteed rather than measured. Over all 60,047 entries:
|
|
34
|
+
|
|
35
|
+
<b>name + description + body</b> keeps 41,051 clusters and spans more than one name <b>zero</b> times
|
|
36
|
+
· <em>body alone</em> keeps 40,372 but spans more than one name <b>259</b> times, which is the
|
|
37
|
+
<code>admin-interface-rule</code> collision again · <em>name + description</em> keeps 37,668,
|
|
38
|
+
over-collapsing <b>3,383</b> clusters of items that share metadata while carrying different prose.
|
|
39
|
+
|
|
40
|
+
<b>So the entry now carries the digest the code already believed in.</b>
|
|
41
|
+
<code>_make_entry</code> hashes name + description + body at scan time, which is free — the
|
|
42
|
+
body is already read, parsed and about to be discarded, measured at <b>2.04 µs per entry,
|
|
43
|
+
122 ms for the whole corpus</b>. It also <em>removes</em> work: <code>rag</code> was re-opening
|
|
44
|
+
all 60k files at index-build time purely to recompute this. Verified against real data by rescanning
|
|
45
|
+
40 tapped repos and checking all <b>8,564</b> entries against what <code>read_body</code> hashes:
|
|
46
|
+
zero mismatches.
|
|
47
|
+
|
|
48
|
+
<b>Nothing is dropped.</b> Duplicate rows stay in the catalogue, because removing them breaks
|
|
49
|
+
<code>--path</code> disambiguation, typosquat detection, tap-scoped repair in <code>sync_apply</code>,
|
|
50
|
+
the eval harness's exemplar resolution, and the <code>source_rank</code> quality prior. The mark is
|
|
51
|
+
the digest, and it is reversible by rebuilding a cache. The tap cache gained a
|
|
52
|
+
<code>format</code> version to backfill 460 machines' worth of caches on read — it was the one
|
|
53
|
+
derived artifact that could not self-invalidate, which is why no entry field could ever be added
|
|
54
|
+
before. A stale cache whose clone is gone is still served rather than discarded: consumers all
|
|
55
|
+
degrade cleanly on a missing digest, so refusing to answer would cost a user their catalogue to buy
|
|
56
|
+
a hash.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>254</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -4023,6 +4023,59 @@ storage cleanup.</p>
|
|
|
4023
4023
|
<span class="m">458 taps held 12 GB to index 1.9 GB of Markdown</span>
|
|
4024
4024
|
</div>
|
|
4025
4025
|
</article>
|
|
4026
|
+
|
|
4027
|
+
<article class="cap rcard" id="catalogue-entries-carry-no-content-identity">
|
|
4028
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Catalog · Correctness</span></div>
|
|
4029
|
+
<h3>A catalog entry knew where it came from, never what it was</h3>
|
|
4030
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
4031
|
+
<p><b>boost collapses duplicate copies at both places a user sees them</b> —
|
|
4032
|
+
<code>rag.dedupe_by_content</code> for search results, <code>resolve_one</code> for install
|
|
4033
|
+
resolution — and at neither place it <em>pays</em> for them. A catalog entry carried
|
|
4034
|
+
<code>(tap, skill_md)</code>, which is row identity and deliberately strict, but nothing that said
|
|
4035
|
+
<em>this is the same thing as that</em>. Every consumer needing content identity therefore derived
|
|
4036
|
+
its own, and they disagreed.
|
|
4037
|
+
|
|
4038
|
+
<b>The bill was measurable.</b> On a real 460-tap install <code>rag_vectors.sqlite</code> is
|
|
4039
|
+
<b>3.2 GB</b>, and <b>42.9% of its 750,416 chunks are duplicates</b> — one chunk was
|
|
4040
|
+
embedded <b>1,464 times</b>. Those embeddings cost API credits and buy nothing:
|
|
4041
|
+
<code>retrieve_any</code> runs <code>dedupe_by_content</code> on every retrieval path, so each
|
|
4042
|
+
redundant vector is computed, stored, billed, then discarded before it can reach a result slot.
|
|
4043
|
+
|
|
4044
|
+
<b>Three keys were in play, and the comment was wrong about which one shipped.</b>
|
|
4045
|
+
<code>dedupe_by_content</code>'s docstring says clustering is “on the body, never the name”
|
|
4046
|
+
and offers as proof that no cluster spans more than one name. Both are artefacts: the code hashes
|
|
4047
|
+
<code>read_body()</code>, which <em>prepends</em> name and description, so zero name-spanning clusters
|
|
4048
|
+
is guaranteed rather than measured. Over all 60,047 entries:
|
|
4049
|
+
|
|
4050
|
+
<b>name + description + body</b> keeps 41,051 clusters and spans more than one name <b>zero</b> times
|
|
4051
|
+
· <em>body alone</em> keeps 40,372 but spans more than one name <b>259</b> times, which is the
|
|
4052
|
+
<code>admin-interface-rule</code> collision again · <em>name + description</em> keeps 37,668,
|
|
4053
|
+
over-collapsing <b>3,383</b> clusters of items that share metadata while carrying different prose.
|
|
4054
|
+
|
|
4055
|
+
<b>So the entry now carries the digest the code already believed in.</b>
|
|
4056
|
+
<code>_make_entry</code> hashes name + description + body at scan time, which is free — the
|
|
4057
|
+
body is already read, parsed and about to be discarded, measured at <b>2.04 µs per entry,
|
|
4058
|
+
122 ms for the whole corpus</b>. It also <em>removes</em> work: <code>rag</code> was re-opening
|
|
4059
|
+
all 60k files at index-build time purely to recompute this. Verified against real data by rescanning
|
|
4060
|
+
40 tapped repos and checking all <b>8,564</b> entries against what <code>read_body</code> hashes:
|
|
4061
|
+
zero mismatches.
|
|
4062
|
+
|
|
4063
|
+
<b>Nothing is dropped.</b> Duplicate rows stay in the catalogue, because removing them breaks
|
|
4064
|
+
<code>--path</code> disambiguation, typosquat detection, tap-scoped repair in <code>sync_apply</code>,
|
|
4065
|
+
the eval harness's exemplar resolution, and the <code>source_rank</code> quality prior. The mark is
|
|
4066
|
+
the digest, and it is reversible by rebuilding a cache. The tap cache gained a
|
|
4067
|
+
<code>format</code> version to backfill 460 machines' worth of caches on read — it was the one
|
|
4068
|
+
derived artifact that could not self-invalidate, which is why no entry field could ever be added
|
|
4069
|
+
before. A stale cache whose clone is gone is still served rather than discarded: consumers all
|
|
4070
|
+
degrade cleanly on a missing digest, so refusing to answer would cost a user their catalogue to buy
|
|
4071
|
+
a hash.</p></details>
|
|
4072
|
+
<div class="meta">
|
|
4073
|
+
<span class="m">Complexity <b>M</b></span>
|
|
4074
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
4075
|
+
<span class="m">Wow <b class="wow">★★★★★</b></span>
|
|
4076
|
+
<span class="m">42.9% of 750,416 embedded chunks are duplicates — one was embedded 1,464 times</span>
|
|
4077
|
+
</div>
|
|
4078
|
+
</article>
|
|
4026
4079
|
<!-- /ROADMAP:cards -->
|
|
4027
4080
|
|
|
4028
4081
|
</div>
|