Apastra ships 13 GitHub Actions workflows inDocumentation Index
Fetch the complete documentation index at: https://bintzgavin-apastra-14.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
.github/workflows/. They cover eval gating, releases, promotion, delivery, governance, and operational scanning.
You do not need all 13 workflows. Start with the two basic CI workflows (
prompt-eval.yml and prompt-release.yml) and add the full enterprise set when you need fine-grained control.Basic CI (start here)
These two workflows give you regression gating and immutable releases with minimal setup.prompt-eval.yml
Runs on every pull request that touches promptops/**. Evaluates changed prompts and blocks merge if a regression is detected.
Trigger:
regression-gate.yml via workflow_call.
eval (or the check name from regression-gate.yml) as a required status check on your main branch. PRs that fail the gate cannot merge.
prompt-release.yml
Runs when any tag is pushed. Creates an immutable GitHub Release with SLSA provenance.
Trigger:
immutable-release.yml via workflow_call.
Full CI (enterprise)
Use these when you need separate regression gating, manual promotion, governed delivery, auto-merge, and human approval recording.regression-gate.yml
Dedicated regression gating job. Can be called directly or via workflow_call from prompt-eval.yml.
Triggers:
- Checkout the repository with
fetch-depth: 2. - Detect changed files — checks
promptops/harnesses/**,promptops/prompts/**,promptops/datasets/**, andpromptops/policies/*.yaml. - Skip if no evaluable changes — exits cleanly when only non-promptops files changed.
- Fetch artifacts branch — checks out
regression_report.jsonandrun_manifest.jsonfromorigin/promptops-artifacts. - Check regression report status — reads
reports/regression_report.json:- If the file is missing, fails with
::error::Regression report missing. Merges are blocked. - Prints a summary table of evidence rows (metric, status, candidate, baseline, delta, message) to
$GITHUB_STEP_SUMMARY. - Emits
::errorannotations for any failing metrics. - Reads
statusfield: exits 0 onpass, exits 1 on any other value.
- If the file is missing, fails with
- Check cost budget — if
run_manifest.jsoncontainstotal_cost, validates it againstbudgets.cost_budgetin every suite file.
promote.yml
Creates an append-only promotion record binding an approved digest to a delivery channel, then triggers deliver.yml.
Triggers:
record-promotion):
- Checkout the
promptops-artifactsbranch. - Enforce approval — reads
approvals/*.jsonfrom the artifacts branch and verifies a matching approval record (matchingrevision_refanddecision == "approved"andchecks_passed == true) exists. Fails if no approval is found. - Generate promotion record — writes a JSON file to
promotions/<timestamp>-<id>.jsonon the artifacts branch: - Commit and push the promotion record to
promptops-artifacts. - Trigger
deliver.yml— passes the promotion record path as an input.
release event, the digest is set to release-tag:<tag_name> and the channel is set to release.
deliver.yml
Syncs an approved version to delivery targets. Called by promote.yml via workflow_call.
Trigger: workflow_call only (not triggered directly).
Input: promotion_record_path — path to the promotion record on the artifacts branch.
Key job steps:
- Checkout the main branch.
- Fetch promotion record from
origin/promptops-artifacts. - Sync to targets — reads
channelanddigestfrom the promotion record. Iterates over allpromptops/delivery/*.yamlfiles and finds targets whosechannelmatches. For each match, readstypeandrepoand executes the appropriate sync.
delivery-target.schema.json): github_pr, oci_registry.
immutable-release.yml
Creates a GitHub Release with a content-addressed tarball and SLSA build provenance attestation.
Triggers:
- Checkout the repository.
- Package prompts — creates
promptops.tar.gzfrom thepromptops/directory and computes its SHA-256 digest. - Attest build provenance — uses
actions/attest-build-provenanceto attach a SLSA provenance attestation to the tarball. - Create GitHub Release — uses
gh release createwith the tag name, attachespromptops.tar.gz, and includes the digest in the release notes.
contents: write, id-token: write, attestations: write, artifact-metadata: write.
auto-merge.yml
Automatically enables squash merge for PRs opened by authorized users (Jules and the repo owner). Resolves docs/PROGRESS.md merge conflicts using a union merge strategy.
Trigger:
google-labs-jules, google-labs-jules[bot], or BintzGavin.
Key job steps (resolve-progress-conflicts):
- Checks out the PR branch.
- Fetches the base branch.
- Attempts a merge; if
docs/PROGRESS.mdhas conflicts, resolves them by concatenating both versions (union merge). - Pushes the resolved branch.
enable-auto-merge):
- Marks the PR as ready for review.
- Calls
gh pr merge --auto --squashwith a retry loop (5 attempts, backoff) to handle rate limits.
record-approval.yml
Records a human approval or rejection decision as an append-only JSON file on the promptops-artifacts branch.
Trigger:
- Checkout the
promptops-artifactsbranch. - Generate approval state record — writes to
approvals/<timestamp>-<id>.json: - Commit and push the approval record to
promptops-artifacts.
promote.yml workflow reads these records to enforce approval before creating a promotion record.
Operational workflows
schema-validation.yml
Validates changed prompt and dataset files against JSON schemas on every pull request.
Trigger:
- Detect changed files using
tj-actions/changed-files. - Install dependencies —
npm install -g ajv-formats ajv-cli. - Validate changed files:
- Prompt files: runs
promptops/validators/validate-prompt-spec.sh <file>. - Dataset files: runs
promptops/validators/validate-dataset.sh <manifest> <cases>for each dataset directory with both a manifest and acases.jsonl. Skips incomplete datasets with a warning. - Emits
::errorannotations for any validation failures and exits with code 1.
- Prompt files: runs
canary-drift-detection.yml
Runs canary suites on a schedule to detect post-ship quality erosion when model providers update silently.
Triggers:
- Checkout the repository.
- Run the canary suite harness.
- Parse
reports/drift_report.json. - Check the
drift_detectedfield. - Trigger an alert and auto-rollback if
drift_detected == true.
The canary harness integration is a placeholder in the current implementation. You supply your own harness command in step 2.
community-reporting.yml
Triages community moderation reports submitted as GitHub Issues with the moderation-report label.
Trigger:
moderation-report label.
Key job steps:
- Add acknowledgment comment — posts a standard acknowledgment to the issue.
- Assign to governance admins — adds
apastraandgovernance-adminsas assignees.
moderation-scan.yml
Scans changed prompt and dataset files for blocked keywords on every pull request.
Trigger:
- Runs a
grepscan for blocked keywords acrosspromptops/prompts/andpromptops/datasets/. - Exits 1 (failing the check) if any blocked keywords are found.
secret-scan.yml
Detects secrets accidentally embedded in prompt files or datasets.
Trigger:
- Scans all prompt and dataset files for patterns matching
api_key:,secret:,password:, ortoken:. - Exits 1 if any matches are found.
Branch protection setup
To enforce required status checks onmain:
Go to branch protection settings
In your GitHub repo, go to Settings → Branches → Add branch protection rule for
main.Enable required status checks
Check Require status checks to pass before merging. Search for and add the check names you want to require.For basic CI, add:
eval / gate(fromregression-gate.yml)validate-schemas / validate-schemas(fromschema-validation.yml)
scan / scan-secrets(fromsecret-scan.yml)scan / scan(frommoderation-scan.yml)
Enable required reviews
Optionally require at least one approving review from a CODEOWNERS reviewer before merge.
Workflow summary table
| Workflow | Trigger | Group |
|---|---|---|
prompt-eval.yml | PR touching promptops/** | Basic CI |
prompt-release.yml | Tag push | Basic CI |
regression-gate.yml | PR to main / workflow_call | Full CI |
promote.yml | Manual dispatch / release published | Full CI |
deliver.yml | workflow_call from promote.yml | Full CI |
immutable-release.yml | Tag push / workflow_call | Full CI |
auto-merge.yml | PR opened/updated | Full CI |
record-approval.yml | Manual dispatch | Full CI |
schema-validation.yml | PR touching prompts or datasets | Operational |
canary-drift-detection.yml | Hourly schedule / manual dispatch | Operational |
community-reporting.yml | Issue opened with moderation-report label | Operational |
moderation-scan.yml | PR touching prompts or datasets | Operational |
secret-scan.yml | PR touching prompts or datasets | Operational |