boost-skill-cli 1.0.285__tar.gz → 1.0.287__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.285 → boost_skill_cli-1.0.287}/.gitignore +8 -2
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/MANIFEST.in +3 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/bring-commands-under-mutation-testing.md +28 -3
- boost_skill_cli-1.0.287/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +69 -0
- boost_skill_cli-1.0.287/docs/roadmap/items/scorecard-findings-triage.md +74 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap.html +109 -16
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/build_roadmap.py +5 -0
- boost_skill_cli-1.0.287/tests/visual/package-lock.json +933 -0
- boost_skill_cli-1.0.285/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -39
- boost_skill_cli-1.0.285/docs/roadmap/items/scorecard-findings-triage.md +0 -38
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.gitattributes +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/.vale.ini +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/LICENSE +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/Makefile +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/README.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/codecov.yml +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/index.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/README.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/examples/README.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/index.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/noxfile.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/setup.cfg +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/style/README.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/style/boost.css +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/style/boost.js +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/style/demo.html +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.285 → boost_skill_cli-1.0.287}/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/
|
|
@@ -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
|
|
@@ -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.287'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 287)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: bring-commands-under-mutation-testing
|
|
3
3
|
board: code
|
|
4
4
|
section: planned
|
|
5
|
-
status:
|
|
5
|
+
status: declined
|
|
6
6
|
category: Testing · Gap
|
|
7
7
|
complexity: XL
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 3
|
|
10
|
-
note:
|
|
10
|
+
note: declined 2026-07-29 — 71.9% measured, and the run cannot complete at all
|
|
11
11
|
order: 2
|
|
12
|
-
owner:
|
|
12
|
+
owner: loop/roadmap-decisions
|
|
13
13
|
pr:
|
|
14
14
|
title: Bring <code>commands/</code> under mutation testing
|
|
15
15
|
---
|
|
@@ -47,3 +47,28 @@ The ~8,100-line command layer has <strong>zero</strong> mutation coverage: mutmu
|
|
|
47
47
|
One prerequisite is already fixed: <code>--no-mcp</code> leaked through
|
|
48
48
|
<code>os.environ</code> and made the suite order-dependent, which mutmut exposes
|
|
49
49
|
because it runs whichever test subset covers each mutant.
|
|
50
|
+
<b>Declined 2026-07-29.</b> Not "hard" — <em>blocked</em>, and the block is
|
|
51
|
+
upstream. mutmut <b>3.6.0 is still the latest release</b>, and
|
|
52
|
+
<code>src/mutmut/__main__.py:120</code> still reads
|
|
53
|
+
<code>source_paths = [p.resolve(strict=True) for p in Config.get().source_paths]</code>
|
|
54
|
+
— unconditionally, before the <code>max_stack_depth</code> guard — on paths that
|
|
55
|
+
<code>configuration.py:102</code> builds as plain relative <code>Path</code>s. Every
|
|
56
|
+
<code>chdir</code>-ing functional test therefore kills the run, and the functional
|
|
57
|
+
suite is precisely what takes <code>commands/</code> from 17.9% to 91.5% line
|
|
58
|
+
coverage. So the two candidate configurations are "floors out near 18%" and "crashes";
|
|
59
|
+
there is no third. Even granting a fix, the measured numbers already refuse the
|
|
60
|
+
proposal on their own terms: <b>71.9%</b> against an <b>80%</b> blocking floor, with
|
|
61
|
+
survivors spread evenly rather than pooled in one testable gap, at
|
|
62
|
+
<b>2.5–4.5 hours</b> per run against an ~18-minute job. A gate that is 8 points red
|
|
63
|
+
on the day it lands does not gate anything; it just makes <code>main</code> red.
|
|
64
|
+
<b>The lead, if anyone reopens this:</b> the crash is a relative-path bug, and
|
|
65
|
+
<code>source_paths</code> is not required to be relative — an absolute path survives
|
|
66
|
+
<code>resolve(strict=True)</code> from any working directory. Whether the rest of
|
|
67
|
+
mutmut's <code>mutants/</code> copy machinery tolerates one is untested. That, plus a
|
|
68
|
+
non-blocking scheduled job that rotates one module per week, is the shape worth
|
|
69
|
+
trying; a blocking 80% floor is not.
|
|
70
|
+
<b>What is not lost by declining.</b> The architecture already puts behaviour in
|
|
71
|
+
<code>core/</code> — which <em>is</em> mutation-gated at 80% — and keeps
|
|
72
|
+
<code>commands/</code> as thin CLI glue. The uncovered layer is the one deliberately
|
|
73
|
+
designed to hold the least logic, and it still carries 91.5% line coverage from the
|
|
74
|
+
functional suite.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: roadmap-html-goes-stale-on-every-rebase
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: shipped
|
|
6
|
+
category: DX
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: two of the three fixes measured dead; one survivor, and it needs a Pages change
|
|
11
|
+
order: 59
|
|
12
|
+
owner: loop/roadmap-stale-diagnosis
|
|
13
|
+
pr: 307
|
|
14
|
+
title: <code>roadmap.html</code> goes stale on every rebase, so a card and a merge race redden the whole matrix
|
|
15
|
+
---
|
|
16
|
+
The data-driven roadmap solved the conflict problem for <em>item files</em>: two loops adding
|
|
17
|
+
two cards touch two different files and merge cleanly. But <code>docs/roadmap.html</code> is
|
|
18
|
+
still a single committed artifact generated from <b>all</b> of them, and
|
|
19
|
+
<code>update-branch</code> merges it textually.
|
|
20
|
+
|
|
21
|
+
So whenever another roadmap-carrying PR merges first, the rebase brings in the new item
|
|
22
|
+
<code>.md</code> cleanly and leaves the generated HTML behind. The board no longer matches
|
|
23
|
+
<code>docs/roadmap/items/</code>, and both <code>build_roadmap.py --check</code> (in lint) and
|
|
24
|
+
<code>tests/unit/test_roadmap_fresh.py</code> fail — on <b>every</b> test leg, for a PR that
|
|
25
|
+
changed no Python at all. It reads as a catastrophic failure and is really a stale generated
|
|
26
|
+
file.
|
|
27
|
+
|
|
28
|
+
This is not hypothetical: one PR hit it twice in a single afternoon, each time needing a
|
|
29
|
+
manual regenerate-and-push, and the cost scales with the number of concurrent loops — the
|
|
30
|
+
exact workload the item-file split was introduced to support. With <code>strict: true</code>
|
|
31
|
+
every merge rebases every open PR, so any PR carrying a card is guaranteed to hit it if it
|
|
32
|
+
sits behind one other roadmap PR.
|
|
33
|
+
|
|
34
|
+
Options, roughly in order of appeal: have CI regenerate and push the board on the PR branch
|
|
35
|
+
(fixes it silently, needs a bot token and care with the required checks); a custom merge
|
|
36
|
+
driver for the generated boards that reruns the generator instead of merging text; or stop
|
|
37
|
+
committing the HTML and build the site at deploy time (biggest change, and it removes the
|
|
38
|
+
artifact from review). At minimum, make the <code>--check</code> failure message say
|
|
39
|
+
"regenerate after rebasing" so the cause is obvious from the log.
|
|
40
|
+
<b>Update 2026-07-29 — the three options were measured, and two of them do not work.</b>
|
|
41
|
+
First, the repro, because both halves matter and they fail differently. Two branches each
|
|
42
|
+
adding one item to the same section: the <em>cards</em> hard-conflict (same insertion point),
|
|
43
|
+
while the <em>counters</em> merge silently to a wrong value — base <code>N</code>, both sides
|
|
44
|
+
<code>N+1</code>, git keeps <code>N+1</code>, the truth is <code>N+2</code>. So a clean merge
|
|
45
|
+
still fails <code>--check</code>. That is why one root cause reddens ~6 checks.
|
|
46
|
+
<b>"Custom merge driver" is dead.</b> GitHub's server-side merge ignores
|
|
47
|
+
<code>.gitattributes</code> merge strategies — not just custom drivers, the built-in ones too.
|
|
48
|
+
Measured on this repo with four throwaway branches and
|
|
49
|
+
<code>POST /repos/…/merges</code>: <b>409 without</b> the attribute and <b>409 with</b>
|
|
50
|
+
<code>docs/roadmap.html merge=union</code>, while the identical merge <em>locally</em> succeeds
|
|
51
|
+
cleanly and one <code>build_roadmap.py</code> run makes it correct. The attribute would help
|
|
52
|
+
only whoever resolves the conflict by hand, which is the case that already works.
|
|
53
|
+
<b>"CI regenerates and pushes on the PR branch" is dead too</b>, at least with
|
|
54
|
+
<code>GITHUB_TOKEN</code>: a push made with it deliberately does not trigger workflows, so the
|
|
55
|
+
fix-up commit would land a new head with <b>no check runs at all</b> and the required contexts
|
|
56
|
+
would never report — the PR blocks forever instead of for one cycle. It needs a PAT or a GitHub
|
|
57
|
+
App, i.e. a new long-lived secret with write access to every branch.
|
|
58
|
+
<b>The survivor is the third one</b> — stop committing the generated HTML and build the site at
|
|
59
|
+
deploy time — and it has a prerequisite that is a repository <em>setting</em>, not a commit:
|
|
60
|
+
Pages is currently <code>build_type: legacy</code> serving <code>main:/</code>, so it publishes
|
|
61
|
+
whatever bytes are committed. The artifact cannot leave git until Pages builds it, which means
|
|
62
|
+
either an Actions-built site or a generated <code>gh-pages</code> branch (the pattern
|
|
63
|
+
<code>ci.yml</code> already uses for the coverage badge, and one that does <b>not</b> re-trigger
|
|
64
|
+
<code>ci</code> → <code>publish</code>, so it cuts no extra release). Everything that reads
|
|
65
|
+
<code>docs/*.html</code> off disk — <code>html-validate</code>, <code>visual</code>,
|
|
66
|
+
<code>lighthouse</code>, <code>check_anchors</code>, <code>a11y_check</code>,
|
|
67
|
+
<code>test_docsite_chrome</code> — would need a generate step first, and
|
|
68
|
+
<code>test_roadmap_fresh</code> loses its purpose. That is the whole cost, and it is bounded;
|
|
69
|
+
what it is not is a change one loop should make to a live public site on its own initiative.
|
|
@@ -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.
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
.pill.inflight { color: var(--cyan); }
|
|
48
48
|
.pill.next { color: var(--yellow); }
|
|
49
49
|
.pill.planned { color: var(--violet); }
|
|
50
|
+
.pill.declined { color: var(--text-3); } /* investigated and rejected — not a stage */
|
|
50
51
|
|
|
51
52
|
.cat { margin-left: auto; font-family: var(--mono); font-size: 11px; color: var(--text-3); letter-spacing: .06em; text-transform: uppercase; }
|
|
52
53
|
|
|
@@ -478,7 +479,7 @@ message, so routing it through the helper would change user-facing errors.</p>
|
|
|
478
479
|
</article>
|
|
479
480
|
|
|
480
481
|
<article class="cap rcard" id="bring-commands-under-mutation-testing">
|
|
481
|
-
<div class="head"><span class="pill
|
|
482
|
+
<div class="head"><span class="pill declined">Declined</span><span class="cat">Testing · Gap</span></div>
|
|
482
483
|
<h3>Bring <code>commands/</code> under mutation testing</h3>
|
|
483
484
|
<p>The ~8,100-line command layer has <strong>zero</strong> mutation coverage: mutmut is
|
|
484
485
|
scoped to <code>core/</code> only. A blocking 80% floor was attempted and the
|
|
@@ -513,11 +514,37 @@ message, so routing it through the helper would change user-facing errors.</p>
|
|
|
513
514
|
errors), and a sibling <code>pytest_add_cli_args</code> takes extra pytest flags.
|
|
514
515
|
One prerequisite is already fixed: <code>--no-mcp</code> leaked through
|
|
515
516
|
<code>os.environ</code> and made the suite order-dependent, which mutmut exposes
|
|
516
|
-
because it runs whichever test subset covers each mutant
|
|
517
|
+
because it runs whichever test subset covers each mutant.
|
|
518
|
+
<b>Declined 2026-07-29.</b> Not "hard" — <em>blocked</em>, and the block is
|
|
519
|
+
upstream. mutmut <b>3.6.0 is still the latest release</b>, and
|
|
520
|
+
<code>src/mutmut/__main__.py:120</code> still reads
|
|
521
|
+
<code>source_paths = [p.resolve(strict=True) for p in Config.get().source_paths]</code>
|
|
522
|
+
— unconditionally, before the <code>max_stack_depth</code> guard — on paths that
|
|
523
|
+
<code>configuration.py:102</code> builds as plain relative <code>Path</code>s. Every
|
|
524
|
+
<code>chdir</code>-ing functional test therefore kills the run, and the functional
|
|
525
|
+
suite is precisely what takes <code>commands/</code> from 17.9% to 91.5% line
|
|
526
|
+
coverage. So the two candidate configurations are "floors out near 18%" and "crashes";
|
|
527
|
+
there is no third. Even granting a fix, the measured numbers already refuse the
|
|
528
|
+
proposal on their own terms: <b>71.9%</b> against an <b>80%</b> blocking floor, with
|
|
529
|
+
survivors spread evenly rather than pooled in one testable gap, at
|
|
530
|
+
<b>2.5–4.5 hours</b> per run against an ~18-minute job. A gate that is 8 points red
|
|
531
|
+
on the day it lands does not gate anything; it just makes <code>main</code> red.
|
|
532
|
+
<b>The lead, if anyone reopens this:</b> the crash is a relative-path bug, and
|
|
533
|
+
<code>source_paths</code> is not required to be relative — an absolute path survives
|
|
534
|
+
<code>resolve(strict=True)</code> from any working directory. Whether the rest of
|
|
535
|
+
mutmut's <code>mutants/</code> copy machinery tolerates one is untested. That, plus a
|
|
536
|
+
non-blocking scheduled job that rotates one module per week, is the shape worth
|
|
537
|
+
trying; a blocking 80% floor is not.
|
|
538
|
+
<b>What is not lost by declining.</b> The architecture already puts behaviour in
|
|
539
|
+
<code>core/</code> — which <em>is</em> mutation-gated at 80% — and keeps
|
|
540
|
+
<code>commands/</code> as thin CLI glue. The uncovered layer is the one deliberately
|
|
541
|
+
designed to hold the least logic, and it still carries 91.5% line coverage from the
|
|
542
|
+
functional suite.</p>
|
|
517
543
|
<div class="meta">
|
|
518
544
|
<span class="m">Complexity <b>XL</b></span>
|
|
519
545
|
<span class="m hi">Impact <b>High</b></span>
|
|
520
546
|
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
547
|
+
<span class="m">declined 2026-07-29 — 71.9% measured, and the run cannot complete at all</span>
|
|
521
548
|
</div>
|
|
522
549
|
</article>
|
|
523
550
|
|
|
@@ -2015,13 +2042,13 @@ path is never used — that fixes the behaviour without satisfying Dependabot's
|
|
|
2015
2042
|
</article>
|
|
2016
2043
|
|
|
2017
2044
|
<article class="cap rcard" id="scorecard-findings-triage">
|
|
2018
|
-
<div class="head"><span class="pill
|
|
2019
|
-
<h3>OpenSSF Scorecard's
|
|
2045
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Supply chain</span></div>
|
|
2046
|
+
<h3>OpenSSF Scorecard's findings, triaged into three piles</h3>
|
|
2020
2047
|
<p>Scorecard files into the same code-scanning inbox as CodeQL, so its findings read like
|
|
2021
2048
|
code defects and get ignored alongside the false positives. They are not defects — they
|
|
2022
2049
|
are <b>posture metrics</b>, and they must not be dismissed as "false positive" the way the
|
|
2023
2050
|
<code>serve.py</code> traversal alerts legitimately were, because that misrepresents the
|
|
2024
|
-
repo's security posture. Triaged 2026-07-25
|
|
2051
|
+
repo's security posture. Triaged 2026-07-25, re-triaged 2026-07-29 against the 7 still open.
|
|
2025
2052
|
<b>Fixed</b> — <code>TokenPermissions</code> #26/#27/#28: <code>ci</code>,
|
|
2026
2053
|
<code>codeql</code> and <code>adapter-conformance</code> had no top-level
|
|
2027
2054
|
<code>permissions:</code> block at all, scoring 0. Added <code>contents: read</code> as the
|
|
@@ -2032,19 +2059,55 @@ least-privilege default.
|
|
|
2032
2059
|
<code>ci.yml</code>'s <code>tests</code> job needs <code>contents: write</code> for the
|
|
2033
2060
|
coverage-badge push. "Fixing" these breaks the release pipeline. They should be
|
|
2034
2061
|
<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
|
-
|
|
2062
|
+
<b>Correction — <code>PinnedDependencies</code> was NOT "not code-fixable".</b> The first
|
|
2063
|
+
pass filed #40/#41/#48 under <i>"npx and pip invocations inside steps, not actions, so
|
|
2064
|
+
SHA-pinning does not apply"</i>. That reads the check as being about action SHAs, and it
|
|
2065
|
+
is not: for npm the remediation is a <b>committed lockfile</b>, and all three hits were
|
|
2066
|
+
<code>npm install</code> steps. <code>tests/visual/package.json</code> pinned its two direct
|
|
2067
|
+
deps exactly — and <code>.gitignore</code> then <i>excluded the lockfile</i>, so 79
|
|
2068
|
+
transitive packages resolved fresh on every run. <code>theme-lint</code> was worse:
|
|
2069
|
+
<code>npm install stylelint@16 eslint@9</code> re-resolved the whole linter every run, so
|
|
2070
|
+
the linter CI executed was never the linter anyone reviewed. Both trees are now hash-pinned
|
|
2071
|
+
(181 + 81 packages, integrity on every one) and installed with <code>npm ci</code>;
|
|
2072
|
+
<code>dependabot.yml</code> gains both npm directories, because a pin with no update path is
|
|
2073
|
+
only half the job.
|
|
2074
|
+
<b>What the pin immediately exposed.</b> Committing the lock made
|
|
2075
|
+
<code>osv-scanner</code> able to see the transitive tree for the first time, and it failed
|
|
2076
|
+
the branch at once on <b>CVE-2026-14257</b> (<code>brace-expansion</code>, CVSS 7.5,
|
|
2077
|
+
unbounded expansion → OOM). Pre-existing, not introduced: the old floating
|
|
2078
|
+
<code>npm install eslint@9</code> resolved the same package, invisibly. The advisory's range
|
|
2079
|
+
is <i>all versions below 5.0.8</i>, so the 1.x maintenance line has no fix — and the obvious
|
|
2080
|
+
patch, an <code>overrides</code> entry forcing <code>brace-expansion@^5</code>, <b>breaks
|
|
2081
|
+
eslint</b>: v5 exports <code>{ expand }</code> where <code>minimatch@3</code> requires a
|
|
2082
|
+
callable default, so <code>eslint "style/**/*.{js,mjs}"</code> dies with
|
|
2083
|
+
<i>"expand is not a function"</i> while plain <code>eslint style/</code> still passes — a
|
|
2084
|
+
green-looking linter with a broken glob path. The real fix is upstream:
|
|
2085
|
+
<code>eslint@10</code> depends on <code>minimatch@^10.2.5</code>, which requires the patched
|
|
2086
|
+
<code>brace-expansion@^5.0.8</code>. Bumped 9.39.5 → 10.8.0; all 262 packages across both
|
|
2087
|
+
locks now return zero OSV advisories.
|
|
2088
|
+
<b>Open by decision, correctly</b> — <code>BranchProtectionID</code> #33 (4/10) and
|
|
2089
|
+
<code>CodeReviewID</code> #34 (0/26 approved changesets) are two readings of one deliberate
|
|
2090
|
+
choice recorded in <a href="#main-has-no-branch-protection">its own card</a>: require status
|
|
2091
|
+
checks, do <i>not</i> require reviews, because the working model is parallel
|
|
2092
|
+
<code>loop/*</code> branches that self-merge and there is no second reviewer. Every warning
|
|
2093
|
+
Scorecard prints under #33 — stale-review dismissal, required approvers, CODEOWNERS review,
|
|
2094
|
+
last-push approval — follows from that one choice. They stay open because the score is
|
|
2095
|
+
<b>accurate</b>: this repo really does merge without human review. Dismissing them would be
|
|
2096
|
+
the lie.
|
|
2097
|
+
<b>Clears itself</b> — <code>MaintainedID</code> #35 is <i>"repository was created within the
|
|
2098
|
+
last 90 days"</i>. Created 2026-07-17, so it resolves on its own around 2026-10-15. Nothing
|
|
2099
|
+
to do but not dismiss it.
|
|
2100
|
+
<b>Needs a human, not a commit</b> — <code>CIIBestPracticesID</code> #36 is the one
|
|
2101
|
+
remaining actionable finding, and it cannot be fixed from a branch: it asks whether the
|
|
2102
|
+
project is registered for an OpenSSF Best Practices badge, which means creating a project
|
|
2103
|
+
entry at <code>bestpractices.dev</code> under a real account and answering its criteria. The
|
|
2104
|
+
prerequisites are already in place (LICENSE, SECURITY.md, CONTRIBUTING.md,
|
|
2105
|
+
CODE_OF_CONDUCT.md, a published CI gate); only the registration is missing.</p>
|
|
2043
2106
|
<div class="meta">
|
|
2044
2107
|
<span class="m">Complexity <b>M</b></span>
|
|
2045
2108
|
<span class="m">Impact <b>Med</b></span>
|
|
2046
2109
|
<span class="m">Wow <b class="wow">★★</b></span>
|
|
2047
|
-
<span class="m">
|
|
2110
|
+
<span class="m">7 open · 3 now hash-pinned, 3 decided, 1 clears itself</span>
|
|
2048
2111
|
</div>
|
|
2049
2112
|
</article>
|
|
2050
2113
|
|
|
@@ -3090,12 +3153,42 @@ Options, roughly in order of appeal: have CI regenerate and push the board on th
|
|
|
3090
3153
|
driver for the generated boards that reruns the generator instead of merging text; or stop
|
|
3091
3154
|
committing the HTML and build the site at deploy time (biggest change, and it removes the
|
|
3092
3155
|
artifact from review). At minimum, make the <code>--check</code> failure message say
|
|
3093
|
-
"regenerate after rebasing" so the cause is obvious from the log
|
|
3156
|
+
"regenerate after rebasing" so the cause is obvious from the log.
|
|
3157
|
+
<b>Update 2026-07-29 — the three options were measured, and two of them do not work.</b>
|
|
3158
|
+
First, the repro, because both halves matter and they fail differently. Two branches each
|
|
3159
|
+
adding one item to the same section: the <em>cards</em> hard-conflict (same insertion point),
|
|
3160
|
+
while the <em>counters</em> merge silently to a wrong value — base <code>N</code>, both sides
|
|
3161
|
+
<code>N+1</code>, git keeps <code>N+1</code>, the truth is <code>N+2</code>. So a clean merge
|
|
3162
|
+
still fails <code>--check</code>. That is why one root cause reddens ~6 checks.
|
|
3163
|
+
<b>"Custom merge driver" is dead.</b> GitHub's server-side merge ignores
|
|
3164
|
+
<code>.gitattributes</code> merge strategies — not just custom drivers, the built-in ones too.
|
|
3165
|
+
Measured on this repo with four throwaway branches and
|
|
3166
|
+
<code>POST /repos/…/merges</code>: <b>409 without</b> the attribute and <b>409 with</b>
|
|
3167
|
+
<code>docs/roadmap.html merge=union</code>, while the identical merge <em>locally</em> succeeds
|
|
3168
|
+
cleanly and one <code>build_roadmap.py</code> run makes it correct. The attribute would help
|
|
3169
|
+
only whoever resolves the conflict by hand, which is the case that already works.
|
|
3170
|
+
<b>"CI regenerates and pushes on the PR branch" is dead too</b>, at least with
|
|
3171
|
+
<code>GITHUB_TOKEN</code>: a push made with it deliberately does not trigger workflows, so the
|
|
3172
|
+
fix-up commit would land a new head with <b>no check runs at all</b> and the required contexts
|
|
3173
|
+
would never report — the PR blocks forever instead of for one cycle. It needs a PAT or a GitHub
|
|
3174
|
+
App, i.e. a new long-lived secret with write access to every branch.
|
|
3175
|
+
<b>The survivor is the third one</b> — stop committing the generated HTML and build the site at
|
|
3176
|
+
deploy time — and it has a prerequisite that is a repository <em>setting</em>, not a commit:
|
|
3177
|
+
Pages is currently <code>build_type: legacy</code> serving <code>main:/</code>, so it publishes
|
|
3178
|
+
whatever bytes are committed. The artifact cannot leave git until Pages builds it, which means
|
|
3179
|
+
either an Actions-built site or a generated <code>gh-pages</code> branch (the pattern
|
|
3180
|
+
<code>ci.yml</code> already uses for the coverage badge, and one that does <b>not</b> re-trigger
|
|
3181
|
+
<code>ci</code> → <code>publish</code>, so it cuts no extra release). Everything that reads
|
|
3182
|
+
<code>docs/*.html</code> off disk — <code>html-validate</code>, <code>visual</code>,
|
|
3183
|
+
<code>lighthouse</code>, <code>check_anchors</code>, <code>a11y_check</code>,
|
|
3184
|
+
<code>test_docsite_chrome</code> — would need a generate step first, and
|
|
3185
|
+
<code>test_roadmap_fresh</code> loses its purpose. That is the whole cost, and it is bounded;
|
|
3186
|
+
what it is not is a change one loop should make to a live public site on its own initiative.</p>
|
|
3094
3187
|
<div class="meta">
|
|
3095
3188
|
<span class="m">Complexity <b>M</b></span>
|
|
3096
3189
|
<span class="m">Impact <b>Med</b></span>
|
|
3097
3190
|
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
3098
|
-
<span class="m">
|
|
3191
|
+
<span class="m">two of the three fixes measured dead; one survivor, and it needs a Pages change</span>
|
|
3099
3192
|
</div>
|
|
3100
3193
|
</article>
|
|
3101
3194
|
|
|
@@ -60,6 +60,11 @@ STATUS_LABEL = {
|
|
|
60
60
|
"inflight": "In flight",
|
|
61
61
|
"next": "Next",
|
|
62
62
|
"planned": "Planned",
|
|
63
|
+
# A measured "no". Without it, an item that was investigated and rejected
|
|
64
|
+
# sits on the board as `planned` forever and reads as backlog, so the next
|
|
65
|
+
# loop scanning for work re-opens the same question. The pill is muted
|
|
66
|
+
# rather than coloured because a decline is not a lifecycle stage.
|
|
67
|
+
"declined": "Declined",
|
|
63
68
|
}
|
|
64
69
|
|
|
65
70
|
# rstatus class -> visible label (design board).
|