Skip to content

feat(gates): enforce the ten release gates as a fail-closed CI audit (SP-GATE-004 / G5) - #54

Merged
mdheller merged 1 commit into
mainfrom
feat/validate-release-gates
Aug 2, 2026
Merged

feat(gates): enforce the ten release gates as a fail-closed CI audit (SP-GATE-004 / G5)#54
mdheller merged 1 commit into
mainfrom
feat/validate-release-gates

Conversation

@mdheller

@mdheller mdheller commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

What (SP-GATE-004, closes audit G5)

The ten release gates ('A SourceOS service is not release-ready unless…', README) were prose — no CI evaluated them. sourceos_service_graph.py now has a release_gate_audit mapping each of the ten to a fail-closed, gate-numbered check, plus a release-gates subcommand and a validate-release-gates make target wired into make validate (blocking).

Gates: manifest · canonical-events(or documented exemption) · required/optional/denied caps · app hermetic launch manifest · incident bundle covering the 5 fault classes {crashes, denial-storms, wake-anomalies, identity-mismatches, parser-faults} · no silent remote trust · no remote telemetry by default · coalesced expected denials · privacy+causal structure · DeliveryExcellence metric.

Teeth-verified: dropping any gate field fails that numbered gate. The bearbrowser example gains a conforming release_gates block; make validate green.

Dogfood note (vocab loop)

The new field names (release_gates.hermetic_launch_manifest, incident_fault_classes, …) are new vocabulary not yet connected to the glossary/ontology — a live instance of the LSA↔LDA divergence the vocab CI feedback loop must surface (language = governance substrate). Flagged for that follow-up. Not auto-merging — for review.

…(SP-GATE-004, G5)

The ten release gates ('A SourceOS service is not release-ready unless…', README) were
prose — no CI evaluated them. Now sourceos_service_graph.py has a release_gate_audit that
maps EACH of the ten gates to a fail-closed check (gate-numbered so failures are legible):
manifest, canonical-events(or documented exemption), required/optional/denied caps, app
hermetic launch manifest, incident bundle covering the 5 fault classes, no silent remote
trust, no remote telemetry by default, coalesced expected denials, privacy+causal structure,
DeliveryExcellence metric. New 'release-gates' subcommand + validate-release-gates make target
wired into 'make validate' (blocking). Teeth-verified: dropping any gate field fails that gate.

The bearbrowser example manifest gains a release_gates block so it conforms. NOTE: those new
field names (release_gates.hermetic_launch_manifest, incident_fault_classes, …) are NEW VOCAB
not yet connected to the glossary/ontology — a live instance of the LSA↔LDA divergence the
vocab CI loop (task #13, [[feedback_vocabulary_is_governance_substrate]]) must surface.
Copilot AI review requested due to automatic review settings August 2, 2026 19:37
@mdheller
mdheller merged commit f624bfb into main Aug 2, 2026
5 checks passed
@mdheller
mdheller deleted the feat/validate-release-gates branch August 2, 2026 19:38

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds an enforced, fail-closed CI audit for the “ten release gates” by implementing a gate-numbered audit in sourceos_service_graph.py, exposing it via a new release-gates subcommand, and wiring it into make validate so it blocks CI when gates are not satisfied.

Changes:

  • Implemented release_gate_audit() with 10 numbered checks and a release-gates CLI subcommand.
  • Added validate-release-gates and made it part of the default validate target.
  • Updated the bearbrowser example manifest to include a conforming release_gates block.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
tools/sourceos_service_graph.py Adds release gate audit logic and a release-gates subcommand to enforce the ten gates in CI.
Makefile Wires the new release-gates audit into make validate as a blocking step.
examples/services/bearbrowser.service.json Adds the release_gates block so the example service passes the new audit.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +266 to +281
def cmd_release_gates(args: argparse.Namespace) -> int:
services, errors = load_services(args.pattern)
if errors:
for error in errors:
print(error, file=sys.stderr)
return 1
all_fails: list[str] = []
for path, service in services:
all_fails.extend(release_gate_audit(path, service))
if all_fails:
for f in all_fails:
print(f, file=sys.stderr)
print(f"release-gate audit: {len(all_fails)} gate failure(s) across {len(services)} service(s)", file=sys.stderr)
return 1
print(f"release-gate audit: all ten gates pass for {len(services)} service manifest(s)")
return 0
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.

2 participants