boost-skill-cli 1.0.275__tar.gz → 1.0.276__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.275/boost_skill_cli.egg-info → boost_skill_cli-1.0.276}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
- boost_skill_cli-1.0.276/docs/roadmap/items/demo-cannot-open-its-own-pr.md +56 -0
- boost_skill_cli-1.0.276/docs/roadmap/items/make-lint-masks-actionlint-failures.md +50 -0
- boost_skill_cli-1.0.276/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +47 -0
- boost_skill_cli-1.0.276/docs/roadmap/items/release-verifies-the-wrong-commit.md +57 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap.html +195 -1
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.gitattributes +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.gitignore +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/.vale.ini +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/LICENSE +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/Makefile +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/README.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/codecov.yml +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/index.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/examples/README.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/index.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/noxfile.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/setup.cfg +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/style/README.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/style/boost.css +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/style/boost.js +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/style/demo.html +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.275 → boost_skill_cli-1.0.276}/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.276'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 276)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -181,6 +181,7 @@ docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md
|
|
|
181
181
|
docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md
|
|
182
182
|
docs/roadmap/items/crash-listing-branch-untested.md
|
|
183
183
|
docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md
|
|
184
|
+
docs/roadmap/items/demo-cannot-open-its-own-pr.md
|
|
184
185
|
docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md
|
|
185
186
|
docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md
|
|
186
187
|
docs/roadmap/items/dependabot-missing-pip-ecosystem.md
|
|
@@ -225,6 +226,7 @@ docs/roadmap/items/log-timestamps-mislabeled-utc.md
|
|
|
225
226
|
docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md
|
|
226
227
|
docs/roadmap/items/main-has-no-branch-protection.md
|
|
227
228
|
docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md
|
|
229
|
+
docs/roadmap/items/make-lint-masks-actionlint-failures.md
|
|
228
230
|
docs/roadmap/items/make-the-roadmaps-discoverable.md
|
|
229
231
|
docs/roadmap/items/markdown-consistency-markdownlint-cli2.md
|
|
230
232
|
docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md
|
|
@@ -236,6 +238,7 @@ docs/roadmap/items/mcp-search-before-reinventing.md
|
|
|
236
238
|
docs/roadmap/items/mcp-startup-self-harden-fork-safety.md
|
|
237
239
|
docs/roadmap/items/memoize-config-load-in-process.md
|
|
238
240
|
docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md
|
|
241
|
+
docs/roadmap/items/merged-loop-branches-are-never-pruned.md
|
|
239
242
|
docs/roadmap/items/modernization-smells-refurb-pyupgrade.md
|
|
240
243
|
docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md
|
|
241
244
|
docs/roadmap/items/mutation-hardening-core-frontmatter-py.md
|
|
@@ -270,6 +273,7 @@ docs/roadmap/items/ranx-significance-monitor.md
|
|
|
270
273
|
docs/roadmap/items/reconcile-the-theme-drift.md
|
|
271
274
|
docs/roadmap/items/refresh-the-marketing-surface.md
|
|
272
275
|
docs/roadmap/items/rel-time-tests-race-the-wall-clock.md
|
|
276
|
+
docs/roadmap/items/release-verifies-the-wrong-commit.md
|
|
273
277
|
docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md
|
|
274
278
|
docs/roadmap/items/required-checks-config-drift.md
|
|
275
279
|
docs/roadmap/items/retrieval-quality-eval-harness.md
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: demo-cannot-open-its-own-pr
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: planned
|
|
6
|
+
category: CI reporting
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: a repo setting blocks it — no edit to demo.yml can fix this one
|
|
11
|
+
order: 65
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>demo.yml</code> still fails on every push — and the fix is not in the workflow
|
|
15
|
+
---
|
|
16
|
+
<code>demo-gif-workflow-has-never-succeeded</code> (shipped, PR 294) fixed the recorder:
|
|
17
|
+
<code>charmbracelet/vhs-action</code>'s broken ffmpeg installer was replaced with apt plus
|
|
18
|
+
ttyd/vhs pinned by release-asset id. That worked. The recording step now succeeds on both event
|
|
19
|
+
paths. <b>The workflow still fails on every push to <code>main</code></b> — observed
|
|
20
|
+
2026-07-28 at 20:56, 20:04 and 09:27, and it is the only failing workflow in the last 60 runs.
|
|
21
|
+
|
|
22
|
+
The failure moved one step later, to <code>open a PR if the recording changed</code>. The run
|
|
23
|
+
annotation gives it verbatim:
|
|
24
|
+
|
|
25
|
+
<code>GitHub Actions is not permitted to create or approve pull requests.</code>
|
|
26
|
+
|
|
27
|
+
<b>Nothing in <code>demo.yml</code> is wrong, so nothing in <code>demo.yml</code> will fix it.</b>
|
|
28
|
+
The job already declares <code>contents: write</code> and <code>pull-requests: write</code>,
|
|
29
|
+
which is exactly what <code>peter-evans/create-pull-request</code> documents as required. The
|
|
30
|
+
workflow uses no secrets. <code>persist-credentials: false</code> on the checkout is correct and
|
|
31
|
+
is the repo-wide convention across all 31 checkout steps — the action supplies its own git
|
|
32
|
+
auth and explicitly unsets any persisted credential. Every one of those is a plausible-looking
|
|
33
|
+
false lead. The actual blocker is a <b>repository setting</b>: Actions → General
|
|
34
|
+
→ Workflow permissions → "Allow GitHub Actions to create and
|
|
35
|
+
approve pull requests", which the API reports as
|
|
36
|
+
<code>can_approve_pull_request_reviews: false</code>. This is the same shape as
|
|
37
|
+
<code>sbom.yml</code>: a workflow that is correct in the file and inert in reality.
|
|
38
|
+
|
|
39
|
+
Deciding it is a real decision, not a formality. Turning that toggle on grants <em>every</em>
|
|
40
|
+
workflow in the repo the ability to open pull requests, which is a genuine widening of what a
|
|
41
|
+
compromised action can do. The alternative is to accept that this step cannot work and change
|
|
42
|
+
what the push path does — upload the GIF as an artifact on both paths, as the pull-request
|
|
43
|
+
path already does, and drop the PR-opening step.
|
|
44
|
+
|
|
45
|
+
<b>A second, independent defect in the same file.</b> Its concurrency group is
|
|
46
|
+
<code>group: demo</code>, not ref-scoped. Every other per-ref workflow scopes it —
|
|
47
|
+
<code>sonarcloud-${{ github.ref }}</code>, <code>fuzz-${{ github.ref }}</code>,
|
|
48
|
+
<code>eval-stats-${{ github.ref }}</code>, <code>eval-explain-${{ github.ref }}</code>; only the
|
|
49
|
+
deliberately-singleton <code>release</code> and <code>post-deploy</code> are global. With
|
|
50
|
+
<code>cancel-in-progress: true</code>, a pull-request run and a <code>main</code> run therefore
|
|
51
|
+
cancel each other, which is where demo's <code>cancelled</code> runs come from. Fix is
|
|
52
|
+
<code>group: demo-${{ github.ref }}</code> regardless of what is decided about the toggle.
|
|
53
|
+
|
|
54
|
+
Worth reconciling while here: the tree disagrees with itself on the history.
|
|
55
|
+
<code>demo-gif-workflow-has-never-succeeded</code> says "3 runs, 3 failures", while
|
|
56
|
+
<code>demo.yml</code> and <code>ci-failure-issue.yml</code> both say six of six.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: make-lint-masks-actionlint-failures
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: planned
|
|
6
|
+
category: Testing · Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: a failing actionlint prints "not on PATH" and make exits 0
|
|
11
|
+
order: 60
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>make lint</code> reports success when <code>actionlint</code> fails — and says it wasn't installed
|
|
15
|
+
---
|
|
16
|
+
<code>Makefile:64</code> guards the workflow linter like this:
|
|
17
|
+
|
|
18
|
+
<code>@command -v actionlint >/dev/null 2>&1 && actionlint || echo "actionlint not on PATH — skipping (CI enforces it)"</code>
|
|
19
|
+
|
|
20
|
+
Because <code>||</code> binds to the whole <code>&&</code> chain, the fallback fires in
|
|
21
|
+
<b>both</b> failure modes — actionlint absent, <em>and</em> actionlint present and reporting
|
|
22
|
+
findings. Reproduced with a stub that exits 1:
|
|
23
|
+
|
|
24
|
+
<code>actionlint: FAKE ERROR</code><br>
|
|
25
|
+
<code>actionlint not on PATH — skipping (CI enforces it)</code><br>
|
|
26
|
+
<code>make exit=0</code>
|
|
27
|
+
|
|
28
|
+
So a real workflow-lint failure is swallowed, and the message asserts something false — that
|
|
29
|
+
the tool is not installed, when it is installed and just failed. <b><code>make lint</code> and
|
|
30
|
+
therefore <code>make check</code> can never fail on actionlint.</b> CLAUDE.md calls
|
|
31
|
+
<code>make check</code> "the one gate that matters" and tells every agent to run it before calling
|
|
32
|
+
a change done; for this tool it returns green unconditionally, and the developer who reads the
|
|
33
|
+
output is told the opposite of what happened.
|
|
34
|
+
|
|
35
|
+
The local-versus-CI gap is wider than this one line. CI's required <code>lint</code> job runs
|
|
36
|
+
three workflow/security tools that <code>make lint</code> has no equivalent for at all:
|
|
37
|
+
<b>actionlint</b> (present but unfailable), <b>zizmor</b> and <b>gitleaks</b> (absent from the
|
|
38
|
+
Makefile entirely). No CI job invokes <code>make lint</code>, so the two lists are hand-maintained
|
|
39
|
+
duplicates with nothing checking they agree — which is how they drifted.
|
|
40
|
+
|
|
41
|
+
Minimal fix is to stop discarding the exit status:
|
|
42
|
+
|
|
43
|
+
<code>@if command -v actionlint >/dev/null 2>&1; then actionlint; else echo "actionlint not on PATH — skipping (CI enforces it)"; fi</code>
|
|
44
|
+
|
|
45
|
+
The stricter option is to install actionlint in <code>make venv</code> and let absence itself
|
|
46
|
+
fail, so <code>make check</code> cannot report success while skipping a required gate. The same
|
|
47
|
+
masking idiom appears at <code>Makefile:143</code> (hyperfine) and <code>Makefile:167</code>
|
|
48
|
+
(node); neither is reached by <code>check</code>, so they are cosmetic by comparison, but they are
|
|
49
|
+
the same bug. Incidental drift found alongside: <code>CLAUDE.md</code> describes the lint recipe
|
|
50
|
+
as "18 commands" and it is 19.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: merged-loop-branches-are-never-pruned
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: planned
|
|
6
|
+
category: Hygiene · DX
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Low
|
|
9
|
+
wow: 2
|
|
10
|
+
note: 68 of 70 loop/* branches have a merged PR; one setting fixes it
|
|
11
|
+
order: 66
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: 68 of the repo's 77 branches are merged <code>loop/*</code> branches nobody deletes
|
|
15
|
+
---
|
|
16
|
+
The repository carries <b>77 branches, 70 of them <code>loop/*</code></b>. Classifying each by the
|
|
17
|
+
state of its pull request: <b>68 have a merged PR</b> and are safe to delete, <b>1</b> has an open
|
|
18
|
+
PR (<code>loop/dependabot-findings</code>), and 1 has no PR on record. The default branch list is
|
|
19
|
+
almost entirely finished work.
|
|
20
|
+
|
|
21
|
+
<b>The obvious measurement is wrong here, which is worth recording.</b> Testing "is it merged?"
|
|
22
|
+
with <code>compare(main...branch).ahead_by == 0</code> reports <b>0 of 70</b> as merged —
|
|
23
|
+
because this repo squash-merges, and a squash leaves the branch's original commits outside
|
|
24
|
+
<code>main</code>'s history forever. Every merged branch looks permanently ahead. The state has to
|
|
25
|
+
come from the pull request, not from commit reachability.
|
|
26
|
+
|
|
27
|
+
The cause is a single repository setting: <code>delete_branch_on_merge</code> is <b>false</b>, so
|
|
28
|
+
nothing removes a head branch when its PR merges. No workflow prunes them either — none of
|
|
29
|
+
the 25 workflow files triggers on <code>create</code>/<code>delete</code> or touches
|
|
30
|
+
<code>loop/*</code>, and no <code>scripts/</code> entry or Makefile target does branch cleanup.
|
|
31
|
+
The one branch-deletion automation in the tree is <code>demo.yml</code>'s
|
|
32
|
+
<code>delete-branch: true</code>, which is <code>create-pull-request</code> tidying its own
|
|
33
|
+
<code>bot/demo-gif</code> branch and has nothing to do with <code>loop/*</code>. No documentation
|
|
34
|
+
asks anyone to clean up either: <code>CONTRIBUTING.md</code>, <code>CLAUDE.md</code> and
|
|
35
|
+
<code>.claude/commands/roadmap-loop.md</code> all describe branching and squash-merging, and none
|
|
36
|
+
of the three mentions deleting the branch afterwards.
|
|
37
|
+
|
|
38
|
+
<b>Not a claim that branches are never deleted.</b> The item files name <b>144 distinct</b>
|
|
39
|
+
<code>owner: loop/<topic></code> values against 70 surviving branches, so roughly 98 have
|
|
40
|
+
gone at some point — by hand, or by topic reuse. The accurate statement is narrower:
|
|
41
|
+
nothing in the repo <em>causes</em> cleanup, so merged branches accumulate until someone does it
|
|
42
|
+
manually.
|
|
43
|
+
|
|
44
|
+
Low impact and near-zero risk to fix — flip <code>delete_branch_on_merge</code> to true and
|
|
45
|
+
the backlog can be pruned by listing merged PR head refs. The reason it is worth doing at all is
|
|
46
|
+
that CLAUDE.md tells every agent to run <code>git worktree list</code> and inspect branch state
|
|
47
|
+
before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: release-verifies-the-wrong-commit
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: planned
|
|
6
|
+
category: Release safety
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: 2 of 18 required contexts are re-checked against the sha actually shipped
|
|
11
|
+
order: 64
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: The release verifies one commit and ships another
|
|
15
|
+
---
|
|
16
|
+
<code>publish.yml</code> fires on <code>workflow_run</code> when <code>ci</code> completes, gates
|
|
17
|
+
on that run's <code>conclusion == 'success'</code> (plus <code>event == 'push'</code> and
|
|
18
|
+
<code>head_repository == this repo</code>), and then checks out <code>ref: main</code>. Those are
|
|
19
|
+
not the same commit. <b>Observed 2026-07-28:</b> <code>ci</code> for <code>ecfe38bc</code>
|
|
20
|
+
completed at 20:19:05Z; the release run was created at 20:19:07Z; it tagged and shipped
|
|
21
|
+
<code>c1727bac</code> as <b>v1.0.271</b> — while <code>c1727bac</code>'s own
|
|
22
|
+
<code>ci</code>, started 20:18:40Z, was still <code>in_progress</code>. One commit's green
|
|
23
|
+
verdict authorised a different commit's release.
|
|
24
|
+
|
|
25
|
+
<b>Most of this is already mitigated, and the card should not be read as "untested code ships".</b>
|
|
26
|
+
A strict "require branches to be up to date" policy means the shipped commit was green as a pull
|
|
27
|
+
request before it could merge, so its <em>tree</em> was gated. And
|
|
28
|
+
<code>release_preflight.py</code> is already pointed at the right commit —
|
|
29
|
+
<code>--sha "$(git rev-parse HEAD)"</code>, with an explicit comment that this is "not the trigger
|
|
30
|
+
sha". It polls each required workflow for that exact sha and fails closed on red, cancelled,
|
|
31
|
+
skipped, never-ran or still-running-at-deadline. The machinery is correct.
|
|
32
|
+
|
|
33
|
+
<b>Its coverage is the gap.</b> <code>.github/required-checks.txt</code> lists <b>18</b> required
|
|
34
|
+
contexts. <code>publish.yml</code> passes preflight exactly two of them —
|
|
35
|
+
<code>--require pip-audit.yml</code> and <code>--require package-metadata.yml</code>. The other
|
|
36
|
+
<b>16 are never re-checked against the commit being shipped</b>, including all 14 that come from
|
|
37
|
+
<code>ci.yml</code> and <code>codeql-analyze</code>. The clearest evidence this is an oversight
|
|
38
|
+
rather than a decision is in-tree: <code>release_preflight.py</code>'s own docstring says it waits
|
|
39
|
+
for <em>every</em> required workflow for the exact commit being released, and the caller hands it
|
|
40
|
+
two.
|
|
41
|
+
|
|
42
|
+
<b>A required context that can never report on <code>main</code> at all.</b> While checking the
|
|
43
|
+
other 16: <code>osv-scanner.yml</code> declares only <code>pull_request</code> and
|
|
44
|
+
<code>merge_group</code> triggers — no <code>push</code>. So <code>scan-pr / osv-scan</code>
|
|
45
|
+
is green as a PR gate and produces <em>nothing</em> for any commit on <code>main</code>, race or
|
|
46
|
+
no race. Adding it to preflight without first giving that workflow a
|
|
47
|
+
<code>push: branches: [main]</code> trigger would fail the release closed every time.
|
|
48
|
+
|
|
49
|
+
The fix is not to change the checkout ref. Pinning to
|
|
50
|
+
<code>github.event.workflow_run.head_sha</code> would build the older commit while release-drafter
|
|
51
|
+
still tags the default branch's head — artifact and tag would disagree. The lower-risk
|
|
52
|
+
change is to widen preflight's <code>--require</code> set to the contexts that actually run on
|
|
53
|
+
<code>main</code>, and optionally fail the job when <code>git rev-parse HEAD</code> differs from
|
|
54
|
+
the triggering run's <code>head_sha</code>. This is the third defect found in the same few lines
|
|
55
|
+
— see <code>publish-trigger-was-reachable-from-a-fork</code> (who can fire it) and
|
|
56
|
+
<code>publish-gate-ignores-pip-audit-and-metadata</code> (which gates are consulted); this one is
|
|
57
|
+
<em>which commit</em> they were consulted about.
|
|
@@ -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>171</b><span>Loop finds</span></div>
|
|
114
114
|
<!-- /ROADMAP:stats -->
|
|
115
115
|
</div>
|
|
116
116
|
</section>
|
|
@@ -2475,6 +2475,154 @@ was found by accident, while installing zizmor locally to verify an unrelated ch
|
|
|
2475
2475
|
<span class="m">the only yanked release of 66 — and the required lint job pins exactly it</span>
|
|
2476
2476
|
</div>
|
|
2477
2477
|
</article>
|
|
2478
|
+
|
|
2479
|
+
<article class="cap rcard" id="release-verifies-the-wrong-commit">
|
|
2480
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Release safety</span></div>
|
|
2481
|
+
<h3>The release verifies one commit and ships another</h3>
|
|
2482
|
+
<p><code>publish.yml</code> fires on <code>workflow_run</code> when <code>ci</code> completes, gates
|
|
2483
|
+
on that run's <code>conclusion == 'success'</code> (plus <code>event == 'push'</code> and
|
|
2484
|
+
<code>head_repository == this repo</code>), and then checks out <code>ref: main</code>. Those are
|
|
2485
|
+
not the same commit. <b>Observed 2026-07-28:</b> <code>ci</code> for <code>ecfe38bc</code>
|
|
2486
|
+
completed at 20:19:05Z; the release run was created at 20:19:07Z; it tagged and shipped
|
|
2487
|
+
<code>c1727bac</code> as <b>v1.0.271</b> — while <code>c1727bac</code>'s own
|
|
2488
|
+
<code>ci</code>, started 20:18:40Z, was still <code>in_progress</code>. One commit's green
|
|
2489
|
+
verdict authorised a different commit's release.
|
|
2490
|
+
|
|
2491
|
+
<b>Most of this is already mitigated, and the card should not be read as "untested code ships".</b>
|
|
2492
|
+
A strict "require branches to be up to date" policy means the shipped commit was green as a pull
|
|
2493
|
+
request before it could merge, so its <em>tree</em> was gated. And
|
|
2494
|
+
<code>release_preflight.py</code> is already pointed at the right commit —
|
|
2495
|
+
<code>--sha "$(git rev-parse HEAD)"</code>, with an explicit comment that this is "not the trigger
|
|
2496
|
+
sha". It polls each required workflow for that exact sha and fails closed on red, cancelled,
|
|
2497
|
+
skipped, never-ran or still-running-at-deadline. The machinery is correct.
|
|
2498
|
+
|
|
2499
|
+
<b>Its coverage is the gap.</b> <code>.github/required-checks.txt</code> lists <b>18</b> required
|
|
2500
|
+
contexts. <code>publish.yml</code> passes preflight exactly two of them —
|
|
2501
|
+
<code>--require pip-audit.yml</code> and <code>--require package-metadata.yml</code>. The other
|
|
2502
|
+
<b>16 are never re-checked against the commit being shipped</b>, including all 14 that come from
|
|
2503
|
+
<code>ci.yml</code> and <code>codeql-analyze</code>. The clearest evidence this is an oversight
|
|
2504
|
+
rather than a decision is in-tree: <code>release_preflight.py</code>'s own docstring says it waits
|
|
2505
|
+
for <em>every</em> required workflow for the exact commit being released, and the caller hands it
|
|
2506
|
+
two.
|
|
2507
|
+
|
|
2508
|
+
<b>A required context that can never report on <code>main</code> at all.</b> While checking the
|
|
2509
|
+
other 16: <code>osv-scanner.yml</code> declares only <code>pull_request</code> and
|
|
2510
|
+
<code>merge_group</code> triggers — no <code>push</code>. So <code>scan-pr / osv-scan</code>
|
|
2511
|
+
is green as a PR gate and produces <em>nothing</em> for any commit on <code>main</code>, race or
|
|
2512
|
+
no race. Adding it to preflight without first giving that workflow a
|
|
2513
|
+
<code>push: branches: [main]</code> trigger would fail the release closed every time.
|
|
2514
|
+
|
|
2515
|
+
The fix is not to change the checkout ref. Pinning to
|
|
2516
|
+
<code>github.event.workflow_run.head_sha</code> would build the older commit while release-drafter
|
|
2517
|
+
still tags the default branch's head — artifact and tag would disagree. The lower-risk
|
|
2518
|
+
change is to widen preflight's <code>--require</code> set to the contexts that actually run on
|
|
2519
|
+
<code>main</code>, and optionally fail the job when <code>git rev-parse HEAD</code> differs from
|
|
2520
|
+
the triggering run's <code>head_sha</code>. This is the third defect found in the same few lines
|
|
2521
|
+
— see <code>publish-trigger-was-reachable-from-a-fork</code> (who can fire it) and
|
|
2522
|
+
<code>publish-gate-ignores-pip-audit-and-metadata</code> (which gates are consulted); this one is
|
|
2523
|
+
<em>which commit</em> they were consulted about.</p>
|
|
2524
|
+
<div class="meta">
|
|
2525
|
+
<span class="m">Complexity <b>S</b></span>
|
|
2526
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
2527
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
2528
|
+
<span class="m">2 of 18 required contexts are re-checked against the sha actually shipped</span>
|
|
2529
|
+
</div>
|
|
2530
|
+
</article>
|
|
2531
|
+
|
|
2532
|
+
<article class="cap rcard" id="demo-cannot-open-its-own-pr">
|
|
2533
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">CI reporting</span></div>
|
|
2534
|
+
<h3><code>demo.yml</code> still fails on every push — and the fix is not in the workflow</h3>
|
|
2535
|
+
<p><code>demo-gif-workflow-has-never-succeeded</code> (shipped, PR 294) fixed the recorder:
|
|
2536
|
+
<code>charmbracelet/vhs-action</code>'s broken ffmpeg installer was replaced with apt plus
|
|
2537
|
+
ttyd/vhs pinned by release-asset id. That worked. The recording step now succeeds on both event
|
|
2538
|
+
paths. <b>The workflow still fails on every push to <code>main</code></b> — observed
|
|
2539
|
+
2026-07-28 at 20:56, 20:04 and 09:27, and it is the only failing workflow in the last 60 runs.
|
|
2540
|
+
|
|
2541
|
+
The failure moved one step later, to <code>open a PR if the recording changed</code>. The run
|
|
2542
|
+
annotation gives it verbatim:
|
|
2543
|
+
|
|
2544
|
+
<code>GitHub Actions is not permitted to create or approve pull requests.</code>
|
|
2545
|
+
|
|
2546
|
+
<b>Nothing in <code>demo.yml</code> is wrong, so nothing in <code>demo.yml</code> will fix it.</b>
|
|
2547
|
+
The job already declares <code>contents: write</code> and <code>pull-requests: write</code>,
|
|
2548
|
+
which is exactly what <code>peter-evans/create-pull-request</code> documents as required. The
|
|
2549
|
+
workflow uses no secrets. <code>persist-credentials: false</code> on the checkout is correct and
|
|
2550
|
+
is the repo-wide convention across all 31 checkout steps — the action supplies its own git
|
|
2551
|
+
auth and explicitly unsets any persisted credential. Every one of those is a plausible-looking
|
|
2552
|
+
false lead. The actual blocker is a <b>repository setting</b>: Actions → General
|
|
2553
|
+
→ Workflow permissions → "Allow GitHub Actions to create and
|
|
2554
|
+
approve pull requests", which the API reports as
|
|
2555
|
+
<code>can_approve_pull_request_reviews: false</code>. This is the same shape as
|
|
2556
|
+
<code>sbom.yml</code>: a workflow that is correct in the file and inert in reality.
|
|
2557
|
+
|
|
2558
|
+
Deciding it is a real decision, not a formality. Turning that toggle on grants <em>every</em>
|
|
2559
|
+
workflow in the repo the ability to open pull requests, which is a genuine widening of what a
|
|
2560
|
+
compromised action can do. The alternative is to accept that this step cannot work and change
|
|
2561
|
+
what the push path does — upload the GIF as an artifact on both paths, as the pull-request
|
|
2562
|
+
path already does, and drop the PR-opening step.
|
|
2563
|
+
|
|
2564
|
+
<b>A second, independent defect in the same file.</b> Its concurrency group is
|
|
2565
|
+
<code>group: demo</code>, not ref-scoped. Every other per-ref workflow scopes it —
|
|
2566
|
+
<code>sonarcloud-${{ github.ref }}</code>, <code>fuzz-${{ github.ref }}</code>,
|
|
2567
|
+
<code>eval-stats-${{ github.ref }}</code>, <code>eval-explain-${{ github.ref }}</code>; only the
|
|
2568
|
+
deliberately-singleton <code>release</code> and <code>post-deploy</code> are global. With
|
|
2569
|
+
<code>cancel-in-progress: true</code>, a pull-request run and a <code>main</code> run therefore
|
|
2570
|
+
cancel each other, which is where demo's <code>cancelled</code> runs come from. Fix is
|
|
2571
|
+
<code>group: demo-${{ github.ref }}</code> regardless of what is decided about the toggle.
|
|
2572
|
+
|
|
2573
|
+
Worth reconciling while here: the tree disagrees with itself on the history.
|
|
2574
|
+
<code>demo-gif-workflow-has-never-succeeded</code> says "3 runs, 3 failures", while
|
|
2575
|
+
<code>demo.yml</code> and <code>ci-failure-issue.yml</code> both say six of six.</p>
|
|
2576
|
+
<div class="meta">
|
|
2577
|
+
<span class="m">Complexity <b>S</b></span>
|
|
2578
|
+
<span class="m">Impact <b>Med</b></span>
|
|
2579
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
2580
|
+
<span class="m">a repo setting blocks it — no edit to demo.yml can fix this one</span>
|
|
2581
|
+
</div>
|
|
2582
|
+
</article>
|
|
2583
|
+
|
|
2584
|
+
<article class="cap rcard" id="merged-loop-branches-are-never-pruned">
|
|
2585
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Hygiene · DX</span></div>
|
|
2586
|
+
<h3>68 of the repo's 77 branches are merged <code>loop/*</code> branches nobody deletes</h3>
|
|
2587
|
+
<p>The repository carries <b>77 branches, 70 of them <code>loop/*</code></b>. Classifying each by the
|
|
2588
|
+
state of its pull request: <b>68 have a merged PR</b> and are safe to delete, <b>1</b> has an open
|
|
2589
|
+
PR (<code>loop/dependabot-findings</code>), and 1 has no PR on record. The default branch list is
|
|
2590
|
+
almost entirely finished work.
|
|
2591
|
+
|
|
2592
|
+
<b>The obvious measurement is wrong here, which is worth recording.</b> Testing "is it merged?"
|
|
2593
|
+
with <code>compare(main...branch).ahead_by == 0</code> reports <b>0 of 70</b> as merged —
|
|
2594
|
+
because this repo squash-merges, and a squash leaves the branch's original commits outside
|
|
2595
|
+
<code>main</code>'s history forever. Every merged branch looks permanently ahead. The state has to
|
|
2596
|
+
come from the pull request, not from commit reachability.
|
|
2597
|
+
|
|
2598
|
+
The cause is a single repository setting: <code>delete_branch_on_merge</code> is <b>false</b>, so
|
|
2599
|
+
nothing removes a head branch when its PR merges. No workflow prunes them either — none of
|
|
2600
|
+
the 25 workflow files triggers on <code>create</code>/<code>delete</code> or touches
|
|
2601
|
+
<code>loop/*</code>, and no <code>scripts/</code> entry or Makefile target does branch cleanup.
|
|
2602
|
+
The one branch-deletion automation in the tree is <code>demo.yml</code>'s
|
|
2603
|
+
<code>delete-branch: true</code>, which is <code>create-pull-request</code> tidying its own
|
|
2604
|
+
<code>bot/demo-gif</code> branch and has nothing to do with <code>loop/*</code>. No documentation
|
|
2605
|
+
asks anyone to clean up either: <code>CONTRIBUTING.md</code>, <code>CLAUDE.md</code> and
|
|
2606
|
+
<code>.claude/commands/roadmap-loop.md</code> all describe branching and squash-merging, and none
|
|
2607
|
+
of the three mentions deleting the branch afterwards.
|
|
2608
|
+
|
|
2609
|
+
<b>Not a claim that branches are never deleted.</b> The item files name <b>144 distinct</b>
|
|
2610
|
+
<code>owner: loop/<topic></code> values against 70 surviving branches, so roughly 98 have
|
|
2611
|
+
gone at some point — by hand, or by topic reuse. The accurate statement is narrower:
|
|
2612
|
+
nothing in the repo <em>causes</em> cleanup, so merged branches accumulate until someone does it
|
|
2613
|
+
manually.
|
|
2614
|
+
|
|
2615
|
+
Low impact and near-zero risk to fix — flip <code>delete_branch_on_merge</code> to true and
|
|
2616
|
+
the backlog can be pruned by listing merged PR head refs. The reason it is worth doing at all is
|
|
2617
|
+
that CLAUDE.md tells every agent to run <code>git worktree list</code> and inspect branch state
|
|
2618
|
+
before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.</p>
|
|
2619
|
+
<div class="meta">
|
|
2620
|
+
<span class="m">Complexity <b>S</b></span>
|
|
2621
|
+
<span class="m">Impact <b>Low</b></span>
|
|
2622
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
2623
|
+
<span class="m">68 of 70 loop/* branches have a merged PR; one setting fixes it</span>
|
|
2624
|
+
</div>
|
|
2625
|
+
</article>
|
|
2478
2626
|
<!-- /ROADMAP:cards -->
|
|
2479
2627
|
|
|
2480
2628
|
</div>
|
|
@@ -2853,6 +3001,52 @@ artifact from review). At minimum, make the <code>--check</code> failure message
|
|
|
2853
3001
|
<span class="m">hit twice on one PR in a single afternoon</span>
|
|
2854
3002
|
</div>
|
|
2855
3003
|
</article>
|
|
3004
|
+
|
|
3005
|
+
<article class="cap rcard" id="make-lint-masks-actionlint-failures">
|
|
3006
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Bug</span></div>
|
|
3007
|
+
<h3><code>make lint</code> reports success when <code>actionlint</code> fails — and says it wasn't installed</h3>
|
|
3008
|
+
<p><code>Makefile:64</code> guards the workflow linter like this:
|
|
3009
|
+
|
|
3010
|
+
<code>@command -v actionlint >/dev/null 2>&1 && actionlint || echo "actionlint not on PATH — skipping (CI enforces it)"</code>
|
|
3011
|
+
|
|
3012
|
+
Because <code>||</code> binds to the whole <code>&&</code> chain, the fallback fires in
|
|
3013
|
+
<b>both</b> failure modes — actionlint absent, <em>and</em> actionlint present and reporting
|
|
3014
|
+
findings. Reproduced with a stub that exits 1:
|
|
3015
|
+
|
|
3016
|
+
<code>actionlint: FAKE ERROR</code><br>
|
|
3017
|
+
<code>actionlint not on PATH — skipping (CI enforces it)</code><br>
|
|
3018
|
+
<code>make exit=0</code>
|
|
3019
|
+
|
|
3020
|
+
So a real workflow-lint failure is swallowed, and the message asserts something false — that
|
|
3021
|
+
the tool is not installed, when it is installed and just failed. <b><code>make lint</code> and
|
|
3022
|
+
therefore <code>make check</code> can never fail on actionlint.</b> CLAUDE.md calls
|
|
3023
|
+
<code>make check</code> "the one gate that matters" and tells every agent to run it before calling
|
|
3024
|
+
a change done; for this tool it returns green unconditionally, and the developer who reads the
|
|
3025
|
+
output is told the opposite of what happened.
|
|
3026
|
+
|
|
3027
|
+
The local-versus-CI gap is wider than this one line. CI's required <code>lint</code> job runs
|
|
3028
|
+
three workflow/security tools that <code>make lint</code> has no equivalent for at all:
|
|
3029
|
+
<b>actionlint</b> (present but unfailable), <b>zizmor</b> and <b>gitleaks</b> (absent from the
|
|
3030
|
+
Makefile entirely). No CI job invokes <code>make lint</code>, so the two lists are hand-maintained
|
|
3031
|
+
duplicates with nothing checking they agree — which is how they drifted.
|
|
3032
|
+
|
|
3033
|
+
Minimal fix is to stop discarding the exit status:
|
|
3034
|
+
|
|
3035
|
+
<code>@if command -v actionlint >/dev/null 2>&1; then actionlint; else echo "actionlint not on PATH — skipping (CI enforces it)"; fi</code>
|
|
3036
|
+
|
|
3037
|
+
The stricter option is to install actionlint in <code>make venv</code> and let absence itself
|
|
3038
|
+
fail, so <code>make check</code> cannot report success while skipping a required gate. The same
|
|
3039
|
+
masking idiom appears at <code>Makefile:143</code> (hyperfine) and <code>Makefile:167</code>
|
|
3040
|
+
(node); neither is reached by <code>check</code>, so they are cosmetic by comparison, but they are
|
|
3041
|
+
the same bug. Incidental drift found alongside: <code>CLAUDE.md</code> describes the lint recipe
|
|
3042
|
+
as "18 commands" and it is 19.</p>
|
|
3043
|
+
<div class="meta">
|
|
3044
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3045
|
+
<span class="m">Impact <b>Med</b></span>
|
|
3046
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3047
|
+
<span class="m">a failing actionlint prints "not on PATH" and make exits 0</span>
|
|
3048
|
+
</div>
|
|
3049
|
+
</article>
|
|
2856
3050
|
<!-- /ROADMAP:cards -->
|
|
2857
3051
|
|
|
2858
3052
|
</div>
|
|
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
|