boost-skill-cli 1.0.280__tar.gz → 1.0.282__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.280 → boost_skill_cli-1.0.282}/.gitignore +5 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/Makefile +28 -3
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/PKG-INFO +42 -2
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/README.md +41 -1
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/PKG-INFO +42 -2
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/SOURCES.txt +15 -0
- boost_skill_cli-1.0.282/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +38 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap.html +35 -1
- boost_skill_cli-1.0.282/evals/README.md +157 -0
- boost_skill_cli-1.0.282/evals/__init__.py +6 -0
- boost_skill_cli-1.0.282/evals/baseline.json +550 -0
- boost_skill_cli-1.0.282/evals/faithfulness.py +382 -0
- boost_skill_cli-1.0.282/evals/golden_set.json +372 -0
- boost_skill_cli-1.0.282/evals/make_corpus.py +718 -0
- boost_skill_cli-1.0.282/evals/make_golden.py +276 -0
- boost_skill_cli-1.0.282/evals/metrics.py +198 -0
- boost_skill_cli-1.0.282/evals/run_evals.py +346 -0
- boost_skill_cli-1.0.282/scripts/eval_gate.py +240 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/setup.cfg +1 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/smoke.sh +6 -1
- boost_skill_cli-1.0.282/tests/unit/test_codeql_analysis_key.py +95 -0
- boost_skill_cli-1.0.282/tests/unit/test_eval_faithfulness.py +259 -0
- boost_skill_cli-1.0.282/tests/unit/test_eval_gate.py +194 -0
- boost_skill_cli-1.0.282/tests/unit/test_eval_metrics.py +255 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.gitattributes +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/.vale.ini +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/LICENSE +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/codecov.yml +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/index.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/examples/README.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/index.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/noxfile.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/style/README.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/style/boost.css +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/style/boost.js +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/style/demo.html +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.280 → boost_skill_cli-1.0.282}/tests/visual/visual_check.mjs +0 -0
|
@@ -230,6 +230,11 @@ mutants/
|
|
|
230
230
|
|
|
231
231
|
# sandboxed boost home for the Tier 1 eval corpus (`make eval` taps here)
|
|
232
232
|
.eval-home/
|
|
233
|
+
|
|
234
|
+
# `make evals` output. The generated corpus and index live in the system temp
|
|
235
|
+
# dir (see evals/run_evals.py), so only the per-run scores land here; the
|
|
236
|
+
# committed evals/baseline.json is what regressions are measured against.
|
|
237
|
+
evals/results.json
|
|
233
238
|
tests/visual/node_modules/
|
|
234
239
|
tests/visual/out/
|
|
235
240
|
tests/visual/package-lock.json
|
|
@@ -10,7 +10,7 @@ PYTEST := $(VENV)/bin/pytest
|
|
|
10
10
|
# pinned taps out of the developer's real ~/.boost.
|
|
11
11
|
EVAL_HOME := $(CURDIR)/.eval-home
|
|
12
12
|
|
|
13
|
-
.PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo carousel clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check bdd bench bench-cli fuzz post-deploy
|
|
13
|
+
.PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo carousel clean-test eval eval-ai eval-rec eval-stats eval-explain evals evals-baseline evals-golden evals-online audit dist-check bdd bench bench-cli fuzz post-deploy
|
|
14
14
|
|
|
15
15
|
# Every tool comes from a hash-pinned requirements/*.txt — the same files CI
|
|
16
16
|
# installs (see scripts/lock_toolchain.py). pip enforces the hashes, so a dev
|
|
@@ -52,7 +52,7 @@ mutation:
|
|
|
52
52
|
$(PY) scripts/mutation_gate.py --run --min 80
|
|
53
53
|
|
|
54
54
|
lint:
|
|
55
|
-
$(VENV)/bin/ruff check boost_cli tests
|
|
55
|
+
$(VENV)/bin/ruff check boost_cli tests evals
|
|
56
56
|
$(VENV)/bin/mypy
|
|
57
57
|
$(VENV)/bin/pyright
|
|
58
58
|
$(VENV)/bin/lint-imports
|
|
@@ -72,6 +72,7 @@ lint:
|
|
|
72
72
|
$(PY) scripts/perf_gate.py
|
|
73
73
|
$(PY) scripts/check_anchors.py
|
|
74
74
|
$(PY) scripts/check_required_checks.py
|
|
75
|
+
$(PY) evals/make_golden.py --check
|
|
75
76
|
|
|
76
77
|
# Supply-chain CVE gate: fail on a known OSV/PyPI advisory in the project's
|
|
77
78
|
# dependency closure. Mirrors the pip-audit CI workflow; run before releasing.
|
|
@@ -125,6 +126,30 @@ eval-explain:
|
|
|
125
126
|
PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
|
|
126
127
|
BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_explain.py --fail-under 0.80
|
|
127
128
|
|
|
129
|
+
# Retrieval-quality gate over the HERMETIC golden set: recall@5/@10, MRR, and
|
|
130
|
+
# nDCG@5/@10 with graded (3/2/1) relevance, plus a paired-bootstrap regression
|
|
131
|
+
# test against the committed evals/baseline.json. Part of `check` and required
|
|
132
|
+
# in CI. Unlike `eval` above it needs no network and no API key: it generates
|
|
133
|
+
# its own corpus and taps it into a disposable BOOST_HOME under the system temp
|
|
134
|
+
# dir, so a metric moving can only mean the ranker moved.
|
|
135
|
+
evals:
|
|
136
|
+
$(PY) scripts/eval_gate.py --run
|
|
137
|
+
|
|
138
|
+
# Re-pin evals/baseline.json to the current scores. Deliberate: it is how you
|
|
139
|
+
# accept a ranking change, so it must be a separate commit that says why.
|
|
140
|
+
evals-baseline:
|
|
141
|
+
$(PY) evals/run_evals.py --save-baseline
|
|
142
|
+
|
|
143
|
+
# Regenerate evals/golden_set.json from evals/make_golden.py after editing the
|
|
144
|
+
# query table (`--check` runs in `lint` and fails on drift).
|
|
145
|
+
evals-golden:
|
|
146
|
+
$(PY) evals/make_golden.py
|
|
147
|
+
|
|
148
|
+
# The same five metrics over the pinned REAL-registry corpus `eval` uses.
|
|
149
|
+
# Needs the network; reported, never gated — mirrors `tests/smoke.sh --online`.
|
|
150
|
+
evals-online:
|
|
151
|
+
$(PY) evals/run_evals.py --online --faithfulness
|
|
152
|
+
|
|
128
153
|
# Opt-in Gherkin/BDD suite (tests/bdd) — additive to tests/functional, not a
|
|
129
154
|
# replacement. Needs the [bdd] extra (`pip install -e '.[bdd]'`); not part of
|
|
130
155
|
# `make check`.
|
|
@@ -183,7 +208,7 @@ demo:
|
|
|
183
208
|
carousel:
|
|
184
209
|
for t in docs/carousel/tapes/*.tape; do vhs "$$t"; done
|
|
185
210
|
|
|
186
|
-
check: lint eval test smoke mutation
|
|
211
|
+
check: lint eval evals test smoke mutation
|
|
187
212
|
@echo "== all gates passed =="
|
|
188
213
|
|
|
189
214
|
clean-test:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.282
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -997,16 +997,56 @@ reports, and the free services that monitor the project.
|
|
|
997
997
|
|
|
998
998
|
## Test suite
|
|
999
999
|
|
|
1000
|
-
|
|
1000
|
+
Four layers, all enforced (`make check` runs the full set; CI runs the same thing):
|
|
1001
1001
|
|
|
1002
1002
|
| Layer | What it does | Gate |
|
|
1003
1003
|
|---|---|---|
|
|
1004
1004
|
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
1005
1005
|
| `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
1006
1006
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
1007
|
+
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
1007
1008
|
|
|
1008
1009
|
Dev setup: `make venv` (pulls in pytest, coverage, mutmut — the shipped
|
|
1009
1010
|
runtime itself stays dependency-free). Every test run uses a throwaway
|
|
1010
1011
|
`$HOME`, so your actual agent configs are never at risk.
|
|
1011
1012
|
|
|
1012
1013
|
[mutmut]: https://mutmut.readthedocs.io/
|
|
1014
|
+
|
|
1015
|
+
## Evaluation harness
|
|
1016
|
+
|
|
1017
|
+
Search quality is the one thing the suite above can't assert: every test can
|
|
1018
|
+
pass while the ranker quietly gets worse. `make evals` measures it. The harness
|
|
1019
|
+
is pure stdlib and fully offline — it generates its own corpus of skills, rules,
|
|
1020
|
+
and workflows and taps it into a disposable `BOOST_HOME`, so a metric that moves
|
|
1021
|
+
can only mean the *ranker* moved. See [`evals/README.md`](evals/README.md).
|
|
1022
|
+
|
|
1023
|
+
**Golden set** — [`evals/golden_set.json`](evals/golden_set.json): 36 realistic
|
|
1024
|
+
queries with **graded** relevance (3 perfect · 2 useful · 1 marginal) over the
|
|
1025
|
+
generated corpus. Generated and validated by `evals/make_golden.py`, which
|
|
1026
|
+
refuses a judgment naming a skill the corpus doesn't contain; `--check` fails CI
|
|
1027
|
+
on drift, so the file can never disagree with its source.
|
|
1028
|
+
|
|
1029
|
+
**Five metrics**, all computed by `evals/metrics.py`:
|
|
1030
|
+
|
|
1031
|
+
- **recall@5** / **recall@10** — of everything relevant, what fraction reached the top *k*.
|
|
1032
|
+
- **MRR** — 1/rank of the first relevant hit, averaged; sensitive only to the top of the list, which is where people look.
|
|
1033
|
+
- **nDCG@5** / **nDCG@10** — graded gain (`2^rel − 1`) with the standard `log2(rank + 1)` discount; the only metric that distinguishes the right results in the wrong order from the right order.
|
|
1034
|
+
|
|
1035
|
+
**Significance gating.** A metric dropping isn't automatically a regression —
|
|
1036
|
+
with 36 queries, one unlucky result moves the mean. So `scripts/eval_gate.py`
|
|
1037
|
+
fails a metric only when it falls more than 0.02 below the committed baseline
|
|
1038
|
+
**and** a seeded 10,000-resample paired bootstrap over the per-query deltas puts
|
|
1039
|
+
that drop at `p < 0.05`. Alongside that, each metric has an absolute floor set
|
|
1040
|
+
~0.05 below its first measured value, which catches the erosion that a
|
|
1041
|
+
compare-to-last-commit check never sees. Accepting a real ranking change is a
|
|
1042
|
+
deliberate `make evals-baseline` commit.
|
|
1043
|
+
|
|
1044
|
+
**Faithfulness.** `boost explain` and `boost distill` generate prose from a
|
|
1045
|
+
`SKILL.md`, and their failure mode is overclaiming. The harness scores that with
|
|
1046
|
+
the Ragas method — split the answer into atomic statements, verify each against
|
|
1047
|
+
the source, score supported/total — and reports it alongside what the runtime
|
|
1048
|
+
grounding guardrail in `boost explain` would do with the same reply. With no
|
|
1049
|
+
`claude` CLI and no `ANTHROPIC_API_KEY` it **skips rather than fails**, and
|
|
1050
|
+
reports a status instead of a number so "couldn't measure" is never mistaken for
|
|
1051
|
+
"scored zero". It's therefore outside `make check`; run it with
|
|
1052
|
+
`make evals-online`.
|
|
@@ -281,16 +281,56 @@ reports, and the free services that monitor the project.
|
|
|
281
281
|
|
|
282
282
|
## Test suite
|
|
283
283
|
|
|
284
|
-
|
|
284
|
+
Four layers, all enforced (`make check` runs the full set; CI runs the same thing):
|
|
285
285
|
|
|
286
286
|
| Layer | What it does | Gate |
|
|
287
287
|
|---|---|---|
|
|
288
288
|
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
289
289
|
| `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
290
290
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
291
|
+
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
291
292
|
|
|
292
293
|
Dev setup: `make venv` (pulls in pytest, coverage, mutmut — the shipped
|
|
293
294
|
runtime itself stays dependency-free). Every test run uses a throwaway
|
|
294
295
|
`$HOME`, so your actual agent configs are never at risk.
|
|
295
296
|
|
|
296
297
|
[mutmut]: https://mutmut.readthedocs.io/
|
|
298
|
+
|
|
299
|
+
## Evaluation harness
|
|
300
|
+
|
|
301
|
+
Search quality is the one thing the suite above can't assert: every test can
|
|
302
|
+
pass while the ranker quietly gets worse. `make evals` measures it. The harness
|
|
303
|
+
is pure stdlib and fully offline — it generates its own corpus of skills, rules,
|
|
304
|
+
and workflows and taps it into a disposable `BOOST_HOME`, so a metric that moves
|
|
305
|
+
can only mean the *ranker* moved. See [`evals/README.md`](evals/README.md).
|
|
306
|
+
|
|
307
|
+
**Golden set** — [`evals/golden_set.json`](evals/golden_set.json): 36 realistic
|
|
308
|
+
queries with **graded** relevance (3 perfect · 2 useful · 1 marginal) over the
|
|
309
|
+
generated corpus. Generated and validated by `evals/make_golden.py`, which
|
|
310
|
+
refuses a judgment naming a skill the corpus doesn't contain; `--check` fails CI
|
|
311
|
+
on drift, so the file can never disagree with its source.
|
|
312
|
+
|
|
313
|
+
**Five metrics**, all computed by `evals/metrics.py`:
|
|
314
|
+
|
|
315
|
+
- **recall@5** / **recall@10** — of everything relevant, what fraction reached the top *k*.
|
|
316
|
+
- **MRR** — 1/rank of the first relevant hit, averaged; sensitive only to the top of the list, which is where people look.
|
|
317
|
+
- **nDCG@5** / **nDCG@10** — graded gain (`2^rel − 1`) with the standard `log2(rank + 1)` discount; the only metric that distinguishes the right results in the wrong order from the right order.
|
|
318
|
+
|
|
319
|
+
**Significance gating.** A metric dropping isn't automatically a regression —
|
|
320
|
+
with 36 queries, one unlucky result moves the mean. So `scripts/eval_gate.py`
|
|
321
|
+
fails a metric only when it falls more than 0.02 below the committed baseline
|
|
322
|
+
**and** a seeded 10,000-resample paired bootstrap over the per-query deltas puts
|
|
323
|
+
that drop at `p < 0.05`. Alongside that, each metric has an absolute floor set
|
|
324
|
+
~0.05 below its first measured value, which catches the erosion that a
|
|
325
|
+
compare-to-last-commit check never sees. Accepting a real ranking change is a
|
|
326
|
+
deliberate `make evals-baseline` commit.
|
|
327
|
+
|
|
328
|
+
**Faithfulness.** `boost explain` and `boost distill` generate prose from a
|
|
329
|
+
`SKILL.md`, and their failure mode is overclaiming. The harness scores that with
|
|
330
|
+
the Ragas method — split the answer into atomic statements, verify each against
|
|
331
|
+
the source, score supported/total — and reports it alongside what the runtime
|
|
332
|
+
grounding guardrail in `boost explain` would do with the same reply. With no
|
|
333
|
+
`claude` CLI and no `ANTHROPIC_API_KEY` it **skips rather than fails**, and
|
|
334
|
+
reports a status instead of a number so "couldn't measure" is never mistaken for
|
|
335
|
+
"scored zero". It's therefore outside `make check`; run it with
|
|
336
|
+
`make evals-online`.
|
|
@@ -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.282'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 282)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.282
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -997,16 +997,56 @@ reports, and the free services that monitor the project.
|
|
|
997
997
|
|
|
998
998
|
## Test suite
|
|
999
999
|
|
|
1000
|
-
|
|
1000
|
+
Four layers, all enforced (`make check` runs the full set; CI runs the same thing):
|
|
1001
1001
|
|
|
1002
1002
|
| Layer | What it does | Gate |
|
|
1003
1003
|
|---|---|---|
|
|
1004
1004
|
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
1005
1005
|
| `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
1006
1006
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
1007
|
+
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
1007
1008
|
|
|
1008
1009
|
Dev setup: `make venv` (pulls in pytest, coverage, mutmut — the shipped
|
|
1009
1010
|
runtime itself stays dependency-free). Every test run uses a throwaway
|
|
1010
1011
|
`$HOME`, so your actual agent configs are never at risk.
|
|
1011
1012
|
|
|
1012
1013
|
[mutmut]: https://mutmut.readthedocs.io/
|
|
1014
|
+
|
|
1015
|
+
## Evaluation harness
|
|
1016
|
+
|
|
1017
|
+
Search quality is the one thing the suite above can't assert: every test can
|
|
1018
|
+
pass while the ranker quietly gets worse. `make evals` measures it. The harness
|
|
1019
|
+
is pure stdlib and fully offline — it generates its own corpus of skills, rules,
|
|
1020
|
+
and workflows and taps it into a disposable `BOOST_HOME`, so a metric that moves
|
|
1021
|
+
can only mean the *ranker* moved. See [`evals/README.md`](evals/README.md).
|
|
1022
|
+
|
|
1023
|
+
**Golden set** — [`evals/golden_set.json`](evals/golden_set.json): 36 realistic
|
|
1024
|
+
queries with **graded** relevance (3 perfect · 2 useful · 1 marginal) over the
|
|
1025
|
+
generated corpus. Generated and validated by `evals/make_golden.py`, which
|
|
1026
|
+
refuses a judgment naming a skill the corpus doesn't contain; `--check` fails CI
|
|
1027
|
+
on drift, so the file can never disagree with its source.
|
|
1028
|
+
|
|
1029
|
+
**Five metrics**, all computed by `evals/metrics.py`:
|
|
1030
|
+
|
|
1031
|
+
- **recall@5** / **recall@10** — of everything relevant, what fraction reached the top *k*.
|
|
1032
|
+
- **MRR** — 1/rank of the first relevant hit, averaged; sensitive only to the top of the list, which is where people look.
|
|
1033
|
+
- **nDCG@5** / **nDCG@10** — graded gain (`2^rel − 1`) with the standard `log2(rank + 1)` discount; the only metric that distinguishes the right results in the wrong order from the right order.
|
|
1034
|
+
|
|
1035
|
+
**Significance gating.** A metric dropping isn't automatically a regression —
|
|
1036
|
+
with 36 queries, one unlucky result moves the mean. So `scripts/eval_gate.py`
|
|
1037
|
+
fails a metric only when it falls more than 0.02 below the committed baseline
|
|
1038
|
+
**and** a seeded 10,000-resample paired bootstrap over the per-query deltas puts
|
|
1039
|
+
that drop at `p < 0.05`. Alongside that, each metric has an absolute floor set
|
|
1040
|
+
~0.05 below its first measured value, which catches the erosion that a
|
|
1041
|
+
compare-to-last-commit check never sees. Accepting a real ranking change is a
|
|
1042
|
+
deliberate `make evals-baseline` commit.
|
|
1043
|
+
|
|
1044
|
+
**Faithfulness.** `boost explain` and `boost distill` generate prose from a
|
|
1045
|
+
`SKILL.md`, and their failure mode is overclaiming. The harness scores that with
|
|
1046
|
+
the Ragas method — split the answer into atomic statements, verify each against
|
|
1047
|
+
the source, score supported/total — and reports it alongside what the runtime
|
|
1048
|
+
grounding guardrail in `boost explain` would do with the same reply. With no
|
|
1049
|
+
`claude` CLI and no `ANTHROPIC_API_KEY` it **skips rather than fails**, and
|
|
1050
|
+
reports a status instead of a number so "couldn't measure" is never mistaken for
|
|
1051
|
+
"scored zero". It's therefore outside `make check`; run it with
|
|
1052
|
+
`make evals-online`.
|
|
@@ -173,6 +173,7 @@ docs/roadmap/items/ci-summary-step-fails-itself.md
|
|
|
173
173
|
docs/roadmap/items/ci-time-is-now-runner-queueing.md
|
|
174
174
|
docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
|
|
175
175
|
docs/roadmap/items/code-scanning-rule-can-be-restored.md
|
|
176
|
+
docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
|
|
176
177
|
docs/roadmap/items/command-carousel-page.md
|
|
177
178
|
docs/roadmap/items/command-reference-docs-site.md
|
|
178
179
|
docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md
|
|
@@ -326,6 +327,15 @@ docs/roadmap/items/workflow-linting-actionlint.md
|
|
|
326
327
|
docs/roadmap/items/workflow-sast-zizmor.md
|
|
327
328
|
docs/roadmap/items/workspace-scope-install.md
|
|
328
329
|
docs/roadmap/items/zizmor-pin-is-a-yanked-release.md
|
|
330
|
+
evals/README.md
|
|
331
|
+
evals/__init__.py
|
|
332
|
+
evals/baseline.json
|
|
333
|
+
evals/faithfulness.py
|
|
334
|
+
evals/golden_set.json
|
|
335
|
+
evals/make_corpus.py
|
|
336
|
+
evals/make_golden.py
|
|
337
|
+
evals/metrics.py
|
|
338
|
+
evals/run_evals.py
|
|
329
339
|
examples/README.md
|
|
330
340
|
examples/adapt-demo.sh
|
|
331
341
|
examples/boost-run-prototype.sh
|
|
@@ -349,6 +359,7 @@ scripts/check_licenses.py
|
|
|
349
359
|
scripts/check_required_checks.py
|
|
350
360
|
scripts/ensure_eval_corpus.sh
|
|
351
361
|
scripts/eval_explain.py
|
|
362
|
+
scripts/eval_gate.py
|
|
352
363
|
scripts/eval_recommend.py
|
|
353
364
|
scripts/eval_retrieval.py
|
|
354
365
|
scripts/eval_stats_summary.py
|
|
@@ -442,6 +453,7 @@ tests/unit/test_check_anchors.py
|
|
|
442
453
|
tests/unit/test_check_licenses.py
|
|
443
454
|
tests/unit/test_claude_settings.py
|
|
444
455
|
tests/unit/test_cliparse.py
|
|
456
|
+
tests/unit/test_codeql_analysis_key.py
|
|
445
457
|
tests/unit/test_command_reference_fresh.py
|
|
446
458
|
tests/unit/test_community_health_files.py
|
|
447
459
|
tests/unit/test_config.py
|
|
@@ -453,6 +465,9 @@ tests/unit/test_docsite_chrome.py
|
|
|
453
465
|
tests/unit/test_ed25519.py
|
|
454
466
|
tests/unit/test_embed.py
|
|
455
467
|
tests/unit/test_errors_and_cli_table.py
|
|
468
|
+
tests/unit/test_eval_faithfulness.py
|
|
469
|
+
tests/unit/test_eval_gate.py
|
|
470
|
+
tests/unit/test_eval_metrics.py
|
|
456
471
|
tests/unit/test_eval_stats_summary.py
|
|
457
472
|
tests/unit/test_faithfulness.py
|
|
458
473
|
tests/unit/test_frontmatter.py
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: codeql-job-rename-stranded-merge-protection
|
|
3
|
+
board: code
|
|
4
|
+
section: trust
|
|
5
|
+
status: shipped
|
|
6
|
+
category: CI · Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: a job rename forked the code-scanning config and blocked 100% of merges for a day
|
|
11
|
+
order: 37
|
|
12
|
+
owner: loop/codeql-analysis-key-guard
|
|
13
|
+
pr:
|
|
14
|
+
title: A CodeQL job rename silently blocked every merge
|
|
15
|
+
---
|
|
16
|
+
GitHub identifies a code-scanning configuration by <code><workflow path>:<job id></code>, which makes
|
|
17
|
+
the job id load-bearing in a way nothing in the workflow file hints at: renaming it does not
|
|
18
|
+
<i>move</i> the configuration, it <b>forks</b> it. #259 renamed this job <code>analyze</code> to
|
|
19
|
+
<code>codeql-analyze</code> on 2026-07-27. The last <code>:analyze</code> analysis landed 20 seconds
|
|
20
|
+
after that merge and never refreshed, stranding <b>247</b> of them on <code>refs/heads/main</code>
|
|
21
|
+
where GitHub kept counting them as a configuration present on the base branch. Merge protection
|
|
22
|
+
then reported <code>1 configuration not found</code> on every pull request — conclusion
|
|
23
|
+
<code>neutral</code> — and because the branch ruleset carries a <code>code_scanning</code> rule,
|
|
24
|
+
that neutral <b>blocked 100% of merges</b> while every required status check stayed green.
|
|
25
|
+
The cutover is exact: the last <code>success</code> was #263, the first <code>neutral</code> #259,
|
|
26
|
+
and every PR from #264 to #316 was neutral regardless of whether its diff contained Python at all.
|
|
27
|
+
That symmetry is what makes it so easy to misread — it presents as a rule that rejects docs-only
|
|
28
|
+
PRs, and the two hypotheses it invites (<i>"CodeQL has nothing to analyse"</i> and <i>"the rule is
|
|
29
|
+
unsatisfiable"</i>) are both wrong. 29 docs-only PRs merged happily under the same rule before the
|
|
30
|
+
rename. The check body says the real answer outright, and reading it beats inferring from
|
|
31
|
+
<code>mergeable_state</code>. Fixed by deleting the 247 orphaned analyses, which was verified safe
|
|
32
|
+
first: every alert still on the stale key was <code>fixed</code>, and all nine dismissed CodeQL
|
|
33
|
+
alerts already carried their false-positive rationale on the live key. The job id was <i>already</i>
|
|
34
|
+
guarded as a required status-check context by
|
|
35
|
+
<code>scripts/check_required_checks.py</code>, and that guard passed during #259 because the
|
|
36
|
+
context list was updated in the same commit — only the invisible half broke. So the guard added
|
|
37
|
+
here pins the id from the analysis-key side, with a note that a future rename is not finished until
|
|
38
|
+
the stale configuration is deleted. Related: [[release-verifies-the-wrong-commit]].
|
|
@@ -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>173</b><span>Loop finds</span></div>
|
|
114
114
|
<!-- /ROADMAP:stats -->
|
|
115
115
|
</div>
|
|
116
116
|
</section>
|
|
@@ -4014,6 +4014,40 @@ is built.</p>
|
|
|
4014
4014
|
</div>
|
|
4015
4015
|
</article>
|
|
4016
4016
|
|
|
4017
|
+
<article class="cap rcard" id="codeql-job-rename-stranded-merge-protection">
|
|
4018
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI · Bug</span></div>
|
|
4019
|
+
<h3>A CodeQL job rename silently blocked every merge</h3>
|
|
4020
|
+
<p>GitHub identifies a code-scanning configuration by <code><workflow path>:<job id></code>, which makes
|
|
4021
|
+
the job id load-bearing in a way nothing in the workflow file hints at: renaming it does not
|
|
4022
|
+
<i>move</i> the configuration, it <b>forks</b> it. #259 renamed this job <code>analyze</code> to
|
|
4023
|
+
<code>codeql-analyze</code> on 2026-07-27. The last <code>:analyze</code> analysis landed 20 seconds
|
|
4024
|
+
after that merge and never refreshed, stranding <b>247</b> of them on <code>refs/heads/main</code>
|
|
4025
|
+
where GitHub kept counting them as a configuration present on the base branch. Merge protection
|
|
4026
|
+
then reported <code>1 configuration not found</code> on every pull request — conclusion
|
|
4027
|
+
<code>neutral</code> — and because the branch ruleset carries a <code>code_scanning</code> rule,
|
|
4028
|
+
that neutral <b>blocked 100% of merges</b> while every required status check stayed green.
|
|
4029
|
+
The cutover is exact: the last <code>success</code> was #263, the first <code>neutral</code> #259,
|
|
4030
|
+
and every PR from #264 to #316 was neutral regardless of whether its diff contained Python at all.
|
|
4031
|
+
That symmetry is what makes it so easy to misread — it presents as a rule that rejects docs-only
|
|
4032
|
+
PRs, and the two hypotheses it invites (<i>"CodeQL has nothing to analyse"</i> and <i>"the rule is
|
|
4033
|
+
unsatisfiable"</i>) are both wrong. 29 docs-only PRs merged happily under the same rule before the
|
|
4034
|
+
rename. The check body says the real answer outright, and reading it beats inferring from
|
|
4035
|
+
<code>mergeable_state</code>. Fixed by deleting the 247 orphaned analyses, which was verified safe
|
|
4036
|
+
first: every alert still on the stale key was <code>fixed</code>, and all nine dismissed CodeQL
|
|
4037
|
+
alerts already carried their false-positive rationale on the live key. The job id was <i>already</i>
|
|
4038
|
+
guarded as a required status-check context by
|
|
4039
|
+
<code>scripts/check_required_checks.py</code>, and that guard passed during #259 because the
|
|
4040
|
+
context list was updated in the same commit — only the invisible half broke. So the guard added
|
|
4041
|
+
here pins the id from the analysis-key side, with a note that a future rename is not finished until
|
|
4042
|
+
the stale configuration is deleted. Related: [[release-verifies-the-wrong-commit]].</p>
|
|
4043
|
+
<div class="meta">
|
|
4044
|
+
<span class="m">Complexity <b>S</b></span>
|
|
4045
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
4046
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
4047
|
+
<span class="m">a job rename forked the code-scanning config and blocked 100% of merges for a day</span>
|
|
4048
|
+
</div>
|
|
4049
|
+
</article>
|
|
4050
|
+
|
|
4017
4051
|
<article class="cap rcard" id="installed-skill-trust-audit">
|
|
4018
4052
|
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Trust · Health</span></div>
|
|
4019
4053
|
<h3><code>boost audit --skills</code> — a trust/staleness report for installed skills</h3>
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# evals — boost's offline evaluation harness
|
|
2
|
+
|
|
3
|
+
A dev/CI quality gate for the retrieval stack, in the same family as mutation
|
|
4
|
+
testing: `make evals`, never a `boost` subcommand. Pure stdlib, no network, no
|
|
5
|
+
API key.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
make evals # run the harness and enforce the gate
|
|
9
|
+
make evals-baseline # deliberately re-pin evals/baseline.json
|
|
10
|
+
make evals-golden # regenerate golden_set.json after editing the queries
|
|
11
|
+
make evals-online # + the pinned real-registry corpus and faithfulness
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Why this exists alongside `make eval`
|
|
15
|
+
|
|
16
|
+
The repo has two retrieval gates and they answer different questions.
|
|
17
|
+
|
|
18
|
+
| | `make eval` | `make evals` |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| corpus | pinned GitHub repos (`tests/eval/taps.txt`) | generated locally, 57 items* |
|
|
21
|
+
| network | required | none |
|
|
22
|
+
| labels | binary | graded 3 / 2 / 1 |
|
|
23
|
+
| metrics | recall@k, hit@1, MRR, nDCG@k | recall@5/@10, MRR, nDCG@5/@10 |
|
|
24
|
+
| significance | `ranx` t-test, opt-in extra, informational | stdlib paired bootstrap, **gated** |
|
|
25
|
+
| catches | "does a real skill come back for a real question" | "did the ranking get worse" |
|
|
26
|
+
|
|
27
|
+
`eval` grades against the live ecosystem, so it drifts when upstream repos do —
|
|
28
|
+
which is why its regression check is deliberately relaxed. This harness fixes
|
|
29
|
+
the corpus so the only thing that can move a number is the ranker.
|
|
30
|
+
|
|
31
|
+
\* 49 skills across 10 topic clusters, plus 4 rules and 4 workflows as ranking
|
|
32
|
+
pressure. Confirm the total the way boost sees it:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
BOOST_HOME=$TMPDIR/boost-evals-home boost count # -> available 57 (across 1 tap)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Layout
|
|
39
|
+
|
|
40
|
+
| file | what it is |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `metrics.py` | the arithmetic — recall@k, MRR, nDCG@k, paired bootstrap |
|
|
43
|
+
| `make_corpus.py` | generates the corpus; **item table is the source of truth** |
|
|
44
|
+
| `make_golden.py` | generates + validates `golden_set.json`; `--check` for drift |
|
|
45
|
+
| `golden_set.json` | 36 queries, 107 graded judgments (generated — don't hand-edit) |
|
|
46
|
+
| `baseline.json` | pinned per-query scores the bootstrap compares against |
|
|
47
|
+
| `run_evals.py` | sets up the sandbox, scores every arm, writes `results.json` |
|
|
48
|
+
| `faithfulness.py` | Ragas-methodology faithfulness for `explain` / `distill` |
|
|
49
|
+
| `../scripts/eval_gate.py` | reads `results.json`, enforces the thresholds |
|
|
50
|
+
|
|
51
|
+
The corpus and BM25 index are built into a disposable `BOOST_HOME` under the
|
|
52
|
+
system temp dir (`$TMPDIR/boost-evals-home`, override with `BOOST_EVALS_HOME` or
|
|
53
|
+
`--home`) — outside the repo on purpose, because it is itself a git repo and a
|
|
54
|
+
nested one confuses `git status`, coverage discovery, and mutmut's tree copy.
|
|
55
|
+
|
|
56
|
+
## The five metrics
|
|
57
|
+
|
|
58
|
+
- **recall@5 / recall@10** — of everything graded relevant, what fraction landed
|
|
59
|
+
in the top k. Grades are binarized here (any grade ≥ 1 counts); recall asks
|
|
60
|
+
"did we find it", not "did we order it well".
|
|
61
|
+
- **MRR** — 1/rank of the first relevant hit, averaged. Sensitive to the top of
|
|
62
|
+
the list only, which is where users actually look.
|
|
63
|
+
- **nDCG@5 / nDCG@10** — DCG over ideal DCG, with the standard `log2(rank + 1)`
|
|
64
|
+
discount and exponential graded gains (`2^rel − 1`, so a perfect hit is worth
|
|
65
|
+
7 and a marginal one 1). This is the only metric that can tell a correct set
|
|
66
|
+
of results in the wrong order from the right order.
|
|
67
|
+
|
|
68
|
+
## The grading scale
|
|
69
|
+
|
|
70
|
+
| grade | meaning |
|
|
71
|
+
|---|---|
|
|
72
|
+
| 3 | perfect — the skill the query is asking for |
|
|
73
|
+
| 2 | useful — a competent answer, not the best one |
|
|
74
|
+
| 1 | marginal — topically adjacent; better than an unrelated hit |
|
|
75
|
+
| — | absent from the label map, i.e. irrelevant |
|
|
76
|
+
|
|
77
|
+
Grading the tail matters: a query labeled with only its perfect answer teaches
|
|
78
|
+
nDCG nothing about the four results underneath it.
|
|
79
|
+
|
|
80
|
+
## How the gate works
|
|
81
|
+
|
|
82
|
+
`scripts/eval_gate.py` runs two independent checks and both must pass.
|
|
83
|
+
|
|
84
|
+
1. **Absolute floors** — each metric must clear a floor calibrated ~0.05 below
|
|
85
|
+
the first measured run. This catches slow erosion across many merges, which a
|
|
86
|
+
compare-to-last-commit check never notices.
|
|
87
|
+
2. **Significant regression vs the baseline** — a metric fails only when it drops
|
|
88
|
+
by more than `--regression-eps` (0.02) **and** a paired bootstrap over the
|
|
89
|
+
per-query deltas returns `p < 0.05`.
|
|
90
|
+
|
|
91
|
+
Requiring both conditions is the whole design. The two arms answer the same 36
|
|
92
|
+
queries, so pairing cancels out "this query is just hard" and leaves the effect
|
|
93
|
+
of the change; resampling those differences 10,000 times (seeded, so the p-value
|
|
94
|
+
is reproducible) asks how often a different draw of queries would have reversed
|
|
95
|
+
the sign. A drop that is large but not significant is one unlucky query. A drop
|
|
96
|
+
that is significant but tiny is a rounding change nobody should re-baseline for.
|
|
97
|
+
Only a drop that is both is a regression.
|
|
98
|
+
|
|
99
|
+
Accepting a genuine ranking change is `make evals-baseline` — its own commit,
|
|
100
|
+
which says why.
|
|
101
|
+
|
|
102
|
+
## Faithfulness
|
|
103
|
+
|
|
104
|
+
`explain` and `distill` generate prose from a `SKILL.md`; their shared failure
|
|
105
|
+
mode is overclaiming. Faithfulness measures it with the Ragas procedure —
|
|
106
|
+
decompose the answer into atomic statements, verify each against the source,
|
|
107
|
+
score supported/total — implemented directly on boost's `core.ai` bridge so the
|
|
108
|
+
harness stays dependency-free and grades the same prompts the shipped commands
|
|
109
|
+
use.
|
|
110
|
+
|
|
111
|
+
Two numbers are reported per sample, and the gap between them is the point:
|
|
112
|
+
|
|
113
|
+
| column | what it is |
|
|
114
|
+
|---|---|
|
|
115
|
+
| `judged` | the Ragas score over the **raw** model reply |
|
|
116
|
+
| `runtime guard` | what `boost explain` would actually do with that reply |
|
|
117
|
+
|
|
118
|
+
`boost explain` does not print whatever the model returns — `core/faithfulness.py`
|
|
119
|
+
scores it for grounding and falls back to the deterministic extractive summary
|
|
120
|
+
below a config-tunable threshold. Grading only the raw reply would answer a
|
|
121
|
+
question nobody asks: how faithful is text the user may never see. The guard
|
|
122
|
+
column costs no extra API calls (the sample already exists) and the run reports
|
|
123
|
+
how many generations would have been discarded.
|
|
124
|
+
|
|
125
|
+
The denominator is the number of statements **extracted**, never the number of
|
|
126
|
+
verdicts returned. A judge reply is capped at `max_tokens`, so dividing by the
|
|
127
|
+
verdicts would score 3/3 = 1.0 for an answer where 7 of 10 claims went
|
|
128
|
+
unexamined — the metric would read best exactly when the judge coped worst. A
|
|
129
|
+
short verdict list is a failed judging pass, not a score.
|
|
130
|
+
|
|
131
|
+
It **skips, never fails**, when there is no `claude` CLI and no
|
|
132
|
+
`ANTHROPIC_API_KEY`, and reports a status rather than a bare number so that
|
|
133
|
+
"could not measure" is never mistakable for "scored 0.0". Because it needs a
|
|
134
|
+
model it is not part of `make check`; run it via `make evals-online`.
|
|
135
|
+
|
|
136
|
+
`--faithfulness-scorer ragas` cross-checks the stdlib scorer against the
|
|
137
|
+
reference implementation by **delegating to `scripts/eval_explain.py`**, which
|
|
138
|
+
owns the ragas path (`make eval-explain`, plus its own CI workflow). That script
|
|
139
|
+
stays the ragas eval for the pinned real-registry corpus; this module is the
|
|
140
|
+
hermetic, key-free counterpart that also covers `distill`. Delegating rather
|
|
141
|
+
than copying is deliberate — an earlier draft duplicated its judge setup and
|
|
142
|
+
silently dropped its `RunConfig` timeout.
|
|
143
|
+
|
|
144
|
+
## Extending the golden set
|
|
145
|
+
|
|
146
|
+
1. Add a row to `QUERIES` in `make_golden.py` with a fresh id, the query as a
|
|
147
|
+
user would actually type it, and a grade for **every** skill you would accept.
|
|
148
|
+
2. Run `make evals-golden` and commit both files. `make_golden.py --check` runs
|
|
149
|
+
in `lint` and fails if they disagree.
|
|
150
|
+
3. Adding queries invalidates the baseline — run `make evals-baseline` in the
|
|
151
|
+
same change and say so in the commit message.
|
|
152
|
+
|
|
153
|
+
Add corpus items the same way, in `make_corpus.py`'s `SKILLS` table. Resist the
|
|
154
|
+
temptation to reword a query because it scores badly: `q29` ("which alerts are
|
|
155
|
+
worth paging someone for") currently misses entirely, because BM25 does not stem
|
|
156
|
+
and the target skill says *alert*, not *alerts*. That is a real property of the
|
|
157
|
+
shipped ranker, and an eval you tune until it looks good has stopped being one.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""boost's offline LLM evaluation harness (dev/CI only — never imported by the CLI).
|
|
2
|
+
|
|
3
|
+
Run it with `make evals`, not through a `boost` subcommand: this is a quality
|
|
4
|
+
gate in the same family as mutation testing, not user-facing functionality.
|
|
5
|
+
See evals/README.md for the metric definitions and how to extend the golden set.
|
|
6
|
+
"""
|