boost-skill-cli 1.2.172__tar.gz → 1.2.173__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.172 → boost_skill_cli-1.2.173}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.2.173/docs/roadmap/items/cancelled-ci-on-main-is-silent-and-skips-the-release.md +56 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shard-weights-do-not-predict-the-job-timeout.md +40 -3
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap.html +91 -3
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/mutation_shards.py +218 -11
- boost_skill_cli-1.2.173/tests/unit/test_mutation_shard_count.py +336 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mutation_subfile_shards.py +3 -2
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.gitattributes +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.gitignore +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/.vale.ini +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/DCO +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/LICENSE +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/Makefile +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/README.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/archive.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/cohort.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/compact.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/deps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/discovery.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/jsonstate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/prereq.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/report.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/typedvalue.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/codecov.yml +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/index.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/a-correct-link-in-a-locked-dir-reads-as-refused.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/a-new-shipped-card-always-404s-its-own-write-up-link.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/a-refusal-and-its-remedy-never-wrapped.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/agent-dir-shapes-install-still-trips-on.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/an-item-materialized-nowhere-reads-ok-in-verify-health-drift.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-absorb-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-adapt-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-attest-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-audit-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-bmad-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-browse-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-bundle-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-catalog-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-changelog-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-chat-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-cohort-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-completions-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-config-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-context-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-create-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-deps-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-discover-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-doctor-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-drift-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-edit-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-evolve-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-explain-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-export-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-health-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-import-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-index-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-install-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-lint-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-log-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-mcp-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-onboard-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-outdated-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-policy-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-preview-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-profile-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-protocol-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-pulse-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-recommend-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-reindex-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-replay-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-root-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-run-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-schedule-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-search-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-simulate-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-sync-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-tag-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-tap-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-taps-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-test-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-trust-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-unpin-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-untap-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-update-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-verify-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/audit-who-findings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bare-boost-never-names-an-entry-point.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/because-that-was-not-the-reason.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bm25-empty-tokenization-kills-catalog-fallback.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-done-contract-ignores-the-track.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-gemini-gets-claude-hook-output.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-personas-delegate-outside-the-router.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-roster-drifted-from-bmad-6-12.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-route-ignores-autopilot-state.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-router-one-keyword-decides-the-track.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bmad-router-reads-each-prompt-alone.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/cache-writers-that-still-crash-on-a-read-only-cache.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/canary-deps-check-skips-in-the-required-job.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ci-summary-reports-the-wrong-coverage-gate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/claude-md-instructs-the-wrong-licence-header.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/codex-hooks-timeout-units-are-unestablished.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/codex-is-not-an-mcp-host.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/compact-answers-a-named-tap-with-a-global-all-clear.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/concurrency-probe-measured-a-race-not-the-pool.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/config-json-edge-shapes-crash-or-disagree.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/corpus-refresh-updates-data-not-prose.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/corrupt-config-reads-as-ready-to-set-up.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/count-flags-that-silently-invert.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-kill-switch-has-no-reason-state.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-local-built-store-displaced-by-a-key.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-no-key-guard-is-unreachable.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-ready-but-embedder-cannot-run.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/doctor-prescribes-sync-that-deletes-live-links.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/err-colour-judged-by-stdout.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/err-multiline-hint-colours-across-the-newline.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-counted-by-the-method-the-repo-disavows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-duplication-is-intra-tap-not-mirrors.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-floor-calibration-stale-after-pin-refresh.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-gate-scores-a-body-less-corpus.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/exemplar-graded-golden-set-runs-in-no-gate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/explain-outline-has-no-cap.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/floors-job-never-installed-setuptools.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/free-threaded-canary-warns-about-nothing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gate-parity-test-ignores-k-and-golden.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gated-golden-set-has-zero-exemplars.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/hooks-list-drops-the-name-before-the-host.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/identifier-columns-shrink-to-a-name-no-command-accepts.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/import-budget-gate-passes-when-boost-cannot-import.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/info-deps-materialize-a-dir-they-then-reject.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-cannot-tell-a-skill-needs-another-one.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-paths-that-still-drop-the-result.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/install-writes-through-a-redirected-dotdir-uninstall-will-not.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/is-dir-follows-a-symlink-at-eleven-rmtree-call-sites.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/keyed-no-store-hint-disagrees-with-shard-remedy.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lighthouse-flips-on-byte-identical-input.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/links-job-503s-its-own-write-up-links.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lock-kept-links-it-had-just-removed.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/manifest-in-prunes-only-the-root-copy.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-doctor-says-healthy-where-mcp-search-says-nothing-is-tapped.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-install-description-omits-antigravity.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-miss-reply-echoes-the-whole-query.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-registration-writes-outside-a-sandboxed-home.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-search-cost-overstated-on-keyless-machines.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-server-dies-on-a-valid-json-message-that-is-not-an-object.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-session-dies-on-a-deeply-nested-json-line.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-skip-list-absent-from-tool-descriptions.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-shard-balance-hints-are-a-release-behind.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/one-bad-agent-dir-silences-the-whole-doctor-report.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/one-failed-shard-job-drops-registries-from-the-manifest.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/panel-fits-data-to-an-assumed-80-in-a-pipe.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/project-scope-in-an-unmarked-tree-does-not-walk-up.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/project-uninstall-deletes-any-in-repo-directory-the-lock-names.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/quickstart-drops-incompatible-shard-status.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/quickstart-manifest-error-drops-hint-and-misnames-cause.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/quickstart-rerun-retargets-tapped-registries.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/quickstart-says-ready-exit-0-after-every-tap-failed.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/quickstart-shard-download-invisible-in-preview-and-run.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/read-only-boost-home-with-no-cache-dir.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/readme-81-command-table-lists-80-omits-quickstart.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/readme-hero-installs-a-name-no-starter-registry-ships.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/reclone-leaves-a-clone-on-head-when-it-cannot-reach-the-pin.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/recommend-recomputes-its-columns-per-row.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/refresh-strands-the-natural-set-baseline.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/reindex-reported-a-completeness-share-it-could-not-compute.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/release-guard-fails-open-when-it-cannot-read-tags.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/required-eval-gate-still-grades-by-name.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/roadmap-boards-advertise-python-39.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/rule-and-workflow-rows-carry-a-scope-nothing-but-list-local-reads.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sandbox-fixture-does-not-sandbox-the-working-directory.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-caps-the-two-copyable-identifiers.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-drops-symbol-language-queries-silently.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-footer-not-fitted-to-the-pane-its-rows-were-fitted-to.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-footer-overflows-40-col-pane-gate-passes-by-luck.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-relevance-meter-is-constant-on-default-page.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/search-rows-use-term-width-so-piping-drops-the-tap-column.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/shrink-the-published-index.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/stale-gate-sizes-in-readme-and-contributing.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/stale-tap-hint-dead-for-tap-only-installs.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/surface-dehyphenation-rationale-is-false.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sweep-died-at-a-page-not-at-launch.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sync-repairs-a-disabled-agents-row-every-run.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/table-fit-widths-floor-destroys-columns-and-still-overflows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/taps-vouches-for-a-clone-that-is-not-there.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/text-io-leaves-its-encoding-to-the-locale.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-install-path-hands-agy-claudes-mcp-argv.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-links-concurrency-cap-did-not-hold.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-model-back-off-mixes-two-clocks.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/the-windows-test-cap-is-five-minutes-from-the-measurement.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/tier3-ceiling-unreachable-at-default-n.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/typos-reported-as-boost-bugs.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/uninstall-local-cannot-remove-a-rule-or-workflow-list-local-shows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/unreadable-tap-cache-healthy-doctor-crashing-heal.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/unwritable-agent-dir-has-no-remedy.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/unwritable-rule-or-workflow-dir-crashes-install.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/util-rmtree-chmods-a-symlink-target-outside-the-tree.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/wrap-width-judged-by-stdout.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/writers-whose-bytes-are-compared-do-not-pin-their-newline.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/README.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/examples/README.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/index.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/noxfile.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/eval_tools.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/measure_near_duplicate_bound.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/setup.cfg +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/style/README.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/style/boost.css +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/style/boost.js +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/style/demo.html +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/eval/tool_calls.jsonl +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_bad_input_is_not_a_crash.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_bmad_personas_scope.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_hooks_codex.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_identifier_columns.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_json_reports.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_context_sees_an_unborn_branch.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_count_flags_reject_nonpositive.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_keyed_no_store_hint.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_recommend_because_is_true.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_repo_root_guard_covers_real_installs.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_reports_match_reality.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/data/bmad-skills-6.12.0.json +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_archive.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_bot_pr_dco.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_canary_deps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_catalog_distinct.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_catalog_keyword_words.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_claude_settings_codex.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_cli_update_shards.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_cohort.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_corpus_prose.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_count_flags_use_positive_int.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_coverage_gate_prose.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_entry_vectors.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_model_unavailable.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dense_vector_dedupe.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_deps.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_discovery.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_distill_merge.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_doctor_output_polish.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_drift_hint.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_dry_run_parity.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_embed_outranking.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_corpus_bodies.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_query_sets.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_tools.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_eval_tools_probe.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_first_run_pointer.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_gstack_coexistence.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_help_contracts.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_hookhost_codex.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_jsonstate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_launcher_python_floor.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_lighthouse_budgets.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mcp_install_sandbox_home.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mcp_read.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mutation_weights_drift.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_near_duplicate_collapse.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_output_table_drop.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_output_table_whole.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_prereq.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_quickstart_readiness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rag_completeness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rag_extra_hint.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_read_text_arg.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_repo_root_guard.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_report.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_sandbox_fixture_cwd.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_schedule_plist.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_sdist_contents.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_shards_carry_forward.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_shards_ingest.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_sync_lost_lock.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_text_io_names_its_encoding.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_typedvalue.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_upstream_path.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_visual_harness_capture.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.172 → boost_skill_cli-1.2.173}/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.173'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 173)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -355,6 +355,7 @@ docs/roadmap/items/build-provenance-slsa-attestations.md
|
|
|
355
355
|
docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md
|
|
356
356
|
docs/roadmap/items/cache-writers-that-still-crash-on-a-read-only-cache.md
|
|
357
357
|
docs/roadmap/items/canary-deps-check-skips-in-the-required-job.md
|
|
358
|
+
docs/roadmap/items/cancelled-ci-on-main-is-silent-and-skips-the-release.md
|
|
358
359
|
docs/roadmap/items/capability-manifest-and-least-privilege-policy.md
|
|
359
360
|
docs/roadmap/items/capability-policy-skips-rules-and-workflows.md
|
|
360
361
|
docs/roadmap/items/catalog-categories-beyond-curated.md
|
|
@@ -1033,6 +1034,7 @@ tests/unit/test_mcphost.py
|
|
|
1033
1034
|
tests/unit/test_measure_registry.py
|
|
1034
1035
|
tests/unit/test_minisign.py
|
|
1035
1036
|
tests/unit/test_mutation_hardening.py
|
|
1037
|
+
tests/unit/test_mutation_shard_count.py
|
|
1036
1038
|
tests/unit/test_mutation_shards.py
|
|
1037
1039
|
tests/unit/test_mutation_subfile_shards.py
|
|
1038
1040
|
tests/unit/test_mutation_weights_drift.py
|
boost_skill_cli-1.2.173/docs/roadmap/items/cancelled-ci-on-main-is-silent-and-skips-the-release.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cancelled-ci-on-main-is-silent-and-skips-the-release
|
|
3
|
+
board: code
|
|
4
|
+
section: trust
|
|
5
|
+
status: planned
|
|
6
|
+
category: CI · Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: the alerting that exists to make a red main impossible to miss asks only about 'failure', and the run that skipped a release was 'cancelled'
|
|
11
|
+
order: 365
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: "A <code>cancelled</code> <code>ci</code> on main skips the release and alerts nobody, because the alert asks only about <code>failure</code>"
|
|
15
|
+
---
|
|
16
|
+
<b>Two independent gates, both keyed on the wrong half of the same enum.</b>
|
|
17
|
+
<code>publish.yml</code> fires on <code>workflow_run</code> and ships only when
|
|
18
|
+
<code>conclusion == 'success'</code>; <code>ci-failure-alert</code> opens the tracking issue
|
|
19
|
+
only when <code>conclusion == 'failure'</code>. A <code>ci</code> run that concludes
|
|
20
|
+
<code>cancelled</code> satisfies neither. <b>It does not ship and it does not tell anyone</b>
|
|
21
|
+
— the one conclusion that falls through both.
|
|
22
|
+
|
|
23
|
+
<b>Observed, on the merge of #1015.</b> <code>mutation-shard (4)</code> hit
|
|
24
|
+
<code>timeout-minutes: 75</code> and was cancelled, the aggregate <code>mutation</code> job
|
|
25
|
+
failed, and the run concluded <code>cancelled</code> rather than <code>failure</code>. No
|
|
26
|
+
release, no issue, no notification. It surfaced the same day, and only because somebody was
|
|
27
|
+
reading per-shard job durations out of the Actions API for an unrelated reason — nothing
|
|
28
|
+
in the repo would have raised it, and the next one will be found the same way or not at all.
|
|
29
|
+
|
|
30
|
+
<b>This is the exact blind spot <code>ci-failure-alert</code>'s own header describes.</b> That
|
|
31
|
+
file opens by explaining that <code>demo</code> "failed six runs out of six on main, alerted
|
|
32
|
+
nobody, and was found by a manual audit instead", and concludes that "any workflow that runs on
|
|
33
|
+
main and nobody watches belongs here". The list was then enforced by
|
|
34
|
+
<code>tests/unit/test_failure_alerting_covers_unattended.py</code> so a new workflow cannot
|
|
35
|
+
quietly join the blind spot. <b>The enforcement is over <em>which workflows</em> are watched,
|
|
36
|
+
and the hole here is <em>which conclusions</em> are</b> — <code>ci</code> is on the list
|
|
37
|
+
and still said nothing.
|
|
38
|
+
|
|
39
|
+
<b>Why a timeout is not an exotic case.</b> It is the designed behaviour of every
|
|
40
|
+
<code>timeout-minutes</code> in the repo, and <code>mutation-shard</code>'s is reached by an
|
|
41
|
+
ordinary slow runner rather than by a bug: across 169 measured shard jobs the worst was 72.5
|
|
42
|
+
minutes against a 75-minute cap. A job can also be cancelled by the concurrency group, by a
|
|
43
|
+
runner eviction (<code>mutation-shard (4)</code> on #1012 died at 15.1 min with exit 143), or by
|
|
44
|
+
a human pressing the button — and only the last of those is one anybody already knows
|
|
45
|
+
about.
|
|
46
|
+
|
|
47
|
+
<b>Shape of the work.</b> Widen the alert's condition from <code>== 'failure'</code> to the set
|
|
48
|
+
of conclusions that mean "main is not green", which is every one except <code>success</code>,
|
|
49
|
+
<code>skipped</code> and <code>neutral</code> — naming what is <em>excluded</em> rather
|
|
50
|
+
than what is included, so the next conclusion GitHub adds defaults to loud. The issue body
|
|
51
|
+
should say which conclusion it was, because <em>cancelled</em> and <em>failure</em> want
|
|
52
|
+
different first moves. Then pin it: the sibling test already enforces the workflow list, so the
|
|
53
|
+
conclusion set wants the same treatment rather than a comment. Worth checking at the same time
|
|
54
|
+
whether <code>publish.yml</code> should distinguish "CI did not pass" from "CI did not finish"
|
|
55
|
+
— today both are a silent no-op, and a release that was skipped because a runner was slow
|
|
56
|
+
is recoverable by a rerun that nobody currently knows to start.
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: shard-weights-do-not-predict-the-job-timeout
|
|
3
3
|
board: code
|
|
4
4
|
section: trust
|
|
5
|
-
status:
|
|
5
|
+
status: inflight
|
|
6
6
|
category: CI · Bug
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 4
|
|
10
10
|
note: the pack is balanced to within 700ms of ideal and a shard still timed out at 75 min, cancelling a release
|
|
11
11
|
order: 364
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/shard-headroom
|
|
13
|
+
pr: 1023
|
|
14
14
|
title: "Mutation shard weights balance perfectly and predict nothing, so a shard can time out and cancel a release"
|
|
15
15
|
---
|
|
16
16
|
<b>Observed, on the merge of #1015.</b> <code>mutation-shard (4)</code> ran 75 minutes against the
|
|
@@ -55,3 +55,40 @@ speedup cap is 6.0x only because <code>store.py</code> is split per function alr
|
|
|
55
55
|
shards is cheap. Separately, a cancelled <code>ci</code> on main should be loud: it currently
|
|
56
56
|
looks identical to a success from the release path's point of view, because
|
|
57
57
|
<code>publish.yml</code> only asks whether the conclusion was <code>success</code>.
|
|
58
|
+
|
|
59
|
+
<b>Fixed, and the calibration is measured.</b> Fitted over the Actions job API on 2026-10-01:
|
|
60
|
+
<b>169 successful <code>mutation-shard</code> jobs</b>, of which 26 runs completed all six
|
|
61
|
+
shards. Two numbers come out, and they answer different questions. Per <em>run</em> — the
|
|
62
|
+
sum over its six shards, which is pack-invariant and so isolates runner speed from packing
|
|
63
|
+
— observed minutes over committed weight-minutes is min 0.265, <b>median 0.307</b>, max
|
|
64
|
+
0.355: a spread of only <b>1.34x</b>. Per <em>shard</em> against its own median the range is
|
|
65
|
+
1.10x (shard 3) to <b>1.91x</b> (shard 2: median 38.0 min, worst 72.5). <b>So the mean is not
|
|
66
|
+
what fails.</b> A single slow runner inside an otherwise ordinary run is, and a check scored on
|
|
67
|
+
the median would have passed the pack that was cancelled — its median shard was 37.8
|
|
68
|
+
minutes against a 75-minute cap, half the ceiling.
|
|
69
|
+
|
|
70
|
+
<b>The 0.307 is not a fudge factor, it is parallelism.</b> Weights are summed per-mutant
|
|
71
|
+
durations — the work a shard holds laid end to end — and the runner executes it
|
|
72
|
+
four-way parallel (<code>max_children</code> defaults to <code>os.cpu_count()</code>;
|
|
73
|
+
<code>ubuntu-latest</code> is 4 vCPU). The median inverts to 3.26 effective workers of 4, so what
|
|
74
|
+
is stored is <b>81.4% parallel efficiency</b> and the worker count separately: a runner with more
|
|
75
|
+
vCPUs then moves one constant and contention moves the other, where a single fitted number would
|
|
76
|
+
hide which had happened.
|
|
77
|
+
|
|
78
|
+
<b>It reproduces the failure it was derived to predict.</b> Six shards at these weights:
|
|
79
|
+
37.8 median minutes × 1.91 = a <b>72.3-minute tail</b> against a real worst job of
|
|
80
|
+
<b>72.5</b> — 96% of the cap. <code>plan --explain --timeout-minutes 75</code> now prints
|
|
81
|
+
that and exits 1. The matrix moved to <b>eight</b>, where the same arithmetic gives 28.4 ×
|
|
82
|
+
1.91 = <b>54.2 min, 72% of the cap</b>; the largest unit (4,063,161 ms) still fits inside an even
|
|
83
|
+
share (5,543,280 ms), so the speedup cap is a full 8.00x and more shards cost nothing but runner
|
|
84
|
+
slots. <code>tests/unit/test_mutation_shard_count.py</code> pins the shard count across
|
|
85
|
+
<code>ci.yml</code> and <code>mutation-weights-refresh.yml</code> (<code>timeout-minutes</code>
|
|
86
|
+
cannot be read through <code>${{ }}</code>, so agreement is asserted rather than derived), and
|
|
87
|
+
re-runs the headroom check on the committed pack every build — a pack that would be
|
|
88
|
+
cancelled now fails in the <code>test</code> job in milliseconds.
|
|
89
|
+
|
|
90
|
+
<b>Not fixed here, and now its own card:</b> a <code>cancelled</code> <code>ci</code> on main is
|
|
91
|
+
still silent. <code>ci-failure-alert</code> gates on
|
|
92
|
+
<code>conclusion == 'failure'</code>, so the run that skipped the release notified nobody either
|
|
93
|
+
— see <code>cancelled-ci-on-main-is-silent-and-skips-the-release</code>.
|
|
94
|
+
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
<div class="stat"><b>27</b><span>Shipped</span></div>
|
|
144
144
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
145
145
|
<div class="stat"><b>75</b><span>Planned</span></div>
|
|
146
|
-
<div class="stat"><b>
|
|
146
|
+
<div class="stat"><b>522</b><span>Loop finds</span></div>
|
|
147
147
|
<!-- /ROADMAP:stats -->
|
|
148
148
|
</div>
|
|
149
149
|
</section>
|
|
@@ -7748,7 +7748,7 @@ the walk and the <code>redirected</code> reporting this card inherits.</p>
|
|
|
7748
7748
|
</article>
|
|
7749
7749
|
|
|
7750
7750
|
<article class="cap rcard" id="shard-weights-do-not-predict-the-job-timeout">
|
|
7751
|
-
<div class="head"><span class="pill
|
|
7751
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">CI · Bug</span></div>
|
|
7752
7752
|
<h3>Mutation shard weights balance perfectly and predict nothing, so a shard can time out and cancel a release</h3>
|
|
7753
7753
|
<p><b>Observed, on the merge of #1015.</b> <code>mutation-shard (4)</code> ran 75 minutes against the
|
|
7754
7754
|
job's <code>timeout-minutes: 75</code> and was cancelled. The aggregate <code>mutation</code> job
|
|
@@ -7791,7 +7791,43 @@ give the heaviest shard headroom — at eight shards the ideal drops by a qu
|
|
|
7791
7791
|
speedup cap is 6.0x only because <code>store.py</code> is split per function already, so more
|
|
7792
7792
|
shards is cheap. Separately, a cancelled <code>ci</code> on main should be loud: it currently
|
|
7793
7793
|
looks identical to a success from the release path's point of view, because
|
|
7794
|
-
<code>publish.yml</code> only asks whether the conclusion was <code>success</code
|
|
7794
|
+
<code>publish.yml</code> only asks whether the conclusion was <code>success</code>.
|
|
7795
|
+
|
|
7796
|
+
<b>Fixed, and the calibration is measured.</b> Fitted over the Actions job API on 2026-10-01:
|
|
7797
|
+
<b>169 successful <code>mutation-shard</code> jobs</b>, of which 26 runs completed all six
|
|
7798
|
+
shards. Two numbers come out, and they answer different questions. Per <em>run</em> — the
|
|
7799
|
+
sum over its six shards, which is pack-invariant and so isolates runner speed from packing
|
|
7800
|
+
— observed minutes over committed weight-minutes is min 0.265, <b>median 0.307</b>, max
|
|
7801
|
+
0.355: a spread of only <b>1.34x</b>. Per <em>shard</em> against its own median the range is
|
|
7802
|
+
1.10x (shard 3) to <b>1.91x</b> (shard 2: median 38.0 min, worst 72.5). <b>So the mean is not
|
|
7803
|
+
what fails.</b> A single slow runner inside an otherwise ordinary run is, and a check scored on
|
|
7804
|
+
the median would have passed the pack that was cancelled — its median shard was 37.8
|
|
7805
|
+
minutes against a 75-minute cap, half the ceiling.
|
|
7806
|
+
|
|
7807
|
+
<b>The 0.307 is not a fudge factor, it is parallelism.</b> Weights are summed per-mutant
|
|
7808
|
+
durations — the work a shard holds laid end to end — and the runner executes it
|
|
7809
|
+
four-way parallel (<code>max_children</code> defaults to <code>os.cpu_count()</code>;
|
|
7810
|
+
<code>ubuntu-latest</code> is 4 vCPU). The median inverts to 3.26 effective workers of 4, so what
|
|
7811
|
+
is stored is <b>81.4% parallel efficiency</b> and the worker count separately: a runner with more
|
|
7812
|
+
vCPUs then moves one constant and contention moves the other, where a single fitted number would
|
|
7813
|
+
hide which had happened.
|
|
7814
|
+
|
|
7815
|
+
<b>It reproduces the failure it was derived to predict.</b> Six shards at these weights:
|
|
7816
|
+
37.8 median minutes × 1.91 = a <b>72.3-minute tail</b> against a real worst job of
|
|
7817
|
+
<b>72.5</b> — 96% of the cap. <code>plan --explain --timeout-minutes 75</code> now prints
|
|
7818
|
+
that and exits 1. The matrix moved to <b>eight</b>, where the same arithmetic gives 28.4 ×
|
|
7819
|
+
1.91 = <b>54.2 min, 72% of the cap</b>; the largest unit (4,063,161 ms) still fits inside an even
|
|
7820
|
+
share (5,543,280 ms), so the speedup cap is a full 8.00x and more shards cost nothing but runner
|
|
7821
|
+
slots. <code>tests/unit/test_mutation_shard_count.py</code> pins the shard count across
|
|
7822
|
+
<code>ci.yml</code> and <code>mutation-weights-refresh.yml</code> (<code>timeout-minutes</code>
|
|
7823
|
+
cannot be read through <code>${{ }}</code>, so agreement is asserted rather than derived), and
|
|
7824
|
+
re-runs the headroom check on the committed pack every build — a pack that would be
|
|
7825
|
+
cancelled now fails in the <code>test</code> job in milliseconds.
|
|
7826
|
+
|
|
7827
|
+
<b>Not fixed here, and now its own card:</b> a <code>cancelled</code> <code>ci</code> on main is
|
|
7828
|
+
still silent. <code>ci-failure-alert</code> gates on
|
|
7829
|
+
<code>conclusion == 'failure'</code>, so the run that skipped the release notified nobody either
|
|
7830
|
+
— see <code>cancelled-ci-on-main-is-silent-and-skips-the-release</code>.</p>
|
|
7795
7831
|
<div class="meta">
|
|
7796
7832
|
<span class="m">Complexity <b>M</b></span>
|
|
7797
7833
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -7799,6 +7835,58 @@ looks identical to a success from the release path's point of view, because
|
|
|
7799
7835
|
<span class="m">the pack is balanced to within 700ms of ideal and a shard still timed out at 75 min, cancelling a release</span>
|
|
7800
7836
|
</div>
|
|
7801
7837
|
</article>
|
|
7838
|
+
|
|
7839
|
+
<article class="cap rcard" id="cancelled-ci-on-main-is-silent-and-skips-the-release">
|
|
7840
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">CI · Bug</span></div>
|
|
7841
|
+
<h3>A <code>cancelled</code> <code>ci</code> on main skips the release and alerts nobody, because the alert asks only about <code>failure</code></h3>
|
|
7842
|
+
<p><b>Two independent gates, both keyed on the wrong half of the same enum.</b>
|
|
7843
|
+
<code>publish.yml</code> fires on <code>workflow_run</code> and ships only when
|
|
7844
|
+
<code>conclusion == 'success'</code>; <code>ci-failure-alert</code> opens the tracking issue
|
|
7845
|
+
only when <code>conclusion == 'failure'</code>. A <code>ci</code> run that concludes
|
|
7846
|
+
<code>cancelled</code> satisfies neither. <b>It does not ship and it does not tell anyone</b>
|
|
7847
|
+
— the one conclusion that falls through both.
|
|
7848
|
+
|
|
7849
|
+
<b>Observed, on the merge of #1015.</b> <code>mutation-shard (4)</code> hit
|
|
7850
|
+
<code>timeout-minutes: 75</code> and was cancelled, the aggregate <code>mutation</code> job
|
|
7851
|
+
failed, and the run concluded <code>cancelled</code> rather than <code>failure</code>. No
|
|
7852
|
+
release, no issue, no notification. It surfaced the same day, and only because somebody was
|
|
7853
|
+
reading per-shard job durations out of the Actions API for an unrelated reason — nothing
|
|
7854
|
+
in the repo would have raised it, and the next one will be found the same way or not at all.
|
|
7855
|
+
|
|
7856
|
+
<b>This is the exact blind spot <code>ci-failure-alert</code>'s own header describes.</b> That
|
|
7857
|
+
file opens by explaining that <code>demo</code> "failed six runs out of six on main, alerted
|
|
7858
|
+
nobody, and was found by a manual audit instead", and concludes that "any workflow that runs on
|
|
7859
|
+
main and nobody watches belongs here". The list was then enforced by
|
|
7860
|
+
<code>tests/unit/test_failure_alerting_covers_unattended.py</code> so a new workflow cannot
|
|
7861
|
+
quietly join the blind spot. <b>The enforcement is over <em>which workflows</em> are watched,
|
|
7862
|
+
and the hole here is <em>which conclusions</em> are</b> — <code>ci</code> is on the list
|
|
7863
|
+
and still said nothing.
|
|
7864
|
+
|
|
7865
|
+
<b>Why a timeout is not an exotic case.</b> It is the designed behaviour of every
|
|
7866
|
+
<code>timeout-minutes</code> in the repo, and <code>mutation-shard</code>'s is reached by an
|
|
7867
|
+
ordinary slow runner rather than by a bug: across 169 measured shard jobs the worst was 72.5
|
|
7868
|
+
minutes against a 75-minute cap. A job can also be cancelled by the concurrency group, by a
|
|
7869
|
+
runner eviction (<code>mutation-shard (4)</code> on #1012 died at 15.1 min with exit 143), or by
|
|
7870
|
+
a human pressing the button — and only the last of those is one anybody already knows
|
|
7871
|
+
about.
|
|
7872
|
+
|
|
7873
|
+
<b>Shape of the work.</b> Widen the alert's condition from <code>== 'failure'</code> to the set
|
|
7874
|
+
of conclusions that mean "main is not green", which is every one except <code>success</code>,
|
|
7875
|
+
<code>skipped</code> and <code>neutral</code> — naming what is <em>excluded</em> rather
|
|
7876
|
+
than what is included, so the next conclusion GitHub adds defaults to loud. The issue body
|
|
7877
|
+
should say which conclusion it was, because <em>cancelled</em> and <em>failure</em> want
|
|
7878
|
+
different first moves. Then pin it: the sibling test already enforces the workflow list, so the
|
|
7879
|
+
conclusion set wants the same treatment rather than a comment. Worth checking at the same time
|
|
7880
|
+
whether <code>publish.yml</code> should distinguish "CI did not pass" from "CI did not finish"
|
|
7881
|
+
— today both are a silent no-op, and a release that was skipped because a runner was slow
|
|
7882
|
+
is recoverable by a rerun that nobody currently knows to start.</p>
|
|
7883
|
+
<div class="meta">
|
|
7884
|
+
<span class="m">Complexity <b>S</b></span>
|
|
7885
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
7886
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
7887
|
+
<span class="m">the alerting that exists to make a red main impossible to miss asks only about 'failure', and the run that skipped a release was 'cancelled'</span>
|
|
7888
|
+
</div>
|
|
7889
|
+
</article>
|
|
7802
7890
|
<!-- /ROADMAP:cards -->
|
|
7803
7891
|
|
|
7804
7892
|
</div>
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
"""Split the mutation gate across parallel CI shards, and merge the results back.
|
|
5
5
|
|
|
6
6
|
The gate runs ~10.5k mutants over ``boost_cli/core`` and is the single longest
|
|
7
|
-
job in CI —
|
|
8
|
-
how long a PR (and
|
|
7
|
+
job in CI — measured at a median 37.5 minutes a shard over 169 real shard jobs,
|
|
8
|
+
against ~9 for the next-slowest job, so it alone sets how long a PR (and
|
|
9
|
+
therefore a release) waits.
|
|
9
10
|
|
|
10
11
|
mutmut's ``run`` accepts fnmatch patterns over mutant names
|
|
11
12
|
(``boost_cli.core.lockfile.x__skeleton__mutmut_1``), and each source file owns a
|
|
@@ -78,14 +79,39 @@ needs no freshness gate — unlike every other generated file in this repo.
|
|
|
78
79
|
|
|
79
80
|
The bound worth knowing: the largest *unit* is a floor on the slowest shard.
|
|
80
81
|
That used to be the largest file — ``store.py``, capping the useful speedup at
|
|
81
|
-
about 5.4x — and is now the largest unsplittable file, which
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
about 5.4x — and is now the largest unsplittable file, which at the committed
|
|
83
|
+
:data:`SHARDS` still fits inside an even share and so leaves the cap at the
|
|
84
|
+
shard count itself. ``plan --explain`` prints the cap, which files were split,
|
|
85
|
+
and the resulting per-shard loads.
|
|
86
|
+
|
|
87
|
+
Ratios, and the one question they cannot answer
|
|
88
|
+
-----------------------------------------------
|
|
89
|
+
Everything above is scale-free: the packer needs only that one unit is twice
|
|
90
|
+
another, so the weights can be in any unit that is consistent with itself, and
|
|
91
|
+
they are in summed per-mutant milliseconds. That was fine until it was asked a
|
|
92
|
+
question in a different unit. ``ci.yml`` caps each shard at ``timeout-minutes``;
|
|
93
|
+
a cancelled shard fails the aggregate ``mutation`` job; a ``ci`` run that is
|
|
94
|
+
*cancelled* rather than *failed* does not satisfy ``publish.yml``'s
|
|
95
|
+
``conclusion == 'success'``; so a merge to main stops shipping, quietly. That
|
|
96
|
+
happened on the merge of #1015, with ``plan --explain`` reporting ``7391040``
|
|
97
|
+
against a ceiling written in minutes and nothing anywhere converting between
|
|
98
|
+
them.
|
|
99
|
+
|
|
100
|
+
:func:`runner_minutes` converts, by dividing the serial weight by the
|
|
101
|
+
parallelism the runner actually delivers — see :data:`RUNNER_EFFICIENCY` and
|
|
102
|
+
:data:`TAIL_MULTIPLIER`, both fitted over the job API rather than assumed.
|
|
103
|
+
``plan --explain --timeout-minutes N`` then answers the question directly and
|
|
104
|
+
exits non-zero when the answer is no;
|
|
105
|
+
``tests/unit/test_mutation_shard_count.py`` asks it of the committed pack on
|
|
106
|
+
every run, so a pack that would be cancelled fails in the ``test`` job in
|
|
107
|
+
milliseconds instead of 75 minutes into the matrix.
|
|
84
108
|
|
|
85
109
|
Usage
|
|
86
110
|
-----
|
|
87
111
|
mutation_shards.py plan --shards N --index I # patterns for one shard
|
|
88
112
|
mutation_shards.py plan --shards N --explain # the whole split + speedup cap
|
|
113
|
+
mutation_shards.py plan --shards N --explain --timeout-minutes M
|
|
114
|
+
# ...and does it fit in M minutes?
|
|
89
115
|
mutation_shards.py merge --shards N --into mutants results/* # rebuild results
|
|
90
116
|
mutation_shards.py weights --source mutants # refresh the balance hints
|
|
91
117
|
mutation_shards.py drift --candidate new.json # is a refresh worth a PR?
|
|
@@ -107,6 +133,82 @@ ROOT = Path(__file__).resolve().parent.parent
|
|
|
107
133
|
SOURCE = Path("boost_cli/core")
|
|
108
134
|
WEIGHTS = Path("scripts/mutation_weights.json")
|
|
109
135
|
|
|
136
|
+
#: How many shards the CI matrix runs. Python's copy of a number that is also
|
|
137
|
+
#: spelled in two workflows, pinned against them by
|
|
138
|
+
#: ``tests/unit/test_mutation_shard_count.py`` — ``timeout-minutes`` cannot be
|
|
139
|
+
#: read through ``${{ }}``, so the agreement is asserted rather than derived.
|
|
140
|
+
SHARDS = 8
|
|
141
|
+
|
|
142
|
+
#: ``mutmut``'s worker count on the runner. It defaults to ``os.cpu_count()``
|
|
143
|
+
#: and ``setup.cfg`` sets no ``max_children``, so on ``ubuntu-latest`` — 4 vCPU
|
|
144
|
+
#: — the mutant set runs four at a time.
|
|
145
|
+
RUNNER_WORKERS = 4
|
|
146
|
+
|
|
147
|
+
#: The fraction of those four workers the runner actually delivers.
|
|
148
|
+
#:
|
|
149
|
+
#: **This is the number that made the plan predictive, and it is measured, not
|
|
150
|
+
#: assumed.** The weights are summed per-mutant durations, so a shard's weight
|
|
151
|
+
#: is the work it holds *serially* while the job runs it four-way parallel: a
|
|
152
|
+
#: plan in weight-milliseconds was predicting 123 minutes a shard against 27-76
|
|
153
|
+
#: observed, and nothing in the repo could answer "will a shard exceed the
|
|
154
|
+
#: cap?".
|
|
155
|
+
#:
|
|
156
|
+
#: Fitted over the GitHub Actions job API on 2026-10-01: **169 successful
|
|
157
|
+
#: `mutation-shard` jobs**, of which **26 runs completed all six shards**, from
|
|
158
|
+
#: 2026-09-30 to 2026-10-01. Per *run* (the sum over its six shards, which is
|
|
159
|
+
#: pack-invariant and so isolates runner speed from packing) the ratio of
|
|
160
|
+
#: observed minutes to committed weight-minutes was min 0.265, **median
|
|
161
|
+
#: 0.307**, p90 0.347, max 0.355 — a 1.34x spread. The median inverts to 3.26
|
|
162
|
+
#: effective workers of 4, hence 81.4%.
|
|
163
|
+
#:
|
|
164
|
+
#: **Two days, and the window is the weakest part of the fit.** The sample is
|
|
165
|
+
#: large (169 jobs) but short, because the weights it is a ratio *against* were
|
|
166
|
+
#: themselves re-measured on 2026-09-30 — before that the denominator is a
|
|
167
|
+
#: different number and the ratio is not comparable. So 1.34x is how much
|
|
168
|
+
#: runners varied over two days, not over a quarter, and a seasonal effect
|
|
169
|
+
#: would not be in it. That is an argument for re-fitting when the weights
|
|
170
|
+
#: move, which is the same event that already opens a PR
|
|
171
|
+
#: (``mutation-weights-refresh.yml``), not for widening the constant on a
|
|
172
|
+
#: guess.
|
|
173
|
+
#:
|
|
174
|
+
#: Expressed as efficiency rather than as the 0.307 itself so that the two
|
|
175
|
+
#: things that could move it stay separable: a runner with more vCPUs changes
|
|
176
|
+
#: ``RUNNER_WORKERS`` and leaves this alone, where contention changes this and
|
|
177
|
+
#: leaves that alone. A single fitted constant would hide which had happened.
|
|
178
|
+
#:
|
|
179
|
+
#: **The model is linear in the weight because the fixed cost is negligible,
|
|
180
|
+
#: and that was measured too, not assumed.** Extrapolating a constant fitted
|
|
181
|
+
#: at six shards to eight is only sound if per-job overhead — checkout, Python
|
|
182
|
+
#: setup, the pip install, the cache restore — does not survive the split, and
|
|
183
|
+
#: it does: over 41 shard jobs the ``mutate shard`` step is a median 35.6
|
|
184
|
+
#: minutes inside a 36.2-minute job, so everything else is **0.6 min, 1.7%**.
|
|
185
|
+
#: Predicting eight shards by the step alone (35.6 x 6/8 + 0.6 = 27.3 min)
|
|
186
|
+
#: lands 4% under what this model gives (28.4), i.e. the model errs toward
|
|
187
|
+
#: *more* time and therefore toward refusing a pack rather than passing one.
|
|
188
|
+
#: If the cache ever stops hitting, that 0.6 is what grows — re-measure before
|
|
189
|
+
#: trusting the extrapolation again.
|
|
190
|
+
RUNNER_EFFICIENCY = 0.814
|
|
191
|
+
|
|
192
|
+
#: How much worse the *worst* run of a shard is than that shard's median.
|
|
193
|
+
#:
|
|
194
|
+
#: The mean is not what fails. Per-run totals vary by only 1.34x, but an
|
|
195
|
+
#: individual shard against its own median ranges 1.10x (shard 3) to **1.91x**
|
|
196
|
+
#: (shard 2: median 38.0 min, worst 72.5) — one slow runner inside an otherwise
|
|
197
|
+
#: ordinary run. The cap is reached by that tail, so the headroom check is
|
|
198
|
+
#: scored against it and not against the median.
|
|
199
|
+
#:
|
|
200
|
+
#: It is a *measured* multiplier and it reproduces the observed worst case:
|
|
201
|
+
#: 37.8 predicted median minutes at six shards x 1.91 = 72.2, against a real
|
|
202
|
+
#: worst job of 72.5 — which is 97% of ``timeout-minutes: 75``. That is the
|
|
203
|
+
#: cancellation this constant exists to predict, and at the time it was
|
|
204
|
+
#: observed nothing printed a number anyone could have compared to the cap.
|
|
205
|
+
TAIL_MULTIPLIER = 1.91
|
|
206
|
+
|
|
207
|
+
#: Fraction of ``timeout-minutes`` the predicted tail may reach before
|
|
208
|
+
#: ``plan --timeout-minutes`` calls the pack unsafe. 0.80 leaves the slowest
|
|
209
|
+
#: shard a fifth of the cap in hand; the pack that was cancelled scored 0.97.
|
|
210
|
+
HEADROOM = 0.80
|
|
211
|
+
|
|
110
212
|
#: "No override is in force", which is a different state from "the override is
|
|
111
213
|
#: no file at all" — ``None`` has to stay available as a value, because that is
|
|
112
214
|
#: how ``drift`` compares against a checkout with no committed hints.
|
|
@@ -596,6 +698,66 @@ def pattern_for(root: Path, path: Path):
|
|
|
596
698
|
return "%s.x_%s__mutmut_*" % (dotted, unit.symbol)
|
|
597
699
|
|
|
598
700
|
|
|
701
|
+
def runner_minutes(weight_ms: float) -> float:
|
|
702
|
+
"""Weight-milliseconds as wall-clock minutes on a CI runner.
|
|
703
|
+
|
|
704
|
+
The two units are not the same quantity and the gap is not a fudge: a
|
|
705
|
+
shard's weight is summed per-mutant durations — the work it holds laid end
|
|
706
|
+
to end — and the runner executes that work ``RUNNER_WORKERS``-way parallel
|
|
707
|
+
at ``RUNNER_EFFICIENCY``. Dividing is the whole of the model.
|
|
708
|
+
|
|
709
|
+
It is the *only* thing that lets the plan be compared to anything. Weights
|
|
710
|
+
are self-consistent ratios, which is all the packer needs, so the packer
|
|
711
|
+
was right to ignore this; but a ratio cannot be held against
|
|
712
|
+
``timeout-minutes``, and the question "will this shard be cancelled?" is
|
|
713
|
+
asked in minutes or not at all.
|
|
714
|
+
"""
|
|
715
|
+
return weight_ms / 60000.0 / (RUNNER_WORKERS * RUNNER_EFFICIENCY)
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def tail_minutes(weight_ms: float) -> float:
|
|
719
|
+
"""The slow-runner case for a shard of this weight — what the cap must clear.
|
|
720
|
+
|
|
721
|
+
:func:`runner_minutes` gives the median run. Scoring the cap against that
|
|
722
|
+
would have passed the pack that was cancelled: its median shard was 37.8
|
|
723
|
+
minutes against a 75-minute cap, a comfortable-looking 50%, while the job
|
|
724
|
+
that actually died ran 72.5. See :data:`TAIL_MULTIPLIER`.
|
|
725
|
+
"""
|
|
726
|
+
return runner_minutes(weight_ms) * TAIL_MULTIPLIER
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
def headroom_report(loads: list[int], cap: int) -> tuple[bool, list[str]]:
|
|
730
|
+
"""Does the heaviest shard fit inside ``cap`` minutes, with margin?
|
|
731
|
+
|
|
732
|
+
Returns ``(safe, lines)``. The caller decides what a false means, because
|
|
733
|
+
the two callers want different things: ``plan --explain`` prints the lines
|
|
734
|
+
and exits non-zero, and the lockstep test asserts on the bool.
|
|
735
|
+
|
|
736
|
+
The budget is ``cap * HEADROOM`` rather than ``cap`` itself, and **not**
|
|
737
|
+
because the prediction is a median — :func:`tail_minutes` has already
|
|
738
|
+
applied the slow-runner multiplier, so the number being compared is the
|
|
739
|
+
tail, not the middle. The margin is for the two things the tail estimate
|
|
740
|
+
does not contain: :data:`TAIL_MULTIPLIER` is a *max over 28 samples per
|
|
741
|
+
shard*, which is an estimate that only grows as runs accumulate, and the
|
|
742
|
+
weights it scales drift between refreshes. Twenty percent is what keeps a
|
|
743
|
+
pack that is merely near the line from being called fine until the day a
|
|
744
|
+
worse runner than any yet seen turns up.
|
|
745
|
+
"""
|
|
746
|
+
worst = max(loads)
|
|
747
|
+
tail = tail_minutes(worst)
|
|
748
|
+
budget = cap * HEADROOM
|
|
749
|
+
safe = tail <= budget
|
|
750
|
+
lines = [
|
|
751
|
+
"timeout : %d min (ci.yml), budget %.1f min at %.0f%% headroom"
|
|
752
|
+
% (cap, budget, HEADROOM * 100),
|
|
753
|
+
"slowest tail: %.1f min (%.1f min median x %.2f slow-runner)"
|
|
754
|
+
% (tail, runner_minutes(worst), TAIL_MULTIPLIER),
|
|
755
|
+
"headroom : %s — slowest shard reaches %.0f%% of the cap"
|
|
756
|
+
% ("OK" if safe else "TOO TIGHT", 100.0 * tail / cap),
|
|
757
|
+
]
|
|
758
|
+
return safe, lines
|
|
759
|
+
|
|
760
|
+
|
|
599
761
|
def cmd_plan(args: argparse.Namespace) -> int:
|
|
600
762
|
root = Path(args.root)
|
|
601
763
|
bins = pack(root, args.shards)
|
|
@@ -625,15 +787,55 @@ def cmd_plan(args: argparse.Namespace) -> int:
|
|
|
625
787
|
else:
|
|
626
788
|
unit = "lines"
|
|
627
789
|
print("weights : lines of code (no %s yet)" % WEIGHTS)
|
|
790
|
+
# Minutes only where the weights ARE time. On the count and line tiers
|
|
791
|
+
# the number is a ratio with no runner behind it, and printing "min"
|
|
792
|
+
# against it would be the same category error this whole calibration
|
|
793
|
+
# exists to remove — one unit further along.
|
|
794
|
+
def also_minutes(value: float) -> str:
|
|
795
|
+
return " (~%.1f min)" % runner_minutes(value) if unit == "ms" else ""
|
|
796
|
+
|
|
628
797
|
print("total weight: %d %s" % (total, unit))
|
|
629
|
-
print("ideal shard : %d %s"
|
|
798
|
+
print("ideal shard : %d %s%s"
|
|
799
|
+
% (total // args.shards, unit, also_minutes(total / args.shards)))
|
|
630
800
|
heaviest = max(unit_weight(root, u) for b in bins for u in b)
|
|
631
801
|
print("largest unit: %d (floor on the slowest shard)" % heaviest)
|
|
632
802
|
print("speedup cap : %.2fx" % (total / max(loads)))
|
|
633
803
|
for i, (b, ld) in enumerate(zip(bins, loads, strict=True)):
|
|
634
|
-
print(" shard %d: weight %5d, %2d units"
|
|
635
|
-
|
|
804
|
+
print(" shard %d: weight %5d, %2d units%s"
|
|
805
|
+
% (i, ld, len(b), also_minutes(ld)))
|
|
636
806
|
|
|
807
|
+
if args.timeout_minutes is None:
|
|
808
|
+
return 0
|
|
809
|
+
if unit != "ms":
|
|
810
|
+
# Refuse rather than answer. A headroom verdict computed off line
|
|
811
|
+
# counts would read exactly like one computed off measured time,
|
|
812
|
+
# and the whole point of the check is that it can be trusted
|
|
813
|
+
# against the cap.
|
|
814
|
+
print("headroom : not checked — weights are %s, not measured time"
|
|
815
|
+
% unit)
|
|
816
|
+
return 0
|
|
817
|
+
safe, lines = headroom_report(loads, args.timeout_minutes)
|
|
818
|
+
for line in lines:
|
|
819
|
+
print(line)
|
|
820
|
+
return 0 if safe else 1
|
|
821
|
+
|
|
822
|
+
if args.timeout_minutes is not None:
|
|
823
|
+
# Not merely unsupported — actively refused. ci.yml does
|
|
824
|
+
# PATTERNS="$(plan --shards N --index $SHARD)", so every word this
|
|
825
|
+
# prints on the --index path becomes an argument to `mutmut run`.
|
|
826
|
+
#
|
|
827
|
+
# Checked against mutmut rather than assumed, because the obvious
|
|
828
|
+
# guess is wrong: it does NOT quietly run an empty set. A filter that
|
|
829
|
+
# matches nothing trips `assert filtered_mutants, "Filtered for
|
|
830
|
+
# specific mutants, but nothing matches"`, and a stray word with no
|
|
831
|
+
# `*` in it goes to `tests_by_mangled_function_name[...]` and raises
|
|
832
|
+
# KeyError. Both are loud. What is NOT loud is the mixed case — a
|
|
833
|
+
# stray word alongside real patterns leaves the assert satisfied, and
|
|
834
|
+
# the word is silently ignored. So the cost is a confusing crash or
|
|
835
|
+
# nothing at all, and neither is a reason to let prose onto that
|
|
836
|
+
# stdout. ci.yml's own `[ -z "$PATTERNS" ]` guard catches only the
|
|
837
|
+
# empty case and would not see any of this.
|
|
838
|
+
raise SystemExit("mutation_shards plan: --timeout-minutes needs --explain")
|
|
637
839
|
if args.index is None:
|
|
638
840
|
raise SystemExit("mutation_shards plan: --index is required without --explain")
|
|
639
841
|
if not 0 <= args.index < args.shards:
|
|
@@ -822,8 +1024,8 @@ def cmd_scope(args: argparse.Namespace) -> int:
|
|
|
822
1024
|
|
|
823
1025
|
Fails SAFE. An empty or unreadable file list means we could not prove the
|
|
824
1026
|
score is unchanged, so we say `true` and do the work. The expensive outcome
|
|
825
|
-
is
|
|
826
|
-
gating.
|
|
1027
|
+
is one wasted shard — ~28 minutes at the committed :data:`SHARDS` — and the
|
|
1028
|
+
cheap-looking one is a gate that silently stops gating.
|
|
827
1029
|
"""
|
|
828
1030
|
if args.changed == "-":
|
|
829
1031
|
changed = sys.stdin.read().splitlines()
|
|
@@ -1257,6 +1459,11 @@ def main() -> int:
|
|
|
1257
1459
|
p.add_argument("--shards", type=int, required=True)
|
|
1258
1460
|
p.add_argument("--index", type=int)
|
|
1259
1461
|
p.add_argument("--explain", action="store_true", help="print the whole split instead")
|
|
1462
|
+
p.add_argument("--timeout-minutes", type=int,
|
|
1463
|
+
help="ci.yml's per-shard ceiling; with --explain, exit 1 "
|
|
1464
|
+
"when the slowest shard's predicted tail reaches it "
|
|
1465
|
+
"(requires --explain — the --index path's stdout is "
|
|
1466
|
+
"captured into mutmut's argv and must stay patterns)")
|
|
1260
1467
|
p.set_defaults(func=cmd_plan)
|
|
1261
1468
|
|
|
1262
1469
|
m = sub.add_parser("merge", help="merge per-shard .meta results for the gate")
|
|
@@ -1282,7 +1489,7 @@ def main() -> int:
|
|
|
1282
1489
|
d = sub.add_parser("drift", help="is the committed balance hint worth replacing?")
|
|
1283
1490
|
d.add_argument("--candidate", required=True,
|
|
1284
1491
|
help="a freshly measured mutation_weights.json to compare against")
|
|
1285
|
-
d.add_argument("--shards", type=int, default=
|
|
1492
|
+
d.add_argument("--shards", type=int, default=SHARDS)
|
|
1286
1493
|
d.add_argument("--threshold", type=float, default=DRIFT_THRESHOLD,
|
|
1287
1494
|
help="slowest-shard cost over the measured best, above which "
|
|
1288
1495
|
"a refresh is worth a pull request (default: %(default)s)")
|