boost-skill-cli 1.2.33__tar.gz → 1.2.34__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.33 → boost_skill_cli-1.2.34}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/configuration.py +21 -1
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/quality.py +20 -2
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/safety.py +7 -1
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/store.py +12 -1
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/SOURCES.txt +6 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/openssf-badge.md +6 -9
- boost_skill_cli-1.2.34/docs/roadmap/items/cli-command-audit.md +72 -0
- boost_skill_cli-1.2.34/docs/roadmap/items/reproducible-release-artifacts.md +62 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap.html +130 -2
- boost_skill_cli-1.2.34/docs/verifying-releases.md +214 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/pyproject.toml +13 -1
- boost_skill_cli-1.2.34/scripts/check_reproducible.py +181 -0
- boost_skill_cli-1.2.34/scripts/normalize_sdist.py +158 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_catalog.py +24 -1
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_configuration.py +26 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_quality.py +43 -0
- boost_skill_cli-1.2.34/tests/unit/test_check_reproducible.py +192 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_link_ownership.py +35 -0
- boost_skill_cli-1.2.34/tests/unit/test_normalize_sdist.py +216 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_store.py +33 -0
- boost_skill_cli-1.2.33/docs/verifying-releases.md +0 -146
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.gitattributes +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.gitignore +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/.vale.ini +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/DCO +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/LICENSE +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/Makefile +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/README.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/codecov.yml +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/index.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/README.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/examples/README.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/index.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/noxfile.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/setup.cfg +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/README.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/boost.css +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/boost.js +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/style/demo.html +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.33 → boost_skill_cli-1.2.34}/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.34'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 34)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -570,6 +570,26 @@ def _write_onboard_file(dest: Path, content: str, force: bool) -> bool:
|
|
|
570
570
|
return True
|
|
571
571
|
|
|
572
572
|
|
|
573
|
+
def _telemetry_created(dest: Path) -> str:
|
|
574
|
+
"""The existing file's ``created`` timestamp, or now for a fresh write.
|
|
575
|
+
|
|
576
|
+
``_write_onboard_file`` treats a byte-identical re-run as a no-op — but
|
|
577
|
+
stamping a fresh ``util.now_iso()`` into telemetry.json on every
|
|
578
|
+
invocation meant the comparison could only match by wall-clock luck (two
|
|
579
|
+
invocations landing in the same second), defeating the "re-running
|
|
580
|
+
onboard regenerates the workflow byte-for-byte" guarantee documented
|
|
581
|
+
above for the one file whose content is otherwise fully deterministic.
|
|
582
|
+
"""
|
|
583
|
+
try:
|
|
584
|
+
data = json.loads(dest.read_text(encoding="utf-8"))
|
|
585
|
+
created = data.get("created")
|
|
586
|
+
if isinstance(created, str) and created:
|
|
587
|
+
return created
|
|
588
|
+
except (OSError, UnicodeDecodeError, json.JSONDecodeError):
|
|
589
|
+
pass
|
|
590
|
+
return util.now_iso()
|
|
591
|
+
|
|
592
|
+
|
|
573
593
|
def cmd_onboard(argv) -> int:
|
|
574
594
|
"""boost onboard [--repo DIR] [--pr] [--dry-run] [--force]"""
|
|
575
595
|
p = cliparse.parser(
|
|
@@ -593,7 +613,7 @@ def cmd_onboard(argv) -> int:
|
|
|
593
613
|
telemetry = json.dumps({
|
|
594
614
|
"enabled": True,
|
|
595
615
|
"share_pulse": True,
|
|
596
|
-
"created":
|
|
616
|
+
"created": _telemetry_created(repo / _TELEMETRY_REL),
|
|
597
617
|
"by": util.user(),
|
|
598
618
|
}, indent=2) + "\n"
|
|
599
619
|
files = [(_TELEMETRY_REL, telemetry), (_WORKFLOW_REL, _WORKFLOW_YML)]
|
|
@@ -94,7 +94,12 @@ def _resolve_as_far_as_it_exists(path: Path) -> Path:
|
|
|
94
94
|
while cur != cur.parent and not cur.exists():
|
|
95
95
|
tail.append(cur.name)
|
|
96
96
|
cur = cur.parent
|
|
97
|
-
with
|
|
97
|
+
# RuntimeError is not redundant with OSError here: Python 3.12's
|
|
98
|
+
# `Path.resolve()` raises RuntimeError("Symlink loop from ...") for a
|
|
99
|
+
# cycle even in non-strict mode, and RuntimeError is NOT an OSError
|
|
100
|
+
# subclass — 3.13+ raises OSError for the same input. See
|
|
101
|
+
# store.resolves_into_store for the identical split, caught the same way.
|
|
102
|
+
with suppress(OSError, RuntimeError):
|
|
98
103
|
cur = cur.resolve()
|
|
99
104
|
return cur.joinpath(*reversed(tail))
|
|
100
105
|
|
|
@@ -907,10 +912,18 @@ def cmd_heal(argv):
|
|
|
907
912
|
|
|
908
913
|
plan = store.sync_plan()
|
|
909
914
|
if dry:
|
|
915
|
+
# `ours` above is exactly what a real run unlinks before computing
|
|
916
|
+
# this plan, so `sync_plan`'s stale-link sweep never sees those paths
|
|
917
|
+
# on a real run — only here, where nothing was unlinked yet. Skip
|
|
918
|
+
# them so a preview doesn't report the same path twice under two
|
|
919
|
+
# different actions.
|
|
920
|
+
already_reported = {str(link) for link in ours}
|
|
910
921
|
for name, agent in plan["missing_links"]:
|
|
911
922
|
out.info("would link %s → %s" % (name, agent))
|
|
912
923
|
actions.append("link %s" % name)
|
|
913
924
|
for p in plan["stale_links"]:
|
|
925
|
+
if p in already_reported:
|
|
926
|
+
continue
|
|
914
927
|
out.info("would remove stale link %s" % _tilde(p))
|
|
915
928
|
actions.append("stale %s" % p)
|
|
916
929
|
for name in plan["missing_store"]:
|
|
@@ -988,7 +1001,12 @@ def cmd_conflict(argv):
|
|
|
988
1001
|
ap.add_argument("--json", action="store_true")
|
|
989
1002
|
args = ap.parse_args(argv)
|
|
990
1003
|
|
|
991
|
-
|
|
1004
|
+
# Quarantine removes a skill's active links/materialization on purpose
|
|
1005
|
+
# (see _drift_status_materialized's docstring) — a quarantined skill has
|
|
1006
|
+
# nothing live to be contradicted by, so it is excluded from both sides
|
|
1007
|
+
# of conflict detection rather than surfacing a conflict finding no
|
|
1008
|
+
# `boost quarantine` can ever clear.
|
|
1009
|
+
installed = [(n, e) for n, e in _iter_installed() if not e.get("quarantined")]
|
|
992
1010
|
rules: list[tuple[str, str, str, set]] = [] # skill, line, polarity, stems
|
|
993
1011
|
declared: list[tuple[str, str]] = [] # skill, conflicting skill
|
|
994
1012
|
installed_names = {n for n, _e in installed}
|
|
@@ -268,7 +268,13 @@ def _trust_audit(as_json: bool) -> int:
|
|
|
268
268
|
"""`boost audit --skills` — one trust-health answer for the installed set."""
|
|
269
269
|
installed = dict(_iter_installed())
|
|
270
270
|
peers: dict = {}
|
|
271
|
-
|
|
271
|
+
# Quarantine removes a skill's active links on purpose — pairing it as a
|
|
272
|
+
# conflict source or target would report a finding `boost quarantine`
|
|
273
|
+
# (its own documented remedy) can never clear. Non-quarantined skills are
|
|
274
|
+
# still checked against a quarantined peer's *declared* conflicts via
|
|
275
|
+
# `_installed_conflicts`, so only the pairing set is trimmed here.
|
|
276
|
+
active_names = [n for n, lk in installed.items() if not lk.get("quarantined")]
|
|
277
|
+
for name, peer in trustaudit.conflict_pairs(active_names,
|
|
272
278
|
_installed_conflicts(installed)):
|
|
273
279
|
peers.setdefault(name, []).append(peer)
|
|
274
280
|
|
|
@@ -80,7 +80,16 @@ def installed() -> dict:
|
|
|
80
80
|
def source_dir_for(entry: dict) -> Path:
|
|
81
81
|
"""Absolute path of a catalog entry's skill dir inside its tap clone.
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
Clones the tap first if it is only *registered* and not yet cloned — the
|
|
84
|
+
state `boost catalog --import` deliberately leaves a tap in (a bundle
|
|
85
|
+
ships the catalogue, not the repo, precisely so the receiver can search
|
|
86
|
+
before paying for any clone). `catalog --import`'s own hint promises
|
|
87
|
+
"`boost install` clones just the one registry it needs"; without this, a
|
|
88
|
+
tap that was imported rather than tapped raised "source vanished from
|
|
89
|
+
tap" — a message that implies the source *used to* exist, when really it
|
|
90
|
+
was never fetched.
|
|
91
|
+
|
|
92
|
+
Materializes the directory next. Taps check out Markdown only, so a skill
|
|
84
93
|
that ships `scripts/` or `assets/` has them in the index and not on disk;
|
|
85
94
|
`_copy_skill` is a copytree, and handed a partial directory it copies what
|
|
86
95
|
is there and reports success. Every consumer of a tap's real files — both
|
|
@@ -88,6 +97,8 @@ def source_dir_for(entry: dict) -> Path:
|
|
|
88
97
|
the one place that has to get it right.
|
|
89
98
|
"""
|
|
90
99
|
tap = registry.get(entry["tap"])
|
|
100
|
+
if not tap.is_cloned:
|
|
101
|
+
gitutil.clone_shallow(tap.url, tap.path)
|
|
91
102
|
src = tap.path if entry["rel_dir"] == "." else tap.path / entry["rel_dir"]
|
|
92
103
|
gitutil.materialize(tap.path, entry["rel_dir"])
|
|
93
104
|
if not (src / "SKILL.md").exists():
|
|
@@ -227,6 +227,7 @@ docs/roadmap/items/ci-job-timeout-minutes.md
|
|
|
227
227
|
docs/roadmap/items/ci-summary-step-fails-itself.md
|
|
228
228
|
docs/roadmap/items/ci-time-is-now-runner-queueing.md
|
|
229
229
|
docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
|
|
230
|
+
docs/roadmap/items/cli-command-audit.md
|
|
230
231
|
docs/roadmap/items/cli-output-ignored-the-terminal.md
|
|
231
232
|
docs/roadmap/items/code-scanning-rule-can-be-restored.md
|
|
232
233
|
docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
|
|
@@ -391,6 +392,7 @@ docs/roadmap/items/reconcile-the-theme-drift.md
|
|
|
391
392
|
docs/roadmap/items/refresh-the-marketing-surface.md
|
|
392
393
|
docs/roadmap/items/rel-time-tests-race-the-wall-clock.md
|
|
393
394
|
docs/roadmap/items/release-verifies-the-wrong-commit.md
|
|
395
|
+
docs/roadmap/items/reproducible-release-artifacts.md
|
|
394
396
|
docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md
|
|
395
397
|
docs/roadmap/items/required-checks-config-drift.md
|
|
396
398
|
docs/roadmap/items/resolve-vendored-duplicate-copies.md
|
|
@@ -508,6 +510,7 @@ scripts/build_scale_corpus.py
|
|
|
508
510
|
scripts/check_anchors.py
|
|
509
511
|
scripts/check_dco.py
|
|
510
512
|
scripts/check_licenses.py
|
|
513
|
+
scripts/check_reproducible.py
|
|
511
514
|
scripts/check_required_checks.py
|
|
512
515
|
scripts/ensure_eval_corpus.sh
|
|
513
516
|
scripts/eval_corpus.py
|
|
@@ -522,6 +525,7 @@ scripts/measure_registry.py
|
|
|
522
525
|
scripts/mutation_gate.py
|
|
523
526
|
scripts/mutation_shards.py
|
|
524
527
|
scripts/mutation_weights.json
|
|
528
|
+
scripts/normalize_sdist.py
|
|
525
529
|
scripts/page_budget.py
|
|
526
530
|
scripts/perf_gate.py
|
|
527
531
|
scripts/post_deploy_smoke.py
|
|
@@ -632,6 +636,7 @@ tests/unit/test_chat.py
|
|
|
632
636
|
tests/unit/test_check_anchors.py
|
|
633
637
|
tests/unit/test_check_dco.py
|
|
634
638
|
tests/unit/test_check_licenses.py
|
|
639
|
+
tests/unit/test_check_reproducible.py
|
|
635
640
|
tests/unit/test_claude_settings.py
|
|
636
641
|
tests/unit/test_clean_internal_cache.py
|
|
637
642
|
tests/unit/test_cliparse.py
|
|
@@ -710,6 +715,7 @@ tests/unit/test_mutation_shards.py
|
|
|
710
715
|
tests/unit/test_mutation_subfile_shards.py
|
|
711
716
|
tests/unit/test_mutmut_source_paths.py
|
|
712
717
|
tests/unit/test_nethttp.py
|
|
718
|
+
tests/unit/test_normalize_sdist.py
|
|
713
719
|
tests/unit/test_output.py
|
|
714
720
|
tests/unit/test_page_budget.py
|
|
715
721
|
tests/unit/test_paths.py
|
|
@@ -213,8 +213,8 @@ of the security-design document for the full account.
|
|
|
213
213
|
|
|
214
214
|
## Gold
|
|
215
215
|
|
|
216
|
-
Gold is **23** criteria on top of silver.
|
|
217
|
-
|
|
216
|
+
Gold is **23** criteria on top of silver. Seventeen are Met, two are N/A and
|
|
217
|
+
four are Unmet. Three of the four are about how many people work on boost
|
|
218
218
|
rather than about the code, so no pull request can close them.
|
|
219
219
|
|
|
220
220
|
That count is worth a note, because an earlier version of this section said 21
|
|
@@ -225,10 +225,9 @@ like a plausible total, so nothing flagged it; the gap only appeared on the
|
|
|
225
225
|
submission form, where 23 rows were waiting. A count that looks reasonable is
|
|
226
226
|
not a checked count.
|
|
227
227
|
|
|
228
|
-
Read this section as the honest ceiling.
|
|
229
|
-
boost stops on its own: of the
|
|
230
|
-
|
|
231
|
-
recruiting problem.
|
|
228
|
+
Read this section as the honest ceiling. Nineteen of twenty-three is where
|
|
229
|
+
boost stops on its own: of the four that remain, one is engineering (a host
|
|
230
|
+
that sets response headers) and three are a recruiting problem.
|
|
232
231
|
|
|
233
232
|
### Prerequisites and project oversight
|
|
234
233
|
|
|
@@ -265,7 +264,7 @@ recruiting problem.
|
|
|
265
264
|
|
|
266
265
|
| Criterion | Cat. | Answer | Evidence |
|
|
267
266
|
|---|---|---|---|
|
|
268
|
-
| `build_reproducible` | MUST | **
|
|
267
|
+
| `build_reproducible` | MUST | **Met** | Measured, not assumed: `scripts/check_reproducible.py` builds the project twice with `SOURCE_DATE_EPOCH` pinned to the same value both times and diffs the results — both the **wheel and the sdist are now bit-identical**. They were not: `setuptools` writes each sdist tar member's real mtime plus the builder's `uid`/`gid`/user name with no override, so 54 members differed between builds two seconds apart ([pypa/setuptools#2133](https://github.com/pypa/setuptools/issues/2133), open since 2020). `scripts/normalize_sdist.py` now clamps that in `publish.yml`, between the build and `twine check`, and the release toolchain that produces the artifacts is hash-pinned (`requirements/release-tools.txt`) with `pyproject.toml`'s `[build-system].requires` exact-pinned rather than left as a floor. The full measurement and the commands to reproduce it are in [docs/verifying-releases.md](https://github.com/jonnyeclectic/boost/blob/main/docs/verifying-releases.md#can-you-rebuild-it-yourself-yes--the-measurement). N/A would be wrong: boost ships wheels. |
|
|
269
268
|
|
|
270
269
|
### Test invocation and coverage
|
|
271
270
|
|
|
@@ -303,8 +302,6 @@ recruiting problem.
|
|
|
303
302
|
- `bus_factor`, `contributors_unassociated`, `two_person_review` — **a second
|
|
304
303
|
person**, sustained. Not a document, not a check, and not something to
|
|
305
304
|
simulate with a second account.
|
|
306
|
-
- `build_reproducible` — pin the release build toolchain, then normalise the
|
|
307
|
-
sdist tarball.
|
|
308
305
|
- `hardened_site` — host the documentation somewhere that lets you set
|
|
309
306
|
response headers.
|
|
310
307
|
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cli-command-audit
|
|
3
|
+
board: code
|
|
4
|
+
section: shipped
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Quality · CLI
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: audited all 80 COMMANDS entries against a disposable HOME; 4 real defects fixed with tests
|
|
11
|
+
order: 128
|
|
12
|
+
owner: loop/verify
|
|
13
|
+
pr:
|
|
14
|
+
title: All 80 <code>boost</code> commands audited against a disposable HOME — four defects fixed
|
|
15
|
+
---
|
|
16
|
+
Every command in <code>boost_cli/cli.py</code>'s <code>COMMANDS</code> table (not memory of
|
|
17
|
+
what the CLI does) was exercised for real: <code>--help</code> against its actual
|
|
18
|
+
<code>argparse</code> definition, the happy path against its one-line summary and
|
|
19
|
+
<code>docs/commands.html</code>, exit codes on success/error/empty-store/nonexistent-name,
|
|
20
|
+
and — for anything that mutates state — the real lock file, symlinks and cache on
|
|
21
|
+
disk, not just stdout. Four parallel audits split the ~80 commands by
|
|
22
|
+
<code>COMMANDS</code>'s own groups (pkg+find, info+tap+ai, quality/safety, cfg+team) so
|
|
23
|
+
every command got adversarial testing (tampered store content, corrupted lock JSON,
|
|
24
|
+
deleted store dirs, real signed/tampered minisign manifests) rather than a clean-state
|
|
25
|
+
smoke pass.
|
|
26
|
+
|
|
27
|
+
The known failure modes this codebase has shipped before were hunted deliberately: a
|
|
28
|
+
command reporting success without doing the thing, a raw read that misses a tap's sparse
|
|
29
|
+
checkout, <code>Path.resolve(strict=True)</code>'s <code>RuntimeError</code>/<code>OSError</code>
|
|
30
|
+
split between Python 3.12 and 3.13+, and a dry-run that silently no-ops or over-reports.
|
|
31
|
+
<code>boost trust add</code> — the one command with a documented history of exactly the
|
|
32
|
+
first failure mode (a merged autofix once deleted its fingerprint line) — was
|
|
33
|
+
re-verified against real Ed25519 signatures and tampering and held up.
|
|
34
|
+
|
|
35
|
+
Four real defects, each fixed with a failing-then-passing test. <code>boost conflict</code>
|
|
36
|
+
and <code>boost audit --skills</code> kept reporting a MED conflict finding against a skill
|
|
37
|
+
after it was quarantined — quarantine's own documented purpose ("isolate a problematic
|
|
38
|
+
skill") gave no relief from the one command whose entire job is to report that condition;
|
|
39
|
+
both now exclude quarantined skills from conflict pairing. <code>boost catalog
|
|
40
|
+
--import</code> tells the receiver "<code>boost install</code> clones just the one registry
|
|
41
|
+
it needs", but <code>install</code> performed no lazy clone — the one end-to-end path the
|
|
42
|
+
command advertises (import → search → install) failed with a misleading "source
|
|
43
|
+
vanished from tap" error; <code>store.source_dir_for</code> now clones a
|
|
44
|
+
registered-but-uncloned tap on demand, the single choke point every consumer of tap content
|
|
45
|
+
already goes through. <code>boost onboard</code>'s own docstring promises a byte-for-byte
|
|
46
|
+
no-op on an unchanged re-run, but <code>.boost/telemetry.json</code> stamped a fresh
|
|
47
|
+
timestamp on every invocation, so the comparison could only pass by wall-clock luck — a
|
|
48
|
+
scripted <code>boost onboard --pr</code> on an already-onboarded repo would open a PR
|
|
49
|
+
containing only a timestamp bump, forever; it now preserves the existing file's
|
|
50
|
+
<code>created</code> field. <code>boost heal --dry-run</code> double-reported the same
|
|
51
|
+
broken symlink under two different messages ("would remove broken link" and "would remove
|
|
52
|
+
stale link") because the real run unlinks before computing <code>sync_plan()</code> while
|
|
53
|
+
dry-run never unlinks anything — a preview overstating what running <code>heal</code> for
|
|
54
|
+
real actually does.
|
|
55
|
+
|
|
56
|
+
A fifth, latent-only finding was fixed alongside them: <code>quality.py</code>'s
|
|
57
|
+
<code>_resolve_as_far_as_it_exists</code> caught only <code>OSError</code> around a
|
|
58
|
+
non-strict <code>Path.resolve()</code>, the same symlink-loop gap
|
|
59
|
+
<code>store.resolves_into_store</code> had already been fixed for. Verified empirically
|
|
60
|
+
(not just read) on both interpreters: <code>Path.resolve(strict=False)</code> on a
|
|
61
|
+
symlink-loop path returns silently on 3.14 and raises <code>RuntimeError</code> on 3.12 —
|
|
62
|
+
confirmed with a live symlink cycle on both, and the full affected test suite reran green
|
|
63
|
+
on a real Python 3.12 venv.
|
|
64
|
+
|
|
65
|
+
Two findings were investigated and deliberately left alone after checking the existing
|
|
66
|
+
test suite rather than trusting the audit's framing: <code>boost drift</code> always
|
|
67
|
+
exiting 0 is pinned as intentional by <code>tests/functional/test_cli_quality.py</code>'s
|
|
68
|
+
own comment ("rc stays 0: drift only reports"), and <code>boost who</code>'s aggregate view
|
|
69
|
+
counting every journal subject (not just install/edit/evolve/distill/tag actions) toward
|
|
70
|
+
"skill expertise" is pinned the same way by an existing test asserting a tap name in the
|
|
71
|
+
skills set. Flipping either would contradict a deliberately written existing test, not fix
|
|
72
|
+
an oversight.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: reproducible-release-artifacts
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Security · Reproducibility
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: wheel + sdist now bit-identical; setuptools#2133 has no native fix
|
|
11
|
+
order: 128
|
|
12
|
+
owner: loop/repro
|
|
13
|
+
pr:
|
|
14
|
+
title: Reproducible release builds — the sdist half nobody's setuptools does for you
|
|
15
|
+
---
|
|
16
|
+
<code>build_reproducible</code> was Unmet on measurement: with <code>SOURCE_DATE_EPOCH</code> set,
|
|
17
|
+
two builds of the same commit produced a <b>bit-identical wheel</b> and a <b>differing
|
|
18
|
+
sdist</b>. <code>setuptools</code> writes each tar member's real build-time mtime, and the
|
|
19
|
+
builder's <code>uid</code>/<code>gid</code>/user name, into the sdist with no environment
|
|
20
|
+
variable to override either — 54 members differed between builds two seconds apart on the
|
|
21
|
+
same machine, and a build on another machine would have differed in the ownership fields too.
|
|
22
|
+
|
|
23
|
+
<b>The upstream knob doesn't exist.</b> <a href="https://github.com/pypa/setuptools/issues/2133">
|
|
24
|
+
pypa/setuptools#2133</a> has asked for <code>SOURCE_DATE_EPOCH</code> support in sdist since 2020;
|
|
25
|
+
it is still open, with no fix in the version this project pins. The one PyPI package that already
|
|
26
|
+
patches it, <code>setuptools-reproducible</code>, does so by replacing
|
|
27
|
+
<code>build-backend</code> entirely — and its dependency closure could not be hash-pinned
|
|
28
|
+
the way the rest of boost's toolchain is, because <code>[build-system].requires</code> is a bare
|
|
29
|
+
PEP 508 requirement string with no hash field. So the fix is a small, stdlib-only
|
|
30
|
+
post-processing step instead: <code>scripts/normalize_sdist.py</code> clamps every member's
|
|
31
|
+
mtime, zeroes uid/gid, blanks uname/gname, and resets the gzip container's own header
|
|
32
|
+
timestamp, run in <code>publish.yml</code> between <code>python -m build</code> and
|
|
33
|
+
<code>twine check</code> — so nothing is ever attested un-normalized.
|
|
34
|
+
|
|
35
|
+
<b>The wheel had a real gap too, not just the sdist.</b> <code>publish.yml</code> never set
|
|
36
|
+
<code>SOURCE_DATE_EPOCH</code> at all before this — the "bit-identical wheel" measurement
|
|
37
|
+
only held in a controlled local test where the variable was exported by hand. The actual release
|
|
38
|
+
pipeline was building an unreproducible wheel as well, and nothing had noticed.
|
|
39
|
+
|
|
40
|
+
<b>The toolchain that determines the bytes is now pinned twice.</b>
|
|
41
|
+
<code>requirements/release-tools.txt</code> hash-pins the outer <code>build</code>/
|
|
42
|
+
<code>twine</code> install (<code>publish.yml</code> used to run
|
|
43
|
+
<code>pip install build twine</code> unpinned, so last month's toolchain was not recoverable
|
|
44
|
+
from the repository). But <code>python -m build</code> resolves <code>setuptools</code> and
|
|
45
|
+
<code>setuptools-scm</code> fresh into an isolated build environment regardless of what the
|
|
46
|
+
outer install has — that's the part that actually produces the artifact bytes — so
|
|
47
|
+
<code>pyproject.toml</code>'s <code>[build-system].requires</code> is now exact-pinned
|
|
48
|
+
(<code>setuptools==83.0.0</code>, <code>setuptools-scm==10.2.1</code>) rather than left as
|
|
49
|
+
<code>>=64</code>/<code>>=8</code>. No hash field exists at that layer; exact-pinning is
|
|
50
|
+
the strongest promise PEP 508 allows there.
|
|
51
|
+
|
|
52
|
+
<b>Falsifiable, not asserted.</b> <code>scripts/check_reproducible.py</code> builds the project
|
|
53
|
+
twice with the same <code>SOURCE_DATE_EPOCH</code>, runs the same sdist fix the release pipeline
|
|
54
|
+
runs, and diffs the results by sha256 — <code>--skip-normalize</code> reruns without the fix
|
|
55
|
+
to show the gap it closes. Degrades to exit 2 ("could not check") rather than exit 0
|
|
56
|
+
when <code>build</code> isn't installed, matching how boost's own CI controls have failed
|
|
57
|
+
silently before: a check that can't run must never read as a pass.
|
|
58
|
+
|
|
59
|
+
<code>docs/openssf-badge.md</code>'s <code>build_reproducible</code> row now reads <b>Met</b>;
|
|
60
|
+
<code>docs/verifying-releases.md</code> carries the re-run measurement and how to rebuild from a
|
|
61
|
+
git tag (the sdist itself carries no <code>.git</code> history, so <code>SOURCE_DATE_EPOCH</code>
|
|
62
|
+
has to come from a checkout, not the tarball).
|
|
@@ -130,10 +130,10 @@
|
|
|
130
130
|
<section class="block reveal">
|
|
131
131
|
<div class="stats">
|
|
132
132
|
<!-- ROADMAP:stats -->
|
|
133
|
-
<div class="stat"><b>
|
|
133
|
+
<div class="stat"><b>17</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>278</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -448,6 +448,75 @@ message, so routing it through the helper would change user-facing errors.</p></
|
|
|
448
448
|
<span class="m">helper dedup + double-parse removed</span>
|
|
449
449
|
</div>
|
|
450
450
|
</article>
|
|
451
|
+
|
|
452
|
+
<article class="cap rcard" id="cli-command-audit">
|
|
453
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Quality · CLI</span></div>
|
|
454
|
+
<h3>All 80 <code>boost</code> commands audited against a disposable HOME — four defects fixed</h3>
|
|
455
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
456
|
+
<p>Every command in <code>boost_cli/cli.py</code>'s <code>COMMANDS</code> table (not memory of
|
|
457
|
+
what the CLI does) was exercised for real: <code>--help</code> against its actual
|
|
458
|
+
<code>argparse</code> definition, the happy path against its one-line summary and
|
|
459
|
+
<code>docs/commands.html</code>, exit codes on success/error/empty-store/nonexistent-name,
|
|
460
|
+
and — for anything that mutates state — the real lock file, symlinks and cache on
|
|
461
|
+
disk, not just stdout. Four parallel audits split the ~80 commands by
|
|
462
|
+
<code>COMMANDS</code>'s own groups (pkg+find, info+tap+ai, quality/safety, cfg+team) so
|
|
463
|
+
every command got adversarial testing (tampered store content, corrupted lock JSON,
|
|
464
|
+
deleted store dirs, real signed/tampered minisign manifests) rather than a clean-state
|
|
465
|
+
smoke pass.
|
|
466
|
+
|
|
467
|
+
The known failure modes this codebase has shipped before were hunted deliberately: a
|
|
468
|
+
command reporting success without doing the thing, a raw read that misses a tap's sparse
|
|
469
|
+
checkout, <code>Path.resolve(strict=True)</code>'s <code>RuntimeError</code>/<code>OSError</code>
|
|
470
|
+
split between Python 3.12 and 3.13+, and a dry-run that silently no-ops or over-reports.
|
|
471
|
+
<code>boost trust add</code> — the one command with a documented history of exactly the
|
|
472
|
+
first failure mode (a merged autofix once deleted its fingerprint line) — was
|
|
473
|
+
re-verified against real Ed25519 signatures and tampering and held up.
|
|
474
|
+
|
|
475
|
+
Four real defects, each fixed with a failing-then-passing test. <code>boost conflict</code>
|
|
476
|
+
and <code>boost audit --skills</code> kept reporting a MED conflict finding against a skill
|
|
477
|
+
after it was quarantined — quarantine's own documented purpose ("isolate a problematic
|
|
478
|
+
skill") gave no relief from the one command whose entire job is to report that condition;
|
|
479
|
+
both now exclude quarantined skills from conflict pairing. <code>boost catalog
|
|
480
|
+
--import</code> tells the receiver "<code>boost install</code> clones just the one registry
|
|
481
|
+
it needs", but <code>install</code> performed no lazy clone — the one end-to-end path the
|
|
482
|
+
command advertises (import → search → install) failed with a misleading "source
|
|
483
|
+
vanished from tap" error; <code>store.source_dir_for</code> now clones a
|
|
484
|
+
registered-but-uncloned tap on demand, the single choke point every consumer of tap content
|
|
485
|
+
already goes through. <code>boost onboard</code>'s own docstring promises a byte-for-byte
|
|
486
|
+
no-op on an unchanged re-run, but <code>.boost/telemetry.json</code> stamped a fresh
|
|
487
|
+
timestamp on every invocation, so the comparison could only pass by wall-clock luck — a
|
|
488
|
+
scripted <code>boost onboard --pr</code> on an already-onboarded repo would open a PR
|
|
489
|
+
containing only a timestamp bump, forever; it now preserves the existing file's
|
|
490
|
+
<code>created</code> field. <code>boost heal --dry-run</code> double-reported the same
|
|
491
|
+
broken symlink under two different messages ("would remove broken link" and "would remove
|
|
492
|
+
stale link") because the real run unlinks before computing <code>sync_plan()</code> while
|
|
493
|
+
dry-run never unlinks anything — a preview overstating what running <code>heal</code> for
|
|
494
|
+
real actually does.
|
|
495
|
+
|
|
496
|
+
A fifth, latent-only finding was fixed alongside them: <code>quality.py</code>'s
|
|
497
|
+
<code>_resolve_as_far_as_it_exists</code> caught only <code>OSError</code> around a
|
|
498
|
+
non-strict <code>Path.resolve()</code>, the same symlink-loop gap
|
|
499
|
+
<code>store.resolves_into_store</code> had already been fixed for. Verified empirically
|
|
500
|
+
(not just read) on both interpreters: <code>Path.resolve(strict=False)</code> on a
|
|
501
|
+
symlink-loop path returns silently on 3.14 and raises <code>RuntimeError</code> on 3.12 —
|
|
502
|
+
confirmed with a live symlink cycle on both, and the full affected test suite reran green
|
|
503
|
+
on a real Python 3.12 venv.
|
|
504
|
+
|
|
505
|
+
Two findings were investigated and deliberately left alone after checking the existing
|
|
506
|
+
test suite rather than trusting the audit's framing: <code>boost drift</code> always
|
|
507
|
+
exiting 0 is pinned as intentional by <code>tests/functional/test_cli_quality.py</code>'s
|
|
508
|
+
own comment ("rc stays 0: drift only reports"), and <code>boost who</code>'s aggregate view
|
|
509
|
+
counting every journal subject (not just install/edit/evolve/distill/tag actions) toward
|
|
510
|
+
"skill expertise" is pinned the same way by an existing test asserting a tap name in the
|
|
511
|
+
skills set. Flipping either would contradict a deliberately written existing test, not fix
|
|
512
|
+
an oversight.</p></details>
|
|
513
|
+
<div class="meta">
|
|
514
|
+
<span class="m">Complexity <b>M</b></span>
|
|
515
|
+
<span class="m">Impact <b>Med</b></span>
|
|
516
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
517
|
+
<span class="m">audited all 80 COMMANDS entries against a disposable HOME; 4 real defects fixed with tests</span>
|
|
518
|
+
</div>
|
|
519
|
+
</article>
|
|
451
520
|
<!-- /ROADMAP:cards -->
|
|
452
521
|
|
|
453
522
|
</div>
|
|
@@ -7389,6 +7458,65 @@ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.</
|
|
|
7389
7458
|
<span class="m">a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still</span>
|
|
7390
7459
|
</div>
|
|
7391
7460
|
</article>
|
|
7461
|
+
|
|
7462
|
+
<article class="cap rcard" id="reproducible-release-artifacts">
|
|
7463
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Security · Reproducibility</span></div>
|
|
7464
|
+
<h3>Reproducible release builds — the sdist half nobody's setuptools does for you</h3>
|
|
7465
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
7466
|
+
<p><code>build_reproducible</code> was Unmet on measurement: with <code>SOURCE_DATE_EPOCH</code> set,
|
|
7467
|
+
two builds of the same commit produced a <b>bit-identical wheel</b> and a <b>differing
|
|
7468
|
+
sdist</b>. <code>setuptools</code> writes each tar member's real build-time mtime, and the
|
|
7469
|
+
builder's <code>uid</code>/<code>gid</code>/user name, into the sdist with no environment
|
|
7470
|
+
variable to override either — 54 members differed between builds two seconds apart on the
|
|
7471
|
+
same machine, and a build on another machine would have differed in the ownership fields too.
|
|
7472
|
+
|
|
7473
|
+
<b>The upstream knob doesn't exist.</b> <a href="https://github.com/pypa/setuptools/issues/2133">
|
|
7474
|
+
pypa/setuptools#2133</a> has asked for <code>SOURCE_DATE_EPOCH</code> support in sdist since 2020;
|
|
7475
|
+
it is still open, with no fix in the version this project pins. The one PyPI package that already
|
|
7476
|
+
patches it, <code>setuptools-reproducible</code>, does so by replacing
|
|
7477
|
+
<code>build-backend</code> entirely — and its dependency closure could not be hash-pinned
|
|
7478
|
+
the way the rest of boost's toolchain is, because <code>[build-system].requires</code> is a bare
|
|
7479
|
+
PEP 508 requirement string with no hash field. So the fix is a small, stdlib-only
|
|
7480
|
+
post-processing step instead: <code>scripts/normalize_sdist.py</code> clamps every member's
|
|
7481
|
+
mtime, zeroes uid/gid, blanks uname/gname, and resets the gzip container's own header
|
|
7482
|
+
timestamp, run in <code>publish.yml</code> between <code>python -m build</code> and
|
|
7483
|
+
<code>twine check</code> — so nothing is ever attested un-normalized.
|
|
7484
|
+
|
|
7485
|
+
<b>The wheel had a real gap too, not just the sdist.</b> <code>publish.yml</code> never set
|
|
7486
|
+
<code>SOURCE_DATE_EPOCH</code> at all before this — the "bit-identical wheel" measurement
|
|
7487
|
+
only held in a controlled local test where the variable was exported by hand. The actual release
|
|
7488
|
+
pipeline was building an unreproducible wheel as well, and nothing had noticed.
|
|
7489
|
+
|
|
7490
|
+
<b>The toolchain that determines the bytes is now pinned twice.</b>
|
|
7491
|
+
<code>requirements/release-tools.txt</code> hash-pins the outer <code>build</code>/
|
|
7492
|
+
<code>twine</code> install (<code>publish.yml</code> used to run
|
|
7493
|
+
<code>pip install build twine</code> unpinned, so last month's toolchain was not recoverable
|
|
7494
|
+
from the repository). But <code>python -m build</code> resolves <code>setuptools</code> and
|
|
7495
|
+
<code>setuptools-scm</code> fresh into an isolated build environment regardless of what the
|
|
7496
|
+
outer install has — that's the part that actually produces the artifact bytes — so
|
|
7497
|
+
<code>pyproject.toml</code>'s <code>[build-system].requires</code> is now exact-pinned
|
|
7498
|
+
(<code>setuptools==83.0.0</code>, <code>setuptools-scm==10.2.1</code>) rather than left as
|
|
7499
|
+
<code>>=64</code>/<code>>=8</code>. No hash field exists at that layer; exact-pinning is
|
|
7500
|
+
the strongest promise PEP 508 allows there.
|
|
7501
|
+
|
|
7502
|
+
<b>Falsifiable, not asserted.</b> <code>scripts/check_reproducible.py</code> builds the project
|
|
7503
|
+
twice with the same <code>SOURCE_DATE_EPOCH</code>, runs the same sdist fix the release pipeline
|
|
7504
|
+
runs, and diffs the results by sha256 — <code>--skip-normalize</code> reruns without the fix
|
|
7505
|
+
to show the gap it closes. Degrades to exit 2 ("could not check") rather than exit 0
|
|
7506
|
+
when <code>build</code> isn't installed, matching how boost's own CI controls have failed
|
|
7507
|
+
silently before: a check that can't run must never read as a pass.
|
|
7508
|
+
|
|
7509
|
+
<code>docs/openssf-badge.md</code>'s <code>build_reproducible</code> row now reads <b>Met</b>;
|
|
7510
|
+
<code>docs/verifying-releases.md</code> carries the re-run measurement and how to rebuild from a
|
|
7511
|
+
git tag (the sdist itself carries no <code>.git</code> history, so <code>SOURCE_DATE_EPOCH</code>
|
|
7512
|
+
has to come from a checkout, not the tarball).</p></details>
|
|
7513
|
+
<div class="meta">
|
|
7514
|
+
<span class="m">Complexity <b>M</b></span>
|
|
7515
|
+
<span class="m">Impact <b>Med</b></span>
|
|
7516
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
7517
|
+
<span class="m">wheel + sdist now bit-identical; setuptools#2133 has no native fix</span>
|
|
7518
|
+
</div>
|
|
7519
|
+
</article>
|
|
7392
7520
|
<!-- /ROADMAP:cards -->
|
|
7393
7521
|
|
|
7394
7522
|
</div>
|