Public repository checklist¶
Operator ETL is open source under Apache License 2.0.
Repo: https://github.com/khaosans/operator-etl
Use this checklist when onboarding contributors, enabling branch protection, or preparing external posts.
Completed¶
| Item | Status |
|---|---|
| Apache-2.0 license | ✅ |
| CI proof gate (95 pytest + FOIA demo) | ✅ |
| Secret scan (gitleaks) | ✅ |
| SAST / SCA (bandit + pip-audit) | ✅ |
| CodeQL (Python) | ✅ |
| Container CVE scan (Trivy HIGH/CRITICAL) | ✅ |
| IaC scan (Checkov) | ✅ |
| Release CycloneDX SBOM | ✅ |
| Dependabot (pip + Actions + Docker + Terraform) | ✅ |
| Standardized root README (Make-a-README layout) | ✅ |
Local make lint / make security + pre-commit |
✅ |
Unified .github/CODEOWNERS (GCP/AWS/Azure secrets paths) |
✅ |
| PR / issue templates, CODE_OF_CONDUCT | ✅ |
| Educational docs + Mermaid diagrams | ✅ WHY.md |
| Public messaging (no "request access") | ✅ |
| Honest scope audit | ✅ FINAL-REVIEW.md |
Required: block merges when CI fails¶
Do not merge a PR while any required check is red or pending. Prefer a GitHub ruleset so the UI enforces this (admins cannot accidentally squash-merge a failing PR).
Agents and gh integrations cannot turn this on — it needs a repo admin in the GitHub Settings UI.
Current state (audited)¶
| Field | Legacy ruleset main (id 20961783) |
|---|---|
| URL | Ruleset main |
| Enforcement | Disabled |
| Branch targets | Empty (matches no branches) |
| Rules present | Restrict deletions · Block force pushes only |
| Missing | PR-before-merge · required status checks · Active enforcement |
Until fixed, a human can still merge a red PR. Treat that as a process failure.
Admin checklist — Settings UI (click path)¶
You need Admin on khaosans/operator-etl. Budget: ~5 minutes.
- Open Settings → Rules → Rulesets
(or edit the legacy one: rules/20961783) - Prefer Edit the existing
mainruleset (or New ruleset → Branch if you delete it). Name it clearly, e.g.protect-default-branches. - Enforcement status → Active (not Disabled / Evaluate).
- Target branches → Include by pattern (add both):
refs/heads/masterrefs/heads/main- Under Rules, enable:
| Toggle in UI | Setting |
|---|---|
| Restrict deletions | On |
| Block force pushes | On |
| Require a pull request before merging | On · Required approvals: 0 (solo maintainer OK) · Dismiss stale pull request approvals when new commits are pushed · Prefer Require conversation resolution if available |
| Require status checks to pass | On · Require branches to be up to date before merging · Add every context in the table below (exact names) |
- Bypass list: leave empty for production (or limit to org owners only). Do not add “all admins” if you want the gate to stick.
- Save changes.
Required status check contexts (exact job names)¶
Type each name when GitHub’s picker offers “Add check”. Names must match Actions job names exactly:
| Context | Workflow file |
|---|---|
ci-gate |
.github/workflows/ci.yml |
Analyze |
.github/workflows/codeql.yml |
ci-gate aggregates parallel peers in ci.yml (e2e, docker matrix + Trivy, terraform matrix + Checkov, gitleaks, bandit, pip-audit). Do not list matrix job names in the ruleset — that is the noisy pattern this gate replaces. Policy: BUILD-HYGIENE.md.
If a check is missing from the picker, open any recent green PR Actions run so GitHub indexes the job name, then retry Add.
Prove it works¶
- [ ] Ruleset shows Active on Rules
- [ ] Open a throwaway PR with a deliberate failing check (or wait mid-run) → Merge stays blocked / greyed for required checks
- [ ] After
ci-gate+Analyzegreen → squash-merge works - [ ] Optional: try a direct push to
master→ rejected (PR required)
Why this matters¶
#34 had green PR CI, then a flaky A2A wait timed out on the post-merge master push (run). Rulesets stop known-red PR merges; keep e2e green on master by fixing flakes (A2A now waits on a completion Event — TESTING.md).
Other recommended GitHub settings (manual)¶
| Setting | Why |
|---|---|
| Dependabot alerts + security updates | Settings → Code security → enable alerts and security updates |
| Secret scanning + push protection | Settings → Code security → prevent committing secrets |
| Require review from Code Owners | Optional for solo maintainer; path owners live in .github/CODEOWNERS |
| Repository visibility | Settings → General → Public |
| Packages tag immutability | After first GHCR publish: package settings → make tags immutable |
Do not force-push master or v* tags |
Releases are snapshots; next freeze is a new tag |
Before your next external post¶
- [ ]
make e2egreen - [ ]
make shareif PDFs changed - [ ] FINAL-REVIEW.md — no overclaiming production/GCP
- [ ] Post copy links repo + invites
make e2e - [ ] Sample data described as synthetic
Suggested copy: share/README.md
What to claim (and not)¶
| Safe to claim | Do not claim |
|---|---|
make e2e reproduces FOIA demo locally |
Production FOIA deployment |
| 95 pytest + critic + PII leak tests | Presidio or a live LLM API (optional path mocked) |
| Medallion + LangGraph + MCP architecture | Live GCP/BQ E2E (PARTIAL) |
See also¶
- REPO-HYGIENE.md — branch policy, merge gate, commit/secrets hygiene
- VERSIONING.md — tags publish; Packages / GHCR
- RELEASING.md — safe updates
- WHY.md — educational overview
- CONTRIBUTING.md
- SECURITY-HARDENING.md — CI SAST/SCA and HTTP guards