Repository navigation
v3.2.0
What's new
Features
Systematic now ships as a distributable Claude Code plugin (#660). The work landed as a series of coordinated changes: a new Claude Code capability profile (skills/using-systematic/references/claude-code-profile.md) documents the harness's verified mechanisms — name-based subagent dispatch, AskUserQuestion, the TaskCreate family, and native Skill/SKILL.md discovery — grounded in HARNESSES.md evidence and a live Desktop probe, resolving a previously-unverified subagent_type note. HARNESSES.md promotes Claude Code from Tier 2 to Tier 1 accordingly, with a new install guide covering the output-style/hook/native-skill channel model.
The bundle itself is generated, not committed: scripts/build-claude-code-plugin.ts mirrors the existing registry codegen pattern, walking skills/ and agents/ source to flatten 37 agents and copy 31 skills into a self-contained plugin, rendering an output-style from the using-systematic skill body plus the CC profile, and emitting a declarative SessionStart hook well under the platform's size cap. After an initial approach that committed the bundle, the design was reworked mid-series into an ephemeral, build-time-translated artifact — identifiers are rewritten to Claude Code's plugin-namespaced form (e.g., ce:brainstorm → systematic:ce-brainstorm), a generated-namespace integrity gate catches any untranslated reference, and the 151 previously-committed bundle files were removed in favor of gitignoring claude-code/ as build staging.
Distribution happens from CI: a .claude-plugin/marketplace.json on main points Claude Code at the built plugin on a dedicated claude-code-plugin branch, which a publish job fast-forwards on every push to main using the built-in GITHUB_TOKEN (no App token or PAT, and its pushes don't recursively trigger workflows). Users install via claude plugin marketplace add marcusrbrown/systematic. Along the way, two dangling skill references (ce:debug, ce:polish-beta) with no bundled directory were found and neutralized, and a new content-integrity check now hard-fails the build if any ce:<name> reference fails to resolve to a real skills/ce-<name>/ directory — closing off that class of broken reference for good. Validation is covered by tests/integration/claude-code.test.ts, which checks shared-core fidelity, artifact self-containment, and that the build never writes to src/.
Code Refactoring
The ce-plan skill's Phase 1.1/1.3/1.5 research-agent dispatch instructions used a fake function-call form (task systematic:research:X(...)) that read as literal, executable code on any harness (#656). It's rewritten as prose (Dispatch \systematic::` — pass ...) matching ce-plan's own existing dispatch-instruction style. The qualified persona IDs themselves are unchanged: they're the canonical, phantom-validated cross-reference form that checkReferenceIntegritychecks againstagents//.md`, and a broader bare-name conversion was investigated and reverted specifically because it would have dropped that validation coverage.
Documentation
Two solutions entries compound recent learnings. One captures why the ce-plan pseudo-dispatch fix above collapsed from a planned four-skill refactor plus a new content-integrity gate down to a five-line prose change: the qualified persona ID syntax was never the bug, only the fake-call form was (#657). The other closes out the harness-portability plan from v3.1.0, adding the neutral-v1 marker and migrated-set identifier gate patterns, documenting a unit-suite-rewrites-repo-file trap that caused a double re-review on #653, and cross-linking related warning-channel and dry-run-integration docs (#655).
Miscellaneous Chores
Renovate's pi-coding-agent bump to v0.80.7 uncovered a matched-pair dependency hazard: a bare lockfile re-resolve floated the transitive pi-ai package to v0.80.10, which dropped the getOAuthApiKey OAuth export the Pi CLI imports at startup, crashing dist/cli.js (#651). The fix pins pi-ai to the version-matched v0.80.7, and Renovate is now configured to group the @earendil-works packages together so future bumps raise one matched PR instead of letting the pair drift independently.
Also in this release
- build: update OpenCode to v1.18.2 (#659)
- build: update OpenCode to v1.18.1 (#654)
- chore(deps): update dependency @biomejs/biome to v2.5.4 (#658)