@davesienkowski/gsd-contribution-toolkit
v2.1.3
Published
GSD Contribution Toolkit — an installable, opt-in gsd-core capability bundling the contribution + maintainer-review knowledge (two skills, five commands, one advisory plan:pre step). Advisory-only; carries no enforcement gates.
Downloads
12
Maintainers
Readme
GSD Contribution Toolkit
A self-contained, installable GSD capability that makes a broken
open-gsd/gsd-corecontribution physically hard to submit — by enforcing the outcomes that matter (no broken issue/PR/push, no edits to generated files) at the Claude Code harness boundary.
A role:feature capability for GSD 1.6.0+ (ADR-1244 capability ecosystem). It bundles the
knowledge (two skills), the triggers (five gsd-* commands), and the load-bearing layer —
twelve PreToolUse enforcement hooks that the harness runs (not the model) and that call
gsd-core's own LIVE gate scripts at runtime. It installs, toggles, and removes through gsd-core's
native capability system, tracked by gsd-core's ledger + consent.
- Repo:
github.com/davesienkowski/gsd-contribution-toolkit - Latest release:
#v2.1.3 - Install: § Install · Architecture: docs/cross-runtime-delivery-model.md
- Reviewers (gsd-core maintainers): start at § For reviewers.
Table of contents
- Why it exists
- What's included
- What it's capable of — by role
- Install
- Manage (on / off / status / remove)
- How it works
- Per-runtime behavior
- What the gates cover
- Recovery offramp
- Honesty & scope
- Documentation
- For reviewers
- Provenance & versioning
Why it exists
Skills and slash-commands are model-driven: under deadline pressure a model can rationalize past a
"please run the full suite first" instruction. Pressure-testing the contribution skill confirmed that
variance. Hooks are the only layer the harness always runs — they fire before the permission
check, so they hold even under --dangerously-skip-permissions. This toolkit puts the
non-negotiable contribution outcomes behind that layer, so even a sloppy, deadline-pressured run is
blocked and corrected rather than merged red. (Verifier-reach = spec-reach, applied to one's own
contribution pipeline.)
What's included
The bundle is self-contained — a remote install delivers the full working surface, not a hooks-only artifact:
| Surface | Count | Items |
|---|---|---|
| PreToolUse gates | 12 | gh-issue-create, gh-pr-create, gh-edit, issue-dedupe, policy-invariants, lint-ci-marker, git-commit-convention, containment, freshness, githooks-seal, scan-gate, binlib-edit |
| UserPromptSubmit advisory | 1 | protocol-reminder |
| Skills | 2 | gsd-core-contribution, maintainer-review-sweep |
| Commands | 5 | gsd-submit, gsd-review-sweep, gsd-triage-assist, gsd-release-preflight, gsd-ruleset-drift |
| Loop contribution | 1 | an advisory plan:pre fragment, gated by the default-off workflow.gsd_contrib_enforcement flag |
The bundled hook scripts resolve and call the LIVE gsd-core gate scripts at runtime — they never reimplement gsd-core policy. When gsd-core's scripts evolve, the gates follow.
What it's capable of — by role
| Role | What the toolkit gives you |
|---|---|
| CODEOWNER (repo owner) | The full enforcement pipeline applied to your own contributions: no broken issue/PR/push and no generated-file edits can leave your machine. Plus every maintainer + contributor capability below. |
| Maintainer | gsd-triage-assist (LIVE dedupe + version-gate + canonical role suggestion), gsd-release-preflight (runs the four LIVE release scripts before a release is cut), gsd-ruleset-drift (declared .github/rulesets/ vs live branch protection), and the maintainer-review-sweep skill (cost-to-advance triage + re-review of change-requested PRs). |
| Contributor | gsd-submit files a verified finding as a proper issue + fix PR through the repo's intake gates; gates enforce well-formed issues/PRs, version/template policy, conventional commits, a green lint:ci stamp before push, CI-check-run-green before PR, secret/scan cleanliness, and no edits to generated bin/lib/*.cjs. |
| Collaborator | The same gates as a contributor, plus advisory guidance from the gsd-core-contribution skill and a GSD-native recovery offramp when a gate denies — so a block becomes a tracked, resumable fix, not a dead stop. |
Enforcement is a Claude Code property (see Per-runtime behavior). On other runtimes the skills + commands still deliver, but the toolkit runs advisory-only.
Install
Install through gsd-core's git capability adapter (ADR-1244 D3):
node <gsd-core>/bin/gsd-tools.cjs capability install \
https://github.com/davesienkowski/gsd-contribution-toolkit.git#v2.1.3 \
--scope project --yes --shared-file .claude/settings.json--scope projectinstalls into the gsd-core checkout (.gsd/capabilities/contribution-toolkit/+ a.gsd-capabilities.jsonledger), keeping enforcement project-scoped — never~/.claude. Use--scope globalfor~/.gsd/....--yesgrants consent — the capability ships executable surfaces (the 13 hooks), so the install discloses them and aborts without consent.--shared-file .claude/settings.jsonis required to actually wire the hooks intosettings.json; without it the install records the ledger + overlay but applies no gates.- Pin a release with
#v2.1.3(a tag) or#sha:<40-hex>(an exact commit). The earlier…-gaterepo name GitHub-redirects, so an existing#v1.0.0install does not hard-break.
Integrity-pinned install (npm, ADR-1244 D1)
The bundle is also published to npm as @davesienkowski/gsd-contribution-toolkit. Unlike the git
adapter (which records a null integrity digest), the npm: source kind verifies the downloaded tarball
against a sha512- digest before staging — so a tampered artifact is refused, fail-closed:
# Fetch the authoritative digest for the version you're pinning:
DIGEST=$(npm view @davesienkowski/[email protected] dist.integrity)
node <gsd-core>/bin/gsd-tools.cjs capability install \
npm:@davesienkowski/[email protected] \
--integrity "$DIGEST" \
--scope project --yes --shared-file .claude/settings.json--integrity sha512-…is honored only for thetarball/npm/registrysource kinds;git/localinstalls always record a null digest. Pinning is what turns the trust model's integrity guarantee on.- The published
capability.jsoncarries aprovenance: { sourceRepo, commit }block (advisory; it surfaces in the install ledger and does not gate the install).
Manage (on / off / status / remove)
node <gsd-core>/bin/gsd-tools.cjs capability status --scope project
node <gsd-core>/bin/gsd-tools.cjs capability disable contribution-toolkit --scope project
node <gsd-core>/bin/gsd-tools.cjs capability enable contribution-toolkit --scope project
node <gsd-core>/bin/gsd-tools.cjs capability update contribution-toolkit --scope project --yes
node <gsd-core>/bin/gsd-tools.cjs capability remove contribution-toolkit --scope projectenable/disable toggle the entire surface (hooks + commands + skills); remove strips exactly
the ledger-recorded files + shared-file fragments and revokes consent — it never deletes shared files
wholesale. disable/remove genuinely take the enforcement away (the hooks leave settings.json —
the hooks are the enforcement).
The owner can also drive the same lifecycle from a local clone via the toolkit's own wrapper (
bin/contrib-capability.cjs install|on|off|status|remove), which auto-applies the shared-edits and reconciles legacy untagged entries. Remote installers use the native adapter above.
How it works
- Harness-boundary enforcement. The 12
PreToolUsegates are written intosettings.jsonon install. The harness runs them before each matching tool call; a broken contribution outcome returnspermissionDecision: "deny". They fail closed — an unparseable command, an unreadable body, or a missing LIVE script denies rather than allows. - Reuse, never reimplement. Each gate resolves and calls the LIVE gsd-core gate script (issue
version-gate, PR template policy,
lint:ci, the scan scripts, etc.). See docs/reuse-and-methodology.md. - Accountable override. A deliberate bypass rides on the existing per-worktree, append-only
GSD_CONTRIB_OVERRIDEreceipt (a logged reason-string, never silent) — no new mechanism.
Per-runtime behavior
Delivery is per-runtime, and what it enforces depends on the runtime:
| Layer | Claude Code | Other runtimes (Codex, OpenCode, …) |
|---|---|---|
| Skills | delivered | delivered via the native skills[] contribution (copy-convert) |
| Commands | delivered | Claude-only today (no third-party slash-command surface — see upstream) |
| PreToolUse enforcement | full | none → toolkit runs advisory-only |
Enforcement is a Claude-harness property; everywhere else the toolkit is advice, not a hard block. Each skill carries an explicit advisory-only note. Full model: docs/cross-runtime-delivery-model.md.
What the gates cover
| Gate | Guards |
|---|---|
| gh-issue-create / gh-pr-create / gh-edit | well-formed, intake-passing issues/PRs (incl. gh api/curl REST synonyms) |
| issue-dedupe | duplicate-issue detection before filing |
| policy-invariants | the LIVE gsd-core mechanizable POLICY-02 checks on commit / pr-create |
| lint-ci-marker | a fresh, tree-keyed lint:ci-green stamp before push |
| git-commit-convention | conventional-commit message shape |
| containment | edits/pushes confined to the intended worktree |
| freshness | acting against a current base |
| githooks-seal | git hooks not tampered |
| scan-gate | secret / prompt-injection / base64 scans before push |
| binlib-edit | no hand-edits to generated bin/lib/*.cjs (ADR-457) |
Recovery offramp
When a gate denies — or the gsd-core-contribution skill surfaces a real blocking issue
mid-run — you are offered a GSD-native recovery rather than a dead stop: fix inline with
/gsd-quick for a trivial correction, or route the issue through the GSD pipeline
(/gsd-debug, or /gsd-discuss-phase→/gsd-plan-phase→/gsd-execute-phase) as a tracked,
resumable work item — then return to the submission once it is green. The offramp is advisory
only: the deny stays fail-closed, and it never suggests bypassing a gate or abusing the override.
Honesty & scope
Please read this as written — don't over-read it:
- The capability's GSD-loop surfaces are advisory:
gates[]is empty, and the oneplan:precontribution fires only inside a GSD command. The capability does not reach the harness tool-call boundary — a direct issue/PR/push typed outside a GSD command never crosses a loop point, so the capability never sees it. - The harness-boundary enforcement is a property of the 12
PreToolUsehooks once installed intosettings.json, not an inherent property of this (toggleable) capability. Do not read this capability as "unbypassable." - It is fully removable:
disable/removegenuinely takes the enforcement away. - Deliberate-bypass accountability rides on the existing per-worktree, append-only
GSD_CONTRIB_OVERRIDEreceipt — this capability adds no new receipt mechanism.
Documentation
- docs/adr/ — Architecture Decision Records (
CTK-ADR-*, Nygard format): the load-bearing decisions (harness-boundary enforcement; capability-native distribution viahooks[]; the v2.3 full-surface/cross-runtime model), each independently challengeable. Accepted but open to maintainer revision. - docs/foundations.md — what the toolkit is built on and how it was designed: trek-e's methodology, the skills-artificer law-lenses, the LIVE gsd-core machinery it reuses, the lineage of every command/skill, and how the design serves gsd-core's contribution goals.
- docs/skills-reference.md — the 2 skills: what each is capable of, when it triggers, the pipeline it runs, and how to invoke it.
- docs/commands-reference.md — the 5 commands: what each does, the accepted arguments/parameters, examples, and the mutation-safety model.
- docs/cross-runtime-delivery-model.md — the per-runtime
delivery model, symlink-vs-copy-convert, enforcement-is-Claude-only, the
off-vs-removelifecycle, and why slash-commands are Claude-only (ADR-959). - docs/reuse-and-methodology.md — the reuse map (delegate / wrap / leave-alone) and methodology alignment with trek-e's published practices.
- docs/upstream-feature-requests.md — two capability-framework
asks for gsd-core maintainers (an opt-in symlink/
linkdelivery mode; a third-party slash-command overlay surface), each citing this toolkit as the reference implementation.
For reviewers
If you maintain gsd-core and are reviewing this toolkit:
- Start with docs/foundations.md — it lays out what the toolkit is assembled from (your methodology, the artificer lenses, the LIVE gsd-core machinery), the lineage of every command/skill, how it was designed, and how its design maps to what gsd-core is driving for.
- Then docs/adr/ — the three decisions are stated as challengeable ADRs (Accepted, but
open to revision via a superseding ADR). Their gsd-core factual claims were re-verified against the
live
capability-validator.cjs/capability-lifecycle.cjs/capability-registry.cjs. - The bundle conforms to the LIVE capability validators (tri-surface
declared == shippedparity across hooks + skills + commands) — see the manifestcapability.json. - The two things that would let this capability go fully native and cross-runtime are written up in docs/upstream-feature-requests.md — they are framework additions, not changes this toolkit can make on its own.
- The honesty contract above is deliberate and enforced by the publish-time conformance check; the capability is never presented as carrying harness-wide enforcement on its own.
Provenance & versioning
- Version: 2.1.3 (semver; the bundle is generated from canonical
hooks//skills//commands/with a--checkdrift gate and validated against the LIVE gsd-core capability validators before publish). The v2.1.x line is docs releases (v2.1.1 README; v2.1.2 foundations + ADRs; v2.1.3 skills/commands reference) — the bundle logic is byte-identical to v2.1.0. - Source toolkit:
gsd-contrib-toolkit(private), through the v2.3 milestone. - See CHANGELOG.md for the release history.
