boost-skill-cli 1.0.446__tar.gz → 1.0.448__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.0.446/boost_skill_cli.egg-info → boost_skill_cli-1.0.448}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/dense.py +73 -13
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
- boost_skill_cli-1.0.448/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +78 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap.html +76 -1
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/eval_corpus.py +13 -1
- boost_skill_cli-1.0.448/tests/unit/test_dense_shard_real_schema.py +155 -0
- boost_skill_cli-1.0.448/tests/unit/test_dense_shard_unreadable_vectors.py +109 -0
- boost_skill_cli-1.0.448/tests/unit/test_shards_matrix.py +136 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/visual/package-lock.json +8 -8
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/visual/package.json +1 -1
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.gitattributes +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.gitignore +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/.vale.ini +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/LICENSE +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/Makefile +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/README.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/codecov.yml +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/index.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/langchain.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/README.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/examples/README.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/index.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/noxfile.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/setup.cfg +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/style/README.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/style/boost.css +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/style/boost.js +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/style/demo.html +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.446 → boost_skill_cli-1.0.448}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.448'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 448)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -17,6 +17,7 @@ import json
|
|
|
17
17
|
import sqlite3
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
|
|
20
|
+
from ..errors import BoostError
|
|
20
21
|
from . import catalog, embed, paths
|
|
21
22
|
from .rag import Hit, chunk, entry_key, read_body
|
|
22
23
|
|
|
@@ -385,29 +386,57 @@ def export_shard(tap: str) -> dict:
|
|
|
385
386
|
the embedding space that produced them, so provider/model/dim have to travel
|
|
386
387
|
with the rows, and the registry commit has to travel too or a stale shard
|
|
387
388
|
would be indistinguishable from a current one.
|
|
389
|
+
|
|
390
|
+
Raises :class:`BoostError` when the rows are present and unreadable, which is
|
|
391
|
+
a different problem from having none — see below.
|
|
388
392
|
"""
|
|
389
|
-
# Plain sqlite3, NOT _connect: exporting reads `chunks`, `meta` and the
|
|
390
|
-
# stored embedding blobs, all ordinary tables. Routing through _connect
|
|
391
|
-
# would make export impossible without the sqlite-vec extension — the same
|
|
392
|
-
# trap `_recorded_meta` documents — and a machine that built vectors and
|
|
393
|
-
# then dropped the extra is exactly the one whose shard is worth having.
|
|
394
393
|
if not db_path().exists():
|
|
395
394
|
return {"tap": tap, "chunks": []}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
395
|
+
# `vec_chunks` is a vec0 VIRTUAL table, so reading an embedding needs the
|
|
396
|
+
# extension loaded: on a plain connection the join below raises `no such
|
|
397
|
+
# module: vec0`, every time, for every tap. An earlier revision opened
|
|
398
|
+
# plainly on the theory that export "reads ordinary tables" — true of
|
|
399
|
+
# `chunks` and `meta`, false of the one relation holding the vectors — and
|
|
400
|
+
# the resulting failure was swallowed into an empty shard. That is why no
|
|
401
|
+
# scheduled `shards` run has ever produced an artifact. Fall back to a plain
|
|
402
|
+
# connection anyway: it still serves a store whose vectors live in an
|
|
403
|
+
# ordinary table, and it is what makes the distinction below observable
|
|
404
|
+
# rather than an exception from the connect call.
|
|
405
|
+
con = _connect()
|
|
406
|
+
if con is None:
|
|
407
|
+
try:
|
|
408
|
+
con = sqlite3.connect(str(db_path()))
|
|
409
|
+
except sqlite3.Error:
|
|
410
|
+
return {"tap": tap, "chunks": []}
|
|
400
411
|
try:
|
|
401
412
|
meta = _read_meta(con)
|
|
402
413
|
commits = meta.get("commits")
|
|
403
414
|
commit = ""
|
|
404
415
|
if isinstance(commits, dict):
|
|
405
416
|
commit = str(commits.get(tap.replace("/", "__")) or "")
|
|
417
|
+
# `chunks` alone, first, because it is an ordinary table and therefore
|
|
418
|
+
# always readable. It answers the question the caller's error message
|
|
419
|
+
# depends on: are there rows for this tap at all?
|
|
420
|
+
expected = _tap_chunk_count(con, tap)
|
|
406
421
|
chunks = []
|
|
407
|
-
|
|
422
|
+
try:
|
|
423
|
+
rows = con.execute(
|
|
408
424
|
"SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding "
|
|
409
425
|
"FROM chunks c JOIN vec_chunks v ON v.rowid = c.id "
|
|
410
|
-
"WHERE c.tap = ? ORDER BY c.id", (tap,))
|
|
426
|
+
"WHERE c.tap = ? ORDER BY c.id", (tap,)).fetchall()
|
|
427
|
+
except sqlite3.Error as exc:
|
|
428
|
+
# Only a tap that HAS chunks can have unreadable ones. With none,
|
|
429
|
+
# the vector relation not resolving says nothing about this tap —
|
|
430
|
+
# it is the ordinary "nothing built here" case, and the caller's
|
|
431
|
+
# "build them first" is the right answer.
|
|
432
|
+
if not expected:
|
|
433
|
+
return {"tap": tap, "chunks": []}
|
|
434
|
+
raise _unreadable_vectors(tap, expected, exc) from exc
|
|
435
|
+
if expected and not rows:
|
|
436
|
+
# The join resolved but produced nothing for a tap that has chunks:
|
|
437
|
+
# the vector rows are gone or unlinked. Still not "never built".
|
|
438
|
+
raise _unreadable_vectors(tap, expected, None)
|
|
439
|
+
for row in rows:
|
|
411
440
|
name, ctap, path, kind, cix, snip, emb = row
|
|
412
441
|
chunks.append({
|
|
413
442
|
"name": name, "tap": ctap, "path": path, "kind": kind,
|
|
@@ -420,12 +449,43 @@ def export_shard(tap: str) -> dict:
|
|
|
420
449
|
"provider": meta.get("provider"), "model": meta.get("model"),
|
|
421
450
|
"dim": meta.get("dim"), "version": INDEX_VERSION,
|
|
422
451
|
"chunks": chunks}
|
|
423
|
-
except sqlite3.Error:
|
|
424
|
-
return {"tap": tap, "chunks": []}
|
|
425
452
|
finally:
|
|
426
453
|
con.close()
|
|
427
454
|
|
|
428
455
|
|
|
456
|
+
def _tap_chunk_count(con: sqlite3.Connection, tap: str) -> int:
|
|
457
|
+
"""How many chunk rows this tap has, or 0 when `chunks` is unreadable.
|
|
458
|
+
|
|
459
|
+
Deliberately forgiving: a store with no `chunks` table has nothing built,
|
|
460
|
+
which is the ordinary empty case rather than the corrupt one.
|
|
461
|
+
"""
|
|
462
|
+
try:
|
|
463
|
+
row = con.execute("SELECT COUNT(*) FROM chunks WHERE tap = ?",
|
|
464
|
+
(tap,)).fetchone()
|
|
465
|
+
except sqlite3.Error:
|
|
466
|
+
return 0
|
|
467
|
+
return int(row[0]) if row else 0
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def _unreadable_vectors(tap: str, expected: int,
|
|
471
|
+
exc: sqlite3.Error | None) -> BoostError:
|
|
472
|
+
"""The error for "the rows are there, and this process cannot read them".
|
|
473
|
+
|
|
474
|
+
Kept apart from the empty case on purpose. Both used to surface as `no
|
|
475
|
+
vectors for <tap>` with the hint `build them first with reindex --dense` —
|
|
476
|
+
advice that is correct for an unbuilt store and a dead end for this one,
|
|
477
|
+
because `reindex --dense` is what wrote the rows the message says are
|
|
478
|
+
missing. Two scheduled `shards` runs died against that loop.
|
|
479
|
+
"""
|
|
480
|
+
detail = ": %s" % exc if exc is not None else ""
|
|
481
|
+
return BoostError(
|
|
482
|
+
"%s has %d embedded chunk%s but its vectors cannot be read%s"
|
|
483
|
+
% (tap, expected, "" if expected == 1 else "s", detail),
|
|
484
|
+
hint="reading vectors needs the sqlite-vec extension — install the "
|
|
485
|
+
"`rag` extra (`pip install 'boost-skill-cli[rag]'`); the rows "
|
|
486
|
+
"themselves are intact, so no re-embedding is required")
|
|
487
|
+
|
|
488
|
+
|
|
429
489
|
def import_shard(shard: dict, commit: str) -> tuple[bool, str]:
|
|
430
490
|
"""Merge a prebuilt shard into this machine's store. ``(ok, reason)``.
|
|
431
491
|
|
|
@@ -385,6 +385,7 @@ docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md
|
|
|
385
385
|
docs/roadmap/items/serve-404-reflected-the-request.md
|
|
386
386
|
docs/roadmap/items/serve-is-a-searchable-catalogue.md
|
|
387
387
|
docs/roadmap/items/serve-py-traversal-guards-untested.md
|
|
388
|
+
docs/roadmap/items/shards-pipeline-never-produced-a-shard.md
|
|
388
389
|
docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
|
|
389
390
|
docs/roadmap/items/single-imperative-rule-extractor.md
|
|
390
391
|
docs/roadmap/items/single-tech-stack-prober.md
|
|
@@ -583,6 +584,8 @@ tests/unit/test_demo_index.py
|
|
|
583
584
|
tests/unit/test_dense.py
|
|
584
585
|
tests/unit/test_dense_fallback.py
|
|
585
586
|
tests/unit/test_dense_fix_hint.py
|
|
587
|
+
tests/unit/test_dense_shard_real_schema.py
|
|
588
|
+
tests/unit/test_dense_shard_unreadable_vectors.py
|
|
586
589
|
tests/unit/test_dense_shards.py
|
|
587
590
|
tests/unit/test_dense_status.py
|
|
588
591
|
tests/unit/test_dependabot_config.py
|
|
@@ -664,6 +667,7 @@ tests/unit/test_secretscan.py
|
|
|
664
667
|
tests/unit/test_selfupdate.py
|
|
665
668
|
tests/unit/test_serve.py
|
|
666
669
|
tests/unit/test_serve_docs.py
|
|
670
|
+
tests/unit/test_shards_matrix.py
|
|
667
671
|
tests/unit/test_smoke_covers_every_command.py
|
|
668
672
|
tests/unit/test_spin.py
|
|
669
673
|
tests/unit/test_stackprobe.py
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: shards-pipeline-never-produced-a-shard
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Build · Bug
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: two scheduled runs, 0 artifacts — 40 of 60 jobs tapped a bare SHA, and the other 20 hit an export that cannot work
|
|
11
|
+
order: 105
|
|
12
|
+
owner: fix/shards-pipeline
|
|
13
|
+
pr:
|
|
14
|
+
title: The shards workflow has never once produced a shard
|
|
15
|
+
---
|
|
16
|
+
<code>shards.yml</code> publishes prebuilt dense-vector shards so a keyless user gets semantic search
|
|
17
|
+
without paying to embed the catalogue — measured at <b>~1.2 s/chunk</b> on CPU, 74 minutes for
|
|
18
|
+
743 entries, which is what makes step 2 of the keyless epic a requirement rather than an
|
|
19
|
+
optimisation. It has run twice on its weekly schedule, <b>2026-08-02</b> and <b>2026-08-09</b>, and
|
|
20
|
+
uploaded <b>nothing</b> either time. Two independent bugs, one in the workflow and one in the engine,
|
|
21
|
+
and a scheduled job is exactly where two of those can sit unnoticed: nobody is waiting on a cron.
|
|
22
|
+
|
|
23
|
+
<b>First bug — the matrix is fields, not rows.</b> A <code>tests/eval/taps.txt</code> row is
|
|
24
|
+
<code>owner/repo <40-char sha> <entry count></code>, and the plan step built its matrix
|
|
25
|
+
with <code>grep -v '^#' tests/eval/taps.txt | tr '\n' ' '</code> and then split on whitespace. That
|
|
26
|
+
does not split the file into rows, it splits it into <b>fields</b>: twenty registries became a
|
|
27
|
+
<b>sixty</b>-entry matrix — twenty repos, twenty bare SHAs and twenty integers, each dispatched to a
|
|
28
|
+
job that ran <code>boost tap</code> on it. The run is full of <code>build (18)</code>,
|
|
29
|
+
<code>build (1616)</code> and
|
|
30
|
+
<code>build (b29e7cf65e5cb78a5ac33d582270551bc74a14eb)</code>. Two thirds of the fleet could never
|
|
31
|
+
do anything but fail.
|
|
32
|
+
|
|
33
|
+
<code>scripts/eval_corpus.parse_taps</code> already parses this format correctly and is already
|
|
34
|
+
tested — the workflow had reimplemented it in one line of shell and got it wrong. It now calls
|
|
35
|
+
<code>--list-repos</code>, a new flag that prints one name per line, so the row/field distinction is
|
|
36
|
+
made once in tested Python instead of re-decided in <code>bash</code>. Deliberately <i>not</i>
|
|
37
|
+
<code>--list</code>, which also prints the SHA and count: a caller that splits <i>that</i> on
|
|
38
|
+
whitespace reproduces the bug exactly.
|
|
39
|
+
|
|
40
|
+
<b>Second bug — the export cannot succeed, on any machine.</b> The twenty real registries got past
|
|
41
|
+
<code>tap and embed</code> and died in <code>export the shard</code> with
|
|
42
|
+
<code>no vectors for 'anthropics/skills'</code>, whose hint reads <i>build them first with
|
|
43
|
+
<code>boost reindex --dense</code></i> — the step that had just run, green, in the line above.
|
|
44
|
+
<code>dense.export_shard</code> opened the store with a <b>plain</b> <code>sqlite3</code> connection
|
|
45
|
+
on the stated theory that it "reads <code>chunks</code>, <code>meta</code> and the stored blobs, all
|
|
46
|
+
ordinary tables". True of the first two; false of the third. <code>vec_chunks</code> is a
|
|
47
|
+
<b><code>vec0</code> virtual table</b>, so the join raises <code>no such module: vec0</code> — always,
|
|
48
|
+
every tap — and <code>except sqlite3.Error</code> turned that into <code>chunks: []</code>.
|
|
49
|
+
|
|
50
|
+
Proven rather than reasoned: build a store through the real path, reopen it plainly, and the join
|
|
51
|
+
raises <code>OperationalError: no such module: vec0</code>. The comment was an accurate description
|
|
52
|
+
of an intention and an inaccurate one of the code.
|
|
53
|
+
|
|
54
|
+
<b>Why the test suite was no help — the fixture disagreed with production in the one way that
|
|
55
|
+
mattered.</b> Every shard test hand-builds its store with <code>CREATE TABLE vec_chunks</code>, an
|
|
56
|
+
<i>ordinary</i> table, and <code>with_backend</code> patches <code>_connect</code> to a plain
|
|
57
|
+
connection. Both are fair shortcuts for tests about validation. Together they mean no test in that
|
|
58
|
+
file ever met a virtual table, so <b>twenty passing tests coexisted with a feature that had never
|
|
59
|
+
worked</b>. There is even a class named <code>TestWorksWithoutTheExtension</code> asserting the
|
|
60
|
+
false claim — written, its docstring says, after an earlier version shipped broken the opposite way.
|
|
61
|
+
That is the shape to remember: the first fix traded a failure that was loud for one that was silent,
|
|
62
|
+
and the fixture blessed it.
|
|
63
|
+
|
|
64
|
+
<b>Fixed by separating two states the old code collapsed.</b> <code>chunks</code> is an ordinary
|
|
65
|
+
table and always readable, so it can answer "are there rows for this tap at all?" before the join is
|
|
66
|
+
attempted. No rows means the shard is empty and <i>"build them first"</i> is right. Rows present but
|
|
67
|
+
unreadable is a different problem with a different fix, and now says so, naming the
|
|
68
|
+
<code>sqlite-vec</code> extension and stating that <b>no re-embedding is required</b> — the rows are
|
|
69
|
+
intact. Sending someone back to a 74-minute embed to solve a missing dependency is the part that
|
|
70
|
+
cost two runs.
|
|
71
|
+
|
|
72
|
+
<b>Both halves are pinned, and one of them runs without the extra.</b>
|
|
73
|
+
<code>test_dense_shard_real_schema.py</code> builds through <code>_ensure_schema</code> and the real
|
|
74
|
+
<code>vec0</code> table — the only test here that failed before the fix — but it <i>skips</i> without
|
|
75
|
+
<code>sqlite-vec</code>, which would leave a bare runner blind.
|
|
76
|
+
<code>test_dense_shard_unreadable_vectors.py</code> pins the same contract with nothing installed, by
|
|
77
|
+
presenting the store as a plain connection sees it: ordinary tables readable, vector relation not
|
|
78
|
+
resolving. Both were run against the pre-fix code and both go red, so neither is decorative.
|
|
@@ -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>244</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -3791,6 +3791,81 @@ looking is worse than no guard, because the green tick still appears.</p></detai
|
|
|
3791
3791
|
</div>
|
|
3792
3792
|
</article>
|
|
3793
3793
|
|
|
3794
|
+
<article class="cap rcard" id="shards-pipeline-never-produced-a-shard">
|
|
3795
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Build · Bug</span></div>
|
|
3796
|
+
<h3>The shards workflow has never once produced a shard</h3>
|
|
3797
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3798
|
+
<p><code>shards.yml</code> publishes prebuilt dense-vector shards so a keyless user gets semantic search
|
|
3799
|
+
without paying to embed the catalogue — measured at <b>~1.2 s/chunk</b> on CPU, 74 minutes for
|
|
3800
|
+
743 entries, which is what makes step 2 of the keyless epic a requirement rather than an
|
|
3801
|
+
optimisation. It has run twice on its weekly schedule, <b>2026-08-02</b> and <b>2026-08-09</b>, and
|
|
3802
|
+
uploaded <b>nothing</b> either time. Two independent bugs, one in the workflow and one in the engine,
|
|
3803
|
+
and a scheduled job is exactly where two of those can sit unnoticed: nobody is waiting on a cron.
|
|
3804
|
+
|
|
3805
|
+
<b>First bug — the matrix is fields, not rows.</b> A <code>tests/eval/taps.txt</code> row is
|
|
3806
|
+
<code>owner/repo <40-char sha> <entry count></code>, and the plan step built its matrix
|
|
3807
|
+
with <code>grep -v '^#' tests/eval/taps.txt | tr '\n' ' '</code> and then split on whitespace. That
|
|
3808
|
+
does not split the file into rows, it splits it into <b>fields</b>: twenty registries became a
|
|
3809
|
+
<b>sixty</b>-entry matrix — twenty repos, twenty bare SHAs and twenty integers, each dispatched to a
|
|
3810
|
+
job that ran <code>boost tap</code> on it. The run is full of <code>build (18)</code>,
|
|
3811
|
+
<code>build (1616)</code> and
|
|
3812
|
+
<code>build (b29e7cf65e5cb78a5ac33d582270551bc74a14eb)</code>. Two thirds of the fleet could never
|
|
3813
|
+
do anything but fail.
|
|
3814
|
+
|
|
3815
|
+
<code>scripts/eval_corpus.parse_taps</code> already parses this format correctly and is already
|
|
3816
|
+
tested — the workflow had reimplemented it in one line of shell and got it wrong. It now calls
|
|
3817
|
+
<code>--list-repos</code>, a new flag that prints one name per line, so the row/field distinction is
|
|
3818
|
+
made once in tested Python instead of re-decided in <code>bash</code>. Deliberately <i>not</i>
|
|
3819
|
+
<code>--list</code>, which also prints the SHA and count: a caller that splits <i>that</i> on
|
|
3820
|
+
whitespace reproduces the bug exactly.
|
|
3821
|
+
|
|
3822
|
+
<b>Second bug — the export cannot succeed, on any machine.</b> The twenty real registries got past
|
|
3823
|
+
<code>tap and embed</code> and died in <code>export the shard</code> with
|
|
3824
|
+
<code>no vectors for 'anthropics/skills'</code>, whose hint reads <i>build them first with
|
|
3825
|
+
<code>boost reindex --dense</code></i> — the step that had just run, green, in the line above.
|
|
3826
|
+
<code>dense.export_shard</code> opened the store with a <b>plain</b> <code>sqlite3</code> connection
|
|
3827
|
+
on the stated theory that it "reads <code>chunks</code>, <code>meta</code> and the stored blobs, all
|
|
3828
|
+
ordinary tables". True of the first two; false of the third. <code>vec_chunks</code> is a
|
|
3829
|
+
<b><code>vec0</code> virtual table</b>, so the join raises <code>no such module: vec0</code> — always,
|
|
3830
|
+
every tap — and <code>except sqlite3.Error</code> turned that into <code>chunks: []</code>.
|
|
3831
|
+
|
|
3832
|
+
Proven rather than reasoned: build a store through the real path, reopen it plainly, and the join
|
|
3833
|
+
raises <code>OperationalError: no such module: vec0</code>. The comment was an accurate description
|
|
3834
|
+
of an intention and an inaccurate one of the code.
|
|
3835
|
+
|
|
3836
|
+
<b>Why the test suite was no help — the fixture disagreed with production in the one way that
|
|
3837
|
+
mattered.</b> Every shard test hand-builds its store with <code>CREATE TABLE vec_chunks</code>, an
|
|
3838
|
+
<i>ordinary</i> table, and <code>with_backend</code> patches <code>_connect</code> to a plain
|
|
3839
|
+
connection. Both are fair shortcuts for tests about validation. Together they mean no test in that
|
|
3840
|
+
file ever met a virtual table, so <b>twenty passing tests coexisted with a feature that had never
|
|
3841
|
+
worked</b>. There is even a class named <code>TestWorksWithoutTheExtension</code> asserting the
|
|
3842
|
+
false claim — written, its docstring says, after an earlier version shipped broken the opposite way.
|
|
3843
|
+
That is the shape to remember: the first fix traded a failure that was loud for one that was silent,
|
|
3844
|
+
and the fixture blessed it.
|
|
3845
|
+
|
|
3846
|
+
<b>Fixed by separating two states the old code collapsed.</b> <code>chunks</code> is an ordinary
|
|
3847
|
+
table and always readable, so it can answer "are there rows for this tap at all?" before the join is
|
|
3848
|
+
attempted. No rows means the shard is empty and <i>"build them first"</i> is right. Rows present but
|
|
3849
|
+
unreadable is a different problem with a different fix, and now says so, naming the
|
|
3850
|
+
<code>sqlite-vec</code> extension and stating that <b>no re-embedding is required</b> — the rows are
|
|
3851
|
+
intact. Sending someone back to a 74-minute embed to solve a missing dependency is the part that
|
|
3852
|
+
cost two runs.
|
|
3853
|
+
|
|
3854
|
+
<b>Both halves are pinned, and one of them runs without the extra.</b>
|
|
3855
|
+
<code>test_dense_shard_real_schema.py</code> builds through <code>_ensure_schema</code> and the real
|
|
3856
|
+
<code>vec0</code> table — the only test here that failed before the fix — but it <i>skips</i> without
|
|
3857
|
+
<code>sqlite-vec</code>, which would leave a bare runner blind.
|
|
3858
|
+
<code>test_dense_shard_unreadable_vectors.py</code> pins the same contract with nothing installed, by
|
|
3859
|
+
presenting the store as a plain connection sees it: ordinary tables readable, vector relation not
|
|
3860
|
+
resolving. Both were run against the pre-fix code and both go red, so neither is decorative.</p></details>
|
|
3861
|
+
<div class="meta">
|
|
3862
|
+
<span class="m">Complexity <b>M</b></span>
|
|
3863
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
3864
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3865
|
+
<span class="m">two scheduled runs, 0 artifacts — 40 of 60 jobs tapped a bare SHA, and the other 20 hit an export that cannot work</span>
|
|
3866
|
+
</div>
|
|
3867
|
+
</article>
|
|
3868
|
+
|
|
3794
3869
|
<article class="cap rcard" id="sync-could-not-repair-a-gutted-skill">
|
|
3795
3870
|
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
|
|
3796
3871
|
<h3>The repair command could not repair the thing two commands sent you to it for</h3>
|
|
@@ -548,6 +548,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
548
548
|
help="static concentration/count checks, no network")
|
|
549
549
|
p.add_argument("--list", action="store_true",
|
|
550
550
|
help="print the parsed rows and exit")
|
|
551
|
+
p.add_argument("--list-repos", action="store_true",
|
|
552
|
+
help="print one owner/repo per line and exit (a matrix "
|
|
553
|
+
"source that cannot be field-split by mistake)")
|
|
551
554
|
p.add_argument("--taps", metavar="PATH", default=str(DEFAULT_TAPS),
|
|
552
555
|
help="corpus list to act on (default the required corpus; "
|
|
553
556
|
"%s is the scale tier)" % SCALE_TAPS.name)
|
|
@@ -555,6 +558,14 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
555
558
|
taps = Path(args.taps)
|
|
556
559
|
if not taps.is_file():
|
|
557
560
|
raise SystemExit("no such corpus list: %s" % taps)
|
|
561
|
+
if args.list_repos:
|
|
562
|
+
# Names only, one per line. `--list` prints the SHA and count too, and
|
|
563
|
+
# a caller that splits THAT on whitespace gets three matrix entries per
|
|
564
|
+
# row — which is exactly how shards.yml ended up dispatching 60 jobs
|
|
565
|
+
# for 20 registries, two thirds of them tapping a bare SHA or integer.
|
|
566
|
+
for repo, _sha, _count in parse_taps(taps.read_text(encoding="utf-8")):
|
|
567
|
+
print(repo)
|
|
568
|
+
return 0
|
|
558
569
|
if args.list:
|
|
559
570
|
for repo, sha, count in parse_taps(taps.read_text(encoding="utf-8")):
|
|
560
571
|
print("%s %s %s" % (repo, sha or "", "" if count is None else count))
|
|
@@ -567,7 +578,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
567
578
|
return _ensure(taps, relock=True)
|
|
568
579
|
if args.ensure:
|
|
569
580
|
return _ensure(taps)
|
|
570
|
-
p.error("provide --ensure, --relock, --refresh, --audit
|
|
581
|
+
p.error("provide --ensure, --relock, --refresh, --audit, --list "
|
|
582
|
+
"or --list-repos")
|
|
571
583
|
return 2
|
|
572
584
|
|
|
573
585
|
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""Unit tests: export a shard from the schema production actually writes.
|
|
2
|
+
|
|
3
|
+
Every other shard test builds its fixture by hand, and every one of them makes
|
|
4
|
+
``vec_chunks`` an **ordinary** table. That is a fair shortcut for tests about
|
|
5
|
+
validation, and it is also why the shard feature could ship broken twice: the
|
|
6
|
+
real :func:`dense._ensure_schema` writes
|
|
7
|
+
|
|
8
|
+
CREATE VIRTUAL TABLE vec_chunks USING vec0(embedding float[N] ...)
|
|
9
|
+
|
|
10
|
+
and a virtual table is exactly the thing a hand-rolled ``CREATE TABLE`` fixture
|
|
11
|
+
cannot stand in for. Against the fixture a plain connection reads the join
|
|
12
|
+
happily; against the real store it raises ``no such module: vec0``.
|
|
13
|
+
|
|
14
|
+
So this file refuses to hand-build anything. It creates the store through
|
|
15
|
+
``dense._connect`` and ``dense._ensure_schema`` — the production path — and then
|
|
16
|
+
asks for a shard. It is the only test here that would have failed before the
|
|
17
|
+
fix, and the only one that will fail if the storage layer moves again.
|
|
18
|
+
|
|
19
|
+
It **skips without ``sqlite-vec``**, which is the honest cost of testing the real
|
|
20
|
+
schema and the reason it is not the whole defence:
|
|
21
|
+
``test_dense_shard_unreadable_vectors.py`` pins the same contract with no extra
|
|
22
|
+
installed, so a runner that skips this file is still not blind. Do not "fix" the
|
|
23
|
+
skip by faking the extension — a fake vec0 is the fixture that hid the bug.
|
|
24
|
+
"""
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import json
|
|
28
|
+
|
|
29
|
+
import pytest
|
|
30
|
+
|
|
31
|
+
from boost_cli.core import dense, paths
|
|
32
|
+
|
|
33
|
+
sqlite_vec = pytest.importorskip(
|
|
34
|
+
"sqlite_vec",
|
|
35
|
+
reason="the real vec0 schema needs the [rag] extra; the contract is also "
|
|
36
|
+
"pinned extension-free in test_dense_shard_unreadable_vectors.py")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _extension_loadable() -> bool:
|
|
40
|
+
"""True when this interpreter can actually create a vec0 table.
|
|
41
|
+
|
|
42
|
+
Importing ``sqlite_vec`` is NOT enough, and assuming it was reddened all
|
|
43
|
+
three macOS legs of PR #503 with ``sqlite-vec imported but _connect returned
|
|
44
|
+
None``. Loading an extension needs
|
|
45
|
+
``sqlite3.Connection.enable_load_extension``, which CPython only exposes
|
|
46
|
+
when its bundled SQLite was built with extension support — macOS builds
|
|
47
|
+
routinely are not. So the package imports, ``dense._load()`` returns it, and
|
|
48
|
+
``dense._connect()`` still returns ``None``.
|
|
49
|
+
|
|
50
|
+
Probe the capability rather than a proxy for it: build the thing these tests
|
|
51
|
+
need and see whether it works. Exactly the mistake this file exists to
|
|
52
|
+
correct, one level up — a fixture that stood in for the real schema is what
|
|
53
|
+
hid the bug, and an import that stood in for the real capability is what
|
|
54
|
+
broke the fix.
|
|
55
|
+
"""
|
|
56
|
+
import sqlite3
|
|
57
|
+
con = sqlite3.connect(":memory:")
|
|
58
|
+
try:
|
|
59
|
+
con.enable_load_extension(True)
|
|
60
|
+
sqlite_vec.load(con)
|
|
61
|
+
con.execute("CREATE VIRTUAL TABLE t USING vec0(embedding float[2])")
|
|
62
|
+
return True
|
|
63
|
+
except (AttributeError, sqlite3.Error):
|
|
64
|
+
return False
|
|
65
|
+
finally:
|
|
66
|
+
con.close()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
pytestmark = pytest.mark.skipif(
|
|
70
|
+
not _extension_loadable(),
|
|
71
|
+
reason="this interpreter cannot load sqlite extensions (macOS CPython is "
|
|
72
|
+
"commonly built without support), so the real vec0 schema is "
|
|
73
|
+
"unreachable — the extension-free half of the contract still runs "
|
|
74
|
+
"in test_dense_shard_unreadable_vectors.py")
|
|
75
|
+
|
|
76
|
+
DIM = 4
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _production_store(tap: str = "acme/skills", rows: int = 2):
|
|
80
|
+
"""A store built the way `dense.build` builds one — vec0 and all."""
|
|
81
|
+
paths.ensure_dirs()
|
|
82
|
+
con = dense._connect()
|
|
83
|
+
# The module-level skipif already proved the extension loads here, so a
|
|
84
|
+
# None now is a real regression in _connect rather than a missing extra.
|
|
85
|
+
assert con is not None, \
|
|
86
|
+
"_connect returned None although vec0 loads on this interpreter"
|
|
87
|
+
try:
|
|
88
|
+
dense._ensure_schema(con, DIM)
|
|
89
|
+
for i in range(rows):
|
|
90
|
+
cur = con.execute(
|
|
91
|
+
"INSERT INTO chunks (name, tap, path, kind, cix, snip) "
|
|
92
|
+
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
93
|
+
("skill-%d" % i, tap, "skill-%d/SKILL.md" % i, "skill", 0,
|
|
94
|
+
"snippet %d" % i))
|
|
95
|
+
con.execute(
|
|
96
|
+
"INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
|
|
97
|
+
(cur.lastrowid,
|
|
98
|
+
sqlite_vec.serialize_float32([0.1 * (i + 1)] * DIM)))
|
|
99
|
+
meta = {"version": dense.INDEX_VERSION, "provider": "local",
|
|
100
|
+
"model": "bge-small-en-v1.5", "dim": DIM,
|
|
101
|
+
"commits": {tap.replace("/", "__"): "c0ffee"}}
|
|
102
|
+
con.executemany("INSERT OR REPLACE INTO meta (k, v) VALUES (?, ?)",
|
|
103
|
+
[(k, json.dumps(v)) for k, v in meta.items()])
|
|
104
|
+
con.commit()
|
|
105
|
+
finally:
|
|
106
|
+
con.close()
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class TestExportAgainstTheRealSchema:
|
|
110
|
+
"""The regression. Before the fix every assertion here failed."""
|
|
111
|
+
|
|
112
|
+
def test_a_shard_carries_the_rows(self, sandbox):
|
|
113
|
+
_production_store(rows=2)
|
|
114
|
+
assert len(dense.export_shard("acme/skills")["chunks"]) == 2
|
|
115
|
+
|
|
116
|
+
def test_a_shard_carries_its_provenance(self, sandbox):
|
|
117
|
+
# shards.yml asserts on exactly these four before it uploads, so an
|
|
118
|
+
# export that returns rows without them still fails the workflow.
|
|
119
|
+
_production_store()
|
|
120
|
+
shard = dense.export_shard("acme/skills")
|
|
121
|
+
for field in ("provider", "model", "dim", "commit"):
|
|
122
|
+
assert shard.get(field), "%s missing from %r" % (field, shard)
|
|
123
|
+
|
|
124
|
+
def test_the_embeddings_survive_the_round_trip(self, sandbox):
|
|
125
|
+
import base64
|
|
126
|
+
_production_store(rows=1)
|
|
127
|
+
blob = dense.export_shard("acme/skills")["chunks"][0]["embedding"]
|
|
128
|
+
assert len(base64.b64decode(blob)) == 4 * DIM
|
|
129
|
+
|
|
130
|
+
def test_the_shard_is_json_serialisable(self, sandbox):
|
|
131
|
+
# It is written to a file by `reindex --export-shard` and uploaded.
|
|
132
|
+
_production_store()
|
|
133
|
+
json.dumps(dense.export_shard("acme/skills"))
|
|
134
|
+
|
|
135
|
+
def test_a_tap_with_no_rows_is_empty_not_an_error(self, sandbox):
|
|
136
|
+
# Same degradation as everywhere else, now confirmed on the real
|
|
137
|
+
# schema rather than inferred from the stand-in.
|
|
138
|
+
_production_store()
|
|
139
|
+
assert dense.export_shard("nobody/nothing")["chunks"] == []
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class TestExportedShardImportsBack:
|
|
143
|
+
"""End-to-end on the real schema: what CI publishes, a user can consume."""
|
|
144
|
+
|
|
145
|
+
def test_a_real_shard_is_accepted_by_import(self, sandbox):
|
|
146
|
+
_production_store(rows=2)
|
|
147
|
+
shard = dense.export_shard("acme/skills")
|
|
148
|
+
ok, reason = dense.import_shard(shard, commit="c0ffee")
|
|
149
|
+
assert ok, reason
|
|
150
|
+
|
|
151
|
+
def test_the_imported_rows_come_back_out_again(self, sandbox):
|
|
152
|
+
_production_store(rows=2)
|
|
153
|
+
shard = dense.export_shard("acme/skills")
|
|
154
|
+
dense.import_shard(shard, commit="c0ffee")
|
|
155
|
+
assert len(dense.export_shard("acme/skills")["chunks"]) == 2
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""Unit tests: exporting a shard must not report "no vectors" when there are.
|
|
2
|
+
|
|
3
|
+
``vec_chunks`` is a **vec0 virtual table**. A plain :mod:`sqlite3` connection has
|
|
4
|
+
no such module, so any statement touching it raises
|
|
5
|
+
``OperationalError: no such module: vec0`` — and :func:`dense.export_shard` used
|
|
6
|
+
to catch ``sqlite3.Error`` and return ``{"chunks": []}``, which the command layer
|
|
7
|
+
turns into::
|
|
8
|
+
|
|
9
|
+
no vectors for 'anthropics/skills'
|
|
10
|
+
hint: build them first with `boost reindex --dense`
|
|
11
|
+
|
|
12
|
+
The hint names the step that had *just* run. Every scheduled ``shards`` run has
|
|
13
|
+
died there — 2026-08-02 and 2026-08-09, 20 of 20 registries, "tap and embed"
|
|
14
|
+
green and "export the shard" red — so the prebuilt-shard feature has never once
|
|
15
|
+
produced an artifact.
|
|
16
|
+
|
|
17
|
+
The existing suite could not see it. ``test_dense_shards._store`` builds
|
|
18
|
+
``vec_chunks`` with ``CREATE TABLE`` — an ordinary table a plain connection reads
|
|
19
|
+
happily — and its ``with_backend`` fixture patches ``_connect`` to a plain
|
|
20
|
+
connection. Both are reasonable shortcuts for tests about *validation*, and
|
|
21
|
+
together they mean no test in that file exercises the schema production actually
|
|
22
|
+
writes. This file covers the gap from the other side, without needing the
|
|
23
|
+
extension installed: from a plain connection's point of view a vec0 table is
|
|
24
|
+
precisely "a relation I cannot read", which is what is simulated here.
|
|
25
|
+
|
|
26
|
+
The distinction being pinned is between two states the old code collapsed:
|
|
27
|
+
|
|
28
|
+
* the tap genuinely has no rows — empty shard, and "run reindex" is right;
|
|
29
|
+
* the rows are there and cannot be read — a different problem with a different
|
|
30
|
+
fix, and answering it with "run reindex" sends the reader back round a loop
|
|
31
|
+
they have already completed.
|
|
32
|
+
"""
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import json
|
|
36
|
+
import sqlite3
|
|
37
|
+
|
|
38
|
+
import pytest
|
|
39
|
+
|
|
40
|
+
from boost_cli.core import dense, paths
|
|
41
|
+
from boost_cli.errors import BoostError
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _store_with_unreadable_vectors(rows=(("a", "acme/skills"),), dim=3):
|
|
45
|
+
"""``chunks`` populated, ``vec_chunks`` absent.
|
|
46
|
+
|
|
47
|
+
Stands in for the real store as a plain connection sees it: the ordinary
|
|
48
|
+
tables read fine and the vector relation does not resolve. Whether that is
|
|
49
|
+
``no such module: vec0`` (production) or ``no such table`` (here) is the
|
|
50
|
+
same ``sqlite3.OperationalError`` reaching the same handler.
|
|
51
|
+
"""
|
|
52
|
+
paths.ensure_dirs()
|
|
53
|
+
con = sqlite3.connect(str(dense.db_path()))
|
|
54
|
+
try:
|
|
55
|
+
con.execute("CREATE TABLE IF NOT EXISTS chunks ("
|
|
56
|
+
"id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, tap TEXT,"
|
|
57
|
+
" path TEXT, kind TEXT, cix INTEGER, snip TEXT)")
|
|
58
|
+
con.execute("CREATE TABLE IF NOT EXISTS meta (k TEXT PRIMARY KEY, v TEXT)")
|
|
59
|
+
for name, tap in rows:
|
|
60
|
+
con.execute(
|
|
61
|
+
"INSERT INTO chunks (name, tap, path, kind, cix, snip) "
|
|
62
|
+
"VALUES (?, ?, ?, ?, 0, ?)",
|
|
63
|
+
(name, tap, "%s/SKILL.md" % name, "skill", "snip"))
|
|
64
|
+
meta = {"version": dense.INDEX_VERSION, "provider": "local",
|
|
65
|
+
"model": "bge", "dim": dim, "commits": {"acme__skills": "c1"}}
|
|
66
|
+
con.executemany("INSERT OR REPLACE INTO meta (k, v) VALUES (?, ?)",
|
|
67
|
+
[(k, json.dumps(v)) for k, v in meta.items()])
|
|
68
|
+
con.commit()
|
|
69
|
+
finally:
|
|
70
|
+
con.close()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class TestUnreadableVectorsAreReportedNotSwallowed:
|
|
74
|
+
def test_export_raises_instead_of_returning_an_empty_shard(self, sandbox):
|
|
75
|
+
_store_with_unreadable_vectors()
|
|
76
|
+
with pytest.raises(BoostError):
|
|
77
|
+
dense.export_shard("acme/skills")
|
|
78
|
+
|
|
79
|
+
def test_the_message_does_not_tell_the_user_to_reindex(self, sandbox):
|
|
80
|
+
# THE WHOLE POINT. `reindex --dense` is what produced these rows; being
|
|
81
|
+
# sent back to it is what made the CI failure unreadable for two runs.
|
|
82
|
+
_store_with_unreadable_vectors()
|
|
83
|
+
with pytest.raises(BoostError) as caught:
|
|
84
|
+
dense.export_shard("acme/skills")
|
|
85
|
+
advice = "%s %s" % (caught.value, getattr(caught.value, "hint", "") or "")
|
|
86
|
+
assert "reindex" not in advice.lower(), advice
|
|
87
|
+
|
|
88
|
+
def test_the_message_names_the_vector_backend(self, sandbox):
|
|
89
|
+
# The actual fix is the sqlite-vec extension, so the text has to point
|
|
90
|
+
# there — a bare "cannot read" would leave the reader nowhere.
|
|
91
|
+
_store_with_unreadable_vectors()
|
|
92
|
+
with pytest.raises(BoostError) as caught:
|
|
93
|
+
dense.export_shard("acme/skills")
|
|
94
|
+
advice = ("%s %s" % (caught.value,
|
|
95
|
+
getattr(caught.value, "hint", "") or "")).lower()
|
|
96
|
+
assert "sqlite-vec" in advice or "rag" in advice, advice
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class TestTheGenuinelyEmptyCasesStillDegrade:
|
|
100
|
+
"""Only the unreadable case became an error. The rest must not regress."""
|
|
101
|
+
|
|
102
|
+
def test_no_store_at_all_is_still_an_empty_shard(self, sandbox):
|
|
103
|
+
assert dense.export_shard("acme/skills")["chunks"] == []
|
|
104
|
+
|
|
105
|
+
def test_a_tap_with_no_rows_is_still_an_empty_shard(self, sandbox):
|
|
106
|
+
# `chunks` is readable and simply has nothing for this tap. Here
|
|
107
|
+
# "build them first" IS the right advice, so this must not raise.
|
|
108
|
+
_store_with_unreadable_vectors(rows=(("a", "acme/skills"),))
|
|
109
|
+
assert dense.export_shard("nobody/nothing")["chunks"] == []
|