boost-skill-cli 1.0.304__tar.gz → 1.0.306__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.304/boost_skill_cli.egg-info → boost_skill_cli-1.0.306}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.0.306/docs/roadmap/items/ci-time-is-now-runner-queueing.md +71 -0
- boost_skill_cli-1.0.306/docs/roadmap/items/keyless-item.md +84 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap.html +114 -3
- boost_skill_cli-1.0.306/tests/unit/test_workflow_concurrency.py +112 -0
- boost_skill_cli-1.0.304/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -40
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.gitattributes +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.gitignore +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/.vale.ini +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/LICENSE +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/Makefile +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/README.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/codecov.yml +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/index.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/README.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/examples/README.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/index.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/noxfile.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/setup.cfg +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/README.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/boost.css +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/boost.js +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/style/demo.html +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.304 → boost_skill_cli-1.0.306}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.306'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 306)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -225,6 +225,7 @@ docs/roadmap/items/integrity-verification-boost-verify.md
|
|
|
225
225
|
docs/roadmap/items/internal-architecture-diagrams.md
|
|
226
226
|
docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md
|
|
227
227
|
docs/roadmap/items/journal-rotation-race-and-handle-leak.md
|
|
228
|
+
docs/roadmap/items/keyless-item.md
|
|
228
229
|
docs/roadmap/items/layering-guard-import-linter.md
|
|
229
230
|
docs/roadmap/items/license-compliance-scanning.md
|
|
230
231
|
docs/roadmap/items/lighthouse-ci-on-the-pages-site.md
|
|
@@ -546,6 +547,7 @@ tests/unit/test_typosquat.py
|
|
|
546
547
|
tests/unit/test_updatediff.py
|
|
547
548
|
tests/unit/test_util.py
|
|
548
549
|
tests/unit/test_version.py
|
|
550
|
+
tests/unit/test_workflow_concurrency.py
|
|
549
551
|
tests/unit/test_workflow_timeouts.py
|
|
550
552
|
tests/unit/test_workflows.py
|
|
551
553
|
tests/visual/a11y_check.mjs
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ci-time-is-now-runner-queueing
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: shipped
|
|
6
|
+
category: CI speed
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: 104 job-min queued vs 236 executing — 31% of CI is waiting for a runner
|
|
11
|
+
order: 62
|
|
12
|
+
owner: loop/ci-concurrency
|
|
13
|
+
pr: 350
|
|
14
|
+
title: A third of CI job time is spent waiting for a runner, not running
|
|
15
|
+
---
|
|
16
|
+
With the mutation gate no longer dominating, the largest remaining term in CI wall clock is
|
|
17
|
+
<b>queueing</b>. Measured over six consecutive successful <code>ci</code> runs: <b>104
|
|
18
|
+
job-minutes queued</b> against <b>236 job-minutes executing</b> — <b>31%</b> of all job
|
|
19
|
+
time spent waiting for a runner.
|
|
20
|
+
|
|
21
|
+
<b>The obvious metric lies.</b> A run's <code>run_started_at</code> minus
|
|
22
|
+
<code>created_at</code> is <b>0.0 for every run</b>, which reads as "no queueing anywhere".
|
|
23
|
+
Queueing happens per <em>job</em>, not per run, so it is only visible as
|
|
24
|
+
<code>job.started_at - job.created_at</code>. Anything measuring this at run level will
|
|
25
|
+
conclude, wrongly, that there is nothing to fix.
|
|
26
|
+
|
|
27
|
+
The per-run spread shows what drives it — median job queue by run:
|
|
28
|
+
<code>c36c53a7</code> 0.1 min, <code>c15ed9da</code> 0.1, <code>903b704f</code> 0.2,
|
|
29
|
+
<code>638bffeb</code> 0.7, <code>ad71ba99</code> <b>2.5</b>, <code>9e190537</code> <b>2.9</b>.
|
|
30
|
+
That is a 29× swing driven not by the change under test but by how many sibling
|
|
31
|
+
<code>loop/*</code> branches and Dependabot PRs happen to be live at the same moment. It is why
|
|
32
|
+
one merge took <b>41 minutes</b> wall clock with a max shard of only 11.4.
|
|
33
|
+
|
|
34
|
+
Sharding the mutation gate made this worse on purpose: it traded one runner slot for six. That
|
|
35
|
+
is the right trade for latency in isolation, and the wrong one to keep making blindly while a
|
|
36
|
+
dozen branches are in flight, because every concurrent PR now multiplies its footprint. Options,
|
|
37
|
+
roughly in increasing order of intrusiveness: a <code>concurrency</code> group that cancels
|
|
38
|
+
superseded PR runs; capping the shard matrix with <code>max-parallel</code>; or making the shard
|
|
39
|
+
count adaptive. Worth measuring before choosing — this item is the measurement, not the
|
|
40
|
+
fix.
|
|
41
|
+
|
|
42
|
+
<b>Shipped: the least intrusive one, and it turned out to be a plain omission rather than a
|
|
43
|
+
trade-off.</b> Seven workflows here already declare a <code>concurrency</code> group.
|
|
44
|
+
<code>ci.yml</code> — the largest by a wide margin, ~36 checks including six mutation
|
|
45
|
+
shards — declared none, so every push to a pull request left the whole previous run
|
|
46
|
+
executing against a commit nobody was waiting on. This session alone pushed four times to one PR,
|
|
47
|
+
which is 24 shard jobs of which 18 were already superseded.
|
|
48
|
+
|
|
49
|
+
Two things keep the release path out of it, and the second is easy to miss. The <b>condition</b>:
|
|
50
|
+
<code>cancel-in-progress: true</code> would also cancel a push to main, which
|
|
51
|
+
<code>publish.yml</code> gates the release on via <code>workflow_run</code> — a merge that
|
|
52
|
+
silently never ships — and a <code>merge_group</code> run, where a cancelled run never
|
|
53
|
+
reports its required contexts and the queue then waits forever on a status that is not coming.
|
|
54
|
+
Both evaluate false.
|
|
55
|
+
|
|
56
|
+
The <b>key</b>: non-PR events group on <code>github.sha</code>, not <code>github.ref</code>.
|
|
57
|
+
<code>cancel-in-progress: false</code> does not mean "never cancel" — it means a newer run
|
|
58
|
+
<i>waits</i>, and GitHub cancels the older <em>pending</em> run when a third arrives. Keying main
|
|
59
|
+
on its ref would put every main push in one group, so three quick merges would leave a middle
|
|
60
|
+
commit whose <code>ci</code> never completes, and since <code>publish.yml</code> fires on
|
|
61
|
+
<code>workflow_run</code> of <code>ci</code>, that commit would never release. A sha is unique per
|
|
62
|
+
commit, so main and the merge queue never share a group at all.
|
|
63
|
+
|
|
64
|
+
Both properties are pinned by tests rather than by the comment, and a separate assertion sweeps
|
|
65
|
+
every workflow that triggers on <code>merge_group</code> and fails if any cancels unconditionally
|
|
66
|
+
— so the deadlock cannot arrive later through a different file.
|
|
67
|
+
|
|
68
|
+
What this does <em>not</em> do is reduce the footprint of a single run, which is the other half of
|
|
69
|
+
the measurement. <code>max-parallel</code> on the shard matrix and an adaptive shard count are
|
|
70
|
+
still open, and both trade latency for footprint rather than removing waste — worth
|
|
71
|
+
re-measuring queue time after this lands before spending that trade.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: keyless-semantic-search-for-everyone
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: next
|
|
6
|
+
category: Retrieval · Architecture
|
|
7
|
+
complexity: L
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: the vector store was never the problem — only turning text into vectors needs a key
|
|
11
|
+
order: 0
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: Semantic search is gated behind an API key it does not need
|
|
15
|
+
---
|
|
16
|
+
boost's flagship retrieval is invisible to almost everyone who installs it. <code>boost search "my
|
|
17
|
+
app is slow"</code> on the five default taps returns <code>dnanexus-integration</code>,
|
|
18
|
+
<code>tamarind</code>, <code>cirq</code>, <code>molfeat</code> — bioinformatics and quantum
|
|
19
|
+
computing, nothing about performance. That is BM25 doing exactly what BM25 does when a human types
|
|
20
|
+
like a human, and it is what every keyless user experiences.
|
|
21
|
+
|
|
22
|
+
<b>The vector database was never the problem.</b> Vectors already live on the user's own machine in
|
|
23
|
+
sqlite-vec (<code>~/.boost/cache/rag_vectors.sqlite</code>), refreshed per tap against the commit it
|
|
24
|
+
was built from. Nothing is hosted and nothing needs to be. The <em>only</em> API-bound step is
|
|
25
|
+
turning text into vectors: <code>embed.provider()</code> returns <code>"voyage"</code> with
|
|
26
|
+
<code>VOYAGE_API_KEY</code> set, <code>"openai"</code> with <code>OPENAI_API_KEY</code>, and
|
|
27
|
+
otherwise <code>None</code> — at which point everything degrades to BM25. So the real dilemma
|
|
28
|
+
("every user rebuilds the index, or someone hosts and pays for it") is false in both halves.
|
|
29
|
+
|
|
30
|
+
Six steps, and the first two carry most of the value.
|
|
31
|
+
|
|
32
|
+
<b>1 — A local ONNX provider, as the third link in a chain built for it.</b> Extend
|
|
33
|
+
<code>embed.provider()</code> to Voyage → OpenAI → <b>local</b> → BM25, using ONNX
|
|
34
|
+
Runtime on CPU with a small model (<code>bge-small-en-v1.5</code>, 384-dim, ~30 MB once). The
|
|
35
|
+
sqlite-vec store, the per-tap commit cache and KNN search are all untouched — only the
|
|
36
|
+
text→vector call changes. This removes the key, the signup and the card for <em>every</em>
|
|
37
|
+
user, and Voyage stays a free quality upgrade for anyone who adds one.
|
|
38
|
+
|
|
39
|
+
<b>2 — Prebuild per-registry shards in CI.</b> Embedding the full catalogue (~28k items,
|
|
40
|
+
~150M tokens) on a laptop is an hour-plus, which no one will wait for. A workflow embeds each
|
|
41
|
+
registry and publishes vectors as GitHub Release artifacts keyed on the registry's git commit
|
|
42
|
+
— the cache key the code already uses — so <code>boost tap</code> fetches the catalogue
|
|
43
|
+
<em>and</em> its shard. This is how Homebrew, npm and crates.io index a moving world.
|
|
44
|
+
|
|
45
|
+
<b>3 — Local delta top-up.</b> When a tap runs ahead of its published shard, or is a team or
|
|
46
|
+
private registry CI has never seen, embed just those files on the spot. This is the structural
|
|
47
|
+
answer to an unbounded ecosystem: shards cover the popular registries, the local model makes the
|
|
48
|
+
long tail self-serve, and cost scales with what each user taps rather than with the size of the
|
|
49
|
+
whole ecosystem. Without it, every uncatalogued registry is a dead end for a keyless user.
|
|
50
|
+
|
|
51
|
+
<b>4 — Fuse the two engines with reciprocal rank fusion.</b> Confirmed against the shipped
|
|
52
|
+
code: <code>rag.retrieve_any()</code> picks <em>one</em> engine — dense when it is ready and
|
|
53
|
+
returns a non-empty result, BM25 otherwise. There is no hybrid path today. RRF changes that to "run
|
|
54
|
+
both, fuse by rank": <code>score = 1/(60+rank_bm25) + 1/(60+rank_dense)</code>. Fusing on
|
|
55
|
+
<b>ranks, not scores</b>, is the point — a BM25 score and a cosine similarity are on
|
|
56
|
+
incomparable scales, and rank fusion sidesteps calibration entirely. The two engines fail in
|
|
57
|
+
opposite directions and this corpus needs both: registries are full of exact identifiers
|
|
58
|
+
(<code>EAS</code>, <code>pptx</code>, skill names) where BM25 is strongest and embeddings weakest,
|
|
59
|
+
while sloppy queries are where BM25 returns quantum computing. <code>retrieve_any</code> is the
|
|
60
|
+
single seam every retrieval path already passes through, CLI and MCP alike, so it is one function.
|
|
61
|
+
|
|
62
|
+
The tradeoffs are real and should be measured rather than assumed: rank fusion discards confidence,
|
|
63
|
+
so plain RRF can trail pure dense on purely semantic queries; "why did this rank third?" gains a
|
|
64
|
+
two-part answer; and both engines must index the same chunks (they already share chunking). Ship
|
|
65
|
+
the k=60 default, benchmark it, and tune only if the eval says so.
|
|
66
|
+
|
|
67
|
+
<b>5 — A hosted demo</b> on free tiers, so the experience is reachable without installing
|
|
68
|
+
anything. <b>6 — Publish the eval</b>: BM25 vs local dense vs Voyage dense vs hybrid on the
|
|
69
|
+
existing golden set, with recall@k and MRR. That last one settles step 4 with data instead of
|
|
70
|
+
argument — and if pure dense wins on this corpus, that is the result worth publishing.
|
|
71
|
+
|
|
72
|
+
<b>Scope note.</b> This is an epic, not a single change. Step 1 is the one that removes the wall and
|
|
73
|
+
is worth landing alone; steps 2–3 are what make it fast enough to be real; step 4 is ~20 lines
|
|
74
|
+
in one function and independently shippable; 5 and 6 are separable. Expect this card to decompose
|
|
75
|
+
into per-step items as each is picked up — the value of keeping it whole here is that the
|
|
76
|
+
steps only make sense against each other.
|
|
77
|
+
|
|
78
|
+
Constraints this must respect: the shipped runtime is stdlib-only and
|
|
79
|
+
<code>[project].dependencies</code> is empty, so a local model belongs behind an extra like
|
|
80
|
+
<code>[rag]</code>, with the keyless path degrading to BM25 exactly as it does now. The required
|
|
81
|
+
<code>eval</code> gate already floors BM25 recall@k at 0.85 over the golden set, so step 6 has a
|
|
82
|
+
harness to extend rather than invent. Related:
|
|
83
|
+
[[dense-search-fallback-and-stale-tap-pruning]] and
|
|
84
|
+
[[cache-the-catalog-entry-set-across-rag-queries]].
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
112
112
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
113
113
|
<div class="stat"><b>4</b><span>Planned</span></div>
|
|
114
|
-
<div class="stat"><b>
|
|
114
|
+
<div class="stat"><b>182</b><span>Loop finds</span></div>
|
|
115
115
|
<!-- /ROADMAP:stats -->
|
|
116
116
|
</div>
|
|
117
117
|
</section>
|
|
@@ -598,6 +598,86 @@ message, so routing it through the helper would change user-facing errors.</p>
|
|
|
598
598
|
<div class="rgrid">
|
|
599
599
|
|
|
600
600
|
<!-- ROADMAP:cards section=internals -->
|
|
601
|
+
<article class="cap rcard" id="keyless-semantic-search-for-everyone">
|
|
602
|
+
<div class="head"><span class="pill next">Next</span><span class="cat">Retrieval · Architecture</span></div>
|
|
603
|
+
<h3>Semantic search is gated behind an API key it does not need</h3>
|
|
604
|
+
<p>boost's flagship retrieval is invisible to almost everyone who installs it. <code>boost search "my
|
|
605
|
+
app is slow"</code> on the five default taps returns <code>dnanexus-integration</code>,
|
|
606
|
+
<code>tamarind</code>, <code>cirq</code>, <code>molfeat</code> — bioinformatics and quantum
|
|
607
|
+
computing, nothing about performance. That is BM25 doing exactly what BM25 does when a human types
|
|
608
|
+
like a human, and it is what every keyless user experiences.
|
|
609
|
+
|
|
610
|
+
<b>The vector database was never the problem.</b> Vectors already live on the user's own machine in
|
|
611
|
+
sqlite-vec (<code>~/.boost/cache/rag_vectors.sqlite</code>), refreshed per tap against the commit it
|
|
612
|
+
was built from. Nothing is hosted and nothing needs to be. The <em>only</em> API-bound step is
|
|
613
|
+
turning text into vectors: <code>embed.provider()</code> returns <code>"voyage"</code> with
|
|
614
|
+
<code>VOYAGE_API_KEY</code> set, <code>"openai"</code> with <code>OPENAI_API_KEY</code>, and
|
|
615
|
+
otherwise <code>None</code> — at which point everything degrades to BM25. So the real dilemma
|
|
616
|
+
("every user rebuilds the index, or someone hosts and pays for it") is false in both halves.
|
|
617
|
+
|
|
618
|
+
Six steps, and the first two carry most of the value.
|
|
619
|
+
|
|
620
|
+
<b>1 — A local ONNX provider, as the third link in a chain built for it.</b> Extend
|
|
621
|
+
<code>embed.provider()</code> to Voyage → OpenAI → <b>local</b> → BM25, using ONNX
|
|
622
|
+
Runtime on CPU with a small model (<code>bge-small-en-v1.5</code>, 384-dim, ~30 MB once). The
|
|
623
|
+
sqlite-vec store, the per-tap commit cache and KNN search are all untouched — only the
|
|
624
|
+
text→vector call changes. This removes the key, the signup and the card for <em>every</em>
|
|
625
|
+
user, and Voyage stays a free quality upgrade for anyone who adds one.
|
|
626
|
+
|
|
627
|
+
<b>2 — Prebuild per-registry shards in CI.</b> Embedding the full catalogue (~28k items,
|
|
628
|
+
~150M tokens) on a laptop is an hour-plus, which no one will wait for. A workflow embeds each
|
|
629
|
+
registry and publishes vectors as GitHub Release artifacts keyed on the registry's git commit
|
|
630
|
+
— the cache key the code already uses — so <code>boost tap</code> fetches the catalogue
|
|
631
|
+
<em>and</em> its shard. This is how Homebrew, npm and crates.io index a moving world.
|
|
632
|
+
|
|
633
|
+
<b>3 — Local delta top-up.</b> When a tap runs ahead of its published shard, or is a team or
|
|
634
|
+
private registry CI has never seen, embed just those files on the spot. This is the structural
|
|
635
|
+
answer to an unbounded ecosystem: shards cover the popular registries, the local model makes the
|
|
636
|
+
long tail self-serve, and cost scales with what each user taps rather than with the size of the
|
|
637
|
+
whole ecosystem. Without it, every uncatalogued registry is a dead end for a keyless user.
|
|
638
|
+
|
|
639
|
+
<b>4 — Fuse the two engines with reciprocal rank fusion.</b> Confirmed against the shipped
|
|
640
|
+
code: <code>rag.retrieve_any()</code> picks <em>one</em> engine — dense when it is ready and
|
|
641
|
+
returns a non-empty result, BM25 otherwise. There is no hybrid path today. RRF changes that to "run
|
|
642
|
+
both, fuse by rank": <code>score = 1/(60+rank_bm25) + 1/(60+rank_dense)</code>. Fusing on
|
|
643
|
+
<b>ranks, not scores</b>, is the point — a BM25 score and a cosine similarity are on
|
|
644
|
+
incomparable scales, and rank fusion sidesteps calibration entirely. The two engines fail in
|
|
645
|
+
opposite directions and this corpus needs both: registries are full of exact identifiers
|
|
646
|
+
(<code>EAS</code>, <code>pptx</code>, skill names) where BM25 is strongest and embeddings weakest,
|
|
647
|
+
while sloppy queries are where BM25 returns quantum computing. <code>retrieve_any</code> is the
|
|
648
|
+
single seam every retrieval path already passes through, CLI and MCP alike, so it is one function.
|
|
649
|
+
|
|
650
|
+
The tradeoffs are real and should be measured rather than assumed: rank fusion discards confidence,
|
|
651
|
+
so plain RRF can trail pure dense on purely semantic queries; "why did this rank third?" gains a
|
|
652
|
+
two-part answer; and both engines must index the same chunks (they already share chunking). Ship
|
|
653
|
+
the k=60 default, benchmark it, and tune only if the eval says so.
|
|
654
|
+
|
|
655
|
+
<b>5 — A hosted demo</b> on free tiers, so the experience is reachable without installing
|
|
656
|
+
anything. <b>6 — Publish the eval</b>: BM25 vs local dense vs Voyage dense vs hybrid on the
|
|
657
|
+
existing golden set, with recall@k and MRR. That last one settles step 4 with data instead of
|
|
658
|
+
argument — and if pure dense wins on this corpus, that is the result worth publishing.
|
|
659
|
+
|
|
660
|
+
<b>Scope note.</b> This is an epic, not a single change. Step 1 is the one that removes the wall and
|
|
661
|
+
is worth landing alone; steps 2–3 are what make it fast enough to be real; step 4 is ~20 lines
|
|
662
|
+
in one function and independently shippable; 5 and 6 are separable. Expect this card to decompose
|
|
663
|
+
into per-step items as each is picked up — the value of keeping it whole here is that the
|
|
664
|
+
steps only make sense against each other.
|
|
665
|
+
|
|
666
|
+
Constraints this must respect: the shipped runtime is stdlib-only and
|
|
667
|
+
<code>[project].dependencies</code> is empty, so a local model belongs behind an extra like
|
|
668
|
+
<code>[rag]</code>, with the keyless path degrading to BM25 exactly as it does now. The required
|
|
669
|
+
<code>eval</code> gate already floors BM25 recall@k at 0.85 over the golden set, so step 6 has a
|
|
670
|
+
harness to extend rather than invent. Related:
|
|
671
|
+
[[dense-search-fallback-and-stale-tap-pruning]] and
|
|
672
|
+
[[cache-the-catalog-entry-set-across-rag-queries]].</p>
|
|
673
|
+
<div class="meta">
|
|
674
|
+
<span class="m">Complexity <b>L</b></span>
|
|
675
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
676
|
+
<span class="m">Wow <b class="wow">★★★★★</b></span>
|
|
677
|
+
<span class="m">the vector store was never the problem — only turning text into vectors needs a key</span>
|
|
678
|
+
</div>
|
|
679
|
+
</article>
|
|
680
|
+
|
|
601
681
|
<article class="cap rcard" id="memoize-config-load-in-process">
|
|
602
682
|
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Performance</span></div>
|
|
603
683
|
<h3>Memoize <code>config.load()</code> in-process</h3>
|
|
@@ -2623,7 +2703,7 @@ missing file is now imputed at the measured mean rate, which keeps every weight
|
|
|
2623
2703
|
</article>
|
|
2624
2704
|
|
|
2625
2705
|
<article class="cap rcard" id="ci-time-is-now-runner-queueing">
|
|
2626
|
-
<div class="head"><span class="pill
|
|
2706
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI speed</span></div>
|
|
2627
2707
|
<h3>A third of CI job time is spent waiting for a runner, not running</h3>
|
|
2628
2708
|
<p>With the mutation gate no longer dominating, the largest remaining term in CI wall clock is
|
|
2629
2709
|
<b>queueing</b>. Measured over six consecutive successful <code>ci</code> runs: <b>104
|
|
@@ -2649,7 +2729,38 @@ dozen branches are in flight, because every concurrent PR now multiplies its foo
|
|
|
2649
2729
|
roughly in increasing order of intrusiveness: a <code>concurrency</code> group that cancels
|
|
2650
2730
|
superseded PR runs; capping the shard matrix with <code>max-parallel</code>; or making the shard
|
|
2651
2731
|
count adaptive. Worth measuring before choosing — this item is the measurement, not the
|
|
2652
|
-
fix
|
|
2732
|
+
fix.
|
|
2733
|
+
|
|
2734
|
+
<b>Shipped: the least intrusive one, and it turned out to be a plain omission rather than a
|
|
2735
|
+
trade-off.</b> Seven workflows here already declare a <code>concurrency</code> group.
|
|
2736
|
+
<code>ci.yml</code> — the largest by a wide margin, ~36 checks including six mutation
|
|
2737
|
+
shards — declared none, so every push to a pull request left the whole previous run
|
|
2738
|
+
executing against a commit nobody was waiting on. This session alone pushed four times to one PR,
|
|
2739
|
+
which is 24 shard jobs of which 18 were already superseded.
|
|
2740
|
+
|
|
2741
|
+
Two things keep the release path out of it, and the second is easy to miss. The <b>condition</b>:
|
|
2742
|
+
<code>cancel-in-progress: true</code> would also cancel a push to main, which
|
|
2743
|
+
<code>publish.yml</code> gates the release on via <code>workflow_run</code> — a merge that
|
|
2744
|
+
silently never ships — and a <code>merge_group</code> run, where a cancelled run never
|
|
2745
|
+
reports its required contexts and the queue then waits forever on a status that is not coming.
|
|
2746
|
+
Both evaluate false.
|
|
2747
|
+
|
|
2748
|
+
The <b>key</b>: non-PR events group on <code>github.sha</code>, not <code>github.ref</code>.
|
|
2749
|
+
<code>cancel-in-progress: false</code> does not mean "never cancel" — it means a newer run
|
|
2750
|
+
<i>waits</i>, and GitHub cancels the older <em>pending</em> run when a third arrives. Keying main
|
|
2751
|
+
on its ref would put every main push in one group, so three quick merges would leave a middle
|
|
2752
|
+
commit whose <code>ci</code> never completes, and since <code>publish.yml</code> fires on
|
|
2753
|
+
<code>workflow_run</code> of <code>ci</code>, that commit would never release. A sha is unique per
|
|
2754
|
+
commit, so main and the merge queue never share a group at all.
|
|
2755
|
+
|
|
2756
|
+
Both properties are pinned by tests rather than by the comment, and a separate assertion sweeps
|
|
2757
|
+
every workflow that triggers on <code>merge_group</code> and fails if any cancels unconditionally
|
|
2758
|
+
— so the deadlock cannot arrive later through a different file.
|
|
2759
|
+
|
|
2760
|
+
What this does <em>not</em> do is reduce the footprint of a single run, which is the other half of
|
|
2761
|
+
the measurement. <code>max-parallel</code> on the shard matrix and an adaptive shard count are
|
|
2762
|
+
still open, and both trade latency for footprint rather than removing waste — worth
|
|
2763
|
+
re-measuring queue time after this lands before spending that trade.</p>
|
|
2653
2764
|
<div class="meta">
|
|
2654
2765
|
<span class="m">Complexity <b>M</b></span>
|
|
2655
2766
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Unit tests: superseded PR runs are cancelled, releases never are.
|
|
2
|
+
|
|
3
|
+
Measured over six consecutive successful ``ci`` runs, **31%** of all job time
|
|
4
|
+
was spent queueing rather than executing (104 job-minutes against 236). The
|
|
5
|
+
median per-job queue swung 29x between runs — 0.1 min when the repo was quiet,
|
|
6
|
+
2.9 min when a dozen ``loop/*`` branches and Dependabot PRs were live — so the
|
|
7
|
+
cost is driven by concurrent footprint, not by the change under test. Sharding
|
|
8
|
+
the mutation gate traded one runner slot for six and made that worse on purpose.
|
|
9
|
+
|
|
10
|
+
``ci.yml`` is the largest workflow in the repo by a wide margin, and it was the
|
|
11
|
+
only one with no ``concurrency`` group at all: every push to a pull request left
|
|
12
|
+
the previous run's ~36 checks (six of them mutation shards) running to
|
|
13
|
+
completion against nothing.
|
|
14
|
+
|
|
15
|
+
The dangerous half of the fix is the half these tests pin. Cancelling a
|
|
16
|
+
**pull_request** run that a newer push superseded costs nothing. Cancelling a
|
|
17
|
+
**push to main** would abandon the run ``publish.yml`` gates the release on, and
|
|
18
|
+
cancelling a **merge_group** run would leave a required check permanently
|
|
19
|
+
unreported and deadlock the queue — the exact failure mode ci.yml's own comments
|
|
20
|
+
describe. So cancellation must be conditional on the event, and that condition
|
|
21
|
+
is what a future edit is most likely to get wrong.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import re
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
import pytest
|
|
29
|
+
|
|
30
|
+
WORKFLOWS = Path(__file__).resolve().parents[2] / ".github" / "workflows"
|
|
31
|
+
CI = WORKFLOWS / "ci.yml"
|
|
32
|
+
|
|
33
|
+
pytestmark = pytest.mark.skipif(
|
|
34
|
+
not CI.exists(),
|
|
35
|
+
reason=".github/workflows not reachable (e.g. mutation sandbox)")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def concurrency_block(path: Path) -> str:
|
|
39
|
+
"""The top-level ``concurrency:`` mapping of a workflow, or ''.
|
|
40
|
+
|
|
41
|
+
Top-level only: a job-level block is indented and must not be mistaken for
|
|
42
|
+
the workflow's own policy.
|
|
43
|
+
"""
|
|
44
|
+
text = path.read_text(encoding="utf-8")
|
|
45
|
+
m = re.search(r"^concurrency:\s*$\n((?:^[ \t]+\S.*\n|^\s*#.*\n)*)", text, re.M)
|
|
46
|
+
return m.group(1) if m else ""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TestCiCancelsSupersededRuns:
|
|
50
|
+
def test_ci_declares_a_concurrency_group(self):
|
|
51
|
+
assert concurrency_block(CI), \
|
|
52
|
+
"ci.yml is the biggest workflow here; without a concurrency group " \
|
|
53
|
+
"every superseded push keeps ~36 checks running against nothing"
|
|
54
|
+
|
|
55
|
+
def test_the_group_is_per_pull_request(self):
|
|
56
|
+
# Keyed on the PR number so two PRs never cancel each other.
|
|
57
|
+
assert "github.event.pull_request.number" in concurrency_block(CI)
|
|
58
|
+
|
|
59
|
+
def test_non_pr_events_group_on_the_commit_not_the_ref(self):
|
|
60
|
+
# THE SUBTLE ONE. `cancel-in-progress: false` does not mean "never
|
|
61
|
+
# cancel" — it means a newer run waits, and GitHub cancels the older
|
|
62
|
+
# *pending* run when a third arrives. Keying main on `github.ref` puts
|
|
63
|
+
# every main push in one group, so three quick merges would leave a
|
|
64
|
+
# middle commit whose ci never completes; publish.yml fires on
|
|
65
|
+
# `workflow_run` of ci, so that commit would never release. A sha is
|
|
66
|
+
# unique per commit, so main and the merge queue never share a group.
|
|
67
|
+
block = concurrency_block(CI)
|
|
68
|
+
assert "github.sha" in block, block
|
|
69
|
+
assert "github.ref" not in block, \
|
|
70
|
+
"grouping non-PR runs on the ref can strand a main commit unreleased"
|
|
71
|
+
|
|
72
|
+
def test_cancellation_is_conditional_not_unconditional(self):
|
|
73
|
+
# `cancel-in-progress: true` would cancel main and merge_group runs too.
|
|
74
|
+
block = concurrency_block(CI)
|
|
75
|
+
m = re.search(r"cancel-in-progress:\s*(.+)", block)
|
|
76
|
+
assert m, "no cancel-in-progress in %r" % block
|
|
77
|
+
value = m.group(1).strip()
|
|
78
|
+
assert value not in ("true", "'true'", '"true"'), \
|
|
79
|
+
"unconditional cancel would abandon the run publish.yml gates on"
|
|
80
|
+
assert "pull_request" in value, value
|
|
81
|
+
|
|
82
|
+
def test_only_pull_request_events_are_cancelled(self):
|
|
83
|
+
# The whole safety property in one assertion: the guard names
|
|
84
|
+
# pull_request, so push-to-main and merge_group evaluate false.
|
|
85
|
+
value = re.search(r"cancel-in-progress:\s*(.+)",
|
|
86
|
+
concurrency_block(CI)).group(1)
|
|
87
|
+
assert "github.event_name == 'pull_request'" in value, value
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class TestReleasePathIsNeverCancelled:
|
|
91
|
+
def test_publish_does_not_cancel_in_progress(self):
|
|
92
|
+
# Every merge to main cuts a PyPI release; cancelling a release run
|
|
93
|
+
# mid-upload is how you get a tagged version that never shipped.
|
|
94
|
+
block = concurrency_block(WORKFLOWS / "publish.yml")
|
|
95
|
+
assert "cancel-in-progress: false" in block, block
|
|
96
|
+
|
|
97
|
+
def test_no_workflow_cancels_a_merge_group_run(self):
|
|
98
|
+
# A required context whose run is cancelled never reports, and the
|
|
99
|
+
# merge queue waits on it forever. Any workflow that both triggers on
|
|
100
|
+
# merge_group and cancels unconditionally is that deadlock waiting to
|
|
101
|
+
# happen.
|
|
102
|
+
offenders = []
|
|
103
|
+
for path in sorted(WORKFLOWS.glob("*.yml")):
|
|
104
|
+
text = path.read_text(encoding="utf-8")
|
|
105
|
+
if not re.search(r"^\s*merge_group:", text, re.M):
|
|
106
|
+
continue
|
|
107
|
+
block = concurrency_block(path)
|
|
108
|
+
if re.search(r"cancel-in-progress:\s*true\s*$", block, re.M):
|
|
109
|
+
offenders.append(path.name)
|
|
110
|
+
assert not offenders, \
|
|
111
|
+
"these cancel merge_group runs and would deadlock the queue: %s" \
|
|
112
|
+
% ", ".join(offenders)
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: ci-time-is-now-runner-queueing
|
|
3
|
-
board: code
|
|
4
|
-
section: pipeline
|
|
5
|
-
status: planned
|
|
6
|
-
category: CI speed
|
|
7
|
-
complexity: M
|
|
8
|
-
impact: High
|
|
9
|
-
wow: 4
|
|
10
|
-
note: 104 job-min queued vs 236 executing — 31% of CI is waiting for a runner
|
|
11
|
-
order: 62
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
14
|
-
title: A third of CI job time is spent waiting for a runner, not running
|
|
15
|
-
---
|
|
16
|
-
With the mutation gate no longer dominating, the largest remaining term in CI wall clock is
|
|
17
|
-
<b>queueing</b>. Measured over six consecutive successful <code>ci</code> runs: <b>104
|
|
18
|
-
job-minutes queued</b> against <b>236 job-minutes executing</b> — <b>31%</b> of all job
|
|
19
|
-
time spent waiting for a runner.
|
|
20
|
-
|
|
21
|
-
<b>The obvious metric lies.</b> A run's <code>run_started_at</code> minus
|
|
22
|
-
<code>created_at</code> is <b>0.0 for every run</b>, which reads as "no queueing anywhere".
|
|
23
|
-
Queueing happens per <em>job</em>, not per run, so it is only visible as
|
|
24
|
-
<code>job.started_at - job.created_at</code>. Anything measuring this at run level will
|
|
25
|
-
conclude, wrongly, that there is nothing to fix.
|
|
26
|
-
|
|
27
|
-
The per-run spread shows what drives it — median job queue by run:
|
|
28
|
-
<code>c36c53a7</code> 0.1 min, <code>c15ed9da</code> 0.1, <code>903b704f</code> 0.2,
|
|
29
|
-
<code>638bffeb</code> 0.7, <code>ad71ba99</code> <b>2.5</b>, <code>9e190537</code> <b>2.9</b>.
|
|
30
|
-
That is a 29× swing driven not by the change under test but by how many sibling
|
|
31
|
-
<code>loop/*</code> branches and Dependabot PRs happen to be live at the same moment. It is why
|
|
32
|
-
one merge took <b>41 minutes</b> wall clock with a max shard of only 11.4.
|
|
33
|
-
|
|
34
|
-
Sharding the mutation gate made this worse on purpose: it traded one runner slot for six. That
|
|
35
|
-
is the right trade for latency in isolation, and the wrong one to keep making blindly while a
|
|
36
|
-
dozen branches are in flight, because every concurrent PR now multiplies its footprint. Options,
|
|
37
|
-
roughly in increasing order of intrusiveness: a <code>concurrency</code> group that cancels
|
|
38
|
-
superseded PR runs; capping the shard matrix with <code>max-parallel</code>; or making the shard
|
|
39
|
-
count adaptive. Worth measuring before choosing — this item is the measurement, not the
|
|
40
|
-
fix.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|