living document · updated by the quality loop

The boost roadmap

Every finding from the autonomous quality loop lands here — what shipped, what's mid-flight, and what's queued — scored by complexity, impact, and a little bit of wow.

Shipped merged & released In flight a PR is open Next triaged, starting soon Planned on the list
16Shipped
1Next up
4Planned
93Loop finds

Shipped

// merged to main & published
ShippedCorrectness · Robustness

Atomic, corruption-safe lock-file writes

Shipped in #65 (this card lingered as "next" after the fact). core/lockfile.py now writes through util.atomic_write_text (temp file + os.replace()) and read() tells "empty" apart from "corrupt": an unparseable lock is preserved as <lock>.corrupt and surfaced loudly rather than silently overwritten, so an interrupted or concurrent write can no longer drop every prior install record.

Complexity M Impact High Wow ★★★★ already fixed in
ShippedBug · Infra

GitHub Pages deploy is broken every push

Fixed by #60: the bogus mutants/None gitlink (a stray mutmut artifact with no .gitmodules entry) that made Pages' submodule checkout abort with fatal: No url found for submodule path 'mutants/None' is gone. Verified: the Pages "build and deployment" now completes successfully and the site serves — the boards live at jonnyeclectic.github.io/boost/docs/roadmap.html (200), since Pages publishes from the repo root.

Complexity S Impact High Wow ★★ root cause removed in
ShippedTesting · Bug

Mutation hardening — core/store.py

Cut mutmut survivors 54 → 29 and uncovered a latent timestamp-preservation bug the old tests masked (second-precision now_iso() collisions hid installed_at/tags preservation mutants).

Complexity M Impact High Wow ★★★ 25 mutants killed
ShippedTesting

Mutation hardening — core/gitutil.py

35 → 1 survivor via argv-assertion tests that record the exact git command line — sidestepping the macOS case-insensitive filesystem that let HEAD/head, .git/.GIT and git/GIT mutants survive against a real repo.

Complexity M Impact High Wow ★★★★ 34 mutants killed
ShippedHygiene · DX

Untrack generated build noise

Shipped in #60. The generated mutants/**, __pycache__/*.pyc and .coverage files were removed from the index (verified: git ls-files now tracks zero of them), so they no longer churn every diff or force path-scoped git adds.

Complexity S Impact Med Wow already fixed in
ShippedBug · UX

browse crashes when you pick a rule or workflow

cmd_browse lists every catalog entry — skills, rules and workflows — then called store.install(picked) unconditionally, so selecting a rule or workflow raised … is a workflow, which boost indexes but cannot install yet and the TUI exited with a fatal Error: after the user had already navigated and chosen (reported from a real boost browse session on AGENT-playbook-to-automated-agent-workflow). Fixed in #118: the install call now catches BoostError and renders the message + hint as a friendly non-fatal notice (exit 0), so a non-skill pick — or an already-installed / pinned skill — no longer crashes the browser. Covered by a regression test that picks a workflow and asserts no fatal exit.

Complexity S Impact Med Wow ★★ user-reported crash, fixed
ShippedCorrectness

Consolidate skill-staleness / drift logic into core

The "is this skill outdated" decision — semver_gt → commit compare → sha256_dir vs lock — was reimplemented nearly verbatim in cmd_update, cmd_outdated and _drift_status — three copies of core business logic that would drift apart. It now lives in one place: core/staleness.py exposes two pure (I/O-free) decisions — upstream_reason() (the version→commit→content ladder rendered by cmd_update/cmd_outdated) and drift_state() (the store/local-edits/upstream ladder rendered by _drift_status). The commands became thin renderers; behavior is byte-for-byte preserved and the new module is fully unit-tested (every branch pinned, all mutants killed).

Complexity M Impact High Wow ★★★ three copies → one core module
ShippedTesting

Mutation hardening — core/frontmatter.py

