boost-skill-cli 1.0.347__tar.gz → 1.0.349__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.347 → boost_skill_cli-1.0.349}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/chat.py +106 -16
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +15 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +41 -2
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap.html +57 -4
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_chat.py +81 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.gitattributes +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.gitignore +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/.vale.ini +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/LICENSE +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/Makefile +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/README.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/codecov.yml +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/index.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/README.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/examples/README.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/index.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/noxfile.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/setup.cfg +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/README.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/boost.css +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/boost.js +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/style/demo.html +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.347 → boost_skill_cli-1.0.349}/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.349'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 349)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -52,6 +52,18 @@ MIN_FAITHFULNESS = 0.60
|
|
|
52
52
|
# conversation instead of from what retrieval actually returned.
|
|
53
53
|
HISTORY_TURNS = 4
|
|
54
54
|
|
|
55
|
+
# A catalogue-name shape: lowercase, hyphenated, e.g. `code-reviewer`.
|
|
56
|
+
_NAME = r"[a-z][a-z0-9]*(?:-[a-z0-9]+)+"
|
|
57
|
+
_TOKEN = re.compile(r"\b%s\b" % _NAME)
|
|
58
|
+
|
|
59
|
+
# Emphasis around a name-shaped token: `x`, **x**, *x*.
|
|
60
|
+
_EMPHASISED = re.compile(r"`(%(n)s)`|\*\*(%(n)s)\*\*|\*(%(n)s)\*" % {"n": _NAME}, re.IGNORECASE)
|
|
61
|
+
|
|
62
|
+
# Verbs that introduce a recommendation. What follows one is a claim about what
|
|
63
|
+
# to install, which is the phrasing a reader acts on.
|
|
64
|
+
_RECOMMENDS = re.compile(
|
|
65
|
+
r"\b(?:use|using|install|try|run|pick|choose|recommends?)\b", re.IGNORECASE)
|
|
66
|
+
|
|
55
67
|
_SYSTEM = (
|
|
56
68
|
"You help a developer pick an AI coding-agent skill from a catalogue. "
|
|
57
69
|
"Answer ONLY from the numbered skills provided. Never invent a skill name. "
|
|
@@ -132,10 +144,36 @@ def retrieve(question: str, history: Sequence[Turn] = (),
|
|
|
132
144
|
return [h["entry"] for h in hits[:k]], engine
|
|
133
145
|
|
|
134
146
|
|
|
147
|
+
# Catalogue descriptions are untrusted upstream text and some are enormous:
|
|
148
|
+
# measured over a real 71,655-entry catalogue, 22.7% exceed 300 characters and
|
|
149
|
+
# the longest is 5,771. One entry rendered as a screenful of embedded
|
|
150
|
+
# `<example>` blocks — a correct answer nobody could read.
|
|
151
|
+
DESC_CHARS = 200
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _one_line(text: str) -> str:
|
|
155
|
+
"""Collapse a description to a single line of plain text.
|
|
156
|
+
|
|
157
|
+
Handles real newlines *and* the literal two-character ``\\n`` that 635
|
|
158
|
+
entries carry from double-escaped upstream frontmatter — those reach a
|
|
159
|
+
terminal as visible backslash-n noise rather than as line breaks.
|
|
160
|
+
"""
|
|
161
|
+
return " ".join(text.replace("\\n", " ").replace("\\t", " ").split())
|
|
162
|
+
|
|
163
|
+
|
|
135
164
|
def _describe(entry: dict) -> str:
|
|
136
|
-
"""One catalogue entry as a line of prompt/answer text.
|
|
165
|
+
"""One catalogue entry as a line of prompt/answer text.
|
|
166
|
+
|
|
167
|
+
Truncation is marked with an ellipsis rather than silent: the reader needs
|
|
168
|
+
to know there is more to the description before deciding, and `boost info
|
|
169
|
+
<name>` is where the full text lives.
|
|
170
|
+
"""
|
|
171
|
+
desc = _one_line(entry.get("description") or "")
|
|
172
|
+
if len(desc) > DESC_CHARS:
|
|
173
|
+
# Cut on a word boundary so the tail is not a severed token.
|
|
174
|
+
desc = desc[:DESC_CHARS].rsplit(" ", 1)[0] + " …"
|
|
137
175
|
return "%s (%s) — %s" % (entry.get("name", "?"), entry.get("tap", "?"),
|
|
138
|
-
|
|
176
|
+
desc or "no description")
|
|
139
177
|
|
|
140
178
|
|
|
141
179
|
def source_text(entries: Sequence[dict]) -> str:
|
|
@@ -143,22 +181,74 @@ def source_text(entries: Sequence[dict]) -> str:
|
|
|
143
181
|
return "\n".join("%d. %s" % (i, _describe(e)) for i, e in enumerate(entries, 1))
|
|
144
182
|
|
|
145
183
|
|
|
146
|
-
def
|
|
147
|
-
"""
|
|
184
|
+
def grounding_text(entries: Sequence[dict]) -> str:
|
|
185
|
+
"""The text a reply is checked against — untruncated, unlike the prompt.
|
|
186
|
+
|
|
187
|
+
These must be different strings. The prompt is trimmed to keep an answer
|
|
188
|
+
readable, but checking a reply against the *trimmed* text would score a
|
|
189
|
+
faithful sentence as unfaithful purely because its evidence fell past
|
|
190
|
+
:data:`DESC_CHARS` — the truncation would manufacture the very failure the
|
|
191
|
+
check exists to detect.
|
|
192
|
+
"""
|
|
193
|
+
return "\n".join(
|
|
194
|
+
"%s %s" % (e.get("name", ""), _one_line(e.get("description") or ""))
|
|
195
|
+
for e in entries)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def claimed_names(reply: str) -> set:
|
|
199
|
+
"""Name-shaped tokens the reply presents *as skills to install*.
|
|
200
|
+
|
|
201
|
+
Not every hyphenated word is a claim. Descriptions in this catalogue are
|
|
202
|
+
thick with ordinary compounds — "read-only", "multi-agent", "single-pass",
|
|
203
|
+
"security-focused" — and treating each as a possible fabricated skill name
|
|
204
|
+
rejected essentially every real answer (reported from live use). The harm
|
|
205
|
+
this guards against is specific: a reader acting on a recommendation and
|
|
206
|
+
hunting for a package that does not exist. So a token counts as claimed when
|
|
207
|
+
it is emphasised, or when it sits in the clause a recommending verb
|
|
208
|
+
introduces — "try code-reviewer or docker-compose-expert" claims both.
|
|
209
|
+
|
|
210
|
+
Scanning the whole clause rather than just the next word is what catches the
|
|
211
|
+
second item in a list, which is exactly where an invention tends to hide.
|
|
212
|
+
Prose that merely *describes* ("a read-only multi-agent review") claims
|
|
213
|
+
nothing and is left to :func:`faithfulness.score`, the second gate.
|
|
214
|
+
"""
|
|
215
|
+
out = {next(g for g in m.groups() if g).lower()
|
|
216
|
+
for m in _EMPHASISED.finditer(reply)}
|
|
217
|
+
for verb in _RECOMMENDS.finditer(reply):
|
|
218
|
+
# Stop at the sentence end: a later sentence is a new statement, not
|
|
219
|
+
# part of this recommendation.
|
|
220
|
+
clause = re.split(r"[.;!?\n]", reply[verb.end():], maxsplit=1)[0]
|
|
221
|
+
out |= {t.lower() for t in _TOKEN.findall(clause)}
|
|
222
|
+
return out
|
|
148
223
|
|
|
149
|
-
Catalogue names are lowercase hyphenated words (``code-reviewer``,
|
|
150
|
-
``pdf``), which is a distinctive enough shape to spot in prose. Anything
|
|
151
|
-
matching that shape and not present in the candidate set is a name the model
|
|
152
|
-
supplied itself — the exact failure that sends a user hunting for a skill
|
|
153
|
-
that does not exist.
|
|
154
224
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
225
|
+
def ungrounded_names(reply: str, entries: Sequence[dict]) -> List[str]:
|
|
226
|
+
"""Skill-shaped tokens in ``reply`` that appear nowhere in ``entries``.
|
|
227
|
+
|
|
228
|
+
Catalogue names are lowercase hyphenated words (``code-reviewer``), which is
|
|
229
|
+
a distinctive enough shape to spot in prose. A token of that shape that
|
|
230
|
+
appears in neither the retrieved names nor the retrieved *text* is one the
|
|
231
|
+
model supplied itself — the failure that sends a user hunting for a skill
|
|
232
|
+
which does not exist, or toward a typosquat (see ``core/typosquat.py``).
|
|
233
|
+
|
|
234
|
+
THE SOURCES GROUND THE REPLY, NOT JUST THE NAMES. An earlier version checked
|
|
235
|
+
only against the name list, so ordinary hyphenated English quoted straight
|
|
236
|
+
out of a description — "read-only", "multi-agent", "pre-deployment" — scored
|
|
237
|
+
as fabricated. In this catalogue those compounds are everywhere, so a
|
|
238
|
+
faithful reply was rejected almost every time and the AI path silently
|
|
239
|
+
degraded to extractive for nearly every real query. Reported from live use.
|
|
240
|
+
|
|
241
|
+
Deliberately narrow in the other direction too: it only flags *hyphenated*
|
|
242
|
+
tokens, because a single ordinary word cannot be told apart from prose. This
|
|
243
|
+
under-reports rather than firing on innocent sentences, and
|
|
244
|
+
:func:`faithfulness.score` covers the rest.
|
|
158
245
|
"""
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
246
|
+
# Whole tokens, not a substring scan. `x in "…"` would treat an invented
|
|
247
|
+
# `code-review` as grounded because `code-reviewer` contains it — precisely
|
|
248
|
+
# the near-miss shape a typosquat has.
|
|
249
|
+
grounded = set(_TOKEN.findall(grounding_text(entries).lower()))
|
|
250
|
+
grounded |= {str(e.get("name", "")).lower() for e in entries}
|
|
251
|
+
return sorted(c for c in claimed_names(reply) if c not in grounded)
|
|
162
252
|
|
|
163
253
|
|
|
164
254
|
def _extractive(question: str, entries: Sequence[dict]) -> str:
|
|
@@ -208,7 +298,7 @@ def answer(question: str, history: Sequence[Turn] = (),
|
|
|
208
298
|
# A manufactured name is unrecoverable — there is no honest way to show
|
|
209
299
|
# prose that points at a skill which does not exist.
|
|
210
300
|
return Reply(extractive, entries.copy(), engine, "extractive", False)
|
|
211
|
-
if faithfulness.score(reply,
|
|
301
|
+
if faithfulness.score(reply, grounding_text(entries)) < MIN_FAITHFULNESS:
|
|
212
302
|
return Reply(extractive, entries.copy(), engine, "extractive", False)
|
|
213
303
|
return Reply(reply, entries.copy(), engine, "ai", True)
|
|
214
304
|
|
|
@@ -72,3 +72,18 @@ Nothing in the tree needed changing. Recording it as shipped rather than deletin
|
|
|
72
72
|
card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
|
|
73
73
|
<code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
|
|
74
74
|
could fix a repository-level setting is what stopped that from being a long false lead.
|
|
75
|
+
|
|
76
|
+
<b>Update — the repository setting this card called immovable has been turned on.</b> The API
|
|
77
|
+
now reports <code>can_approve_pull_request_reviews: <b>true</b></code>, <code>demo.yml</code>
|
|
78
|
+
succeeds on every push to <code>main</code>, and it has opened real pull requests as
|
|
79
|
+
<code>github-actions[bot]</code> (<code>#353</code>, <code>#394</code>). So the coupled item
|
|
80
|
+
[[scheduled-toolchain-lock-regeneration]] was unblocked too, and shipped on the strength of it.
|
|
81
|
+
|
|
82
|
+
<b>What did not change is the check-run consequence</b>, which is worth keeping on the record
|
|
83
|
+
because it is invisible: a PR opened this way lands with <b>zero</b> check runs, since
|
|
84
|
+
<code>create-pull-request</code> pushes with <code>GITHUB_TOKEN</code> and a
|
|
85
|
+
<code>GITHUB_TOKEN</code> push never triggers workflows. Measured on both bot PRs —
|
|
86
|
+
<code>ffc07b0</code> and <code>a9da922</code> each had 0, and the same commits had 27 after an
|
|
87
|
+
<i>Update branch</i>. An empty check list is indistinguishable from "CI has not started yet", so a
|
|
88
|
+
bot PR can look ready to merge while nothing has run.
|
|
89
|
+
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
id: scheduled-toolchain-lock-regeneration
|
|
3
3
|
board: code
|
|
4
4
|
section: internals
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Build · Gap
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: Med
|
|
9
9
|
wow: 2
|
|
10
|
-
note: the
|
|
10
|
+
note: the blocker this card recorded had already been lifted — re-checked, not assumed
|
|
11
11
|
order: 36
|
|
12
12
|
owner:
|
|
13
13
|
pr:
|
|
@@ -87,3 +87,42 @@ when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runn
|
|
|
87
87
|
untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
|
|
88
88
|
The value of this note is that the next person picking it up starts from “build it”
|
|
89
89
|
rather than from “it cannot be built”.
|
|
90
|
+
|
|
91
|
+
<b>Shipped as <code>.github/workflows/lock-refresh.yml</code>, and the first thing that had to be
|
|
92
|
+
re-checked was this card's own blocker.</b> It states the work is blocked because
|
|
93
|
+
Actions → Workflow permissions forbids creating pull requests, citing
|
|
94
|
+
<code>can_approve_pull_request_reviews: false</code>. That is no longer true: the API now returns
|
|
95
|
+
<b><code>true</code></b>, <code>demo.yml</code> succeeds on every push to <code>main</code>, and it
|
|
96
|
+
opened <code>#353</code> and <code>#394</code> as <code>github-actions[bot]</code>. A blocker
|
|
97
|
+
recorded once is a claim with an expiry date; this one had quietly lapsed, and the card would have
|
|
98
|
+
kept the item shelved indefinitely.
|
|
99
|
+
|
|
100
|
+
<b>One PR for all five groups — a deliberate departure from what this card proposed.</b> The
|
|
101
|
+
card suggested per-group jobs so a bump stays reviewable. Two things measured while building it
|
|
102
|
+
argue the other way. <code>lock_toolchain.py</code> has <b>no per-group flag</b>
|
|
103
|
+
(<code>--upgrade</code> always re-resolves all five), so a five-job matrix would run the same
|
|
104
|
+
resolution five times and commit one file from each. And a PR opened this way arrives with
|
|
105
|
+
<b>zero check runs</b> — <code>create-pull-request</code> pushes with
|
|
106
|
+
<code>GITHUB_TOKEN</code>, which never triggers workflows — so every one of them costs a human
|
|
107
|
+
a manual <i>Update branch</i> before CI reports at all. Five PRs a month is five full CI runs and
|
|
108
|
+
five manual unblocks to review what is usually a list of version bumps. Reviewability is bought
|
|
109
|
+
instead with a <b>monthly</b> cadence and a per-group diffstat in the PR body.
|
|
110
|
+
|
|
111
|
+
<b>The other three constraints this card named were met as written.</b> <code>uv</code> and the
|
|
112
|
+
network are provisioned the same way <code>ci.yml</code> does it (<code>pip install uv</code>, then
|
|
113
|
+
the script). <code>--audit</code> runs as its own invocation, because the script refuses it
|
|
114
|
+
alongside <code>--upgrade</code> — auditing a file mid-replacement reads the old bytes —
|
|
115
|
+
and a failure there means no PR is opened. Every <code>uses:</code> is pinned to the same peeled
|
|
116
|
+
SHAs the repo already uses, permissions are <code>contents: read</code> at the top with the two
|
|
117
|
+
writes scoped to the one job, and no <code>merge_group:</code> trigger is needed because this is not
|
|
118
|
+
a required context (<code>check_required_checks.py</code> passes).
|
|
119
|
+
|
|
120
|
+
<b>Verified before pushing:</b> the workflow parses, and <code>zizmor</code> reports <b>no
|
|
121
|
+
findings</b>. That clean result was itself checked rather than trusted — re-running the
|
|
122
|
+
scanner against a copy with <code>${{ github.event.head_commit.message }}</code> spliced into a
|
|
123
|
+
<code>run:</code> block produces a high-severity <code>template-injection</code>, so the scanner is
|
|
124
|
+
genuinely reading this file. That check exists because an earlier workflow in this repo
|
|
125
|
+
(<code>shards.yml</code>) shipped exactly that hole.
|
|
126
|
+
|
|
127
|
+
<b>Unproven until it runs:</b> the first scheduled execution is the first end-to-end exercise.
|
|
128
|
+
|
|
@@ -1806,8 +1806,9 @@ validator that rejects values below 1; reuse it here.</p></details>
|
|
|
1806
1806
|
</article>
|
|
1807
1807
|
|
|
1808
1808
|
<article class="cap rcard" id="scheduled-toolchain-lock-regeneration">
|
|
1809
|
-
<div class="head"><span class="pill
|
|
1809
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Build · Gap</span></div>
|
|
1810
1810
|
<h3>The toolchain lock has no proactive update path any more</h3>
|
|
1811
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
1811
1812
|
<p><code>#342</code> set <code>open-pull-requests-limit: 0</code> on the <code>/requirements</code>
|
|
1812
1813
|
Dependabot entry, because Dependabot cannot regenerate a hash-pinned universal lock without dropping
|
|
1813
1814
|
the pins whose environment markers exclude them on the resolving platform (see
|
|
@@ -1881,12 +1882,50 @@ Deliberately left unimplemented here. It needs a real decision about cadence and
|
|
|
1881
1882
|
when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runner, and shipping an
|
|
1882
1883
|
untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
|
|
1883
1884
|
The value of this note is that the next person picking it up starts from “build it”
|
|
1884
|
-
rather than from “it cannot be built&rdquo
|
|
1885
|
+
rather than from “it cannot be built”.
|
|
1886
|
+
|
|
1887
|
+
<b>Shipped as <code>.github/workflows/lock-refresh.yml</code>, and the first thing that had to be
|
|
1888
|
+
re-checked was this card's own blocker.</b> It states the work is blocked because
|
|
1889
|
+
Actions → Workflow permissions forbids creating pull requests, citing
|
|
1890
|
+
<code>can_approve_pull_request_reviews: false</code>. That is no longer true: the API now returns
|
|
1891
|
+
<b><code>true</code></b>, <code>demo.yml</code> succeeds on every push to <code>main</code>, and it
|
|
1892
|
+
opened <code>#353</code> and <code>#394</code> as <code>github-actions[bot]</code>. A blocker
|
|
1893
|
+
recorded once is a claim with an expiry date; this one had quietly lapsed, and the card would have
|
|
1894
|
+
kept the item shelved indefinitely.
|
|
1895
|
+
|
|
1896
|
+
<b>One PR for all five groups — a deliberate departure from what this card proposed.</b> The
|
|
1897
|
+
card suggested per-group jobs so a bump stays reviewable. Two things measured while building it
|
|
1898
|
+
argue the other way. <code>lock_toolchain.py</code> has <b>no per-group flag</b>
|
|
1899
|
+
(<code>--upgrade</code> always re-resolves all five), so a five-job matrix would run the same
|
|
1900
|
+
resolution five times and commit one file from each. And a PR opened this way arrives with
|
|
1901
|
+
<b>zero check runs</b> — <code>create-pull-request</code> pushes with
|
|
1902
|
+
<code>GITHUB_TOKEN</code>, which never triggers workflows — so every one of them costs a human
|
|
1903
|
+
a manual <i>Update branch</i> before CI reports at all. Five PRs a month is five full CI runs and
|
|
1904
|
+
five manual unblocks to review what is usually a list of version bumps. Reviewability is bought
|
|
1905
|
+
instead with a <b>monthly</b> cadence and a per-group diffstat in the PR body.
|
|
1906
|
+
|
|
1907
|
+
<b>The other three constraints this card named were met as written.</b> <code>uv</code> and the
|
|
1908
|
+
network are provisioned the same way <code>ci.yml</code> does it (<code>pip install uv</code>, then
|
|
1909
|
+
the script). <code>--audit</code> runs as its own invocation, because the script refuses it
|
|
1910
|
+
alongside <code>--upgrade</code> — auditing a file mid-replacement reads the old bytes —
|
|
1911
|
+
and a failure there means no PR is opened. Every <code>uses:</code> is pinned to the same peeled
|
|
1912
|
+
SHAs the repo already uses, permissions are <code>contents: read</code> at the top with the two
|
|
1913
|
+
writes scoped to the one job, and no <code>merge_group:</code> trigger is needed because this is not
|
|
1914
|
+
a required context (<code>check_required_checks.py</code> passes).
|
|
1915
|
+
|
|
1916
|
+
<b>Verified before pushing:</b> the workflow parses, and <code>zizmor</code> reports <b>no
|
|
1917
|
+
findings</b>. That clean result was itself checked rather than trusted — re-running the
|
|
1918
|
+
scanner against a copy with <code>${{ github.event.head_commit.message }}</code> spliced into a
|
|
1919
|
+
<code>run:</code> block produces a high-severity <code>template-injection</code>, so the scanner is
|
|
1920
|
+
genuinely reading this file. That check exists because an earlier workflow in this repo
|
|
1921
|
+
(<code>shards.yml</code>) shipped exactly that hole.
|
|
1922
|
+
|
|
1923
|
+
<b>Unproven until it runs:</b> the first scheduled execution is the first end-to-end exercise.</p></details>
|
|
1885
1924
|
<div class="meta">
|
|
1886
1925
|
<span class="m">Complexity <b>M</b></span>
|
|
1887
1926
|
<span class="m">Impact <b>Med</b></span>
|
|
1888
1927
|
<span class="m">Wow <b class="wow">★★</b></span>
|
|
1889
|
-
<span class="m">the
|
|
1928
|
+
<span class="m">the blocker this card recorded had already been lifted — re-checked, not assumed</span>
|
|
1890
1929
|
</div>
|
|
1891
1930
|
</article>
|
|
1892
1931
|
|
|
@@ -3713,7 +3752,21 @@ this card says is impossible.
|
|
|
3713
3752
|
Nothing in the tree needed changing. Recording it as shipped rather than deleting it, because the
|
|
3714
3753
|
card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
|
|
3715
3754
|
<code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
|
|
3716
|
-
could fix a repository-level setting is what stopped that from being a long false lead
|
|
3755
|
+
could fix a repository-level setting is what stopped that from being a long false lead.
|
|
3756
|
+
|
|
3757
|
+
<b>Update — the repository setting this card called immovable has been turned on.</b> The API
|
|
3758
|
+
now reports <code>can_approve_pull_request_reviews: <b>true</b></code>, <code>demo.yml</code>
|
|
3759
|
+
succeeds on every push to <code>main</code>, and it has opened real pull requests as
|
|
3760
|
+
<code>github-actions[bot]</code> (<code>#353</code>, <code>#394</code>). So the coupled item
|
|
3761
|
+
[[scheduled-toolchain-lock-regeneration]] was unblocked too, and shipped on the strength of it.
|
|
3762
|
+
|
|
3763
|
+
<b>What did not change is the check-run consequence</b>, which is worth keeping on the record
|
|
3764
|
+
because it is invisible: a PR opened this way lands with <b>zero</b> check runs, since
|
|
3765
|
+
<code>create-pull-request</code> pushes with <code>GITHUB_TOKEN</code> and a
|
|
3766
|
+
<code>GITHUB_TOKEN</code> push never triggers workflows. Measured on both bot PRs —
|
|
3767
|
+
<code>ffc07b0</code> and <code>a9da922</code> each had 0, and the same commits had 27 after an
|
|
3768
|
+
<i>Update branch</i>. An empty check list is indistinguishable from "CI has not started yet", so a
|
|
3769
|
+
bot PR can look ready to merge while nothing has run.</p></details>
|
|
3717
3770
|
<div class="meta">
|
|
3718
3771
|
<span class="m">Complexity <b>S</b></span>
|
|
3719
3772
|
<span class="m">Impact <b>Med</b></span>
|
|
@@ -190,3 +190,84 @@ class TestSourceText:
|
|
|
190
190
|
# A blank line reads as "no such skill"; the placeholder keeps the
|
|
191
191
|
# numbering honest and tells the model there is nothing to summarise.
|
|
192
192
|
assert "no description" in chat.source_text([_entry("bare")])
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class TestGroundingDoesNotFlagOrdinaryEnglish:
|
|
196
|
+
"""A hyphenated word is not a skill name.
|
|
197
|
+
|
|
198
|
+
Reported from real use: every AI reply was rejected with "named something
|
|
199
|
+
outside the retrieved skills". The catalogue's own descriptions are full of
|
|
200
|
+
hyphenated compounds — "read-only", "multi-agent", "pre-deployment",
|
|
201
|
+
"risk-adaptive", "test-driven" — and the first version of
|
|
202
|
+
:func:`ungrounded_names` flagged any hyphenated token that was not itself a
|
|
203
|
+
catalogue name. So a reply that faithfully quoted its sources was scored as
|
|
204
|
+
fabricating, and the AI path degraded to extractive for essentially every
|
|
205
|
+
query in this domain.
|
|
206
|
+
|
|
207
|
+
The fix is that the *sources* ground the reply, not just the name list:
|
|
208
|
+
a term that appears in the retrieved text came from the retrieved text.
|
|
209
|
+
"""
|
|
210
|
+
|
|
211
|
+
ENTRIES = ({"name": "code-reviewer", "tap": "t",
|
|
212
|
+
"description": "Parallel read-only multi-agent review of a git diff, "
|
|
213
|
+
"risk-adaptive and pre-deployment focused."},)
|
|
214
|
+
|
|
215
|
+
def test_compounds_quoted_from_the_sources_are_grounded(self):
|
|
216
|
+
reply = ("The read-only multi-agent code-reviewer fits — it is "
|
|
217
|
+
"risk-adaptive and pre-deployment focused.")
|
|
218
|
+
assert chat.ungrounded_names(reply, self.ENTRIES) == []
|
|
219
|
+
|
|
220
|
+
def test_a_genuinely_invented_name_is_still_caught(self):
|
|
221
|
+
# The whole point of the check: boost is a package manager, so a
|
|
222
|
+
# plausible-but-absent name sends the user hunting for a skill that
|
|
223
|
+
# does not exist, or to a typosquat.
|
|
224
|
+
reply = "Use docker-compose-expert for that."
|
|
225
|
+
assert "docker-compose-expert" in chat.ungrounded_names(reply, self.ENTRIES)
|
|
226
|
+
|
|
227
|
+
def test_a_near_miss_is_not_grounded_by_a_longer_real_name(self):
|
|
228
|
+
# A substring scan would treat "code-review" as grounded because
|
|
229
|
+
# "code-reviewer" contains it — exactly the near-miss shape a
|
|
230
|
+
# typosquat has, so matching is on whole tokens.
|
|
231
|
+
reply = "Install code-review for that."
|
|
232
|
+
assert "code-review" in chat.ungrounded_names(reply, self.ENTRIES)
|
|
233
|
+
|
|
234
|
+
def test_grounding_is_case_insensitive(self):
|
|
235
|
+
reply = "Read-Only review is what Code-Reviewer does."
|
|
236
|
+
assert chat.ungrounded_names(reply, self.ENTRIES) == []
|
|
237
|
+
|
|
238
|
+
def test_a_name_never_needs_the_description_to_be_grounded(self):
|
|
239
|
+
entries = [{"name": "tdd-workflow", "tap": "t", "description": ""}]
|
|
240
|
+
assert chat.ungrounded_names("Try tdd-workflow.", entries) == []
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class TestLongDescriptionsAreReadable:
|
|
244
|
+
"""Catalogue descriptions are untrusted text and some are enormous.
|
|
245
|
+
|
|
246
|
+
Measured over a real 71,655-entry catalogue: 22.7% of descriptions exceed
|
|
247
|
+
300 characters, the longest is 5,771, and 635 contain literal ``\\n``
|
|
248
|
+
escape sequences. One such entry rendered as a screenful of embedded
|
|
249
|
+
``<example>`` blocks, which is what a user actually saw — the answer was
|
|
250
|
+
correct and unreadable.
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
def test_a_long_description_is_truncated(self):
|
|
254
|
+
entry = {"name": "x", "tap": "t", "description": "word " * 400}
|
|
255
|
+
line = chat._describe(entry)
|
|
256
|
+
assert len(line) < 300, len(line)
|
|
257
|
+
|
|
258
|
+
def test_truncation_is_marked_rather_than_silent(self):
|
|
259
|
+
entry = {"name": "x", "tap": "t", "description": "word " * 400}
|
|
260
|
+
assert chat._describe(entry).rstrip().endswith("…")
|
|
261
|
+
|
|
262
|
+
def test_a_short_description_is_left_alone(self):
|
|
263
|
+
entry = {"name": "x", "tap": "t", "description": "Short and useful."}
|
|
264
|
+
assert chat._describe(entry).endswith("Short and useful.")
|
|
265
|
+
|
|
266
|
+
def test_embedded_newlines_collapse_to_one_line(self):
|
|
267
|
+
# Both real newlines and the literal two-character \n seen in 635
|
|
268
|
+
# entries, which reach the terminal as visible backslash-n noise.
|
|
269
|
+
entry = {"name": "x", "tap": "t",
|
|
270
|
+
"description": "first\nsecond\\nthird\r\nfourth"}
|
|
271
|
+
line = chat._describe(entry)
|
|
272
|
+
assert "\n" not in line and "\\n" not in line
|
|
273
|
+
assert "first second third fourth" in line
|
|
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
|
|
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
|