chore(governance): document the main gate, add the release pipeline, remove loop artifacts - #62
Conversation
…and remove loop artifacts
- GOVERNANCE.md / SECURITY.md: ruleset 21237783 (eight required contexts,
one approval of the last push, no bypass actors), reviewer independence
rule, keyless signing, SBOM + checksum policy, private-advisory reporting,
response targets, supported versions, release baseline statement.
- docs/release-policy.md and docs/supply-chain.md.
- .github/workflows/release.yml: v* tag / dry-run pipeline gated on the exact
SHA being on main with all required checks green; -trimpath -buildvcs=true
CGO_ENABLED=0 builds for linux/{amd64,arm64}; CycloneDX SBOM; SHA256SUMS;
cosign keyless sign + provenance attest; draft GitHub Release.
- .github/workflows/dependency-review.yml (advisory).
- .github/dependabot.yml: drop the lockfile-less root npm entry.
- Remove _loopstate/** from the tree.
- CONTRIBUTING.md review/merge section; CHANGELOG Unreleased entry.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ard manual runs - SHA256SUMS is built from an explicit list (agent/core/ctl x amd64/arm64 + the CycloneDX SBOM); the glob missed antiflockctl_* and the SBOM. Each artifact must exist, the line count must match, and sha256sum -c --strict runs before and after signing. - A workflow_dispatch run never creates a release; only a pushed tag does. - persist-credentials: false on the gate checkout. - GOVERNANCE.md: self-review is recorded in the controller ledger, not docs/release-status.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
R0 fixes pushed in 6530d90: SHA256SUMS now enumerates the 7 artifacts explicitly (agent/core/ctl x amd64/arm64 + SBOM), checks each exists, checks the line count, and runs |
|
R0 independent exact-head review — 6530d90: APPROVE-EXACT-HEAD. Prior blocking defect (SHA256SUMS glob missed |
Outcome
main's real gate is now documented in the repository, a release pipeline exists that refuses to build anything the gate did not pass, and internal agent-loop artifacts are gone from the public tree. Nothing in the ruleset or repository settings was modified; this PR describes what is already enforced (ruleset21237783, read viagh api repos/AetherAI3/AntiFlock/rulesets/21237783on 2026-08-23).What changed
GOVERNANCE.md: themaingate (ruleset, exact eight required contexts, 1 approval + last-push approval, stale dismissal, thread resolution, extra approval for unattributed commits, squash/rebase only, code-owner review off, no bypass actors); the independence rule (AetherAI3anddbarranteare one person, so cross-approval is not independent security review; AI-agent reviews are advisory evidence, never the approving review); release signing (cosign keyless, workflow identity); SBOM + checksum policy; supply chain; the release baseline statement (first release-qualified tag only from amaincommit whose required checks passed on that exact SHA).SECURITY.md: GitHub private advisory link (verified enabled), response targets table, supported versions, "who reviews and what a merge proves", release-integrity verification commands.docs/release-policy.md(new): rc → canary → release flow, tag format, artifact set (agent/core/ctl for linux/amd64+arm64, CycloneDX SBOM viasyft/anchore/sbom-action,SHA256SUMS, cosign keyless signature bundle, cosign provenance attestation bundle), verification order, rollback, and the generic "external adversarial gate: required when configured, absent is FAIL not PASS" rule.docs/supply-chain.md(new): inputs/build/outputs/permissions inventory and known gaps..github/workflows/release.yml(new):v*tags +workflow_dispatch(dry_run, default true).gatejob (contents: read,checks: read) resolves the tagged commit, requires it to be an ancestor oforigin/main, and requires every one of the eight contexts to becompleted/successon that exact SHA (missing = FAIL; dry run downgrades to warnings).releasejob (the only job withcontents: write+id-token: write) builds withCGO_ENABLED=0 -trimpath -buildvcs=true -ldflags="-s -w"from a verified-clean tree into$RUNNER_TEMP, generates the CycloneDX SBOM, writesSHA256SUMS,cosign sign-blob+cosign attest-blob --type slsaprovenance1, verifies both bundles on the runner, uploads the set as a workflow artifact, and creates a draft GitHub Release withgh release create --draft --verify-tag. Concurrency group per ref,cancel-in-progress: false. No secrets beyondGITHUB_TOKEN/OIDC. All actions pinned by full SHA with version comments (sigstore/cosign-installerv4.1.2 withcosign-release: v3.0.6,anchore/sbom-actionv0.24.0,actions/upload-artifactv7.0.1, plus the existing checkout/setup-go pins)..github/workflows/dependency-review.yml(new):actions/dependency-review-actionv5.0.0 pinned,fail-on-severity: high, license allowlist, no PR comments. Advisory (not in the ruleset)..github/dependabot.yml: removed the rootnpmentry (root has no lockfile; it produced the lockfile-less duplicates build(deps-dev): bump @types/node from 22.19.19 to 26.2.0 #37/build(deps-dev): bump eslint from 9.39.4 to 10.8.1 #38/build(deps): bump the js-root group across 1 directory with 10 updates #55); per-workspace groups kept with PR limits._loopstate/**removed (8 files)..gitleaks.tomlkeeps the_loopstate/path allowlist (commented) because thescancheck is a full-history scan.CONTRIBUTING.md: "Review and merge" section.CHANGELOG.md: Unreleased entry.ci.ymljob names untouched..github/CODEOWNERSuntouched.Safety boundary
gh apicalls only.contents: write/id-token: writeare scoped to thereleasejob only; the top-level default iscontents: read.Verification
python3 -c 'import yaml; yaml.safe_load(open(f))'forrelease.yml,dependency-review.yml,dependabot.yml→ allOK.go run github.com/rhysd/actionlint/cmd/actionlint@latest -no-color -oneline .github/workflows/release.yml .github/workflows/dependency-review.yml(WSL, tool run only, no module change) → first run flaggedrunner.tempin job-levelenv(fixed:DISTnow set via$GITHUB_ENV); second run → no findings.30c4197c(main) → all eight contextsok,GATE=PASS.failureinstead ofsuccess) →GATE=FAIL.6e58031b(feat(agent): verify signed plans without execution #60 head): check runs green butgit merge-base --is-ancestor 6e58031b origin/main→ NO, so the ancestry guard would fail it, as intended..gitattributeseol=lf).Follow-ups for A0 (outside this lease)
docs/release-status.md:37still cites_loopstate/LOOP-18/as the evidence location; that file is S2's this wave. Suggested one-line change: point it at the CI run for the final verified commit instead..github/CODEOWNERS: PR feat(agent): verify signed plans without execution #60 rewrites it; not touched here. After feat(agent): verify signed plans without execution #60 lands, a follow-up should reconcile it with the "code-owner review not required" statement inGOVERNANCE.md(CODEOWNERS stays advisory).Dependency reviewand, once S10 hands overadversarial.yml, its context to the required list (governance change; updateGOVERNANCE.mdtable +REQUIRED_CONTEXTSinrelease.ymlin the same PR).actions/attest-build-provenancewould give GitHub-generated SLSA provenance but needsattestations: writeon the release job; deliberately not added here.workflow_dispatchwithdry_run: trueafter merge.Dependabot triage (this PR's companion actions, no merges)
Closed as superseded with a one-line comment each: #35 (⊂ #56), #36 (⊂ #56), #37 (lockfile-less; #46 + #56 cover it), #38 (lockfile-less; #56 covers eslint in apps/web), #55 (lockfile-less root group; #56 is the lockfile-backed equivalent). Left open: #42, #45, #46, #54, #56.