34 → 11 survivors with exact-equality tests, replacing substring in checks a mutated string literal still satisfied (e.g. dump()'s XX%s:XX still contains tags:).

Complexity M Impact Med Wow ★★★ PR
ShippedTesting · Coverage

Extension-free tests — core/dense.py

The dense-vector RAG backend's whole test module is skipif-gated on the [rag] sqlite-vec C extension, so on the default zero-dependency install every degradation and ranking path went untested (17.6% → 89% coverage). New tests force _load() → None and drive the SQL helpers and retrieve()'s cosine reducer through in-memory/fake connections — killing mutants on every machine, extension or not.

Complexity M Impact High Wow ★★★ 42 tests · +71pts coverage
ShippedTesting · Resilience

Crash-recorder error paths — core/logs.py

The black-box diagnostic logger swallows every filesystem/handler failure so a broken log can never break the CLI — but those except arms (the parts that matter most during a crash) were the least exercised. New tests force each failure — handler close() raising, a read-only log dir, an unresolvable version, a wedged logger, unlink denied — taking the module to 100% coverage.

Complexity S Impact Med Wow ★★★ 7 branches · 88%→100%
ShippedTech-debt

Extract MCP + HTTP servers out of configuration.py

~200 lines implementing a full HTTP catalog server and a JSON-RPC 2.0 MCP server lived inside the "configuration" command module — nearly untestable in place. The JSON-RPC protocol now lives in core/mcp.py as a pure handle_request(req, *, version, registry) plus a serve_stdio() loop with injectable stdin/stdout; the HTTP server moved to a new core/serve.py with a pure route() function, serve_page()/skill_text(), and serve_http(). cmd_serve and cmd_mcp --stdio became thin wrappers. Behavior is preserved exactly (the full-server and stdio-protocol functional tests pass unchanged) and the extracted core is pinned by new unit tests covering every branch.

Complexity L Impact High Wow ★★★★ two servers now testable in core
ShippedInfra · DX

Autonomous ship-workflow & isolated worktree

The loop now runs commit → PR → green CI → squash-merge → release in a dedicated ~/boost-loop git worktree (own venv for mutmut), and modern git 2.55 replaced a 2017 build that fatally choked on the global zdiff3 config.

Complexity L Impact High Wow ★★★★
ShippedCorrectness

Fix self-update version detection (dead branch)

boost self-update greped __init__.py for a __version__ = "…" literal that setuptools-scm never writes, so the regex never matched and it always reported "already up to date" — even after a pull brought a newer tag. The success path was unreachable. It now derives the pulled version straight from git (describe --tags, mirroring _detect_version()) and treats a moved HEAD as the "an update landed" signal, so the version-bump path finally fires. Regression tests cover both the up-to-date and update-landed branches.

Complexity S Impact High Wow ★★★ broken headline command, now works
ShippedSecurity

End-of-options -- guard on git commands

clone_shallow passed the clone URL as a positional with no -- separator, so a value beginning with - could be read as a git flag, and git's remote-helper transports (ext::sh -c …, file::, fd::) can execute arbitrary commands straight from a URL. Now it refuses those transports outright and passes -- before the URL so option parsing can't be hijacked — argument-injection defense-in-depth beside registry.parse_spec. Kept scoped to the one primitive that takes a user-influenced URL (the refs in pull/reset are constants, and -- there would wrongly mean a pathspec). Six tests, mutation-verified.

Complexity S Impact Med Wow ★★★ transport allow-list + -- guard
ShippedObservability · Diagnostics

Crash-correlation breadcrumbs in the invocation log

A native abort (e.g. a macOS Obj-C fork-safety SIGABRT) kills the process outright, so it never reaches boost's Python crash recorder — leaving no boost-side trace to confirm or clear boost when an OS crash report appears. log_invocation now records pid, ppid and the interpreter path on every run, so any OS crash report can be cross-referenced by PID: if the crashing PID never appears in ~/.boost/logs/boost.log, boost is definitively ruled out.

Complexity S Impact Med Wow ★★★ rule boost in/out of OS crash reports
ShippedTech-debt

Reuse helpers; kill minor dead work

Shipped in #126. The byte-identical _user() getpass helper — copy-pasted three times across core/journal.py, commands/configuration.py and commands/team.py — is now a single public core/util.user() the three call sites delegate to (covered incl. the getpass-raises fallback). cmd_simulate also parsed the same frontmatter twice (_, body = … then meta, _ = …); collapsed to one meta, body = frontmatter.parse(text). cmd_migrate's two-agent validation is intentionally left as-is — its first-fail wording differs from _check_agents' collect-all message, so routing it through the helper would change user-facing errors.

Complexity S Impact Low Wow helper dedup + double-parse removed

Next up

// triaged findings, starting soon
NextDesign

Reconcile the theme drift

docs/index.html inlines its own amber/orange palette instead of the canonical Aurora cyan→violet→pink system in style/boost.css. Move it onto the shared stylesheet so one token edit recolours the guide, roadmap, and demo together.

Complexity M Impact Med Wow ★★★

Planned

// on the list
PlannedTesting

Finish mutation hardening across core/

Work down the remaining survivor counts, biggest first: catalog (27), util (26), ai (21), registry (20), lockfile (13), policy (12), config (9), output (8), agents (6), paths (4).

Complexity L Impact Med Wow ★★ ~146 survivors
PlannedTesting · Gap

Bring commands/ under mutation testing

The ~5,000-line CLI command layer has zero mutation coverage today — mutmut is scoped to core/ only. Extend the gate (or a second gate) to the command groups.

Complexity XL Impact High Wow ★★★
PlannedDesign · QA

Visual regression pass on the guide

Drive docs/index.html in a real browser across breakpoints to confirm the glass cards, aurora, and terminal windows render cleanly — and to catch anything the theme reconciliation shifts.

Complexity M Impact Med Wow ★★★
PlannedDocs · Marketing

Refresh the marketing surface

Re-record docs/demo.gif from demo.tape against the current CLI, tighten the README hero, and give the landing page a flashier first impression that matches the Aurora theme.

Complexity M Impact Med Wow ★★★★

Engine & command internals

// concrete file:line findings from the code scan
ShippedPerformance

Memoize config.load() in-process

Every config.get() re-reads config.json and runs a recursive deepcopy of DEFAULTS (core/config.py:80–102). It's called all over hot paths — ai.enabled, per-skill enabled_agents in sync loops, log-level and policy checks — so one command triggers dozens of full reads + deep-copies. Cache the load, invalidate on save.

Complexity S Impact Med-High Wow ★★★
PlannedRobustness

Atomic skill install (temp-dir swap)

_copy_skill does rmtree(dest) then copytree() (core/store.py:108–131); an interrupt between the two leaves a missing or half-copied skill, and the lock is written afterward — so a mid-copy failure leaves store and lock disagreeing. Copy to a temp dir and atomically swap into place.

Complexity M Impact Med Wow ★★★
ShippedRobustness

One shared atomic-write helper

journal._maybe_rotate is a racy read-modify-write that concurrent appends can truncate mid-line; rag._save and config.save repeat the non-atomic pattern (journal.py:63 · rag.py:252 · config.py:93). Factor a single atomic_write into core and route all four through it.

Complexity S Impact Med Wow ★★
ShippedCorrectness

Unify _tilde() — two copies have a boundary bug

Eight command modules each define _tilde; the quality and intelligence versions use startswith(home) with no separator check (quality.py:78), so /Users/bob-backup wrongly contracts to ~-backup. Collapse to one helper in core/paths.

Complexity S Impact Med Wow ★★
ShippedPerformance

Cache the catalog entry-set across RAG queries

rag.retrieve() calls all_entries(), which reads & json.loads every tap cache on every search to build the live map (rag.py:323 · catalog.py:166–181) — the BM25 index is mtime-cached, the entry set is not. Memoize the entry set on cache mtime the same way.

Complexity M Impact Med Wow ★★★
ShippedPerformance

Stop re-serializing entry meta on every search

catalog.search computes json.dumps(meta).lower() for every entry on every query just to substring-match (catalog.py:222). Precompute a lowercased search blob at index time, or match structured fields directly.

Complexity S Impact Med Wow ★★
ShippedPerformance

Prune ignored dirs during scan_dir walk

Two full rglob passes descend into .git/node_modules and only filter afterward, and the skill-dir membership test is O(files × skill_dirs) (catalog.py:106,119–123). Switch to an os.walk that prunes ignored dirs in place; index skill dirs in a set.

Complexity M Impact Low-Med Wow ★★
PlannedTech-debt

Single tech-stack prober

Stack detection exists three times — discovery.detect_stack, intelligence._local_stack, quality._STACK_MARKERS (discovery.py:74 · intelligence.py:359 · quality.py:55) — and two already import detect_stack yet still carry a parallel marker table "as a fallback". Consolidate into one core prober.

Complexity M Impact Med Wow ★★
PlannedTech-debt

Single imperative-rule extractor

Three separate regexes scan SKILL.md bodies for "Always / Never / Must / Do not" lines across cmd_explain, simulate and conflict (info.py:363 · intelligence.py:254 · quality.py:822) — same concept, three implementations. Extract one shared core extractor.

Complexity M Impact Med Wow ★★
PlannedMaintainability

Split oversized command modules

quality.py (14 cmds / 1,051 lines) mixes audit regexes, conflict NLP, decay scoring, fingerprinting and a health dashboard; intelligence.py and configuration.py are similarly overloaded. Split along cohesive seams to shrink blast radius and sharpen mutation-gate targeting.

Complexity L Impact Med Wow ★★
ShippedMaintainability

Robust tag argument parsing

Because -tag looks like an option, cmd_tag calls parse_known_args then re-walks raw argv to reorder tokens (info.py:575–584) — fragile enough that the comment calls it "defensive". Replace with a positional-only sub-parser or an explicit --add/--remove design.

Complexity M Impact Med Wow ★★
ShippedTech-debt · RAG

Localize the stored BM25 snippet

_make_docs stored piece[:200] — the head of the best chunk — and retrieve surfaced it verbatim, yet the docstrings promised the "best-matching passage": when the matched terms sat past the chunk's first 200 chars, the shown snippet (and the rerank context fed to the LLM) missed them entirely. Now the index stores a larger head of the matched chunk (SNIP_STORE) and retrieve windows a SNIP_WIDTH-char passage centered on the first query term, with ellipsis markers on trimmed edges (_passage). Ranking is untouched — the eval harness confirms recall@10 holds at 0.919 — and the index grows a bounded ~34% (an INDEX_VERSION bump forces the one-time reindex); storing whole chunks instead cost ~70%.

Complexity M Impact Low Wow ★★★ query-centered snippets
PlannedCorrectness

Frontmatter scalar over-coercion

_scalar turns no/on/off/null into bool/None (core/frontmatter.py:32–53), so a tag or name literally equal to one of those parses to the wrong type and leaks into search/ranking meta. Restrict boolean coercion to true/false.

Complexity S Impact Low Wow ★★
PlannedInstall engine · Rules

Rule install — materialize rules into each agent's native format

Today store.install refuses every non-skill kind ("rules and workflows show up in boost search/boost taps for now"), so rules are indexed for discovery but land nowhere — there is no boost install path for a rule. Add one that writes each rule into the form the target agent actually reads, since there is no single cross-agent "rules folder": Cursor/Windsurf/Cline consume a rules directory (.cursorrules / .windsurfrules / .clinerules / .mdc), but Claude Code has no rules folder — its standing rules are CLAUDE.md. So installing a rule for Claude means merging it into CLAUDE.md (a managed, idempotent block), while for the others it means dropping the file into their rules dir. Needs a store/lock model for rules (uninstall must cleanly remove the merged block), mirroring how skills symlink into enabled_agents().

Complexity L Impact High Wow ★★★★ rules are indexed but never installed
PlannedInstall engine · Scope

Workspace scope — boost install --local into the project

boost is user-global only: the store is ~/.agents/skills and every install symlinks into home-level agent dirs (~/.claude/skills, ~/.cursor/skills, ~/.windsurf/skills). There is no per-project scope — install takes --agent (which agents) but no --global/--local. Add a workspace paradigm mirroring npm (local vs -g): boost install <skill> --local writes into the current repo's .claude/skills/ (and the other agents' project dirs), and — paired with rule install — merges a rule into the project's ./CLAUDE.md rather than the global one, so a team can commit its skills and rules with the repo. Needs a per-scope store/lock, scope resolution (walk up for the nearest project root), and list/sync/uninstall that understand both scopes.

