boost-skill-cli 1.2.8__tar.gz → 1.2.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/eval-latest.json +2 -2
- boost_skill_cli-1.2.10/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +53 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap.html +51 -1
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/eval_corpus.py +64 -12
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_corpus.py +153 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_scale_corpus.py +34 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.gitattributes +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.gitignore +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.vale.ini +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/LICENSE +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/Makefile +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/README.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/codecov.yml +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/index.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/README.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/examples/README.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/index.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/noxfile.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/setup.cfg +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/style/README.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/style/boost.css +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/style/boost.js +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/style/demo.html +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.10'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 10)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -412,6 +412,7 @@ docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md
|
|
|
412
412
|
docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md
|
|
413
413
|
docs/roadmap/items/taps-check-out-freight-they-never-index.md
|
|
414
414
|
docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md
|
|
415
|
+
docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md
|
|
415
416
|
docs/roadmap/items/the-shard-job-that-could-not-finish.md
|
|
416
417
|
docs/roadmap/items/theme-asset-linting-stylelint-eslint.md
|
|
417
418
|
docs/roadmap/items/tool-call-eval-tier.md
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: the-scale-corpus-refreshed-the-wrong-rows
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: CI · Evaluation
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: 185 rows, 20 pinned — the monthly job moved exactly the 20 it did not own and pinned none of the 165 it existed to pin
|
|
11
|
+
order: 121
|
|
12
|
+
owner: loop/scale-refresh-freezes-required
|
|
13
|
+
pr: 537
|
|
14
|
+
title: the scheduled re-pin that refreshed the twenty rows it must not touch, and none of the hundred and sixty-five it existed to pin
|
|
15
|
+
---
|
|
16
|
+
<b>The Tier 1b scale corpus is the required corpus plus distractors</b> — 20 rows copied
|
|
17
|
+
verbatim out of <code>taps.txt</code>, pins and counts included, so both tiers start from the same
|
|
18
|
+
trees, plus 165 curated registries that make it the size of a real install. The golden floors were
|
|
19
|
+
calibrated against those 20 trees. A scale tier measuring a <em>different</em> snapshot of the same
|
|
20
|
+
repos reports a difference that is not scale.
|
|
21
|
+
|
|
22
|
+
<b>The monthly job did precisely the inverse of its job.</b>
|
|
23
|
+
<code>eval_corpus.py --refresh</code> walked every row of whatever file it was handed, so it moved
|
|
24
|
+
the 20 required pins — which <code>build_scale_corpus.py</code> owns and copies verbatim
|
|
25
|
+
— and, because <code>relock_text</code> skipped any row with fewer than two fields, pinned
|
|
26
|
+
<b>zero</b> of the 165 bare distractors. The tier that exists to measure a pinned 20,000-entry
|
|
27
|
+
corpus was floating on upstream HEAD for <b>89% of its rows</b>.
|
|
28
|
+
|
|
29
|
+
<b>It also could never merge.</b> The same workflow runs
|
|
30
|
+
<code>build_scale_corpus.py --check</code> one step <em>before</em> the refresh; the refresh then
|
|
31
|
+
broke exactly that check. Every PR it opened was unmergeable by construction, and the diff read as
|
|
32
|
+
ordinary pin movement — 20 SHAs and 20 counts, which is what a healthy re-pin looks like.
|
|
33
|
+
PR #536 is the specimen.
|
|
34
|
+
|
|
35
|
+
<b>Two mechanisms, both about a fallback being consulted too early.</b> The pins moved because
|
|
36
|
+
nothing said the required rows belong to another file. The distractors stayed bare because
|
|
37
|
+
<code>relock_text</code> gated on <em>“does this row already have a pin”</em> when the
|
|
38
|
+
durable rule is <em>“never write a count without a SHA”</em> —
|
|
39
|
+
<code>--relock</code> re-measures the same tree and has no SHA to offer, but <code>--refresh</code>
|
|
40
|
+
has just resolved upstream HEAD and can close the row. A third, quieter symptom fell out of the
|
|
41
|
+
first: the column width is the longest name being rewritten, and the distractor names are longer
|
|
42
|
+
than anything in <code>taps.txt</code>, so every required row was re-columned even where its pin had
|
|
43
|
+
not changed.
|
|
44
|
+
|
|
45
|
+
<b>Freezing is by membership, not identity.</b> <code>--refresh</code> on <code>taps.txt</code>
|
|
46
|
+
itself is exactly the job that <em>may</em> move those pins, so it freezes nothing. Freezing on
|
|
47
|
+
“is this a required repo” would have made the required corpus permanently unrefreshable
|
|
48
|
+
— the same bug pointed the other way, and far quieter.
|
|
49
|
+
|
|
50
|
+
<b>Verified against the real file, not argued.</b> Simulating a refresh that resolved a new SHA for
|
|
51
|
+
all 185 rows: the 20 required rows come back byte-identical, all 185 end up pinned, and
|
|
52
|
+
<code>--check</code> passes — so the PR is mergeable. The workflow now runs that check
|
|
53
|
+
<b>after</b> the refresh as well as before, which is the guard that was missing.
|
|
@@ -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>259</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -4255,6 +4255,56 @@ with the numbers.</p></details>
|
|
|
4255
4255
|
<span class="m">5h30m cancelled at the ceiling, then 2h07m green — the same job, with duplicate embeddings collapsed</span>
|
|
4256
4256
|
</div>
|
|
4257
4257
|
</article>
|
|
4258
|
+
|
|
4259
|
+
<article class="cap rcard" id="the-scale-corpus-refreshed-the-wrong-rows">
|
|
4260
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI · Evaluation</span></div>
|
|
4261
|
+
<h3>the scheduled re-pin that refreshed the twenty rows it must not touch, and none of the hundred and sixty-five it existed to pin</h3>
|
|
4262
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
4263
|
+
<p><b>The Tier 1b scale corpus is the required corpus plus distractors</b> — 20 rows copied
|
|
4264
|
+
verbatim out of <code>taps.txt</code>, pins and counts included, so both tiers start from the same
|
|
4265
|
+
trees, plus 165 curated registries that make it the size of a real install. The golden floors were
|
|
4266
|
+
calibrated against those 20 trees. A scale tier measuring a <em>different</em> snapshot of the same
|
|
4267
|
+
repos reports a difference that is not scale.
|
|
4268
|
+
|
|
4269
|
+
<b>The monthly job did precisely the inverse of its job.</b>
|
|
4270
|
+
<code>eval_corpus.py --refresh</code> walked every row of whatever file it was handed, so it moved
|
|
4271
|
+
the 20 required pins — which <code>build_scale_corpus.py</code> owns and copies verbatim
|
|
4272
|
+
— and, because <code>relock_text</code> skipped any row with fewer than two fields, pinned
|
|
4273
|
+
<b>zero</b> of the 165 bare distractors. The tier that exists to measure a pinned 20,000-entry
|
|
4274
|
+
corpus was floating on upstream HEAD for <b>89% of its rows</b>.
|
|
4275
|
+
|
|
4276
|
+
<b>It also could never merge.</b> The same workflow runs
|
|
4277
|
+
<code>build_scale_corpus.py --check</code> one step <em>before</em> the refresh; the refresh then
|
|
4278
|
+
broke exactly that check. Every PR it opened was unmergeable by construction, and the diff read as
|
|
4279
|
+
ordinary pin movement — 20 SHAs and 20 counts, which is what a healthy re-pin looks like.
|
|
4280
|
+
PR #536 is the specimen.
|
|
4281
|
+
|
|
4282
|
+
<b>Two mechanisms, both about a fallback being consulted too early.</b> The pins moved because
|
|
4283
|
+
nothing said the required rows belong to another file. The distractors stayed bare because
|
|
4284
|
+
<code>relock_text</code> gated on <em>“does this row already have a pin”</em> when the
|
|
4285
|
+
durable rule is <em>“never write a count without a SHA”</em> —
|
|
4286
|
+
<code>--relock</code> re-measures the same tree and has no SHA to offer, but <code>--refresh</code>
|
|
4287
|
+
has just resolved upstream HEAD and can close the row. A third, quieter symptom fell out of the
|
|
4288
|
+
first: the column width is the longest name being rewritten, and the distractor names are longer
|
|
4289
|
+
than anything in <code>taps.txt</code>, so every required row was re-columned even where its pin had
|
|
4290
|
+
not changed.
|
|
4291
|
+
|
|
4292
|
+
<b>Freezing is by membership, not identity.</b> <code>--refresh</code> on <code>taps.txt</code>
|
|
4293
|
+
itself is exactly the job that <em>may</em> move those pins, so it freezes nothing. Freezing on
|
|
4294
|
+
“is this a required repo” would have made the required corpus permanently unrefreshable
|
|
4295
|
+
— the same bug pointed the other way, and far quieter.
|
|
4296
|
+
|
|
4297
|
+
<b>Verified against the real file, not argued.</b> Simulating a refresh that resolved a new SHA for
|
|
4298
|
+
all 185 rows: the 20 required rows come back byte-identical, all 185 end up pinned, and
|
|
4299
|
+
<code>--check</code> passes — so the PR is mergeable. The workflow now runs that check
|
|
4300
|
+
<b>after</b> the refresh as well as before, which is the guard that was missing.</p></details>
|
|
4301
|
+
<div class="meta">
|
|
4302
|
+
<span class="m">Complexity <b>S</b></span>
|
|
4303
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
4304
|
+
<span class="m">Wow <b class="wow">★★★★★</b></span>
|
|
4305
|
+
<span class="m">185 rows, 20 pinned — the monthly job moved exactly the 20 it did not own and pinned none of the 165 it existed to pin</span>
|
|
4306
|
+
</div>
|
|
4307
|
+
</article>
|
|
4258
4308
|
<!-- /ROADMAP:cards -->
|
|
4259
4309
|
|
|
4260
4310
|
</div>
|
|
@@ -77,7 +77,7 @@ import argparse
|
|
|
77
77
|
import re
|
|
78
78
|
import subprocess
|
|
79
79
|
import sys
|
|
80
|
-
from collections.abc import Sequence
|
|
80
|
+
from collections.abc import Collection, Sequence
|
|
81
81
|
from pathlib import Path
|
|
82
82
|
|
|
83
83
|
ROOT = Path(__file__).resolve().parent.parent
|
|
@@ -346,31 +346,50 @@ def _report_failures(failures: Sequence[CorpusError], total_rows: int) -> int:
|
|
|
346
346
|
|
|
347
347
|
|
|
348
348
|
def relock_text(text: str, counts: dict[str, int],
|
|
349
|
-
shas: dict[str, str] | None = None
|
|
349
|
+
shas: dict[str, str] | None = None,
|
|
350
|
+
frozen: Collection[str] | None = None) -> str:
|
|
350
351
|
"""Rewrite each pinned row's entry count — and its SHA when ``shas`` says so.
|
|
351
352
|
|
|
352
353
|
A whole-file rewrite would lose the header, which is where the reasoning
|
|
353
|
-
lives; this touches only rows it has a new count for. A
|
|
354
|
-
|
|
355
|
-
underneath it
|
|
354
|
+
lives; this touches only rows it has a new count for. A count is never
|
|
355
|
+
written without a SHA — beside an unpinned repo it would describe a tree
|
|
356
|
+
free to change underneath it — but the SHA may come from ``shas`` rather
|
|
357
|
+
than from the row, which is how ``--refresh`` closes a row that arrived
|
|
358
|
+
bare. Gating on "the row already has a pin" instead left the scale corpus
|
|
359
|
+
at 165 bare rows to 20 pinned, refreshing only the 20 it did not own.
|
|
356
360
|
|
|
357
361
|
``shas`` is what makes ``--refresh`` a rewrite of the pins rather than of
|
|
358
362
|
the counts alone. It is optional because the two operations are genuinely
|
|
359
363
|
different: ``--relock`` re-measures the *same* trees (the scanner changed),
|
|
360
364
|
``--refresh`` moves to *new* trees (the world changed).
|
|
365
|
+
|
|
366
|
+
``frozen`` names repos whose rows this file does not own, and they are
|
|
367
|
+
emitted byte for byte — not re-pinned, and *not re-columned*. Both halves
|
|
368
|
+
matter: the width is the longest name being rewritten, so refreshing
|
|
369
|
+
``taps-scale.txt`` (whose distractor names are longer than anything in
|
|
370
|
+
``taps.txt``) moved every required row even where its pin had not changed.
|
|
361
371
|
"""
|
|
362
372
|
shas = shas or {}
|
|
363
|
-
|
|
373
|
+
frozen = frozen or ()
|
|
374
|
+
width = max([len(r) for r in counts if r not in frozen] or [1])
|
|
364
375
|
out = []
|
|
365
376
|
for raw in text.splitlines():
|
|
366
377
|
line = raw.strip()
|
|
367
378
|
parts = line.split()
|
|
368
|
-
if not line or line.startswith("#") or
|
|
369
|
-
or parts[0] not in counts or
|
|
379
|
+
if not line or line.startswith("#") or not parts \
|
|
380
|
+
or parts[0] not in counts or parts[0] in frozen:
|
|
370
381
|
out.append(raw)
|
|
371
382
|
continue
|
|
372
383
|
repo = parts[0]
|
|
373
|
-
|
|
384
|
+
# The row's own pin is only a fallback, and only when well formed: a
|
|
385
|
+
# malformed one is not a value to carry forward, it is a row nothing
|
|
386
|
+
# may claim to have measured.
|
|
387
|
+
committed = (parts[1] if len(parts) > 1
|
|
388
|
+
and _SHA.fullmatch(parts[1]) else None)
|
|
389
|
+
sha = shas.get(repo) or committed
|
|
390
|
+
if sha is None:
|
|
391
|
+
out.append(raw)
|
|
392
|
+
continue
|
|
374
393
|
if not _SHA.fullmatch(sha):
|
|
375
394
|
raise SystemExit(
|
|
376
395
|
"refusing to write %s: %r is not a 40-character commit SHA"
|
|
@@ -379,6 +398,27 @@ def relock_text(text: str, counts: dict[str, int],
|
|
|
379
398
|
return "\n".join(out) + ("\n" if text.endswith("\n") else "")
|
|
380
399
|
|
|
381
400
|
|
|
401
|
+
def frozen_rows(taps: Path, required: Path = DEFAULT_TAPS) -> set[str]:
|
|
402
|
+
"""Repos in ``taps`` whose pins belong to ``required``, not to ``taps``.
|
|
403
|
+
|
|
404
|
+
The scale corpus is the required corpus PLUS distractors, and
|
|
405
|
+
``build_scale_corpus.render`` copies the required block in verbatim so both
|
|
406
|
+
tiers start from the same trees. The golden floors were calibrated against
|
|
407
|
+
those trees; a scale tier measuring a *different* snapshot of the same
|
|
408
|
+
repos reports a difference that is not scale.
|
|
409
|
+
|
|
410
|
+
Membership, not identity, decides. ``--refresh`` on ``taps.txt`` itself is
|
|
411
|
+
exactly the job that MAY move those pins, so it must freeze nothing —
|
|
412
|
+
freezing on "is this a required repo" rather than "does another file own
|
|
413
|
+
this row" would make the required corpus permanently unrefreshable, which
|
|
414
|
+
is the same bug pointed the other way and far quieter.
|
|
415
|
+
"""
|
|
416
|
+
if taps.resolve() == required.resolve() or not required.exists():
|
|
417
|
+
return set()
|
|
418
|
+
return {repo for repo, _sha, _n in
|
|
419
|
+
parse_taps(required.read_text(encoding="utf-8"))}
|
|
420
|
+
|
|
421
|
+
|
|
382
422
|
def refresh_summary(rows: Sequence[Row], shas: dict[str, str],
|
|
383
423
|
counts: dict[str, int]) -> str:
|
|
384
424
|
"""A Markdown table of what a refresh moved, for the pull request body.
|
|
@@ -465,10 +505,20 @@ def _refresh(taps: Path, summary_path: str | None = None) -> int:
|
|
|
465
505
|
from boost_cli.core import catalog, gitutil, registry # deferred: path shim
|
|
466
506
|
|
|
467
507
|
rows = parse_taps(taps.read_text(encoding="utf-8"))
|
|
508
|
+
# Rows another file owns are neither measured nor written — skipping the
|
|
509
|
+
# measurement is not just an optimisation here, it is what keeps the two
|
|
510
|
+
# tiers pinned to one set of trees. It also saves re-cloning the required
|
|
511
|
+
# corpus, whose largest member is 6,309 entries.
|
|
512
|
+
frozen = frozen_rows(taps)
|
|
513
|
+
failures: list[CorpusError] = []
|
|
468
514
|
shas: dict[str, str] = {}
|
|
469
515
|
counts: dict[str, int] = {}
|
|
470
|
-
|
|
516
|
+
if frozen:
|
|
517
|
+
print(" %d rows are owned by %s and are left alone"
|
|
518
|
+
% (len(frozen & {r for r, _s, _n in rows}), DEFAULT_TAPS.name))
|
|
471
519
|
for repo, old_sha, _n in rows:
|
|
520
|
+
if repo in frozen:
|
|
521
|
+
continue
|
|
472
522
|
try:
|
|
473
523
|
try:
|
|
474
524
|
tap = registry.get(repo)
|
|
@@ -499,8 +549,10 @@ def _refresh(taps: Path, summary_path: str | None = None) -> int:
|
|
|
499
549
|
"" if sha == old_sha else " MOVED"))
|
|
500
550
|
if failures:
|
|
501
551
|
return _report_failures(failures, len(rows))
|
|
502
|
-
taps.write_text(
|
|
503
|
-
|
|
552
|
+
taps.write_text(
|
|
553
|
+
relock_text(taps.read_text(encoding="utf-8"), counts, shas,
|
|
554
|
+
frozen=frozen),
|
|
555
|
+
encoding="utf-8")
|
|
504
556
|
summary = refresh_summary(rows, shas, counts)
|
|
505
557
|
print("\n" + summary)
|
|
506
558
|
if summary_path:
|
|
@@ -543,3 +543,156 @@ class TestTheSentinelIsKeyedOnTheTapList:
|
|
|
543
543
|
out = self._wrapper_run(tmp_path, "owner/repo %s 2\n" % ("a" * 40), calls)
|
|
544
544
|
assert "skipping" not in out
|
|
545
545
|
assert calls.read_text(encoding="utf-8").count("ensure") == 2
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
class TestRefreshingTheScaleCorpusLeavesTheRequiredRowsAlone:
|
|
549
|
+
"""The required rows in `taps-scale.txt` belong to `taps.txt`.
|
|
550
|
+
|
|
551
|
+
`build_scale_corpus.render` copies them in verbatim — pin and count
|
|
552
|
+
included — because both tiers must start from the same trees: the golden
|
|
553
|
+
floors were calibrated against the required corpus, and a scale tier
|
|
554
|
+
measuring a *different* snapshot of the same repos reports a difference
|
|
555
|
+
that is not scale. The generator's own section header says "verbatim".
|
|
556
|
+
|
|
557
|
+
Nothing enforced it. `--refresh` walked every row of whatever file it was
|
|
558
|
+
given, so the monthly scale job moved the required pins too, and the two
|
|
559
|
+
tiers silently decoupled. It also re-columned the whole file (the width is
|
|
560
|
+
the longest name in the file, and the distractor names are longer), so
|
|
561
|
+
every required row changed even where the pin did not.
|
|
562
|
+
|
|
563
|
+
The PR it opened could never merge: `build_scale_corpus.py --check` — which
|
|
564
|
+
the same workflow runs one step earlier — calls the result stale, forever.
|
|
565
|
+
"""
|
|
566
|
+
|
|
567
|
+
def _scale_file(self, tmp_path):
|
|
568
|
+
required = ("anthropics/skills %s 18\n" % ("a" * 40)
|
|
569
|
+
+ "minio/skills %s 3\n" % ("b" * 40))
|
|
570
|
+
scale = tmp_path / "taps-scale.txt"
|
|
571
|
+
scale.write_text(
|
|
572
|
+
"# --- the required corpus, verbatim ---\n"
|
|
573
|
+
+ required
|
|
574
|
+
+ "\n# --- distractors ---\n"
|
|
575
|
+
+ "some-very-long-owner/some-very-long-repo-name\n",
|
|
576
|
+
encoding="utf-8")
|
|
577
|
+
(tmp_path / "taps.txt").write_text(required, encoding="utf-8")
|
|
578
|
+
return scale, required
|
|
579
|
+
|
|
580
|
+
def test_a_required_row_is_not_re_pinned(self, tmp_path):
|
|
581
|
+
scale, required = self._scale_file(tmp_path)
|
|
582
|
+
frozen = _load().frozen_rows(scale, tmp_path / "taps.txt")
|
|
583
|
+
assert frozen == {"anthropics/skills", "minio/skills"}
|
|
584
|
+
# A refresh that measured new trees for them must still not write them.
|
|
585
|
+
out = _load().relock_text(
|
|
586
|
+
scale.read_text(encoding="utf-8"),
|
|
587
|
+
{"anthropics/skills": 20, "minio/skills": 9},
|
|
588
|
+
{"anthropics/skills": "c" * 40, "minio/skills": "d" * 40},
|
|
589
|
+
frozen=frozen)
|
|
590
|
+
for row in required.splitlines():
|
|
591
|
+
assert row in out, "required row was rewritten: %r" % row
|
|
592
|
+
|
|
593
|
+
def test_a_frozen_row_keeps_its_column_width(self, tmp_path):
|
|
594
|
+
"""The subtler half: even an unchanged pin was being re-columned.
|
|
595
|
+
|
|
596
|
+
`relock_text` pads to the longest name it is rewriting, and the scale
|
|
597
|
+
file's distractors are longer than anything in `taps.txt` — so the
|
|
598
|
+
required block came back at a different width and stopped matching the
|
|
599
|
+
generator byte for byte.
|
|
600
|
+
"""
|
|
601
|
+
scale, _required = self._scale_file(tmp_path)
|
|
602
|
+
out = _load().relock_text(
|
|
603
|
+
scale.read_text(encoding="utf-8"),
|
|
604
|
+
{"anthropics/skills": 18,
|
|
605
|
+
"some-very-long-owner/some-very-long-repo-name": 7},
|
|
606
|
+
{"some-very-long-owner/some-very-long-repo-name": "e" * 40},
|
|
607
|
+
frozen={"anthropics/skills"})
|
|
608
|
+
assert "anthropics/skills %s 18" % ("a" * 40) in out
|
|
609
|
+
assert "some-very-long-owner/some-very-long-repo-name %s" % ("e" * 40) in out
|
|
610
|
+
|
|
611
|
+
def test_distractors_are_still_refreshed(self, tmp_path):
|
|
612
|
+
# Freezing must not turn the monthly job into a no-op.
|
|
613
|
+
scale, _required = self._scale_file(tmp_path)
|
|
614
|
+
out = _load().relock_text(
|
|
615
|
+
scale.read_text(encoding="utf-8"),
|
|
616
|
+
{"some-very-long-owner/some-very-long-repo-name": 7},
|
|
617
|
+
{"some-very-long-owner/some-very-long-repo-name": "e" * 40},
|
|
618
|
+
frozen={"anthropics/skills", "minio/skills"})
|
|
619
|
+
assert "some-very-long-owner/some-very-long-repo-name %s 7" % ("e" * 40) in out
|
|
620
|
+
|
|
621
|
+
def test_refreshing_the_required_corpus_itself_freezes_nothing(self, tmp_path):
|
|
622
|
+
"""`--refresh` on taps.txt is exactly the job that MAY move those pins.
|
|
623
|
+
|
|
624
|
+
Freezing on identity rather than on membership would make the required
|
|
625
|
+
corpus permanently unrefreshable — the opposite failure, and a quieter
|
|
626
|
+
one.
|
|
627
|
+
"""
|
|
628
|
+
_scale, required = self._scale_file(tmp_path)
|
|
629
|
+
taps = tmp_path / "taps.txt"
|
|
630
|
+
assert _load().frozen_rows(taps, taps) == set()
|
|
631
|
+
out = _load().relock_text(required, {"anthropics/skills": 20},
|
|
632
|
+
{"anthropics/skills": "c" * 40},
|
|
633
|
+
frozen=_load().frozen_rows(taps, taps))
|
|
634
|
+
assert "c" * 40 in out
|
|
635
|
+
|
|
636
|
+
def test_a_missing_required_file_freezes_nothing(self, tmp_path):
|
|
637
|
+
# A refresh must degrade to the old behaviour, never crash.
|
|
638
|
+
scale, _required = self._scale_file(tmp_path)
|
|
639
|
+
assert _load().frozen_rows(scale, tmp_path / "absent.txt") == set()
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
class TestRefreshPinsARowThatArrivedBare:
|
|
643
|
+
"""`--refresh` resolves a new SHA, so it can pin a row that has none.
|
|
644
|
+
|
|
645
|
+
`relock_text` skipped any row with fewer than two fields, on a rule that is
|
|
646
|
+
right for `--relock` and wrong for `--refresh`. The two differ in exactly
|
|
647
|
+
the way that matters: `--relock` re-measures the *same* tree and has no SHA
|
|
648
|
+
to offer, so writing a count beside an unpinned repo would describe a tree
|
|
649
|
+
free to change underneath it. `--refresh` has just resolved upstream HEAD,
|
|
650
|
+
so it has both halves and the row can be closed.
|
|
651
|
+
|
|
652
|
+
Measured cost of the old rule: the shipped scale corpus is 165 bare rows
|
|
653
|
+
and 20 pinned ones, and the monthly job rewrote exactly the 20 — the
|
|
654
|
+
required block it must not touch — while pinning none of the 165 it exists
|
|
655
|
+
to pin. The tier that is supposed to measure a pinned 20,000-entry corpus
|
|
656
|
+
was floating on upstream HEAD for 89% of its rows.
|
|
657
|
+
|
|
658
|
+
The durable rule is about the SHA, not about the row: never write a count
|
|
659
|
+
without one.
|
|
660
|
+
"""
|
|
661
|
+
|
|
662
|
+
def test_a_bare_row_gains_a_pin_when_a_sha_was_resolved(self):
|
|
663
|
+
m = _load()
|
|
664
|
+
out = m.relock_text("a/b\n", {"a/b": 7}, {"a/b": "f" * 40})
|
|
665
|
+
assert out == "a/b %s 7\n" % ("f" * 40)
|
|
666
|
+
|
|
667
|
+
def test_a_bare_row_is_left_alone_when_no_sha_was_resolved(self):
|
|
668
|
+
"""The property the old rule was protecting, kept.
|
|
669
|
+
|
|
670
|
+
This is `--relock`: the scanner changed, the trees did not, and there
|
|
671
|
+
is no SHA on offer. A count here would claim a measurement of a tree
|
|
672
|
+
nobody pinned.
|
|
673
|
+
"""
|
|
674
|
+
m = _load()
|
|
675
|
+
assert m.relock_text("a/b\n", {"a/b": 7}) == "a/b\n"
|
|
676
|
+
|
|
677
|
+
def test_a_bare_row_with_no_count_is_left_alone(self):
|
|
678
|
+
m = _load()
|
|
679
|
+
assert m.relock_text("a/b\n", {}, {"a/b": "f" * 40}) == "a/b\n"
|
|
680
|
+
|
|
681
|
+
def test_a_malformed_pin_is_still_refused(self):
|
|
682
|
+
# Not a SHA and nothing resolved for it: writing would launder a typo
|
|
683
|
+
# into a row that reads as measured.
|
|
684
|
+
m = _load()
|
|
685
|
+
assert m.relock_text("a/b nope 3\n", {"a/b": 7}) == "a/b nope 3\n"
|
|
686
|
+
|
|
687
|
+
def test_a_malformed_pin_is_replaced_when_a_sha_was_resolved(self):
|
|
688
|
+
m = _load()
|
|
689
|
+
out = m.relock_text("a/b nope 3\n", {"a/b": 7}, {"a/b": "f" * 40})
|
|
690
|
+
assert out == "a/b %s 7\n" % ("f" * 40)
|
|
691
|
+
|
|
692
|
+
def test_the_width_covers_rows_that_were_bare(self):
|
|
693
|
+
# A newly-pinned long name must not be excluded from the column maths.
|
|
694
|
+
m = _load()
|
|
695
|
+
out = m.relock_text("short/x\nmuch-longer-owner/repo\n",
|
|
696
|
+
{"short/x": 1, "much-longer-owner/repo": 2},
|
|
697
|
+
{"short/x": "a" * 40, "much-longer-owner/repo": "b" * 40})
|
|
698
|
+
assert "short/x %s 1" % ("a" * 40) in out
|
|
@@ -230,3 +230,37 @@ class TestPinsSurviveRegeneration:
|
|
|
230
230
|
refreshed = first.replace("\ns/one\n", "\ns/one %s 99\n" % ("d" * 40))
|
|
231
231
|
again = m.render(required, picked, 30, m.existing_pins(refreshed))
|
|
232
232
|
assert again == refreshed
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class TestTheScheduledJobCannotOpenAnUnmergeablePR:
|
|
236
|
+
"""`--check` must run AFTER the refresh, not only before it.
|
|
237
|
+
|
|
238
|
+
Running it first proves the committed file is fresh; it says nothing about
|
|
239
|
+
what the refresh then wrote. For months the job checked, refreshed, and
|
|
240
|
+
opened a PR that the very same check would have rejected — because
|
|
241
|
+
`--refresh` re-pinned and re-columned the required block, which the
|
|
242
|
+
generator copies verbatim from `taps.txt`. The PR was unmergeable by
|
|
243
|
+
construction and the diff read as ordinary pin movement.
|
|
244
|
+
"""
|
|
245
|
+
|
|
246
|
+
_WORKFLOW = _ROOT / ".github" / "workflows" / "eval-scale.yml"
|
|
247
|
+
|
|
248
|
+
@pytest.mark.skipif(not _WORKFLOW.exists(), reason="workflow not reachable")
|
|
249
|
+
def test_the_check_runs_after_the_refresh(self):
|
|
250
|
+
text = self._WORKFLOW.read_text(encoding="utf-8")
|
|
251
|
+
check = "build_scale_corpus.py --check"
|
|
252
|
+
refresh = "eval_corpus.py --refresh"
|
|
253
|
+
assert text.count(check) >= 2, (
|
|
254
|
+
"only one --check: a refresh that breaks the selection would still "
|
|
255
|
+
"open a PR")
|
|
256
|
+
assert text.index(refresh) < text.rindex(check), (
|
|
257
|
+
"the last --check must follow the refresh")
|
|
258
|
+
|
|
259
|
+
@pytest.mark.skipif(not _WORKFLOW.exists(), reason="workflow not reachable")
|
|
260
|
+
def test_the_check_is_not_allowed_to_fail_quietly(self):
|
|
261
|
+
# `score it` is continue-on-error by design; the selection check is not.
|
|
262
|
+
text = self._WORKFLOW.read_text(encoding="utf-8")
|
|
263
|
+
tail = text[text.rindex("build_scale_corpus.py --check"):]
|
|
264
|
+
head = text[:text.rindex("build_scale_corpus.py --check")]
|
|
265
|
+
step = head[head.rindex(" - name:"):] + tail.split(" - name:")[0]
|
|
266
|
+
assert "continue-on-error" not in step
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.2.8 → boost_skill_cli-1.2.10}/.vale/styles/config/vocabularies/boost/accept.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|