boost-skill-cli 1.0.283__tar.gz → 1.0.285__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/CLAUDE.md +1 -1
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/Makefile +11 -1
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.0.285/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +58 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/one-commit-can-cut-two-releases.md +6 -2
- boost_skill_cli-1.0.285/docs/roadmap/items/sbom-declares-the-wrong-version.md +54 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap.html +111 -3
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/lint-tools.in +10 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/lint-tools.txt +7 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.gitattributes +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.gitignore +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/.vale.ini +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/LICENSE +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/README.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/codecov.yml +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/index.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/README.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/examples/README.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/index.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/noxfile.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/setup.cfg +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/README.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/boost.css +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/boost.js +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/style/demo.html +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/tests/visual/visual_check.mjs +0 -0
|
@@ -11,7 +11,7 @@ make venv # .venv from the hash-pinned requ
|
|
|
11
11
|
.venv/bin/pytest tests/unit/test_catalog.py -q # one test file
|
|
12
12
|
.venv/bin/pytest tests/unit/test_catalog.py::test_scan_dir -q # one test
|
|
13
13
|
.venv/bin/pytest tests/functional -q -k install # functional tests matching "install"
|
|
14
|
-
make lint # the whole static tier —
|
|
14
|
+
make lint # the whole static tier — read the recipe, it is long
|
|
15
15
|
make test # unit + functional with 80% coverage gate
|
|
16
16
|
make check # the full required gate — see table below
|
|
17
17
|
|
|
@@ -61,7 +61,17 @@ lint:
|
|
|
61
61
|
$(VENV)/bin/interrogate boost_cli/core
|
|
62
62
|
$(VENV)/bin/refurb boost_cli
|
|
63
63
|
$(VENV)/bin/codespell boost_cli docs README.md
|
|
64
|
-
|
|
64
|
+
@# actionlint does not lint `run:` blocks itself — it shells out to
|
|
65
|
+
@# shellcheck, and if shellcheck is not on PATH it skips them silently and
|
|
66
|
+
@# still exits 0. So `make lint` could report a clean workflow lint having
|
|
67
|
+
@# never looked inside a single script. shellcheck is pinned in
|
|
68
|
+
@# requirements/lint-tools.in for exactly this; put $(VENV)/bin on PATH so
|
|
69
|
+
@# actionlint finds it, and fail loudly rather than run a hollow check.
|
|
70
|
+
@if command -v actionlint >/dev/null 2>&1; then \
|
|
71
|
+
if [ ! -x $(VENV)/bin/shellcheck ]; then \
|
|
72
|
+
echo "shellcheck missing from $(VENV) — actionlint would skip every run: block. Re-run 'make venv'."; exit 1; \
|
|
73
|
+
fi; \
|
|
74
|
+
PATH="$(CURDIR)/$(VENV)/bin:$$PATH" actionlint; \
|
|
65
75
|
else echo "actionlint not on PATH — skipping (CI enforces it)"; fi
|
|
66
76
|
$(PY) scripts/build_registries.py --check
|
|
67
77
|
$(PY) scripts/build_roadmap.py --check
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.285'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 285)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -155,6 +155,7 @@ docs/roadmap/items/BOOST-D24.md
|
|
|
155
155
|
docs/roadmap/items/BOOST-D25.md
|
|
156
156
|
docs/roadmap/items/BOOST-D26.md
|
|
157
157
|
docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
|
|
158
|
+
docs/roadmap/items/actionlint-skips-shellcheck-silently.md
|
|
158
159
|
docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md
|
|
159
160
|
docs/roadmap/items/ai-bridge-silent-failure-logging.md
|
|
160
161
|
docs/roadmap/items/ambiguous-tap-short-name-resolution.md
|
|
@@ -288,6 +289,7 @@ docs/roadmap/items/rule-install-native-materialization.md
|
|
|
288
289
|
docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md
|
|
289
290
|
docs/roadmap/items/runtime-explain-faithfulness-guardrail.md
|
|
290
291
|
docs/roadmap/items/sbom-aware-scanning-osv-scanner.md
|
|
292
|
+
docs/roadmap/items/sbom-declares-the-wrong-version.md
|
|
291
293
|
docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md
|
|
292
294
|
docs/roadmap/items/sbom-release-event-never-fires.md
|
|
293
295
|
docs/roadmap/items/scan-and-sync-rules-and-workflows.md
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: actionlint-skips-shellcheck-silently
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Testing · Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: fixed — shellcheck is pinned in lint-tools and both gates now assert it is there
|
|
11
|
+
order: 69
|
|
12
|
+
owner: loop/lint-shellcheck
|
|
13
|
+
pr:
|
|
14
|
+
title: The second silent skip — <code>actionlint</code> runs, and checks no <code>run:</code> block at all
|
|
15
|
+
---
|
|
16
|
+
<code>make-lint-masks-actionlint-failures</code> fixed the layer everyone can see: <code>make
|
|
17
|
+
lint</code> discarded actionlint's exit status. There is a second layer underneath it, and the
|
|
18
|
+
first fix does not reach it. <b><code>actionlint</code> does not lint <code>run:</code> blocks
|
|
19
|
+
itself.</b> It shells out to <code>shellcheck</code>, and when shellcheck is not on
|
|
20
|
+
<code>PATH</code> it skips every one of them — no warning, no note, exit 0.
|
|
21
|
+
|
|
22
|
+
Same workflow file, same actionlint binary, only <code>PATH</code> differs:
|
|
23
|
+
|
|
24
|
+
<code>without shellcheck -> (no output) exit=0</code><br>
|
|
25
|
+
<code>with shellcheck -> bad.yml:8:9: shellcheck reported issue in this script: SC2001 … exit=1</code>
|
|
26
|
+
|
|
27
|
+
So the honest description of the gate before this change was: <code>make lint</code> ran a workflow
|
|
28
|
+
linter that silently declined to look inside any script, and reported success. That is not
|
|
29
|
+
hypothetical either — it is exactly how an <code>SC2001</code> reached CI from a green local
|
|
30
|
+
gate, in the very change that fixed layer one.
|
|
31
|
+
|
|
32
|
+
<b>CI was not safe, only lucky.</b> Its actionlint step carried the comment "shellcheck is
|
|
33
|
+
preinstalled on the runner, so run: blocks are checked too" — true today, and an unpinned,
|
|
34
|
+
unversioned, silently revocable dependency on somebody else's base image. If GitHub ever drops it
|
|
35
|
+
from <code>ubuntu-latest</code>, CI degrades to the same hollow check with no signal that anything
|
|
36
|
+
changed. For a repository that hash-pins its entire lint toolchain precisely so an upstream release
|
|
37
|
+
cannot move a gate underneath it, an implicit dependency on a runner image is the same bug in a
|
|
38
|
+
different coat.
|
|
39
|
+
|
|
40
|
+
<b>Shipped.</b> <code>shellcheck-py==0.11.0.1</code> is declared in
|
|
41
|
+
<code>requirements/lint-tools.in</code> and hash-pinned into the generated
|
|
42
|
+
<code>lint-tools.txt</code> like every other tool, which puts it on both sides: CI installs it from
|
|
43
|
+
that lock, and <code>make venv</code> puts it in <code>.venv/bin</code>. <code>make lint</code> now
|
|
44
|
+
prepends <code>.venv/bin</code> to <code>PATH</code> so actionlint can find it, and <b>fails</b> if
|
|
45
|
+
it is missing rather than running a check it knows is hollow; CI asserts <code>command -v
|
|
46
|
+
shellcheck</code> before invoking actionlint. Verified in four states against the real recipe: the
|
|
47
|
+
tool absent (skip message, exit 0), shellcheck missing from the venv (exit 1 with a message naming
|
|
48
|
+
the fix), both present and workflows clean (exit 0), and both present with an <code>SC2001</code> in
|
|
49
|
+
a <code>run:</code> block (exit 1 — the case that used to pass). The old recipe on that same
|
|
50
|
+
file exits 0.
|
|
51
|
+
|
|
52
|
+
<b>What is deliberately still skipped.</b> If <code>actionlint</code> itself is absent,
|
|
53
|
+
<code>make lint</code> prints a message and continues. Closing that would mean pinning
|
|
54
|
+
<code>actionlint-py</code>, which is sdist-only and fetches the binary from the network at install
|
|
55
|
+
time, and which tracks a different actionlint version than the URL-pinned one CI uses. Trading a
|
|
56
|
+
pinned binary for a build-time download is a worse trade than the skip, so the skip stays and is
|
|
57
|
+
documented rather than quietly tolerated. The wider gap named by the earlier card is also still
|
|
58
|
+
open: <code>zizmor</code> and <code>gitleaks</code> run only in CI and have no Makefile equivalent.
|
|
@@ -48,5 +48,9 @@ ci will trigger its own release, but it means some merges never get their own ve
|
|
|
48
48
|
|
|
49
49
|
<b>Already mitigated:</b> <code>sbom.yml</code> now builds and attaches an SBOM for <em>every</em>
|
|
50
50
|
tag on the commit rather than only the highest, so a duplicate release no longer produces a release
|
|
51
|
-
with no SBOM. Each tag is built separately
|
|
52
|
-
|
|
51
|
+
with no SBOM. Each tag is built separately so its SBOM carries its own version.
|
|
52
|
+
|
|
53
|
+
<b>Correction:</b> the claim above originally read "because setuptools-scm reads the version from
|
|
54
|
+
the tag", and that is false — it reads the version from the <em>commit</em>, so separate checkouts
|
|
55
|
+
of two tags on one commit produce the same version. That was a second, quieter consequence of the
|
|
56
|
+
duplicate release, fixed separately in <code>sbom-declares-the-wrong-version</code>.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: sbom-declares-the-wrong-version
|
|
3
|
+
board: code
|
|
4
|
+
section: trust
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Supply chain · Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: fixed — release v1.0.278's SBOM declared 1.0.277; the version is now pinned to the tag
|
|
11
|
+
order: 68
|
|
12
|
+
owner: loop/sbom-tag-version
|
|
13
|
+
pr:
|
|
14
|
+
title: The SBOM can declare a different version than the release it is attached to
|
|
15
|
+
---
|
|
16
|
+
<code>sbom.yml</code> builds each released tag separately so that every release gets an SBOM
|
|
17
|
+
describing <em>its own</em> version. It does that by checking the tag out:
|
|
18
|
+
<code>git checkout --detach "refs/tags/$TAG"</code>. The premise is wrong.
|
|
19
|
+
<b>setuptools-scm derives the version from the commit, not from the ref used to reach it</b>, so
|
|
20
|
+
when one commit carries two tags every checkout resolves to the same version — whichever one
|
|
21
|
+
<code>git describe</code> picks, which is not the highest.
|
|
22
|
+
|
|
23
|
+
Measured against the real repository, detached at each tag in turn:
|
|
24
|
+
|
|
25
|
+
<code>checked out v1.0.278 -> setuptools-scm says: 1.0.277</code><br>
|
|
26
|
+
<code>checked out v1.0.277 -> setuptools-scm says: 1.0.277</code>
|
|
27
|
+
|
|
28
|
+
And confirmed in production rather than in a fixture — the published asset on
|
|
29
|
+
<code>v1.0.278</code>, downloaded from the release, contains
|
|
30
|
+
<code>{"name": "boost-skill-cli", "version": "1.0.277"}</code>. <b>The SBOM attached to release
|
|
31
|
+
v1.0.278 describes v1.0.277.</b> A consumer resolving that release's bill of materials gets a
|
|
32
|
+
document for a different version, which is precisely the trust property an SBOM exists to provide.
|
|
33
|
+
|
|
34
|
+
The blast radius is bounded by how often one commit cuts two releases, which
|
|
35
|
+
<code>one-commit-can-cut-two-releases</code> documents happening three times so far
|
|
36
|
+
(<code>246</code>/<code>247</code>, <code>248</code>/<code>249</code>, <code>277</code>/<code>278</code>).
|
|
37
|
+
Every duplicate pair mislabels one of its two SBOMs. It is <em>not</em> latent in
|
|
38
|
+
<code>publish.yml</code>, which builds the PyPI dist: that job checks out before the sibling run's
|
|
39
|
+
tag exists, so it happens to resolve correctly — all 281 PyPI versions are present and correctly
|
|
40
|
+
numbered. The defect is specific to the job that runs <em>after</em> both tags are in place.
|
|
41
|
+
|
|
42
|
+
<b>Shipped.</b> The build now pins the version to the tag it is building
|
|
43
|
+
(<code>SETUPTOOLS_SCM_PRETEND_VERSION_FOR_BOOST_SKILL_CLI="${TAG#v}"</code>) and then asserts the
|
|
44
|
+
wheel it produced carries that version, so a package rename — which would silently unhook the
|
|
45
|
+
scoped variable and restore the bug — fails the job instead of shipping a mislabelled document.
|
|
46
|
+
Verified both ways against the live repository: without the pin, <code>v1.0.278</code> resolves to
|
|
47
|
+
<code>1.0.277</code>; with it, <code>1.0.278</code>.
|
|
48
|
+
|
|
49
|
+
The same exercise settled the other thing this workflow had never proven: the multi-tag loop
|
|
50
|
+
itself. Both <code>run:</code> blocks were extracted verbatim from the YAML and driven against a
|
|
51
|
+
fixture repository with two tags on one commit, with <code>gh</code> and the build toolchain
|
|
52
|
+
stubbed. Resolution returns both tags newest-first, the loop iterates both, and it issues a
|
|
53
|
+
separate <code>upload</code> and a separate post-upload <code>view</code> assertion per tag. That
|
|
54
|
+
path had never executed in production — every commit since it shipped has carried exactly one tag.
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
111
111
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
112
112
|
<div class="stat"><b>4</b><span>Planned</span></div>
|
|
113
|
-
<div class="stat"><b>
|
|
113
|
+
<div class="stat"><b>176</b><span>Loop finds</span></div>
|
|
114
114
|
<!-- /ROADMAP:stats -->
|
|
115
115
|
</div>
|
|
116
116
|
</section>
|
|
@@ -2707,8 +2707,12 @@ ci will trigger its own release, but it means some merges never get their own ve
|
|
|
2707
2707
|
|
|
2708
2708
|
<b>Already mitigated:</b> <code>sbom.yml</code> now builds and attaches an SBOM for <em>every</em>
|
|
2709
2709
|
tag on the commit rather than only the highest, so a duplicate release no longer produces a release
|
|
2710
|
-
with no SBOM. Each tag is built separately
|
|
2711
|
-
|
|
2710
|
+
with no SBOM. Each tag is built separately so its SBOM carries its own version.
|
|
2711
|
+
|
|
2712
|
+
<b>Correction:</b> the claim above originally read "because setuptools-scm reads the version from
|
|
2713
|
+
the tag", and that is false — it reads the version from the <em>commit</em>, so separate checkouts
|
|
2714
|
+
of two tags on one commit produce the same version. That was a second, quieter consequence of the
|
|
2715
|
+
duplicate release, fixed separately in <code>sbom-declares-the-wrong-version</code>.</p>
|
|
2712
2716
|
<div class="meta">
|
|
2713
2717
|
<span class="m">Complexity <b>M</b></span>
|
|
2714
2718
|
<span class="m">Impact <b>Med</b></span>
|
|
@@ -3177,6 +3181,60 @@ regresses.</p>
|
|
|
3177
3181
|
<span class="m">agent reflex</span>
|
|
3178
3182
|
</div>
|
|
3179
3183
|
</article>
|
|
3184
|
+
|
|
3185
|
+
<article class="cap rcard" id="actionlint-skips-shellcheck-silently">
|
|
3186
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Testing · Bug</span></div>
|
|
3187
|
+
<h3>The second silent skip — <code>actionlint</code> runs, and checks no <code>run:</code> block at all</h3>
|
|
3188
|
+
<p><code>make-lint-masks-actionlint-failures</code> fixed the layer everyone can see: <code>make
|
|
3189
|
+
lint</code> discarded actionlint's exit status. There is a second layer underneath it, and the
|
|
3190
|
+
first fix does not reach it. <b><code>actionlint</code> does not lint <code>run:</code> blocks
|
|
3191
|
+
itself.</b> It shells out to <code>shellcheck</code>, and when shellcheck is not on
|
|
3192
|
+
<code>PATH</code> it skips every one of them — no warning, no note, exit 0.
|
|
3193
|
+
|
|
3194
|
+
Same workflow file, same actionlint binary, only <code>PATH</code> differs:
|
|
3195
|
+
|
|
3196
|
+
<code>without shellcheck -> (no output) exit=0</code><br>
|
|
3197
|
+
<code>with shellcheck -> bad.yml:8:9: shellcheck reported issue in this script: SC2001 … exit=1</code>
|
|
3198
|
+
|
|
3199
|
+
So the honest description of the gate before this change was: <code>make lint</code> ran a workflow
|
|
3200
|
+
linter that silently declined to look inside any script, and reported success. That is not
|
|
3201
|
+
hypothetical either — it is exactly how an <code>SC2001</code> reached CI from a green local
|
|
3202
|
+
gate, in the very change that fixed layer one.
|
|
3203
|
+
|
|
3204
|
+
<b>CI was not safe, only lucky.</b> Its actionlint step carried the comment "shellcheck is
|
|
3205
|
+
preinstalled on the runner, so run: blocks are checked too" — true today, and an unpinned,
|
|
3206
|
+
unversioned, silently revocable dependency on somebody else's base image. If GitHub ever drops it
|
|
3207
|
+
from <code>ubuntu-latest</code>, CI degrades to the same hollow check with no signal that anything
|
|
3208
|
+
changed. For a repository that hash-pins its entire lint toolchain precisely so an upstream release
|
|
3209
|
+
cannot move a gate underneath it, an implicit dependency on a runner image is the same bug in a
|
|
3210
|
+
different coat.
|
|
3211
|
+
|
|
3212
|
+
<b>Shipped.</b> <code>shellcheck-py==0.11.0.1</code> is declared in
|
|
3213
|
+
<code>requirements/lint-tools.in</code> and hash-pinned into the generated
|
|
3214
|
+
<code>lint-tools.txt</code> like every other tool, which puts it on both sides: CI installs it from
|
|
3215
|
+
that lock, and <code>make venv</code> puts it in <code>.venv/bin</code>. <code>make lint</code> now
|
|
3216
|
+
prepends <code>.venv/bin</code> to <code>PATH</code> so actionlint can find it, and <b>fails</b> if
|
|
3217
|
+
it is missing rather than running a check it knows is hollow; CI asserts <code>command -v
|
|
3218
|
+
shellcheck</code> before invoking actionlint. Verified in four states against the real recipe: the
|
|
3219
|
+
tool absent (skip message, exit 0), shellcheck missing from the venv (exit 1 with a message naming
|
|
3220
|
+
the fix), both present and workflows clean (exit 0), and both present with an <code>SC2001</code> in
|
|
3221
|
+
a <code>run:</code> block (exit 1 — the case that used to pass). The old recipe on that same
|
|
3222
|
+
file exits 0.
|
|
3223
|
+
|
|
3224
|
+
<b>What is deliberately still skipped.</b> If <code>actionlint</code> itself is absent,
|
|
3225
|
+
<code>make lint</code> prints a message and continues. Closing that would mean pinning
|
|
3226
|
+
<code>actionlint-py</code>, which is sdist-only and fetches the binary from the network at install
|
|
3227
|
+
time, and which tracks a different actionlint version than the URL-pinned one CI uses. Trading a
|
|
3228
|
+
pinned binary for a build-time download is a worse trade than the skip, so the skip stays and is
|
|
3229
|
+
documented rather than quietly tolerated. The wider gap named by the earlier card is also still
|
|
3230
|
+
open: <code>zizmor</code> and <code>gitleaks</code> run only in CI and have no Makefile equivalent.</p>
|
|
3231
|
+
<div class="meta">
|
|
3232
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3233
|
+
<span class="m">Impact <b>Med</b></span>
|
|
3234
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3235
|
+
<span class="m">fixed — shellcheck is pinned in lint-tools and both gates now assert it is there</span>
|
|
3236
|
+
</div>
|
|
3237
|
+
</article>
|
|
3180
3238
|
<!-- /ROADMAP:cards -->
|
|
3181
3239
|
|
|
3182
3240
|
</div>
|
|
@@ -4279,6 +4337,56 @@ having found error-severity alerts.</p>
|
|
|
4279
4337
|
<span class="m">safe scoped to CodeQL (0 open) — adding Scorecard deadlocks every merge</span>
|
|
4280
4338
|
</div>
|
|
4281
4339
|
</article>
|
|
4340
|
+
|
|
4341
|
+
<article class="cap rcard" id="sbom-declares-the-wrong-version">
|
|
4342
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Supply chain · Bug</span></div>
|
|
4343
|
+
<h3>The SBOM can declare a different version than the release it is attached to</h3>
|
|
4344
|
+
<p><code>sbom.yml</code> builds each released tag separately so that every release gets an SBOM
|
|
4345
|
+
describing <em>its own</em> version. It does that by checking the tag out:
|
|
4346
|
+
<code>git checkout --detach "refs/tags/$TAG"</code>. The premise is wrong.
|
|
4347
|
+
<b>setuptools-scm derives the version from the commit, not from the ref used to reach it</b>, so
|
|
4348
|
+
when one commit carries two tags every checkout resolves to the same version — whichever one
|
|
4349
|
+
<code>git describe</code> picks, which is not the highest.
|
|
4350
|
+
|
|
4351
|
+
Measured against the real repository, detached at each tag in turn:
|
|
4352
|
+
|
|
4353
|
+
<code>checked out v1.0.278 -> setuptools-scm says: 1.0.277</code><br>
|
|
4354
|
+
<code>checked out v1.0.277 -> setuptools-scm says: 1.0.277</code>
|
|
4355
|
+
|
|
4356
|
+
And confirmed in production rather than in a fixture — the published asset on
|
|
4357
|
+
<code>v1.0.278</code>, downloaded from the release, contains
|
|
4358
|
+
<code>{"name": "boost-skill-cli", "version": "1.0.277"}</code>. <b>The SBOM attached to release
|
|
4359
|
+
v1.0.278 describes v1.0.277.</b> A consumer resolving that release's bill of materials gets a
|
|
4360
|
+
document for a different version, which is precisely the trust property an SBOM exists to provide.
|
|
4361
|
+
|
|
4362
|
+
The blast radius is bounded by how often one commit cuts two releases, which
|
|
4363
|
+
<code>one-commit-can-cut-two-releases</code> documents happening three times so far
|
|
4364
|
+
(<code>246</code>/<code>247</code>, <code>248</code>/<code>249</code>, <code>277</code>/<code>278</code>).
|
|
4365
|
+
Every duplicate pair mislabels one of its two SBOMs. It is <em>not</em> latent in
|
|
4366
|
+
<code>publish.yml</code>, which builds the PyPI dist: that job checks out before the sibling run's
|
|
4367
|
+
tag exists, so it happens to resolve correctly — all 281 PyPI versions are present and correctly
|
|
4368
|
+
numbered. The defect is specific to the job that runs <em>after</em> both tags are in place.
|
|
4369
|
+
|
|
4370
|
+
<b>Shipped.</b> The build now pins the version to the tag it is building
|
|
4371
|
+
(<code>SETUPTOOLS_SCM_PRETEND_VERSION_FOR_BOOST_SKILL_CLI="${TAG#v}"</code>) and then asserts the
|
|
4372
|
+
wheel it produced carries that version, so a package rename — which would silently unhook the
|
|
4373
|
+
scoped variable and restore the bug — fails the job instead of shipping a mislabelled document.
|
|
4374
|
+
Verified both ways against the live repository: without the pin, <code>v1.0.278</code> resolves to
|
|
4375
|
+
<code>1.0.277</code>; with it, <code>1.0.278</code>.
|
|
4376
|
+
|
|
4377
|
+
The same exercise settled the other thing this workflow had never proven: the multi-tag loop
|
|
4378
|
+
itself. Both <code>run:</code> blocks were extracted verbatim from the YAML and driven against a
|
|
4379
|
+
fixture repository with two tags on one commit, with <code>gh</code> and the build toolchain
|
|
4380
|
+
stubbed. Resolution returns both tags newest-first, the loop iterates both, and it issues a
|
|
4381
|
+
separate <code>upload</code> and a separate post-upload <code>view</code> assertion per tag. That
|
|
4382
|
+
path had never executed in production — every commit since it shipped has carried exactly one tag.</p>
|
|
4383
|
+
<div class="meta">
|
|
4384
|
+
<span class="m">Complexity <b>S</b></span>
|
|
4385
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
4386
|
+
<span class="m">Wow <b class="wow">★★★★★</b></span>
|
|
4387
|
+
<span class="m">fixed — release v1.0.278's SBOM declared 1.0.277; the version is now pinned to the tag</span>
|
|
4388
|
+
</div>
|
|
4389
|
+
</article>
|
|
4282
4390
|
<!-- /ROADMAP:cards -->
|
|
4283
4391
|
|
|
4284
4392
|
</div>
|
|
@@ -30,3 +30,13 @@ interrogate==1.7.0
|
|
|
30
30
|
# itself, which is why this set is lint-only and never a runtime dependency.
|
|
31
31
|
# Reuses the mypy pinned above.
|
|
32
32
|
refurb==2.3.1
|
|
33
|
+
# shellcheck, as a pinned dependency rather than an assumption. actionlint does
|
|
34
|
+
# not lint `run:` blocks itself — it shells out to shellcheck, and when
|
|
35
|
+
# shellcheck is not on PATH it skips that entirely and still exits 0. Same
|
|
36
|
+
# workflow file, same actionlint: without shellcheck, no output and exit 0; with
|
|
37
|
+
# it, `SC2001` and exit 1. CI got away with it because the GitHub runner image
|
|
38
|
+
# happens to preinstall shellcheck, which is an unpinned, unversioned, silently
|
|
39
|
+
# revocable dependency on somebody else's base image — and locally, where it is
|
|
40
|
+
# usually absent, `make lint` was passing a check it never ran. Pinning it here
|
|
41
|
+
# puts it on both sides and makes the version reviewable like every other tool.
|
|
42
|
+
shellcheck-py==0.11.0.1
|
|
@@ -564,6 +564,13 @@ ruff==0.16.0 \
|
|
|
564
564
|
--hash=sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e \
|
|
565
565
|
--hash=sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4
|
|
566
566
|
# via -r requirements/lint-tools.in
|
|
567
|
+
shellcheck-py==0.11.0.1 \
|
|
568
|
+
--hash=sha256:1b274df81de5b000ff78db433e7328b87e52e3c38481c60f8e488c3095beef05 \
|
|
569
|
+
--hash=sha256:5c620c88901e8f1d3be5934b31ea99e3310065e1245253741eafd0a275c8c9cc \
|
|
570
|
+
--hash=sha256:6b88d0a244c82ed07e06a53e444da841f69330ca59ae15d4a66c391655dae7a0 \
|
|
571
|
+
--hash=sha256:784156289ecb17e91c692cd783ab5152333309588cabb10032a047331c63e759 \
|
|
572
|
+
--hash=sha256:b6a3fee28efda2e16e38d6e6d59faf7224300256456639727370d404730849e8
|
|
573
|
+
# via -r requirements/lint-tools.in
|
|
567
574
|
six==1.17.0 \
|
|
568
575
|
--hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
|
|
569
576
|
--hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{boost_skill_cli-1.0.283 → boost_skill_cli-1.0.285}/boost_skill_cli.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|