Complexity L Impact High Wow ★★★★ --global vs --local, project .claude/

Code health & security

// planned · free tooling to catch vulns, smells & bugs
ShippedSecurity · Vuln

Security linting — bandit via ruff S rules

Turn on the flake8-bandit (S) rule family already bundled in ruff — one line in pyproject.toml, zero new tools. It catches the Python SAST smells the linter is blind to today: subprocess(shell=True), assert as a runtime check, tempfile.mktemp, unsafe yaml.load, hardcoded secrets and weak hashing. Semgrep Community rules are the heavier alternative when a finding needs real dataflow.

Complexity S Impact High Wow ★★★ extend-select S; git/swallow rules ignored, real cases noqa'd
ShippedSecurity · Supply chain

Dependency CVE gate — pip-audit

PyPA's pip-audit fails CI when a resolved dependency matches a known advisory in the OSV / PyPI Advisory database. Dependabot opens update PRs but never blocks a merge on a live CVE; a scheduled + PR pip-audit job closes that gap and covers the dev/test toolchain that ships nothing but can still run malicious code.

Complexity S Impact Med Wow ★★ OSV-backed
ShippedQuality · Retrieval eval

Retrieval-quality eval harness (Tier 1 + rerank lift)

Boost's unit tests prove the retrieval math is arithmetically correct, but nothing graded whether search returns the right skill for a real question. This adds a golden-set harness — tests/eval/golden.jsonl, 43 query → relevant skill(s) judgments across skills, rules and workflows — scored with rank-aware IR metrics (recall@k, hit@1, MRR, nDCG@k). Deterministic and offline over the tapped catalog, so it runs as a local pre-release gate (make eval, --fail-under 0.85) alongside make check, with a pinned baseline (tests/eval/baseline.json) that flags regressions. The first run earned its keep immediately, exposing a duplicate-name double-count (recall 2.7) fixed by deduping the ranked list. A three-way engine compare proved BM25 full-content (0.919 recall) decisively beats the frontmatter heuristic (0.756), justifying the RAG stack. An opt-in, key-gated make eval-ai arm reuses the same labels to measure the LLM rerank lift — no judge needed — and confirmed rerank promotes the right skill to #1 in 16% more cases (hit@1 0.605 → 0.767) at unchanged recall. A Tier 2b arm (eval_recommend.py, make eval-rec) grades the boost recommend AI pick stage over golden project stacks with a hard grounding gate: it found the AI picks statistically tied with the heuristic on precision but perfectly grounded (0 hallucinated / off-shortlist picks) — the honest verdict that this stage earns its place through explanations and safety, not better ranking.

