boost-skill-cli 1.0.284__tar.gz → 1.0.286__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.284 → boost_skill_cli-1.0.286}/.gitignore +8 -2
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/CLAUDE.md +1 -1
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/MANIFEST.in +3 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/Makefile +11 -1
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.0.286/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +58 -0
- boost_skill_cli-1.0.286/docs/roadmap/items/scorecard-findings-triage.md +74 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap.html +103 -13
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/lint-tools.in +10 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/lint-tools.txt +7 -0
- boost_skill_cli-1.0.286/tests/visual/package-lock.json +933 -0
- boost_skill_cli-1.0.284/docs/roadmap/items/scorecard-findings-triage.md +0 -38
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.gitattributes +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/.vale.ini +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/LICENSE +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/README.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/codecov.yml +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/index.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/README.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/examples/README.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/index.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/noxfile.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/setup.cfg +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/style/README.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/style/boost.css +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/style/boost.js +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/style/demo.html +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.284 → boost_skill_cli-1.0.286}/tests/visual/visual_check.mjs +0 -0
|
@@ -235,6 +235,12 @@ mutants/
|
|
|
235
235
|
# dir (see evals/run_evals.py), so only the per-run scores land here; the
|
|
236
236
|
# committed evals/baseline.json is what regressions are measured against.
|
|
237
237
|
evals/results.json
|
|
238
|
-
tests/visual/node_modules/
|
|
239
238
|
tests/visual/out/
|
|
240
|
-
|
|
239
|
+
|
|
240
|
+
# Installed npm trees, never the lockfiles that describe them. Both
|
|
241
|
+
# package-lock.json files ARE committed on purpose: package.json pins only the
|
|
242
|
+
# direct dependencies, so without the lock every transitive package resolves
|
|
243
|
+
# fresh at install time. The lock carries an integrity hash for all 181 (root)
|
|
244
|
+
# and 81 (tests/visual) packages, which is what makes `npm ci` reproducible and
|
|
245
|
+
# what OpenSSF Scorecard's Pinned-Dependencies check asks for.
|
|
246
|
+
node_modules/
|
|
@@ -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
|
|
|
@@ -9,4 +9,7 @@ prune .idea
|
|
|
9
9
|
prune .claude
|
|
10
10
|
prune .github
|
|
11
11
|
exclude .coverage
|
|
12
|
+
# The npm lint/test toolchain (stylelint, eslint, puppeteer-core, axe-core). CI
|
|
13
|
+
# only; nothing in the shipped runtime touches node.
|
|
14
|
+
exclude package.json package-lock.json
|
|
12
15
|
global-exclude __pycache__ *.pyc *.pyo .DS_Store
|
|
@@ -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.286'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 286)
|
|
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
|
|
@@ -528,5 +529,6 @@ tests/unit/test_workflow_timeouts.py
|
|
|
528
529
|
tests/unit/test_workflows.py
|
|
529
530
|
tests/visual/a11y_check.mjs
|
|
530
531
|
tests/visual/console_check.mjs
|
|
532
|
+
tests/visual/package-lock.json
|
|
531
533
|
tests/visual/package.json
|
|
532
534
|
tests/visual/visual_check.mjs
|
|
@@ -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.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: scorecard-findings-triage
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Supply chain
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 2
|
|
10
|
+
note: 7 open · 3 now hash-pinned, 3 decided, 1 clears itself
|
|
11
|
+
order: 13
|
|
12
|
+
owner: loop/scorecard-pinned-deps
|
|
13
|
+
pr:
|
|
14
|
+
title: OpenSSF Scorecard's findings, triaged into three piles
|
|
15
|
+
---
|
|
16
|
+
Scorecard files into the same code-scanning inbox as CodeQL, so its findings read like
|
|
17
|
+
code defects and get ignored alongside the false positives. They are not defects — they
|
|
18
|
+
are <b>posture metrics</b>, and they must not be dismissed as "false positive" the way the
|
|
19
|
+
<code>serve.py</code> traversal alerts legitimately were, because that misrepresents the
|
|
20
|
+
repo's security posture. Triaged 2026-07-25, re-triaged 2026-07-29 against the 7 still open.
|
|
21
|
+
<b>Fixed</b> — <code>TokenPermissions</code> #26/#27/#28: <code>ci</code>,
|
|
22
|
+
<code>codeql</code> and <code>adapter-conformance</code> had no top-level
|
|
23
|
+
<code>permissions:</code> block at all, scoring 0. Added <code>contents: read</code> as the
|
|
24
|
+
least-privilege default.
|
|
25
|
+
<b>Intentional, leave</b> — <code>TokenPermissions</code> #39/#37/#25/#24:
|
|
26
|
+
<code>publish.yml</code> needs <code>contents: write</code> to create the release and tag,
|
|
27
|
+
<code>osv-scanner</code> needs <code>security-events: write</code> to upload SARIF, and
|
|
28
|
+
<code>ci.yml</code>'s <code>tests</code> job needs <code>contents: write</code> for the
|
|
29
|
+
coverage-badge push. "Fixing" these breaks the release pipeline. They should be
|
|
30
|
+
<b>dismissed as used-in-tests/acceptable-risk with a reason</b>, not left open to rot the list.
|
|
31
|
+
<b>Correction — <code>PinnedDependencies</code> was NOT "not code-fixable".</b> The first
|
|
32
|
+
pass filed #40/#41/#48 under <i>"npx and pip invocations inside steps, not actions, so
|
|
33
|
+
SHA-pinning does not apply"</i>. That reads the check as being about action SHAs, and it
|
|
34
|
+
is not: for npm the remediation is a <b>committed lockfile</b>, and all three hits were
|
|
35
|
+
<code>npm install</code> steps. <code>tests/visual/package.json</code> pinned its two direct
|
|
36
|
+
deps exactly — and <code>.gitignore</code> then <i>excluded the lockfile</i>, so 79
|
|
37
|
+
transitive packages resolved fresh on every run. <code>theme-lint</code> was worse:
|
|
38
|
+
<code>npm install stylelint@16 eslint@9</code> re-resolved the whole linter every run, so
|
|
39
|
+
the linter CI executed was never the linter anyone reviewed. Both trees are now hash-pinned
|
|
40
|
+
(181 + 81 packages, integrity on every one) and installed with <code>npm ci</code>;
|
|
41
|
+
<code>dependabot.yml</code> gains both npm directories, because a pin with no update path is
|
|
42
|
+
only half the job.
|
|
43
|
+
<b>What the pin immediately exposed.</b> Committing the lock made
|
|
44
|
+
<code>osv-scanner</code> able to see the transitive tree for the first time, and it failed
|
|
45
|
+
the branch at once on <b>CVE-2026-14257</b> (<code>brace-expansion</code>, CVSS 7.5,
|
|
46
|
+
unbounded expansion → OOM). Pre-existing, not introduced: the old floating
|
|
47
|
+
<code>npm install eslint@9</code> resolved the same package, invisibly. The advisory's range
|
|
48
|
+
is <i>all versions below 5.0.8</i>, so the 1.x maintenance line has no fix — and the obvious
|
|
49
|
+
patch, an <code>overrides</code> entry forcing <code>brace-expansion@^5</code>, <b>breaks
|
|
50
|
+
eslint</b>: v5 exports <code>{ expand }</code> where <code>minimatch@3</code> requires a
|
|
51
|
+
callable default, so <code>eslint "style/**/*.{js,mjs}"</code> dies with
|
|
52
|
+
<i>"expand is not a function"</i> while plain <code>eslint style/</code> still passes — a
|
|
53
|
+
green-looking linter with a broken glob path. The real fix is upstream:
|
|
54
|
+
<code>eslint@10</code> depends on <code>minimatch@^10.2.5</code>, which requires the patched
|
|
55
|
+
<code>brace-expansion@^5.0.8</code>. Bumped 9.39.5 → 10.8.0; all 262 packages across both
|
|
56
|
+
locks now return zero OSV advisories.
|
|
57
|
+
<b>Open by decision, correctly</b> — <code>BranchProtectionID</code> #33 (4/10) and
|
|
58
|
+
<code>CodeReviewID</code> #34 (0/26 approved changesets) are two readings of one deliberate
|
|
59
|
+
choice recorded in <a href="#main-has-no-branch-protection">its own card</a>: require status
|
|
60
|
+
checks, do <i>not</i> require reviews, because the working model is parallel
|
|
61
|
+
<code>loop/*</code> branches that self-merge and there is no second reviewer. Every warning
|
|
62
|
+
Scorecard prints under #33 — stale-review dismissal, required approvers, CODEOWNERS review,
|
|
63
|
+
last-push approval — follows from that one choice. They stay open because the score is
|
|
64
|
+
<b>accurate</b>: this repo really does merge without human review. Dismissing them would be
|
|
65
|
+
the lie.
|
|
66
|
+
<b>Clears itself</b> — <code>MaintainedID</code> #35 is <i>"repository was created within the
|
|
67
|
+
last 90 days"</i>. Created 2026-07-17, so it resolves on its own around 2026-10-15. Nothing
|
|
68
|
+
to do but not dismiss it.
|
|
69
|
+
<b>Needs a human, not a commit</b> — <code>CIIBestPracticesID</code> #36 is the one
|
|
70
|
+
remaining actionable finding, and it cannot be fixed from a branch: it asks whether the
|
|
71
|
+
project is registered for an OpenSSF Best Practices badge, which means creating a project
|
|
72
|
+
entry at <code>bestpractices.dev</code> under a real account and answering its criteria. The
|
|
73
|
+
prerequisites are already in place (LICENSE, SECURITY.md, CONTRIBUTING.md,
|
|
74
|
+
CODE_OF_CONDUCT.md, a published CI gate); only the registration is missing.
|
|
@@ -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>
|
|
@@ -2015,13 +2015,13 @@ path is never used — that fixes the behaviour without satisfying Dependabot's
|
|
|
2015
2015
|
</article>
|
|
2016
2016
|
|
|
2017
2017
|
<article class="cap rcard" id="scorecard-findings-triage">
|
|
2018
|
-
<div class="head"><span class="pill
|
|
2019
|
-
<h3>OpenSSF Scorecard's
|
|
2018
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Supply chain</span></div>
|
|
2019
|
+
<h3>OpenSSF Scorecard's findings, triaged into three piles</h3>
|
|
2020
2020
|
<p>Scorecard files into the same code-scanning inbox as CodeQL, so its findings read like
|
|
2021
2021
|
code defects and get ignored alongside the false positives. They are not defects — they
|
|
2022
2022
|
are <b>posture metrics</b>, and they must not be dismissed as "false positive" the way the
|
|
2023
2023
|
<code>serve.py</code> traversal alerts legitimately were, because that misrepresents the
|
|
2024
|
-
repo's security posture. Triaged 2026-07-25
|
|
2024
|
+
repo's security posture. Triaged 2026-07-25, re-triaged 2026-07-29 against the 7 still open.
|
|
2025
2025
|
<b>Fixed</b> — <code>TokenPermissions</code> #26/#27/#28: <code>ci</code>,
|
|
2026
2026
|
<code>codeql</code> and <code>adapter-conformance</code> had no top-level
|
|
2027
2027
|
<code>permissions:</code> block at all, scoring 0. Added <code>contents: read</code> as the
|
|
@@ -2032,19 +2032,55 @@ least-privilege default.
|
|
|
2032
2032
|
<code>ci.yml</code>'s <code>tests</code> job needs <code>contents: write</code> for the
|
|
2033
2033
|
coverage-badge push. "Fixing" these breaks the release pipeline. They should be
|
|
2034
2034
|
<b>dismissed as used-in-tests/acceptable-risk with a reason</b>, not left open to rot the list.
|
|
2035
|
-
<b>
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
<code
|
|
2041
|
-
|
|
2042
|
-
|
|
2035
|
+
<b>Correction — <code>PinnedDependencies</code> was NOT "not code-fixable".</b> The first
|
|
2036
|
+
pass filed #40/#41/#48 under <i>"npx and pip invocations inside steps, not actions, so
|
|
2037
|
+
SHA-pinning does not apply"</i>. That reads the check as being about action SHAs, and it
|
|
2038
|
+
is not: for npm the remediation is a <b>committed lockfile</b>, and all three hits were
|
|
2039
|
+
<code>npm install</code> steps. <code>tests/visual/package.json</code> pinned its two direct
|
|
2040
|
+
deps exactly — and <code>.gitignore</code> then <i>excluded the lockfile</i>, so 79
|
|
2041
|
+
transitive packages resolved fresh on every run. <code>theme-lint</code> was worse:
|
|
2042
|
+
<code>npm install stylelint@16 eslint@9</code> re-resolved the whole linter every run, so
|
|
2043
|
+
the linter CI executed was never the linter anyone reviewed. Both trees are now hash-pinned
|
|
2044
|
+
(181 + 81 packages, integrity on every one) and installed with <code>npm ci</code>;
|
|
2045
|
+
<code>dependabot.yml</code> gains both npm directories, because a pin with no update path is
|
|
2046
|
+
only half the job.
|
|
2047
|
+
<b>What the pin immediately exposed.</b> Committing the lock made
|
|
2048
|
+
<code>osv-scanner</code> able to see the transitive tree for the first time, and it failed
|
|
2049
|
+
the branch at once on <b>CVE-2026-14257</b> (<code>brace-expansion</code>, CVSS 7.5,
|
|
2050
|
+
unbounded expansion → OOM). Pre-existing, not introduced: the old floating
|
|
2051
|
+
<code>npm install eslint@9</code> resolved the same package, invisibly. The advisory's range
|
|
2052
|
+
is <i>all versions below 5.0.8</i>, so the 1.x maintenance line has no fix — and the obvious
|
|
2053
|
+
patch, an <code>overrides</code> entry forcing <code>brace-expansion@^5</code>, <b>breaks
|
|
2054
|
+
eslint</b>: v5 exports <code>{ expand }</code> where <code>minimatch@3</code> requires a
|
|
2055
|
+
callable default, so <code>eslint "style/**/*.{js,mjs}"</code> dies with
|
|
2056
|
+
<i>"expand is not a function"</i> while plain <code>eslint style/</code> still passes — a
|
|
2057
|
+
green-looking linter with a broken glob path. The real fix is upstream:
|
|
2058
|
+
<code>eslint@10</code> depends on <code>minimatch@^10.2.5</code>, which requires the patched
|
|
2059
|
+
<code>brace-expansion@^5.0.8</code>. Bumped 9.39.5 → 10.8.0; all 262 packages across both
|
|
2060
|
+
locks now return zero OSV advisories.
|
|
2061
|
+
<b>Open by decision, correctly</b> — <code>BranchProtectionID</code> #33 (4/10) and
|
|
2062
|
+
<code>CodeReviewID</code> #34 (0/26 approved changesets) are two readings of one deliberate
|
|
2063
|
+
choice recorded in <a href="#main-has-no-branch-protection">its own card</a>: require status
|
|
2064
|
+
checks, do <i>not</i> require reviews, because the working model is parallel
|
|
2065
|
+
<code>loop/*</code> branches that self-merge and there is no second reviewer. Every warning
|
|
2066
|
+
Scorecard prints under #33 — stale-review dismissal, required approvers, CODEOWNERS review,
|
|
2067
|
+
last-push approval — follows from that one choice. They stay open because the score is
|
|
2068
|
+
<b>accurate</b>: this repo really does merge without human review. Dismissing them would be
|
|
2069
|
+
the lie.
|
|
2070
|
+
<b>Clears itself</b> — <code>MaintainedID</code> #35 is <i>"repository was created within the
|
|
2071
|
+
last 90 days"</i>. Created 2026-07-17, so it resolves on its own around 2026-10-15. Nothing
|
|
2072
|
+
to do but not dismiss it.
|
|
2073
|
+
<b>Needs a human, not a commit</b> — <code>CIIBestPracticesID</code> #36 is the one
|
|
2074
|
+
remaining actionable finding, and it cannot be fixed from a branch: it asks whether the
|
|
2075
|
+
project is registered for an OpenSSF Best Practices badge, which means creating a project
|
|
2076
|
+
entry at <code>bestpractices.dev</code> under a real account and answering its criteria. The
|
|
2077
|
+
prerequisites are already in place (LICENSE, SECURITY.md, CONTRIBUTING.md,
|
|
2078
|
+
CODE_OF_CONDUCT.md, a published CI gate); only the registration is missing.</p>
|
|
2043
2079
|
<div class="meta">
|
|
2044
2080
|
<span class="m">Complexity <b>M</b></span>
|
|
2045
2081
|
<span class="m">Impact <b>Med</b></span>
|
|
2046
2082
|
<span class="m">Wow <b class="wow">★★</b></span>
|
|
2047
|
-
<span class="m">
|
|
2083
|
+
<span class="m">7 open · 3 now hash-pinned, 3 decided, 1 clears itself</span>
|
|
2048
2084
|
</div>
|
|
2049
2085
|
</article>
|
|
2050
2086
|
|
|
@@ -3181,6 +3217,60 @@ regresses.</p>
|
|
|
3181
3217
|
<span class="m">agent reflex</span>
|
|
3182
3218
|
</div>
|
|
3183
3219
|
</article>
|
|
3220
|
+
|
|
3221
|
+
<article class="cap rcard" id="actionlint-skips-shellcheck-silently">
|
|
3222
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Testing · Bug</span></div>
|
|
3223
|
+
<h3>The second silent skip — <code>actionlint</code> runs, and checks no <code>run:</code> block at all</h3>
|
|
3224
|
+
<p><code>make-lint-masks-actionlint-failures</code> fixed the layer everyone can see: <code>make
|
|
3225
|
+
lint</code> discarded actionlint's exit status. There is a second layer underneath it, and the
|
|
3226
|
+
first fix does not reach it. <b><code>actionlint</code> does not lint <code>run:</code> blocks
|
|
3227
|
+
itself.</b> It shells out to <code>shellcheck</code>, and when shellcheck is not on
|
|
3228
|
+
<code>PATH</code> it skips every one of them — no warning, no note, exit 0.
|
|
3229
|
+
|
|
3230
|
+
Same workflow file, same actionlint binary, only <code>PATH</code> differs:
|
|
3231
|
+
|
|
3232
|
+
<code>without shellcheck -> (no output) exit=0</code><br>
|
|
3233
|
+
<code>with shellcheck -> bad.yml:8:9: shellcheck reported issue in this script: SC2001 … exit=1</code>
|
|
3234
|
+
|
|
3235
|
+
So the honest description of the gate before this change was: <code>make lint</code> ran a workflow
|
|
3236
|
+
linter that silently declined to look inside any script, and reported success. That is not
|
|
3237
|
+
hypothetical either — it is exactly how an <code>SC2001</code> reached CI from a green local
|
|
3238
|
+
gate, in the very change that fixed layer one.
|
|
3239
|
+
|
|
3240
|
+
<b>CI was not safe, only lucky.</b> Its actionlint step carried the comment "shellcheck is
|
|
3241
|
+
preinstalled on the runner, so run: blocks are checked too" — true today, and an unpinned,
|
|
3242
|
+
unversioned, silently revocable dependency on somebody else's base image. If GitHub ever drops it
|
|
3243
|
+
from <code>ubuntu-latest</code>, CI degrades to the same hollow check with no signal that anything
|
|
3244
|
+
changed. For a repository that hash-pins its entire lint toolchain precisely so an upstream release
|
|
3245
|
+
cannot move a gate underneath it, an implicit dependency on a runner image is the same bug in a
|
|
3246
|
+
different coat.
|
|
3247
|
+
|
|
3248
|
+
<b>Shipped.</b> <code>shellcheck-py==0.11.0.1</code> is declared in
|
|
3249
|
+
<code>requirements/lint-tools.in</code> and hash-pinned into the generated
|
|
3250
|
+
<code>lint-tools.txt</code> like every other tool, which puts it on both sides: CI installs it from
|
|
3251
|
+
that lock, and <code>make venv</code> puts it in <code>.venv/bin</code>. <code>make lint</code> now
|
|
3252
|
+
prepends <code>.venv/bin</code> to <code>PATH</code> so actionlint can find it, and <b>fails</b> if
|
|
3253
|
+
it is missing rather than running a check it knows is hollow; CI asserts <code>command -v
|
|
3254
|
+
shellcheck</code> before invoking actionlint. Verified in four states against the real recipe: the
|
|
3255
|
+
tool absent (skip message, exit 0), shellcheck missing from the venv (exit 1 with a message naming
|
|
3256
|
+
the fix), both present and workflows clean (exit 0), and both present with an <code>SC2001</code> in
|
|
3257
|
+
a <code>run:</code> block (exit 1 — the case that used to pass). The old recipe on that same
|
|
3258
|
+
file exits 0.
|
|
3259
|
+
|
|
3260
|
+
<b>What is deliberately still skipped.</b> If <code>actionlint</code> itself is absent,
|
|
3261
|
+
<code>make lint</code> prints a message and continues. Closing that would mean pinning
|
|
3262
|
+
<code>actionlint-py</code>, which is sdist-only and fetches the binary from the network at install
|
|
3263
|
+
time, and which tracks a different actionlint version than the URL-pinned one CI uses. Trading a
|
|
3264
|
+
pinned binary for a build-time download is a worse trade than the skip, so the skip stays and is
|
|
3265
|
+
documented rather than quietly tolerated. The wider gap named by the earlier card is also still
|
|
3266
|
+
open: <code>zizmor</code> and <code>gitleaks</code> run only in CI and have no Makefile equivalent.</p>
|
|
3267
|
+
<div class="meta">
|
|
3268
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3269
|
+
<span class="m">Impact <b>Med</b></span>
|
|
3270
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3271
|
+
<span class="m">fixed — shellcheck is pinned in lint-tools and both gates now assert it is there</span>
|
|
3272
|
+
</div>
|
|
3273
|
+
</article>
|
|
3184
3274
|
<!-- /ROADMAP:cards -->
|
|
3185
3275
|
|
|
3186
3276
|
</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
|