Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
d1745d5
feat(source-control): bind babysit guard semantics to an executable c…
kyle-sexton Jul 25, 2026
455022b
fix(source-control): assert the refusal envelope and widen the doc sweep
kyle-sexton Jul 25, 2026
5515b19
docs(source-control): keep the guard-contract pointer in safety.md alone
kyle-sexton Jul 25, 2026
4bf9eb9
fix(source-control): scope the guard contract to domain mutations
kyle-sexton Jul 25, 2026
0689a1d
fix(source-control): scope the contract's own executed-assertion claim
kyle-sexton Jul 25, 2026
7b3ea15
Merge origin/main into feat/1265-guard-contract-suite
kyle-sexton Jul 25, 2026
909f112
Merge remote-tracking branch 'origin/main' into feat/1265-guard-contr…
kyle-sexton Jul 25, 2026
4acfcfd
Merge remote-tracking branch 'origin/main' into feat/1265-guard-contr…
kyle-sexton Jul 25, 2026
ac6af16
fix(source-control): bind each guard-contract row to its own claim
kyle-sexton Jul 25, 2026
33d4e85
Merge remote-tracking branch 'origin/main' into feat/1265-guard-contr…
kyle-sexton Jul 25, 2026
5cda868
fix(source-control): make the recording gh shim reachable under the i…
kyle-sexton Jul 25, 2026
87b2091
Merge remote-tracking branch 'origin/feat/1265-guard-contract-suite' …
kyle-sexton Jul 25, 2026
66bea42
Merge remote-tracking branch 'origin/main' into feat/1265-guard-contr…
kyle-sexton Jul 25, 2026
3d9bae8
fix(source-control): check documented commands at the wrapper boundary
kyle-sexton Jul 25, 2026
aa455d3
Merge remote-tracking branch 'origin/main' into feat/1265-guard-contr…
kyle-sexton Jul 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugins/source-control/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "source-control",
"version": "0.26.12",
"version": "0.28.0",
"description": "Git and GitHub delivery workflow: /commit (Conventional Commits + Co-Authored-By trailer via safe heredoc mechanics), /pull-request (prep, create, CI monitoring, review-comment triage, merge, CI-log fetch), /babysit-prs (self-pacing fleet loop — safe by default; opt-in worker/autopilot tiers add gate-checked merge and thread resolution behind a deterministic Python engine), /babysit-loop (the loop-lane merge lane: a standing or drain loop that invokes babysit-prs per cycle, configured through repo-scoped babysit_loop_* keys on the layered source-control.md seam, with merge authority human-only until the target repo's tracked config adopts the lane, a gate-proven C2-mechanical baseline once adopted, and merge-rung raises binding from the team-tracked layer only), /worktree (create, status, cleanup, audit for parallel-session isolation), /setup (check the effective commit-subject / PR-title convention merged across its config layers and the babysit-prs config, or apply — interview the repo and write the convention config to a chosen layer), and /resolve-conflicts (intent-first merge/rebase conflict resolution with a semantic-conflict sweep — never --abort). The commit-subject / PR-title convention is configurable via a source-control.md config written by a re-runnable setup skill, layered across a ~/.claude user-global file, the tracked team file, and a gitignored .claude/source-control.local.md personal overlay merged per key; Conventional Commits is the default when no convention is declared.",
"author": {
"name": "Melodic Software",
Expand Down
31 changes: 31 additions & 0 deletions plugins/source-control/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,37 @@
All notable changes to the `source-control` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.28.0]

### Added

- **`babysit-prs` guard semantics are now an executable contract (`#1265`).** The facts a host
permission classifier has to know about this lane — which entry points mutate, which flags gate
which guard, where a refusal is enforced, and how a mutation is actually performed — were
restated in prose by every consumer and had nothing detecting drift. They are now a table in
`skills/babysit-prs/scripts/tests/guard_contract.py`, executed row by row against the real entry
points by `test_guards.py`, and rendered to a citable
`skills/babysit-prs/reference/guard-contract.md`. Every row carries the prose claim it backs, so
a changed guard fails CI with a message naming the downstream claim that just became false. Five
binding kinds: refusals (invoked, exit code and message asserted), predicates (the classifier
called directly, because `--autonomous`'s `isOutdated` requirement is a condition over fetched
API data that no argument shape expresses), effects (run offline against a throwaway state dir —
this is what proves `manage_babysit_lease.py acquire` writes with no `--apply`, contrary to what
its flag names suggest), mechanisms (`refresh_pr_branch.py` uses GitHub's server-side
`update-branch` and never pushes), and documented command lines (every `bin/`-path wrapper
command spelled in `reference/safety.md` and `reference/orchestration.md` is checked against the
backing CLI's own parser). Catalogue gates fail when a new entry point, wrapper, or
command-spelling document arrives without a row — including the plugin-level
`scripts/babysit-readiness-gate.sh`, the one lane entry point outside the skill's scripts
directory. Each binding asserts the specific claim rather than a proxy for it: a row claiming
the refusal precedes every network call is replayed against a recording `gh` shim and fails if
the shim ran at all, an effect row records which way the state directory's file set moved so a
rewrite cannot pass as a deletion, and documented flags are checked against the parser's usage
block rather than scraped `--help` prose that names flags the CLI rejects. What CI does not
bind is stated in the generated doc's "Not covered here" section rather than left to inference:
the entry-point **Class** column cannot be proven for the four entry points whose mutation is a
GitHub write, because every row runs without network access.

## [0.26.12]

### Fixed
Expand Down
Loading
Loading