Skip to content

ci: gate this repository on its own protocol - #3

Merged
augbastos merged 1 commit into
mainfrom
feat/dogfood-scpe-gate
Aug 25, 2026
Merged

ci: gate this repository on its own protocol#3
augbastos merged 1 commit into
mainfrom
feat/dogfood-scpe-gate

Conversation

@augbastos

Copy link
Copy Markdown
Owner

What this changes

SCPE specifies how a project learns who signed a contribution and what they declared about AI use. This repository did not ask either question about its own pull requests. After this, it does — as a failing check, not a comment.

Measured before writing a line, with this repo's own reference/disclosure.py, against PR #2 (opened by an agent, body reading "PR created automatically by Jules"):

{'present': False, 'form': 'none', 'value': ''}

True, human-readable, and invisible to every tool that has to make a decision. That is the gap the spec describes — here, in this repo.

Files

  • .github/workflows/scpe.yml — the untrusted half, running this repo's own Action at level: 1 with require: "true". Two files, not one: a workflow cannot name itself in workflow_run.
  • .github/workflows/scpe-seal.yml — the trusted half that posts the verdict. Never checks out or runs contributor code.
  • .github/pull_request_template.md — the five-second path for a human.
  • AGENTS.md — the binding rule for automated contributors, with the exact trailer and the measurement showing why prose does not count.

Why level 1 and not level 2

Level 2 anchors a signature to a key the forge publishes for the signing account, and no coding agent has one today. Gating there would not raise the bar — it would ban agent contributions and make this repository quieter and less honest. Level 1 asks the one thing an agent can do and a human can do in five seconds, and it is enforced. The switch to level 2 is a single line, and everything it needs (fetch-depth: 0, the two-job split, the artifact hand-off) is already in place.

A bug caught while building this

An example Assisted-by: line inside an HTML comment in the template satisfied the gate for every PR that left the template untouched — the lint reads the raw PR body and does not skip comments. Caught by a local check before this ever became a pull request; fixed, and the reason recorded in the template so the next editor does not reintroduce it.

Note on this PR

It will not receive a seal: workflow_run only fires for a workflow file already present on the default branch. The first sealed PR is the next one. PR #2 is the natural first test — as it stands today, it would fail the gate.

AI use

  • I used generative AI for part of this change

Written with Claude Code; every claim above was measured against this repository before being written. The commit carries Assisted-by: claude-code.

Checks

  • Tests pass locally, or this change carries no code
  • I read CONTRIBUTING.md

SCPE specifies how a project learns who signed a contribution and what they
declared about AI use. This repository did not ask either question about its
own pull requests.

Measured before writing this, against reference/disclosure.py: PR #2 — opened
by an agent, body reading "PR created automatically by Jules" — returned
{'present': False, 'form': 'none'}. True, human-readable, and invisible to
every tool that has to decide. That is the gap the spec describes, in this repo.

- .github/workflows/scpe.yml: the untrusted half, running this repo's own
  Action at level 1 with require=true. A pull request with no AI-use
  disclosure now fails a check.
- .github/workflows/scpe-seal.yml: the trusted half that posts the verdict.
  Two files because a workflow cannot name itself in workflow_run.
- .github/pull_request_template.md: the five-second path for a human.
- AGENTS.md: the binding rule for automated contributors, with the trailer
  they must emit and the measurement that shows why prose does not count.

Level 1, not 2, and the file says why: level 2 anchors a signature to a
forge-published key, and no coding agent has one today. Gating there would ban
agent contributions rather than raise the bar. The switch is one line when that
changes.

Caught while building it, by _local/test-gate-level1.py: an example
`Assisted-by:` line inside an HTML comment in the template satisfied the gate
for every PR that left the template untouched. The lint reads the raw body and
does not skip comments. Fixed, and the reason is recorded in the template.

Assisted-by: claude-code
@strix-security

Copy link
Copy Markdown

Strix is installed on this repository, but we couldn't run this PR security review because this workspace's trial has ended. Add a card to resume code reviews here.

So far, Strix has reviewed 15 pull requests and surfaced 1 security issue across this workspace.

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9c379fca-9904-47ee-a50f-701b5eb94332


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@augbastos
augbastos merged commit fb182eb into main Aug 25, 2026
8 checks passed
@augbastos
augbastos deleted the feat/dogfood-scpe-gate branch August 25, 2026 02:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant