Install the contribution governance for the OWASP re-launch - #64
Conversation
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Both rulesets now carry the same admin RepositoryRole 5 always-bypass that protect-main carries, so a sole maintainer can merge pull requests requiring review. Without it, the day-before-relaunch migration halts unmergeable the instant the ruleset is created, locking out the one awake maintainer because GitHub does not let anyone approve their own pull request. Adds bypass_actors field to Ruleset with a default factory, renders it at top level in the GitHub API payload, and updates docstrings to explain why. Tests verify every ruleset carries the bypass and that the payload renders it correctly at the top level rather than nested inside rules. Signed-off-by: rocklambros <rock@rockcyber.com>
Four seeded issues incorrectly claimed priority:P0. GOVERNANCE.md lines 32-34 reserve P0 for the serial chain: the floor decision (PR #21), adapters (PR #22), the installable Guardian, and the interoperability benchmark. Runtime ports to Python, Go, Rust, and Codex are valuable parallel work that widen the reference implementation's reach but do not block the ninety-day outcome. Changed: Priority labels from P0 to P1 for the four port issues. Rewrote their body text to state the truthful rationale instead of overclaiming they sit on the serial chain. Added a docstring comment to desired_issues() explaining that P0 stays unused until maintainers apply it to PRs #21 and #22 during triage. Added two tests: one asserting no seeded issue carries P0, one verifying all nine seeded issues carry the three onramp labels. Both tests enforce the governance rules that the repository publishes in CONTRIBUTING.md and GOVERNANCE.md. Signed-off-by: rocklambros <rock@rockcyber.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
The landing page said "open an issue or a discussion," an invitation that produces self-directed issues nobody asked for. Parse the committed-outcome blockquote under CONTRIBUTING.md's Current Priority Scope heading the same way render_landing.py already parses GOVERNANCE.md's workstream table, so the page states one source of truth instead of a second copy that can drift from it. The issue-list item now points at the issue forms and says only a maintainer-accepted issue enters the backlog. Signed-off-by: rocklambros <rock@rockcyber.com>
|
@afogel @bar-capsule tagging you both ahead of Thursday. Two areas where your judgment matters more than mine: Ariel — the branching model and the guard. Bar — the issue forms in Two deliberate choices worth flagging, either of which I will reverse if you disagree:
Nothing on the published site changes except the landing page's Contribute section, which now renders the priority scope directly out of |
Add strict_required_status_checks_policy and do_not_enforce_on_create to the required_status_checks rule parameters in _ruleset_payload. GitHub rejects the ruleset creation with HTTP 422 if these fields are absent, naming only the rule index rather than the missing field. Both are set to false to match the protect-main ruleset already deployed. Signed-off-by: rocklambros <rock@rockcyber.com>
) Rewrites the README so it describes the repository as it now is, and extends the link guard to cover it. **Depends on #64.** The contribution section describes the Current Priority Scope, the branch model, and the issue forms, all of which live on that branch. Merge #64 first, or this README describes governance that does not exist yet. ## Errors of fact corrected The previous README told a reader that the documentation site would work "once GitHub Pages is enabled". Pages went live on September 5 and has been monitored every six hours since. It also carried `## Rational`, "dynamicly", and "CoycloneDX". The `## What's next` section invented a v0.1 / v1 / v2 / v3 scheme that matches nothing the project actually does. Real versioning is specification v0.1.0, release tag v0.1.1, v0.2.0 targeted March 2027, and v1.0 undated. The near-term milestones are the four that now exist as GitHub Milestones. ## Structure The spine runs concrete before abstract. A reader sees an actual hook request and the Guardian's decision as JSON before reading a word of prose about the contract, then how to fetch a schema, then a second example showing a `modify` disposition, and only then the concept vocabulary. A reader who only wants to know whether ACS fits their problem has an explicit stopping point before the contribution material. Four mermaid diagrams, placed where a reader needs each one rather than collected in a gallery: the Guardian's two layers and why the LLM layer cannot read policy code, the three pillars and what each produces, the contribution flow through triage, and the branch model. All four are small enough to read on a phone. ## The link guard now covers the README `tests/test_doc_links.py` scanned `docs/` only. The README is exactly the kind of file that accumulated 44 dead links to a personal fork, and it was unguarded. It now covers the root markdown files too, and it caught two dead links in this very draft before commit. `CONTRIBUTING.md` is deliberately untouched here, since #64 rewrites it. ## Verification - 205 tests pass, `mkdocs build --strict` clean - All nine links in the README fetched live: 200, except `owasp.slack.com` which returns 403 unauthenticated as it always has - No em dashes, no semicolons, no sentence opening with a conjunction --------- Signed-off-by: rocklambros <rock@rockcyber.com>
| HEAD_REF: ${{ github.event.pull_request.head.ref }} | ||
| HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} | ||
| BASE_REPO: ${{ github.repository }} | ||
| run: python3 tools/base_branch_guard.py changed.txt |
There was a problem hiding this comment.
I think this runs the pull request's own copy of the guard. On a pull_request event the checkout is the PR merge ref, so tools/base_branch_guard.py — and this workflow file itself — come from the change being judged. A PR that targets main and edits the guard's allowlist in the same diff gets a green required check from its own edited gate; CODEOWNERS review on /tools/ and /.github/ is then the only thing standing, and a green check is exactly what softens that review.
The trigger and permissions can stay as they are — only the script's provenance needs to change. BASE_SHA is already in the environment and fetch-depth: 0 already makes it reachable:
- name: Enforce the documentation lane
env:
BASE_REF: ${{ github.event.pull_request.base.ref }}
HEAD_REF: ${{ github.event.pull_request.head.ref }}
HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
BASE_REPO: ${{ github.repository }}
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
set -euo pipefail
# Run the BASE branch's guard, not the PR's: a diff that edits the
# guard must not be judged by its own edit.
git show "${BASE_SHA}:tools/base_branch_guard.py" > /tmp/base_branch_guard.py
python3 /tmp/base_branch_guard.py changed.txt
The workflow file itself staying PR-controlled is a residue this can't close (that's inherent to pull_request triggers); the base-sourced script at least makes the bypass require deleting the enforcement step outright, which is louder in a diff than a one-line allowlist edit.
Operationalizes the contribution governance the core team agreed on September 8, filtered through the Strategic Adoption Plan v3 committed outcome.
Design:
design/2026-09-09-contribution-governance-design.md(v1.1)Plan:
design/plans/2026-09-09-contribution-governance.mdWhat this installs
Current Priority Scope.
CONTRIBUTING.mdgains one section that states what the project is driving at for the next ninety days, what is deferred to v0.2.0, and what is out of scope by design. It is stated once. Every other surface links to it rather than restating it, and the landing page now renders it straight out ofCONTRIBUTING.mdso the two cannot drift.Branching.
mainpublishes the site and all 44 schema$idURIs on merge, so specification and code land onintegrationand publish on a deliberate promotion. A guard (tools/base_branch_guard.py, 16 tests) enforces a positive path allowlist and fails closed on anything nobody anticipated. The promotion exemption checks the head repository, not just the ref, so a fork branch namedintegrationcannot walk a schema change onto the publishing branch.Intake. Blank issues are off. Six forms route by type, and no form can stamp a
scope:,priority:,workstream:, orstatus:acceptedlabel. That prohibition is the whole structural guarantee behind maintainer-only triage. The sixth form asks for nothing but a description, because the strongest outside contribution this project has received would have fit none of the other five.The gate. A change to behavior, normative text, or code references an issue carrying
status:accepted. An editorial correction does not, wherever it lands. A pull request whose issue is not accepted yet is neither closed nor reviewed. It waits, and a bot says why.Automation. Four workflows: the base-branch guard, an integration sync, a weekly promotion pull request, and the intake comment. Plus a reminder that opens an issue when the priority scope passes its review date.
Phase 2 executor.
tools/apply_governance.pyperforms the live migration steps idempotently,--dry-runby default. It is structurally incapable of merging, closing, or retargeting a pull request, and a test asserts no code path can emit those commands.Authorship policy change
The rule that a maintainer strips a
Co-Authored-Bytrailer naming a model is removed. The project now mandates neither direction. The humanSigned-off-bystays required, because only a person can make the DCO certification. A standard about agent provenance should not erase the provenance of its own commits.Reviewer notes
mainand from this branch and diffed: the only files that differ areindex.htmlandacs.css. All 44 schemas are byte identical.mkdocs build --strictpasses.integrationrather thanmainbecause it touches.github/,tools/, andtests/, which is exactly what the guard it installs requires.Still to do after this merges
Retarget #63, #24, #60, and #22 to
integration. Merge #21, #20, and #22 when the team is ready. Then run the executor for rulesets, default branch, required check, and the seeded issues. The order that matters is in the plan.