Complexity M Impact High Wow ★★★★ golden-set IR gate
PlannedSecurity · Posture

Supply-chain posture — OpenSSF Scorecard

The Scorecard GitHub Action audits ~18 supply-chain signals weekly — branch protection, token permissions, SHA-pinned actions, dangerous workflows, signed releases — and publishes results to the Security tab plus a README badge. Turns "are we set up safely?" into a tracked, trend-able number for a repo that owns a Trusted-Publisher release path.

Complexity S Impact Med Wow ★★★★ badge-worthy
PlannedSecurity · Secrets

Secret scanning — gitleaks + push protection

Scan the full history and every PR diff for leaked tokens, keys and PyPI credentials with the free gitleaks action, paired with GitHub push-protection (free on public repos) so a secret is blocked before it lands. Cheap insurance for a project whose release automation trades on trusted identity.

Complexity S Impact Med Wow ★★★ pre-commit-able
PlannedQuality · Smell

Complexity & dead-code radar — xenon · vulture

Gate CI on a maintainability grade with xenon (built on radon) and flag unreachable branches, unused arguments and orphan helpers with vulture. First target: the ~5,000-line commands/ layer that has no complexity signal today. Surfaces the structural smells mutation testing can't see.

Complexity M Impact Med Wow ★★ commands/ first
PlannedQuality · Platform

Quality dashboard — SonarCloud (free for OSS)

SonarCloud is free for public repos and layers bugs, code smells, security hotspots, duplication and a coverage overlay into one dashboard, decorating each PR with a pass/fail quality gate. The single highest-signal freemium add — one external surface that unifies everything else in this section.

Complexity M Impact High Wow ★★★★★ PR quality gate
PlannedTesting · Bug

Property-based tests — hypothesis on the parsers

Generate adversarial inputs against core/frontmatter and core/catalog.scan_dir to surface crashes and round-trip failures the example-based unit tests never think to try — a dumpparse must round-trip; a scan must never raise on arbitrary bytes. Complements the gate: mutmut proves the tests are strict, Hypothesis proves the inputs are wide.

Complexity M Impact High Wow ★★★★ finds edge cases
PlannedTesting · Bug

Coverage-guided fuzzing — atheris / OSS-Fuzz

Google's atheris fuzzes the frontmatter and registry parsers under coverage guidance to mine deep crash inputs; OSS-Fuzz runs it continuously for free once boost qualifies as an open-source project. The stretch goal — the highest ceiling for finding the bug nobody thought to write a test for.

Complexity L Impact Med Wow ★★★★ stretch
ShippedReliability · Network

Fork-safe network layer — explicit ProxyHandler

core/ai.py and core/embed.py call urllib.request.urlopen with the default opener, which on macOS runs getproxies_macosx_sysconf()_scproxy → SystemConfiguration/CoreFoundation — an Obj-C path that is not fork-safe and aborts on the child side of a fork(). Harmless in today's single-process CLI, but fragile if boost ever runs post-fork (a future multiprocessing worker, or an embedding host). Build the opener with an explicit ProxyHandler honoring HTTP(S)_PROXY/NO_PROXY so network calls never touch the Obj-C proxy machinery — deterministic and fork-safe.

Complexity S Impact Med Wow ★★★ avoid macOS _scproxy Obj-C path
ShippedObservability · Diagnostics

Log timestamps are local time mislabeled Z

core/logs.py builds the logging.Formatter with datefmt="%Y-%m-%dT%H:%M:%SZ" but never sets converter = time.gmtime, so %(asctime)s uses local time while stamping a literal Z (UTC) suffix. Every line in ~/.boost/logs/boost.log is therefore off by the machine's UTC offset — which nearly caused a 5-hour mis-correlation when matching the log against an OS crash report. Set the formatter's converter to time.gmtime (or drop the Z) so the trail is honestly UTC, making the pid/ppid crash-correlation breadcrumbs trustworthy.

Complexity S Impact Med Wow ★★ converter = time.gmtime

Pipeline & supply-chain integrity

// planned · free tooling to secure the CI/CD path itself
PlannedSecurity · CI/CD

Workflow SAST — zizmor

boost's four workflows embed github-script JavaScript and shell and drive a Trusted-Publisher release — a rich attack surface. zizmor statically flags template injection, unpinned actions, over-broad GITHUB_TOKEN permissions and dangerous triggers. The one tool that audits the automation that ships every other fix.

Complexity S Impact High Wow ★★★★★ pipx-run
ShippedQuality · CI/CD

Workflow linting — actionlint

Catches GitHub Actions YAML bugs before they fail a live release: malformed ${{ }} expressions, deprecated syntax, and shellcheck run over every run: block. Cheap insurance for a repo whose release is fully automated — a broken workflow is a broken publish.

Complexity S Impact Med Wow ★★★ shellcheck built in
PlannedSecurity · Supply chain

Build provenance — SLSA attestations

actions/attest-build-provenance emits a cryptographically signed, verifiable record of which workflow built which wheel from which commit, layered on top of the existing PyPI Trusted Publishing. Consumers can gh attestation verify the artifact they install — provenance without a paid signing service.

Complexity S Impact Med Wow ★★★★ SLSA build L2
PlannedSecurity · Supply chain

SBOM on every release — CycloneDX / Syft

Generate a CycloneDX SBOM with the free anchore/sbom-action and attach it to each GitHub Release, so downstreams can inventory and scan exactly what boost is built from. Modest today (boost is close to stdlib-only) but it grows in value as the optional [rag] extras pull in real dependencies.

Complexity S Impact Med Wow ★★★ feeds osv-scanner
PlannedSecurity · Vuln

SBOM-aware scanning — osv-scanner

Google's osv-scanner cross-checks a lockfile or the SBOM above against the OSV database, with broader ecosystem coverage than a single-language audit. The SBOM-driven complement to pip-audit: one scans the resolved env, the other scans the published manifest.

Complexity S Impact Med Wow ★★ OSV-backed
PlannedTesting · Type

Second type checker — pyright

Run Microsoft's pyright alongside mypy. Its independent inference catches None-flow and narrowing bugs the current mypy config lets slide, and it's the same engine most editors use — so CI enforces what contributors already see. Two type checkers rarely agree on nothing.

Complexity M Impact Med Wow ★★★ editor-parity
PlannedQuality · Smell

Widen the ruff rule surface — B·SIM·C4·PERF·RUF

Beyond the S security family (round 1), enable flake8-bugbear (B), simplify (SIM), comprehensions (C4), perflint (PERF) and Ruff-native (RUF) rules — bug, readability and performance smells caught at zero new-tool cost since ruff already runs in the lint gate.

Complexity S Impact Med Wow ★★★ 0 new deps
PlannedTesting · Gap

Patch-coverage gate — diff-cover

