π± oss β Claude Code Plugin¶
OSS workflow plugin for Python/ML open-source projects. Four agents (two user-facing, two internal pipeline) and five slash-command skills: issue analysis, parallel code review, PR resolution, release artifacts/readiness, and post-install rule setup.
Public actions stay maintainer-owned: replies, merges, pushes, tags, and releases are drafted or prepared here, never posted or published automatically.
Works standalone β
foundrynot required. Without it, agent dispatches fall back togeneral-purposewith role descriptions and less specialization. Installingfoundryunlocks the specialized agent roster.
π Contents
- [What is oss?](#-what-is-oss) - [Why oss?](#-why-oss) - [Install](#-install) - [Quick start](#-quick-start) - [Skills reference](#-skills-reference) - [/oss:analyse](#ossanalyse) - [/oss:review](#ossreview) - [/oss:resolve](#ossresolve) - [/oss:release](#ossrelease) - [/oss:setup](#osssetup) - [Agents reference](#-agents-reference) - [oss:gh-scraper](#gh-scraper) - [oss:repo-warden](#repo-warden) - [oss:shepherd](#ossshepherd) - [oss:cicd-steward](#osscicd-steward) - [Configuration](#-configuration) - [Bin helper inventory](#bin-helper-inventory) - [Troubleshooting](#troubleshooting) - [Contributing / feedback](#contributing--feedback)π€ What is oss?¶
oss = Claude Code plugin for Python/ML open-source maintainers. Five slash-command skills β analyse, review, resolve, release, and setup β plus four agents for contributor communication, CI health, and vitality data collection/scoring. It covers recurring maintainer work: triaging GitHub threads, multi-perspective PR review, organizing review feedback into fixes, and preparing release artifacts with readiness checks.
π― Why oss?¶
Maintaining OSS = three competing demands: review code carefully (catch regressions), respond to contributors fast (keep engaged), ship releases confidently (users upgrade). Each = context-switch tax.
oss targets that tax:
Reduce review context switching. /oss:review classifies the PR, runs relevant review dimensions in parallel, and writes a ranked report. The default fan-out is capped at four scope-selected dimensions; --full runs every dimension selected by scope. An optional Codex integration can add a co-review, and missing optional agents fall back gracefully.
Contributors get a usable response draft. The --reply flag drafts a welcoming comment in project voice, citing project conventions. The draft is written for maintainer review; the plugin does not post it automatically.
Turn review feedback into traceable action items. /oss:resolve closes the gap between "reviewer said X" and "X in code." It reads live PR comments, a saved review report, or both; deduplicates sources; resolves conflicts semantically; and implements selected items with [resolve No.N] attribution, using isolated worktrees for specialist batches.
Release communication stays grounded in the diff. /oss:release classifies changes, checks documentation/version consistency, writes release notes and optional changelog/summary/migration artifacts, and audits readiness. It does not edit package versions, create tags, or publish packages.
Triage with structure. /oss:analyse vitality produces a repo vitality scorecard with duplicate issue clustering and stale-PR detection. A specific thread becomes a structured summary with next actions.
π¦ Install¶
After installation, run /oss:setup once to link this plugin's rules into ~/.claude/rules/; use /oss:setup --approve for the non-interactive path. Re-run it after an upgrade. In this repository, make sync-claude invokes that setup path for managed installs.
Recommended setup:
oss requires Claude Code, Python 3.10+, and an authenticated GitHub CLI (gh auth login) for GitHub-backed workflows. The plugin can run without foundry, but agent calls then use general-purpose fallbacks with lower specialization.
Optional integrations (unlock extra capabilities inside oss skills):
| Plugin | What it unlocks |
|---|---|
foundry |
Specialized review and implementation agents instead of general-purpose fallbacks |
bridge@borda-ai-rig |
Optional Codex co-review in /oss:review and Codex action-item dispatch in /oss:resolve |
codemap-py |
Reverse-dependency count (rdep_count) in /oss:review risk assessment; stale-symbol detection in /oss:analyse issue triage, Open-PR Overlap + Structural Constraints in /oss:analyse vitality |
All oss skills degrade gracefully when optional plugins absent β reduced capability, not broken commands.
Install the optional Codex integration only if you need those paths:
For codemap-backed structural signals, install codemap-py from the same marketplace:
For local-file review, install develop and use /develop:review (requires develop plugin); /oss:review is for GitHub pull requests.
Note: Skills always use the
oss:prefix:/oss:analyse,/oss:review,/oss:resolve,/oss:release, and/oss:setup.
β‘ Quick start¶
# Morning: understand what needs attention
/oss:analyse vitality
# Review top PR and draft a contributor-facing response
/oss:review 55 --reply
# Apply selected review feedback
/oss:resolve 55 report
# Prepare release artifacts
/oss:release prepare v2.1.0
π§ Skills reference¶
/oss:analyse¶
Analyse GitHub threads + repo vitality. Accepts issue/PR number, keyword vitality, keyword ecosystem, or path to saved report file.
Purpose: Structured actionable summary of any GitHub thread, or broad view of open work. No need to read every comment yourself.
Auto-invokes when: user gives GitHub issue/PR number (#N) or github.com URL + asks analyze/summarize/triage; user asks "is this repo healthy" or vitality stats.
Invocation:
/oss:analyse 123 # issue, PR, or discussion by number
/oss:analyse vitality # repo vitality: 9-axis health scorecard, duplicate clustering, raw data JSONL
/oss:analyse vitality --quick # fast daily scorecard: core scoring only, skips codex + adversarial passes
/oss:analyse ecosystem # dependency health, upstream compatibility
/oss:analyse path/to/report.md # re-analyse a saved report
Flags:
| Flag | Effect |
|---|---|
--reply |
Draft contributor-facing response after analysis (routed through oss:shepherd for voice consistency) |
--quick |
Vitality only: fast daily scorecard β skips Codex independent review + adversarial rework loop, reduces to 4 spawns. Full (reviewed) mode = default; confidence capped lower in quick mode. |
--keep "<items>" |
Append quoted string to compaction contract's preserve: line β items survive auto-compact mid-run (advanced; long multi-agent sessions) |
What it does:
Thread number: fetches issue/PR, reads all comments, classifies thread type (bug report, feature request, question, duplicate, stale), produces structured summary: what asked, current state, action needed from you, and β with --reply β draft response. With codemap index present, symbols/modules named in issue thread existence-checked against index; identifiers that no longer resolve flag issue as referencing stale code (with likely rename target when codemap suggests one).
vitality: pulls open issues + PRs, scores repo across 9 axes (Axes 1β8 plus Axis 9 Trajectory), clusters duplicates, flags threads stale beyond project threshold, gives prioritised triage list with weighted Health Score %. All raw API data saved to JSONL file alongside report for manual inspection. With codemap index, report gains Open-PR Overlap note (pairwise changed-file overlap plus tightly-coupled-module conflict candidates) and Structural Constraints block (highest-blast-radius modules, collision/degraded/stale index signals). Every codemap signal optional β no index or plugin absent β analyse degrades to GitHub-only behavior, flags gap inline, never blocks.
Sample vitality scorecard (terminal output):
# Repo Vitality β example/mylib
**Skill:** oss:analyse v0.7.0 Β· **Generated:** 2026-05-11T10-00-00Z
---
## Executive Summary
Project is in healthy condition (74%) with strong CI/CD and documentation.
Bus factor of 2 is the primary risk. Dependency update config absent.
**Health Score:** 74% π‘ Β· 5 healthy Β· 3 warning Β· 1 critical Β· 0 unavailable (βͺ)
**Top Risk:** Axis 3 bus factor = 2 β one departure stalls merges
---
| # | Axis | Score | Status | Key Signal |
|---|----------------------|--------|--------|--------------------------------------|
| 1 | Responsiveness | 10.0 | π’ | median issue 1.2d, PR 0.8d; 94% β€7d |
| 2 | Maintenance activity | 10.0 | π’ | last commit 3d, 18 commits/30d |
| 3 | Contributor health | 5.0 | π‘ | bus factor 2, retention 67% |
| 4 | Issue & PR health | 5.0 | π‘ | stale 18%, close 0.71, review 62% |
| 5 | CI/CD & code quality | 10.0 | π’ | 5/5 checks, CI pass 95% |
| 6 | Documentation | 7.8 | π’ | 7/9 checkpoints |
| 7 | Governance | 8.3 | π’ | 5/6 files, active maint 3/3 |
| 8 | Security posture | 5.0 | π‘ | dep-config: no, alerts: 403 |
| 9 | Trajectory | 5.0 | π‘ | pool -10%, TTM 2d->3d, P90 45d, dep 12% |
| | **Total Score** | **74%** | | |
Output locations:
- Thread analysis:
.reports/analyse/thread/ - Vitality report:
.reports/analyse/vitality/ - Ecosystem report:
.reports/analyse/ecosystem/
GitHub API responses cached in .cache/gh/ by number and date (30-day TTL) β repeated calls on same thread fast.
/oss:review¶
Scope-aware parallel review of a GitHub PR. Input is a PR number or a saved review report for reply drafting.
Purpose: Review architecture, tests, performance, docs, linting, and security in parallel. Produce a ranked findings report and, optionally, a welcoming contributor comment.
Invocation:
/oss:review 55 # scope-aware review β saves findings report
/oss:review 55 --reply # review + draft contributor-facing comment
Local files or current git diff without PR β use
/develop:reviewfromdevelopplugin.
How the pipeline works:
Tier 0 git diff --stat
Scope detection β exits only if no Python or doc files changed
Acceptance gate β Stage 1 (reject, terminal) then Stage 2 (block,
non-terminal); reads PR description + known CI status before any
agent spawns. Full criteria: "Review stages" below.
Optional Codex co-review
Runs when `bridge@borda-ai-rig` is installed and enabled; otherwise skipped
Tier 2 Parallel review dimensions
PR metadata/diff/checks fetched once at Step 0 (per-run snapshot) and reused by every stage
Scope selects spawn units β paired dimensions share one agent
(perf+architecture in one opus spawn, docs+lint in one sonnet spawn),
each writing its own per-dimension finding file + confidence block
Default ranks units under a cap of three; qa-specialist is pinned
outside the cap (security scan runs on every code PR)
`--full` runs every unit selected by scope
Without foundry, requested agents use general-purpose fallbacks
Scope examples:
docs-only PR β foundry:doc-scribe (+ challenge/Codex when enabled/available)
docs + CI PR β oss:cicd-steward + foundry:doc-scribe (+ challenge/Codex)
tests + CI β foundry:qa-specialist + foundry:linting-expert
code PR β pinned qa-specialist + top-ranked units from code, perf+architecture, docs+lint, challenge
CI status: failing CI noted in report header β review always proceeds
codemap integration: rdep_count > 20 flags as high-risk change
Consolidation: the selected consolidator merges findings into a ranked report
--reply: oss:shepherd drafts contributor-facing comment from consolidated report (written to .temp/; user posts)
Review stages (acceptance gate): Gate: header field is two states beyond PASS β reject is terminal (skips every tier, no agent spawned), block is not (full fanout still runs, the report just surfaces the fixable gap up front instead of burying it after N findings). Test: could revising the code, not the goal, resolve this? Yes β block. No β reject.
Stage 1 β Reject (terminal, 8 grounds)
Aligned with close-without-merge practice in K8s/CPython/Rust/Django contributing docs. Every ground needs affirmative evidence, never suspicion alone. | Ground | Test | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `REJECT_GOAL` | Stated goal factually/technically wrong regardless of diff quality β e.g. "raise this [0,1]-bounded metric above 1.0". Disagreeing with the approach is a normal review finding, not this. | | `REJECT_CONDUCT` | By-design adversarial/malicious contribution or Code of Conduct violation. Confirmed via a shared `foundry:challenger` check before rejecting β accidental (or confidence \<0.7) falls through as a normal finding. | | `REJECT_SCOPE` | Out of project scope / against roadmap, maintainers already decided against this direction. Evidence: a `wontfix`/`invalid`/`declined`/`out-of-scope` label already applied, or an explicit "out of scope" statement in `CONTRIBUTING.md`/an ADR the PR directly matches. | | `REJECT_LICENSE` | Incompatible license copied in, or plagiarized/copied source with no right to submit it. Not the same as a missing CLA/DCO signature (that's Stage 2, fixable). Confirmed via the same shared `foundry:challenger` check as conduct. | | `REJECT_DUPLICATE` | Another PR already merged solving this, or the linked issue already fixed upstream. Evidence: the linked issue is closed by a different, already-merged PR. | | `REJECT_REVERTED` | Reintroduces a previously reverted change without addressing why it was reverted. Evidence: a matching revert commit exists **and** the PR body doesn't reference or address it. | | `REJECT_SPAM` | Spam/low-effort/AI-slop β no real change, hacktoberfest-farming pattern. Evidence needs both a trivially low-value diff **and** a generic/templated description β either alone isn't enough (a genuine one-line fix looks low-value too). | | `REJECT_PHILOSOPHY` | Contradicts a documented design principle, not just a style preference β e.g. adding a GUI to a project whose docs state "CLI-only by design". Requires a citable doc line. |Stage 2 β Block (non-terminal, full review still runs)
Default `[blocking]` tag per finding category β judgment still required, not automatic: | Category | Default | Nuance | | -------------------------------------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CI red / failing check | blocking | Only a **major**/required-check failure. A single flaky-looking rerun blip is noted, not auto-blocking. | | Missing test coverage for new/changed logic | blocking | β | | Accidental security bug (careless, not by-design) | blocking | By-design version is Stage 1 `REJECT_CONDUCT`, not this. | | Breaking API change, no deprecation/migration path | blocking | β | | Missing docs for new/changed public behavior | blocking | Missing CHANGELOG entry alone is **not** blocking β can land in a follow-up (`/oss:release`). | | Perf regression | contextual | A regression vs recent releases with no offsetting reason is bad; not blocking when the prior speed only existed because of a correctness bug and the "regression" is the cost of fixing it right. | | Merge conflicts | **not** blocking | `/oss:resolve`'s job β review doesn't gate on it. | | Incomplete implementation (TODOs in changed paths, missing error handling) | blocking | β | | Missing CLA/DCO signature | blocking, **only if the project requires one** | Check first β CLA-assistant/DCO-check bot status, or a signing mandate in `CONTRIBUTING.md`. No such requirement β not applicable. |Typical scenarios:
| PR type | Agents that run | Skipped |
|---|---|---|
| Docs-only (.md, .rst) | doc-scribe, plus challenge/Codex when enabled/available | Code, test, performance, architecture dimensions |
| Docs + CI/CD | oss:cicd-steward, doc-scribe, plus challenge/Codex when enabled/available | Code, test, performance, architecture dimensions |
| Tests + CI | qa-specialist, linting-expert | Other dimensions |
| Annotation-only Python | linting-expert | Other dimensions |
| Code PR | Pinned qa-specialist + top three ranked units (--full removes the cap) |
Units ruled out by scope or the default cap |
Without foundry, selected dimensions fall back to general-purpose agents with role descriptions β functional, but less specialized.
Output locations:
- Per-agent handover files (intermediate):
.temp/review/<timestamp>/ - Consolidated report:
.reports/review/<timestamp>/review-report.md - Reply draft (with
--reply):.temp/output-reply-<PR#>-<date>.md
Flags:
| Flag | Effect |
|---|---|
--reply |
After consolidation, oss:shepherd drafts a welcoming two-part PR comment (positive framing first, then specific actionable asks) |
--no-challenge |
Skip the adversarial challenge pass |
--codemap / --no-codemap |
Require or disable codemap structural context; default is automatic when available |
--semble |
Enable the optional semble semantic-search companion |
--full |
Run every dimension selected by scope instead of the default top-four cap |
--worktree |
Opt-in. Run the review in an isolated git worktree (base: HEAD) so no dimension agent can mutate main sources. Report is written to the main tree; you review + merge. PR-review mode only (not --reply/direct-report). On entry it also reports leaked worktrees it could reclaim (clean, β₯14 d, agent-*/oss-*, including ones git no longer has registered) and asks before deleting any β trees with uncommitted work are kept at any age. |
--keep "<items>" |
Append quoted string to compaction contract's preserve: line β items survive auto-compact mid-run (advanced; long multi-agent sessions) |
/oss:resolve¶
Apply review findings to codebase. Reads live PR comments, saved review report, or both β deduplicates, resolves conflicts, implements fixes.
Purpose: Close gap between "reviewer said X" and "X in code." One command: open findings β committed fixes.
Reject-gate interlock: if the newest /oss:review report for this PR carries Gate: REJECT_<GROUND> (any of the 8 grounds under "/review" above), resolve refuses to start unless the PR's head commit has changed since that review β a rejected premise isn't something a code fix resolves. Gate: BLOCK (e.g. red CI) and everything else proceed normally β resolve is exactly the fix path for those.
Invocation:
/oss:resolve 55 # pr mode β apply fixes from live GitHub PR comments
/oss:resolve report # report mode β apply fixes from the saved /oss:review report
/oss:resolve 55 report # pr + report mode β both sources, deduplicated
/oss:resolve # review-handoff mode β picks up from the last /oss:review run
Source modes:
| Arguments | Mode | Source | When to use |
|---|---|---|---|
55 (PR number) |
pr | Live GitHub PR comments | Apply feedback posted directly on GitHub |
report |
report | Saved /oss:review findings file |
Apply findings from last review run |
55 report |
pr + report | Both, aggregated | Full close β deduplicates across both inputs |
| (none) | review-handoff | Review-handoff | Continues directly from last /oss:review run this session |
report / review-handoff discovery looks for the newest report across both .reports/review/*/review-report.md (/oss:review's own output) and .reports/codex/review/*/review-notes.md (a Codex-native review run outside this plugin). Only the former's section schema is parsed β a codex-lineage report is detected and refused with an explicit message (rather than silently skipped or mis-parsed) so a blocking finding never goes unactioned; pass the PR number explicitly instead.
How it works:
Three phases:
- Intelligence gathering β dedicated subagent fetches full PR thread (comments, reviews, inline code comments) β orchestrator context stays small; subagent classifies each finding, writes structured output to files; orchestrator reads compact classified table
- Conflict resolution β merge conflicts: read intent from both sides; apply semantically correct resolution (never mechanical "take ours"/"take theirs")
- Action item implementation β three-phase parallel dispatch: medium-effort items go to Codex first, batched up to three disjoint-file items per call (same-file items stay sequential; per-item verdicts and commits preserved); everything else splits into Phase 1 challenge (grouped by domain, all groups fire concurrently β read-only, safe to overlap), Phase 2 implementation (grouped by one of six specialists β
sw-engineer,qa-specialist,doc-scribe,linting-expert,perf-optimizer,solution-architectβ max 5 items/group, each group runs in its own isolatedgit worktreeso concurrent specialists never race on the same working tree), Phase 3 merge-back (orchestrator cherry-picks every item's commit onto the PR branch, sequentially β whole worktree groups ordered most-central-first, so a foundational contract change lands before the commits that depend on it). Before Phase 2 dispatch, two grouping tiebreaks reduce Phase 3 conflicts at the root: a file-ownership tiebreak (rank:linting-expert < doc-scribe < qa-specialist < perf-optimizer < sw-engineer < solution-architect) reassigns every item touching a contested file to its single highest-ranked owner, so two specialists never edit the same file concurrently; then a soft import-coupling merge co-locates items in different files when one imports the other (caught via codemap forwarddepsβ a module's own imports, so recall isn't truncated by the caller-list cap), so a rename and its callers land in one worktree instead of silently diverging. The codemap maps are built once, concurrently with the read-only challenge phase, so grouping adds ~0 wall-clock. Any conflict that still slips through Phase 3 routes through the same semantic conflict-resolution as Step 5. A branch mutex blocks a second concurrent resolve run from racing the same tree, and a HEAD fingerprint taken before Phase 2 flags any external write that lands mid-flight so cherry-picks never stack silently on a moved base. Per-item verdicts and[resolve No.N]attribution unchanged throughout; soft cap 10 items per dispatch (AskUserQuestion beyond, hard cap 20); soft codemap blast-radius check flags callers of changed modules before Phase 2 dispatch
Resolve after /review on same PR: blast-radius check reuses per-module codemap answers review already computed, no re-query β review's persisted pre-flight batch split into freshness-stamped per-module artifacts. Freshness is fail-closed on three conditions, all of which must hold: prefix.git_sha matches the current index git_sha; prefix.scanned_at is not older than the index's (a rebuilt index invalidates every artifact); and prefix.index_stamp still equals the index file's <size>:<mtime_ns>. That stamp is what makes the rule hold without trusting index-declared metadata β an --incremental re-scan, a restored backup, or a manual edit can leave git_sha and scanned_at untouched, and the first two checks alone would not see it. An artifact written before the stamp field existed carries none and is re-queried rather than trusted. Verdict reasons from codemap_cache.py read: fresh Β· git_sha_mismatch Β· index_rebuilt Β· index_stamp_mismatch Β· content_hash_mismatch. Reuse measured as reuse_ratio (fraction of persisted answers actually reused). No review artifact or codemap plugin absent β every module cache miss, scan queries live β no behaviour change.
Severity β triage type mapping (report mode):
| Review severity | Section | Resolve type |
|---|---|---|
CRITICAL / [blocking] |
any | [req] |
| HIGH | any | [req] |
| MEDIUM | Architecture, Performance, API Design (code-related) | [req] |
| MEDIUM | Test Coverage, Documentation, Static Analysis, Codex Co-Review | [suggest] |
| LOW | any | [suggest] β grouped by topic when count exceeds ceiling, never dropped |
[req] items apply by default on bulk-action; [suggest] items need explicit selection. Security findings inherit severity from /oss:review (hardcoded secrets β CRITICAL, dep CVEs β HIGH) β no separate security category. LOW findings cluster into composite rows by logical theme when total exceeds AskUserQuestion ceiling (12 items); each composite carries full member bullet list in full_comment_text.
Guard rails:
- More than 10 selected items β asks to batch or proceed with the slower larger dispatch; a single dispatch never exceeds 20 items
- More than 20 conflicted files β aborts, reports; you review manually
- Git push requires explicit confirmation before executing
- Core invariant: uses
git merge, nevergit rebaseβ preserves history
Every resolve cycle closes with parallel foundry:linting-expert + foundry:qa-specialist passes before final report.
Flags:
| Flag | Effect |
|---|---|
--worktree |
Opt-in. Wrap the whole run in an isolated git worktree (base: HEAD) entered before gh pr checkout, so the checkout, per-specialist worktrees, and cherry-picks never touch your main tree/branch. Commits can push to the fork only after explicit confirmation; the local worktree is disposable. Composes with resolve's existing per-specialist isolation. |
--no-challenge |
Skip per-item challenge validation |
--agent <name> |
Select the implementation/intelligence agent instead of the default Codex path |
--codemap / --no-codemap |
Require or disable codemap structural context; default is automatic when available |
--keep "<items>" |
Append quoted string to compaction contract's preserve: line β items survive auto-compact mid-run (advanced; long multi-agent sessions) |
Output location: .reports/resolve/<timestamp>/
/oss:release¶
Release communication and readiness pipeline with four modes: notes, prepare, audit, and demo.
Purpose: Prepare release artifacts from a verified change range and audit readiness before a human tags or publishes the release.
Invocation:
/oss:release notes v1.2->HEAD # release notes from range
/oss:release notes --changelog # notes + CHANGELOG.md entry
/oss:release notes --summary # notes + internal summary
/oss:release notes v1.2->v2.0 --migration # notes + migration guide
/oss:release notes --changelog --summary --migration # all four outputs
/oss:release notes --append # integrate newly-landed commits into existing artifacts
/oss:release prepare v2.1.0 # full pipeline: audit β all artifacts
/oss:release audit # readiness check; does not tag or publish
/oss:release demo # story-telling notebook for the release
/oss:release demo v1.2->v2.0 # demo scoped to explicit range
Range notation: v1->v2 (e.g. v1.2->v2.0). Omit range β defaults to last-tag..HEAD. Pre-release tags (rcN, devN, alphaN, betaN) excluded from tag detection automatically.
Modes and flags:
| Mode / Flag | What it produces |
|---|---|
notes |
Release notes (DRAFT.md); add flags for extra outputs |
--changelog |
CHANGELOG.md entry (no shepherd review) |
--summary |
Internal summary saved to .temp/ |
--migration |
Migration guide for breaking changes saved to .temp/ (shepherd review) |
--append |
Rerun the full pipeline scoped to newly-landed commits; integrate results into existing artifacts instead of a full regenerate (see below) |
prepare |
Full pipeline: audit β project CHANGELOG.md entry plus HIGHLIGHTS.md, MIGRATION.md, SUMMARY.md, DRAFT.md, and demo.py under releases/<version>/ |
audit |
Readiness checklist: tests green, changelog present, version bumped, no uncommitted changes, doc proportionality for newly added features, no blocking upstream /oss:review verdict on file, changelog scope check , Codex adversarial pass (if codex plugin installed) |
demo |
Story-telling jupytext notebook (demo.py) highlighting most significant contributions |
What each mode does:
| Primitive | notes |
prepare |
audit |
demo |
|---|---|---|---|---|
| Read git log + PRs | full | diff | full | full |
| Classify changes | β | β | - | β |
| Explore codebase | full | diff | full | diff |
| Shepherd voice review | β | β | - | - |
| DRAFT.md | write | write | - | - |
| CHANGELOG.md | --changelog |
write | - | - |
| SUMMARY.md | --summary |
write | - | - |
| MIGRATION.md | --migration |
writeΒΉ | - | - |
| HIGHLIGHTS.md | - | write | - | - |
| demo.py | - | writeΒ² | - | writeΒ² |
| Release mode (informational, never blocking) | - | β | β | - |
| Working tree | - | β | β | - |
| CI status | - | β | β | - |
| Open issues / PRs | - | β | β | - |
| Docs alignment | - | diff | full | - |
| Version consistency | - | β | β | - |
| CVEs | - | β | β | - |
| Upstream review verdict | - | β | β | - |
| Codex adversarial pass | - | β | β | - |
Flag mark = output produced only when flag passed. ΒΉ Full guide when breaking changes detected; single-line stub otherwise. Β² Jupytext percent-format Python script with # %% code cells and # %% [markdown] narrative cells; self-contained with references to additional resources.
Version and breaking-change checks:
The pipeline checks version consistency and classifies public breaking changes when codemap evidence is available. It does not choose or write a package version, create a git tag, or upload to PyPI/another registry; perform those project-specific release steps separately after reviewing the generated artifacts.
Breaking-change classification (codemap-gated): after truth check, each diff-derived public symbol run through fn-rdeps --exclude-tests. Symbol with caller outside own top-level package β labelled Breaking, moved to β Breaking Changes with external call sites cited; symbol whose callers all inside own package stays under human label. Affected call-site list drafted into migration guide β downstream consumers see exactly what to change. Requires codemap v3 index β no index β phase skipped, human classification stands. Partial coverage (query_complete:false) surfaces evidence as possibly-incomplete, never drops it.
CHANGELOG section ordering (strict, enforced):
Deprecation tracking: Uses pyDeprecate for deprecation lifecycle. Migration guides include before/after table with argument mapping for all renamed/removed parameters.
Shepherd review applies to release notes + migration guides. CHANGELOG entries + summaries written directly, no review.
--append: assumes an earlier notes run already produced DRAFT.md (and, when their flags were used, CHANGELOG.md/SUMMARY.md/MIGRATION.md) and reruns the full pipeline β unchanged, Gather changes through Draft executive summary β scoped to only the commits landed since then, tracked via a per-branch marker at .temp/release-last-processed-<branch>. Results integrate into every existing artifact in place via Read + Edit tool (no parsing script): DRAFT.md's Summary/Spotlights/Migration-guide/Notable-changes/Contributors sections all merge (not overwrite); root-level SUMMARY.md/MIGRATION.md merge the same way when their flags are set, guarded by a mechanical byte-count collapse guard against an accidental whole-file wipe. Purely additive β except when this cycle detects a commit reverting or materially changing something a prior cycle already wrote (cross-cycle revert/pivot detection): that stale entry is struck or superseded, never left stale beside a contradicting new one. A genuine git revert is resolved deterministically against a per-branch patch-id-keyed provenance store (.temp/release-provenance-<branch>.json, recording which commit's diff-content wrote which exact bullet β keyed on git patch-id --stable rather than raw commit sha, so a reword, rebase, or cherry-pick of the original commit since it was recorded doesn't defeat the lookup); a pivot (no literal revert commit) still relies on grep-narrowed semantic judgment. After merge, a post-merge re-validation pass re-runs Truth check, Identify highlights re-ranking, Validate migration docs, and Validate docs against the final merged content (not just this cycle's incremental diff) β catches prior-cycle content gone stale from this cycle's changes without a clean detected revert/pivot (e.g. a spotlight built on a commit a later cycle reverts gets replaced, not left beside the new set). No marker found (first use, or history rewritten by rebase/force-push) β falls back to the default $LAST_TAG..HEAD range and a full overwrite β identical to plain notes β establishing the baseline for the next --append run. Every successful notes-mode write refreshes the marker to current HEAD.
Output location: releases/<version>/ for prepare artifacts (the project CHANGELOG.md is updated at its discovered path and linked from the release directory); .temp/ for individual modes and demo on non-release branches.
/oss:setup¶
Purpose: Deliver this plugin's rules/*.md into Claude's user-level rule namespace. Maintenance command, not part of any OSS workflow.
When to use: after installing oss on a new machine, or after upgrading it. make sync-claude runs it automatically for every installed managed plugin that ships a setup skill, so a normal sync needs no manual step.
Invocation:
/oss:setup # interactive β asks before replacing anything it does not own
/oss:setup --approve # non-interactive β used by make sync-claude
Each rule installs as a symlink at ~/.claude/rules/oss-<source-name>.md. The oss- prefix keeps the flat rule namespace collision-free β four plugins ship a rules/quality-gates.md. A filename prefix does not change how Claude loads a rule or how its paths: frontmatter matches.
Only links this plugin provably owns are replaced or removed: the existing target must resolve under the current plugin root or under the same install-cache lineage. A real file, a link into another marketplace, a source checkout, or a dotfiles tree is reported as a conflict and left alone unless you approve replacing it.
Uninstall leaves rule links behind: Claude Code runs no cleanup hook on uninstall, so ~/.claude/rules/oss-*.md survives both claude plugin uninstall and make clear-all. Delete those symlinks by hand β once the plugin cache version is gone they dangle.
π€ Agents reference¶
gh-scraper¶
Role: Raw GitHub data fetcher for /oss:analyse vitality. Fetches all GitHub API data (REST + GraphQL) across two parallel groups, writes raw JSONL consumed by oss:repo-warden axis scorers. Internal β spawned by oss:analyse vitality Step 1 only.
Model: Sonnet (focused data collection)
What gh-scraper does:
- Runs all GitHub API fetch calls parallel (Group 1), then Group 2 (README, CONTRIBUTING, workflow files, branch protection)
- Retries contributor stats (202 computing) up to 6Γ before writing partial record
- Writes
raw-data-{owner}-{repo}-{date}.jsonlfor reproducibility + scorer consumption
What gh-scraper does NOT do:
- Axis scoring β oss:repo-warden owns all axis scoring
- Report generation, terminal output, adversarial review β oss:analyse vitality Steps 4β7 own those
- Direct user invocation β always spawned by vitality skill
repo-warden¶
Role: Axis scorer for /oss:analyse vitality. Reads pre-fetched raw JSONL from oss:gh-scraper, scores assigned group of vitality axes per vitality-scoring.md rubric; writes partial scores JSON for assembly. Spawned 3Γ parallel by oss:analyse vitality Step 2 β not for direct user invocation.
Model: Sonnet (focused computation)
What repo-warden does:
- Scores assigned axis group (A: Axes 1,2,5,6 / B: Axes 4,7,8 / C: Axes 3,9) from DATA_FILE
- Runs Axis 3 multi-pass confidence logic; applies fallback from commits_50 when contributor stats unavailable
- Writes
partial-{group}-{owner}-{repo}-{ts}.jsonconsumed by vitality Step 3 assembly
What repo-warden does NOT do:
- Raw data fetching β oss:gh-scraper owns all GitHub API calls
- Report generation, terminal output, adversarial review β oss:analyse vitality Steps 4β7 own those
- Direct user invocation β always spawned by vitality skill
oss:shepherd¶
Role: Public voice of project. Owns all external-facing communication β PR replies, issue responses, release notes, changelog entries, migration guides. Never writes implementation code.
Model: opusplan
When to use shepherd directly:
use shepherd to draft a response for issue #88, citing the contributing guide
use shepherd to review this changelog entry for tone before I post it
use shepherd to write a migration guide for the v3.0 breaking changes
What shepherd does:
- Issue triage: Classifies every issue into one of seven archetypes (bug confirmed, feature request, question/support, duplicate, stale, out of scope, breaking change), drafts response fitting each
- Close-scenario replies: Seven close archetypes from shepherd playbook β fixed in release, fixed on
develop, superseded by architecture change, external/wrong repo, self-resolved/stale, keep open + relabel, superseded PR - PR review response: Two-part format β leads with genuinely good, then specific actionable asks with line references; never adversarial
- SemVer validation: Reads actual diff, enforces correct bump type before any release proceeds
- Release pipeline: Writes release notes, changelog entries, migration guides in consistent project voice
- Deprecation lifecycle: Works with
pyDeprecate; tracks deprecated APIs, writes migration guides, enforces deprecation β warning β removal timeline
What shepherd does NOT do:
- Inline docstrings or API reference docs β use
foundry:doc-scribe - CI pipeline configuration or GitHub Actions YAML structure for publish/release workflows β use
oss:cicd-steward - Implementation code of any kind
Voice principles:
- Leads with what's good
- Treats contributors as partners, never supplicants
- Cites specific conventions (contributing guide, coding style) when asking for changes
- Never adversarial, never dismissive of effort
oss:cicd-steward¶
Role: GitHub Actions health specialist. Owns CI configuration quality: workflow topology, runner strategy, caching, branch protections, flaky test detection.
Model: Sonnet (fast iteration on workflow YAML)
When to use cicd-steward directly:
use cicd-steward to reduce the build time in .github/workflows/ci.yml
use cicd-steward to diagnose the failing test matrix on PR #72
use cicd-steward to add SHA pinning to all actions in the workflow
What cicd-steward does:
- Diagnoses CI failures by failure type (linting, type errors, test failures, import errors, timeouts, OOM)
- Audits GitHub Actions workflow files for antipatterns (unpinned actions, missing concurrency groups, broken caching, wrong parallelism)
- Optimises build time toward targets: unit tests < 5 min, full CI < 15 min
- Enforces cache hit rate > 80% using
astral-sh/setup-uvwithuv.lock-keyed caching - Detects + quarantines flaky tests (target: 0% flakiness)
- Configures test matrices, reusable workflows, nightly upstream CI, performance regression benchmarks
SHA pinning enforcement (cicd-steward flags these as primary findings):
| Severity | Pattern | Example |
|---|---|---|
| Critical | Branch/named refs | uses: actions/checkout@main |
| High | Mutable version tags | uses: actions/checkout@v4 |
| Compliant | Full 40-char SHA | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 |
Short SHAs (fewer than 40 hex chars) treated as unpinned β can collide, not cryptographically safe.
What cicd-steward does NOT do:
- ruff/mypy rule selection or
.pre-commit-config.yamlauthoring β usefoundry:linting-expert(IS for CI workflow steps that invoke pre-commit, e.g.pre-commit/action@SHA) - PyPI release management, release notes, CHANGELOG entries, contributor communication β use
oss:shepherd - PyPI project registration, OIDC trusted publisher setup on pypi.org dashboard, GitHub environment configuration β use
oss:shepherd
Health targets:
| Metric | Target |
|---|---|
| Main branch | Green 100% of the time |
| Unit test suite | < 5 minutes |
| Full CI | < 15 minutes |
| Cache hit rate | > 80% |
| Flaky tests | 0% β any flaky test is quarantined immediately |
βοΈ Configuration¶
oss needs no required configuration β reads project structure automatically.
GitHub authentication: Skills use gh CLI. Run gh auth login once if not already.
Optional plugin integrations detected automatically at runtime. Install any optional plugin from Install β skills use them next invocation, no config changes.
Hooks register automatically from hooks/hooks.json when the plugin is enabled β no settings.json edits needed:
| Hook | Event | Behaviour |
|---|---|---|
agent-router.js |
PreToolUse (Agent) |
Reroutes Agent() calls when the requested agent is not installed: exact match β semantic match β general-purpose. |
sentinel-read-allow.js |
PreToolUse (Bash) |
Auto-allows the pre-canned TMPDIR sentinel-read and $(date +FMT) idioms inside read-only commands, so skill bash blocks stop raising "Contains expansion" prompts. Everything else falls through to normal checks. Whole-line # β¦ comments inside a block are skipped rather than blocking it, and .. is matched as a path component so ellipsis and version ranges are not mistaken for traversal. |
blueprint-allow.js |
PreToolUse (Bash) |
Byte-identical copy of the cc_foundry canonical (propagated via propagate_shared.py); normalizes the command, hashes it, and exact-matches it against this plugin's committed blueprint-manifest.json, so verbatim bash shipped in its own skills runs without a prompt. Any deviation from the blueprint text misses and falls through to a normal prompt. |
write-guard.js |
PreToolUse (Edit, Write, NotebookEdit) |
Byte-identical copy of the cc_foundry canonical (propagated via propagate_shared.py); grants nothing β forces a confirmation on writes to .github/**, CLAUDE.md/AGENTS.md, .claude/settings*.json, .pre-commit-config.yaml, CHANGELOG.md, dependency lockfiles and pyproject.toml. Source and tests are deliberately unprotected; everything else is silent passthrough. |
enforce-review-header.js |
PreToolUse (AskUserQuestion) |
Denies /oss:review's follow-up question until the consolidated review-report.md exists, so the report header always reaches the terminal first. Silent unless a review run is in flight. Once the report exists, additionally nudges (never blocks) via additionalContext when the reply never rendered the header as a table β see report-header-table.js. |
enforce-analyse-header.js |
PreToolUse (AskUserQuestion) |
Same gate for /oss:analyse: denies the Step 6a follow-up question until the running mode (thread, vitality or ecosystem) has written its report under .reports/analyse/. Silent unless an analyse run is in flight. Same table-format nudge as above once the report exists. |
report-header-table.js |
(shared module, not a hook) | Byte-identical copy of the cc_foundry canonical (propagated via propagate_shared.py); reads the session transcript to check whether the assistant's own reply, since the last human turn, rendered the report's --- header as a \| Field \| Value \| table (or the documented Β·-fallback line) β catches the PR #1303 incident (raw YAML fields printed instead of a table) that the file-existence gate alone could not. |
Cache location: .cache/gh/ at project root. Cached responses: 30-day TTL. Force fresh fetch: delete relevant cache file or entire .cache/gh/ directory.
Artifact directories created by oss skills:
| Directory | Created by | Contents |
|---|---|---|
.reports/analyse/ |
/oss:analyse |
Thread, vitality, ecosystem reports |
.temp/review/ |
/oss:review |
Per-agent handover files (intermediate, per-run) |
.reports/resolve/ |
/oss:resolve |
Resolve run outputs |
.temp/ |
All skills | Long-form output files |
.cache/gh/ |
/oss:analyse |
GitHub API response cache |
releases/<version>/ |
/oss:release prepare |
Release artefacts |
Artifact directories are gitignored; GitHub API cache entries use the 30-day TTL described above.
π§° Bin helper inventory (33 shipped deterministic helpers)
These helpers are installed workflow support and maintainer surfaces, not additional slash-command skills. The skills own the orchestration; the helpers handle bounded parsing, evidence collection, path resolution, scoring, and artifact preparation. #### Analysis, signals, and structural context | Helper | Purpose | | -------------------------------- | --------------------------------------------------------------------- | | `assemble_vitality_scores.py` | Merge three vitality-axis partials into one health score. | | `build_triage_batch.py` | Build a codemap query batch from triaged identifiers. | | `check_agent.py` | Probe whether a plugin agent is installed. | | `check_oss_pr_signals.py` | Collect read-only OSS signals from a pull-request diff. | | `classify_breaking.py` | Label changed public symbols as Breaking or internal. | | `classify_pr_scope.py` | Classify a pull request as CHORE, FIX, REFACTOR, FEATURE, or MIXED. | | `codemap_cache.py` | Materialize review-to-resolve codemap pre-flight cache artifacts. | | `detect_codemap.py` | Detect codemap availability, index presence, and currency. | | `detect_thread_type.py` | Detect GitHub thread type and report drift. | | `extract_changed_symbols.py` | Extract changed public Python symbols from a diff. | | `extract_diff_impact_qnames.py` | Extract qualified names from codemap diff-impact JSON. | | `extract_vitality_vars.py` | Emit shell assignments from vitality-score JSON. | | `fetch_gh_data_group1.py` | Fetch independent GitHub datasets for vitality scoring. | | `fetch_gh_data_group2.py` | Fetch dependent repository and workflow content for vitality scoring. | | `resolve_centrality.py` | Convert codemap centrality output into a worktree resolver map. | | `search_downstream_consumers.py` | Find GitHub repositories importing changed symbols. | #### Review, resolve, and argument helpers | Helper | Purpose | | ---------------------------- | ------------------------------------------------------------------ | | `commit_action_item.py` | Manage the commit sentinel around one resolve action-item commit. | | `commit_all_items.py` | Create a bulk commit summarizing resolved review items. | | `commit_lint_fixes.py` | Stage tracked lint changes and create the lint-fix commit. | | `compute_commit_sentinel.py` | Print the current repository and branch commit-sentinel path. | | `heal_git_artifacts.py` | Reclaim stale resolve locks and orphaned git worktrees. | | `merge_specialist_batch.py` | Cherry-pick specialist worktree commits in priority order. | | `parse-resolve-args.py` | Parse `/oss:resolve` arguments into shell assignments. | | `parse-skill-flags.py` | Parse shared skill flags into shell assignments. | | `parse_audit_json.py` | Summarize `pip-audit` JSON as dependency and vulnerability counts. | | `resolve_preflight.py` | Verify tools, authentication, and remote state before resolve. | | `resolve_shared_path.py` | Resolve the plugin's shared directory portably. | #### Release, installation, and path helpers | Helper | Purpose | | ---------------------------- | ---------------------------------------------------------- | | `extract_contributors.py` | List unique non-bot contributors in a Git range. | | `get_plugin_install_path.py` | Resolve the active plugin path from Claude's registry. | | `release_append_marker.py` | Persist and resolve the release `--append` baseline. | | `release_setup.py` | Resolve shared setup values for release modes. | | `run_audit_checks.py` | Gather raw readiness evidence for release audit. | | `setup_release_dir.py` | Create a release directory and protect existing artifacts. | | `sync_rules.py` | Install namespaced rule symlinks into `~/.claude/rules/`. |## π Troubleshooting
**`/oss:review` skips Tier 2 agents** Review dimensions are scope-selected and the default fan-out is capped at four. Install `foundry` for specialized agents; otherwise the selected work uses `general-purpose` fallbacks. Install `bridge@borda-ai-rig` only if you want optional Codex co-review. **A question is blocked with "oss:review report gate"** `enforce-review-header.js` denied an `AskUserQuestion` call because `.reports/review/π Contributing / feedback¶
oss = part of Borda-AI-Rig plugin suite. Contribute or report issues:
- Bugs and feature requests: Open issue in Borda-AI-Rig repository
- Plugin authoring rules: See
plugins/CLAUDE.mdβ file layout, naming conventions, cross-plugin references, README sync requirements, versioning policy - Voice and tone: All contributor-facing text follows same principles as
oss:shepherdβ welcoming, specific, treats contributors as partners
Editing oss skills or agents β update this README before commit. Rule in plugins/CLAUDE.md: changed trigger, scope, NOT-for, or hook behaviour β update README description. Added/removed agent/skill β update table. Unsynced change = incomplete.