Enforce coverage on the changed lines of each PR — no external service needed, it reads the same coverage.xml the suite already emits. Pairs with the 80% project gate so new code can't quietly ride in under-tested behind an already-high overall number.

Complexity S Impact Med Wow ★★ self-hosted

Developer experience & maintainability

// planned · free tooling to catch issues earlier & keep the code legible
PlannedDX · Design system

Promote nav / footer into the shared style system

Canonical style/boost.css ships tokens + primitives but no nav, logo, or footer, so every page (the guide and both roadmaps) redefines that chrome inline — and the Design Roadmap currently renders its nav unstyled because of the gap. Add .site-nav/.logo/footer primitives to the one sheet so the chrome is defined once and can't drift.

Complexity S Impact Med Wow ★★★ style/boost.css
PlannedDX · Infra

Shift-left gate — pre-commit + pre-commit.ci

A .pre-commit-config.yaml runs ruff, mypy, codespell and the whitespace fixers before code ever reaches CI, and the free-for-OSS pre-commit.ci auto-fixes and auto-updates hooks right on the PR. The foundation the rest of this section plugs into — one config, many checks, faster feedback.

Complexity S Impact High Wow ★★★★ auto-fix PRs
PlannedQuality · Architecture

Layering guard — import-linter

Enforce the architecture boost already assumes: core/ must never import commands/, and the CLI depends inward only. import-linter turns that contract into a CI check, catching the cross-layer imports that slowly erode a clean engine — a structural smell no line-level linter can see.

Complexity M Impact Med Wow ★★★★ core/ ↛ commands/
ShippedQuality · Docs

Typo detection — codespell

Cheap, high-signal for a project this documentation-heavy: scan the README, docs/*.html, docstrings and every user-facing CLI string for misspellings. A typo in boost --help is a bug users see on their first run.

Complexity S Impact Med Wow ★★ user-facing text
PlannedQuality · Docs

Docstring coverage — interrogate

Gate CI below a docstring-coverage threshold so the engine stays self-documenting as it grows. core/ is already well commented; interrogate keeps it that way and flags the new public function that shipped without a word of explanation.

Complexity S Impact Low Wow ★★ keeps core/ documented
PlannedTesting · Perf

Performance-regression gate — pytest-benchmark

Benchmark the hot paths — a catalog scan over a large skills tree, a registry load — and fail the build when a change regresses them past a threshold. Catches the performance bugs a correctness suite waves through: the O(n²) that only bites at scale.

Complexity M Impact Med Wow ★★★ scan & registry
PlannedQuality · Smell

Modernization smells — refurb + pyupgrade

refurb's unique FURB checks flag dated idioms the ruff families miss, and pyupgrade rewrites to the cleanest form the >=3.9 floor allows. Keeps the codebase reading like modern Python instead of accreting legacy patterns.

Complexity S Impact Low Wow ★★ respects 3.9 floor
PlannedTesting · Platform

Coverage dashboard — Codecov (free for OSS)

Upgrade the homegrown coverage badge to Codecov's PR diff-coverage comments, file sunburst and trend graph — free for public repos. The hosted counterpart to the self-contained diff-cover gate: one enforces patch coverage in CI, the other visualizes the trend over time.

Complexity S Impact Med Wow ★★★ PR decoration
PlannedSecurity · CI/CD

Runner egress monitoring — StepSecurity Harden-Runner

Free for public repos, Harden-Runner watches (and can block) unexpected network egress from CI runners — the runtime signal that catches a compromised action exfiltrating a token. The dynamic complement to zizmor's static workflow analysis, guarding the release path from both sides.

Complexity S Impact Med Wow ★★★★ runtime + static

Docs-site & content quality

// planned · free tooling for the Pages site, README & prose
ShippedDocs · Discoverability

Make the roadmaps discoverable

The living roadmaps were unreachable unless you knew the URL: design-roadmap.html was linked nowhere and the README had no roadmap link at all. The Visual Guide nav now carries both boards (a Design ↗ entry beside the existing Roadmap ↗), and the README opens with a Roadmap section linking the code and design boards plus the Visual Guide — so the two data-driven boards are one click away and the work stays visible.

Complexity S Impact Med Wow ★★★ nav + README links
PlannedDocs · Perf

Lighthouse CI on the Pages site

treosh/lighthouse-ci-action scores index.html and roadmap.html on performance, accessibility, best-practices and SEO on every deploy, and fails the build against budgets. Turns the marketing surface's quality into a number that can't silently regress as the Aurora theme evolves.

Complexity M Impact High Wow ★★★★★ 4 score budgets
PlannedQuality · A11y

Accessibility audit — pa11y-ci / axe-core

Run WCAG checks over the rendered pages: colour contrast, focus order, alt text and ARIA. The Aurora palette leans on muted --text-2/--text-3 tokens against dark glass — exactly where contrast ratios slip below AA. Catches the a11y regressions a purely visual review misses.

Complexity M Impact Med Wow ★★★★ WCAG AA
PlannedQuality · Docs

HTML validation — html-validate

The guide and roadmap are hand-authored HTML whose tags are balanced by eye today. A CI html-validate pass catches unclosed elements, duplicate ids and invalid nesting before they ship a subtly broken layout — the automated version of the manual tag-count sanity check.

Complexity S Impact Med Wow ★★★ hand-authored HTML
PlannedQuality · Docs

Broken-link & anchor checking — lychee

Fast, free link checker over the README and docs/*.html: verifies external URLs (GitHub, PyPI), asset paths (../style/boost.css) and in-page anchors (#next, #health) still resolve. A dead link in the landing page is the first broken promise a visitor sees.

Complexity S Impact Med Wow ★★★ URLs + anchors
PlannedQuality · Content

Prose & terminology linting — vale

vale enforces a consistent voice across the README and docs with a small boost vocabulary — canonical spelling of skill, tap, registry; no Boost/boost drift; flagged weasel words. Keeps a docs-heavy project reading like one author wrote it.

Complexity S Impact Low Wow ★★ house style
PlannedQuality · Docs

Markdown consistency — markdownlint-cli2

Lint every Markdown surface — README, CLAUDE.md, DEBUGGING.md, rag-architecture.md — for heading order, list style and fenced-code hygiene. Cheap, deterministic, and it keeps the contributor-facing docs as tidy as the code the gates already enforce.

Complexity S Impact Low Wow ★★ every .md
PlannedQuality · Style

Theme-asset linting — stylelint + eslint

The shared style/boost.css and boost.js theme the guide, roadmap and demo together, so a bug there recolours or breaks everything at once. stylelint guards the CSS tokens and eslint the reveal/interaction JS — the one place a small mistake has system-wide blast radius.

Complexity S Impact Med Wow ★★ shared blast radius
PlannedTesting · Docs

Post-deploy smoke — headless load check

After each Pages deploy, headless-load the guide and roadmap and assert the essentials: HTTP 200, every asset resolves, and the console is free of errors. Distinct from the planned visual-regression pass — this is a cheap always-on health gate that would have caught the current broken Pages deploy automatically.

Complexity M Impact Med Wow ★★★ catches red deploys
PlannedDocs · Command reference

Command reference documentation site

boost has no browsable command reference — help lives only in --help output and scattered README prose, so there's no versioned, searchable home for what each command does. Build a proper docs site in the shape of learning-python.readthedocs.io: a left-nav tree of commands, per-command pages (synopsis, flags, examples, exit codes), and full-text search. Generate the command pages from the CLI's own definitions so the docs can't drift from the code, and publish alongside the existing Pages site under the Aurora theme.

Complexity M Impact High Wow ★★★★ Read the Docs–style
ShippedDocs · Discoverability

Surface every docs/*.html page from the main page

Making the roadmaps discoverable put both boards in the Visual Guide nav, but the same gap remains for the rest of docs/*.html: mcp-hub.html is reachable only if you already know the URL — nothing on index.html links to it. Add a nav entry for every shipped doc page (today just the MCP Hub, beside Roadmap ↗ / Design ↗) so no page is an orphan, and treat "a new docs/*.html means a new nav link" as the standing rule — ideally checked in CI so a future page can't ship unlinked.

Complexity S Impact Med Wow ★★
PlannedDocs · Visual polish

Fix overflowing node text in the RAG diagram (mcp-hub.html)

On the Fig 2 RAG-pipeline diagram, the read_body → chunk node overflows its rounded box: the third caption line (1000 chars · 150 overlap · ≤40…) runs past the node's right border and is clipped where the pink embed arrow begins. Give the node room so all three lines sit inside the bubble — widen its min-width, wrap or shrink the caption, or trim the label text — and re-check the other nodes at the same breakpoint so none clip.

Complexity S Impact Low Wow ★★ read_body→chunk node clips its 3rd line

Compatibility & install integrity

// planned · free tooling to prove boost installs & runs everywhere it claims
PlannedCompat · Platform

Windows in the CI matrix

The test matrix runs macOS and Ubuntu only, so windows-latest path separators, case-sensitivity and console-encoding bugs ship uncaught to any Windows user. Adding one matrix leg closes the biggest untested surface for a tool that promises to work "everywhere your agent does".

Complexity S Impact High Wow ★★★★ untested OS
ShippedTesting · Install

Clean-env install smoke — pip & pipx

Every gate runs against an editable pip install -e ., which hides missing package-data, a broken entry point or an undeclared dependency. A job that pip installs the built wheel into a fresh venv (and pipx installs it) then runs boost --version proves the artifact a user actually gets works.

Complexity S Impact High Wow ★★★★ tests the real artifact
PlannedTesting · Deps

Lowest-version resolution — uv --resolution lowest-direct

CI always installs the newest compatible dependencies, so the lower bounds declared in pyproject.toml are never actually exercised. Resolving and testing against the minimum versions catches the "works here, breaks on the floor we advertise" class of bug.

Complexity S Impact Med Wow ★★★ honours declared floors
PlannedCompat · Python

Pre-release Python canary — 3.14t free-threaded

An allow-failure matrix leg on Python pre-releases and the free-threaded (no-GIL) build gives early warning of breakage before users on new interpreters hit it. Cheap insurance for a project that already targets 3.9 → 3.14 and can't afford a surprise on release day.

Complexity S Impact Med Wow ★★★ continue-on-error
PlannedPerf · Startup

Startup & import-time budget — -X importtime

For a CLI, cold-start latency is the UX — every command pays it. A gate on python -X importtime boost catches the accidental top-level import of a heavy module (the optional [rag] stack is the obvious trap) and keeps common commands feeling instant.

Complexity M Impact High Wow ★★★★ lazy-import guard
PlannedQuality · Packaging

Package-metadata validation — twine check + friends

Before every publish, twine check confirms the long description renders on PyPI, check-wheel-contents catches stray or missing files, and pyroma scores the metadata completeness. Stops a broken PyPI page or an empty wheel from reaching users — the release path currently trusts the build blindly.

Complexity S Impact Med Wow ★★★ pre-publish gate
PlannedSecurity · Repro

Hash-pinned, reproducible toolchain — uv.lock

Pin the dev and CI toolchain with a hash-locked uv.lock (or a hashed constraints file) so a yanked or compromised transitive dependency can't silently change a build. The reproducibility layer that complements Dependabot and pip-audit — same inputs, same bytes, every run.

Complexity M Impact Med Wow ★★★ supply-chain repro
PlannedTesting · Infra

One command, every env — nox

A noxfile.py makes the full lint / test / smoke / mutation gate reproducible across 3.9 → 3.14 in isolated environments, locally and in CI alike — so "green on my machine" and "green in CI" finally mean the same thing, and a contributor can run the exact gate before pushing.

Complexity S Impact Med Wow ★★ local == CI
ShippedCompatibility · macOS

Harden boost mcp launch against macOS Obj-C fork aborts

On macOS, a host that spawns boost mcp --stdio via fork() can abort on the child side pre-exec when Obj-C is touched post-fork (CFPreferences / _scproxy proxy lookup) — the classic "crashed on child side of fork pre-exec" SIGABRT. Not boost's own code (it aborts before boost runs), but boost can make its integration robust: when registering the MCP server (boost mcp register / the emitted client config), set OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES (and no_proxy=*) in the launch environment so the host's fork into boost can't trip the Obj-C fork-safety abort. Document it for hosts that launch boost directly.

Complexity S Impact Med Wow ★★★ OBJC_DISABLE_INITIALIZE_FORK_SAFETY

Skill-content trust & safety

// planned · boost's core threat model — the third-party skills it installs run inside an agent
ShippedSecurity · Content

Prompt-injection scanning of skill Markdown

The highest-signal gap: boost installs Markdown an agent then executes, and nothing inspects that content. Scan skills for injection patterns — "ignore previous instructions", data-exfiltration prompts, embedded curl … | sh — with free rule engines (semgrep custom rules, garak/llm-guard patterns) at tap and install time.

Complexity M Impact High Wow ★★★★★ the core risk
PlannedSecurity · Integrity

Integrity verification — boost verify

The lockfile already records a sha256 per install via util.sha256_dir, but nothing ever re-checks it. A verify command (and a doctor gate) that re-hashes installed skills and flags drift turns that stored digest into actual tamper-detection — cheap, and built on machinery that already exists.

Complexity S Impact High Wow ★★★★ reuses sha256_dir
PlannedSecurity · Provenance

Tap signing & provenance — Sigstore / minisign

A tap records its commit today but offers no cryptographic proof the content came from its claimed publisher, so a hijacked mirror can serve altered skills undetected. Verify a signature (Sigstore keyless or minisign) before trusting a tap — free, and the standard the wider ecosystem is converging on.

Complexity M Impact Med Wow ★★★★ keyless OIDC
ShippedSecurity · Registry

Typosquat & name-confusion detection

The classic package-manager attack: a skill named one edit-distance from a popular one, or a familiar name that quietly resolves to an unexpected owner/repo. Flag near-duplicate names and owner mismatches at search and install time so a user can't fat-finger their way into a malicious skill.

Complexity M Impact Med Wow ★★★★ edit-distance guard
PlannedSecurity · Supply chain

Update-diff before apply

boost update overwrites installed skills in place. Show a content diff of what an upstream change alters — and require confirmation for anything that touches executable-looking instructions — so a poisoned update is visible instead of silent. The "review the diff" gate, applied to skills.

Complexity M Impact Med Wow ★★★ no silent overwrites
PlannedSecurity · Secrets

Secret & PII scanning of installed skills

Point the round-2 secret scanners (gitleaks/trufflehog) at third-party skill content, not just boost's own repo — catching a skill that ships embedded credentials or, worse, one whose prompt coaxes the agent into harvesting the user's. Same free tools, a different and higher-stakes target.

Complexity S Impact Med Wow ★★★ installed content
PlannedSecurity · Integrity

Lockfile enforcement & commit pinning

Promote the recorded sha256 from a note to a rule: refuse to load a skill whose content has drifted from the lockfile, and let users pin a skill to an exact commit. The enforcement layer that makes the verify digest binding rather than advisory.

Complexity S Impact Med Wow ★★★ pin to commit
PlannedSecurity · Policy

Capability manifest & least-privilege policy

Extend the existing policy.py so a skill declares the capabilities it expects — network, shell, file scope — and the user's policy allows or denies them. Turns install-time governance into least-privilege for the instructions an agent is about to run, the natural next step for a tool that already blocks installs by policy.

Complexity L Impact Med Wow ★★★★ builds on policy.py