ChangeOps Reference
Operational details for the ChangeOps gate surface—CLI commands, API endpoints, and data storage—sourced from the Phase 4 release plan.
CLI commands
fleetforge-ctl wraps the ChangeOps API so pipelines and operators can drive
gating flows:
| Command | Purpose | Key flags |
|---|---|---|
fleetforge-ctl gates check --input change.json --output gate-decision.json | Evaluate a change bundle and produce a decision (allow, follow_up, deny). | --endpoint, --token, --input, --output |
fleetforge-ctl gates followup --gate <ID> --note "<text>" | Record acknowledgements or overrides for a follow-up decision. | --gate, --note, --actor (optional override) |
fleetforge-ctl gates list [--change-id <CHANGE>] | List historical gate outcomes for auditing or dashboards. | --change-id, --limit, `--format=json |
fleetforge-ctl audit export --bundle-dir bundle/ writes a JSON bundle that
includes the exported audit rows and any attestation identifiers referenced by
those records, making it easier to hand evidence to compliance reviewers.
All commands respect the standard FleetForge environment variables (FLEETFORGE_API_HTTP,
FLEETFORGE_API_TOKEN) and return JSON by default. Exit codes are non-zero on
CLI errors; gates check itself succeeds even if the decision is deny, so
pipelines should inspect the decision.effect field.
API endpoints
The runtime API exposes three RPCs (see
RuntimeService):
| RPC | Request | Response | Notes |
|---|---|---|---|
CheckChangeGate | CheckChangeGateRequest | CheckChangeGateResponse | Evaluates the change bundle and returns the decision payload plus artifact IDs. |
RecordGateFollowup | RecordGateFollowupRequest | RecordGateFollowupResponse | Stores acknowledgements or overrides tied to a gate. |
ListChangeGates | ListChangeGatesRequest | ListChangeGatesResponse | Paginates stored decisions for dashboards and audits. |
The TypeScript SDK (sdk/typescript/src/gen/fleetforge/runtime/v1/runtime_*)
and Python SDK (sdk/python/fleetforge_proto/.../runtime_pb2.py) expose
generated clients matching these endpoints.
Data model & storage
- Tables:
changeops_gatescaptures decision snapshots;changeops_followupsrecords acknowledgements. Apply migrationcore/storage/migrations/0014_changeops_gates.sqlviasqlx migrate run. - Artifacts: Every decision emits a JSON artifact tagged
kind=change_gate_decision, containing the evaluated bundle, scores, and recommendations. When attestation evidence is available, the runtime also publishes a signed SCITT transparency entry (kind=scitt_entry) that links the decision to its attestation bundle. The SCITT artifact metadata now embeds atransparencyobject describing which backend handled the append (localvsscitt-http), whether it was a dry run, and any receipt payload returned by the remote log. - Transparency queue: Setting
FLEETFORGE_TRANSPARENCY_WRITER=1enables a background worker that scans the newtransparency_jobstable and publishes SCITT entries asynchronously. Gate metadata records the queued job id (status=queued) until the worker writes the final receipt, so release pipelines no longer block on remote SCITT endpoints. The same worker honorsFLEETFORGE_TRANSPARENCY_DRY_RUN=1and writes the returned dry-run receipts to the metadata. Adjust the cadence withFLEETFORGE_TRANSPARENCY_WRITER_INTERVAL_SECS(defaults to 30s). The writer requires an Enterprise license (FLEETFORGE_LICENSE_TIER=enterprise); OSS/Pro deployments log a warning and continue without the SCITT feed. UseFLEETFORGE_TRANSPARENCY_SCOPE=gates|runs|artifactsto pick whether only gate decisions, whole runs, or every artifact enqueue SCITT jobs (default:gates). - Replay diff artifacts: When deterministic replays detect attestation or
tool I/O drift, the executor fails fast and writes a compact
replay_attestation_difforreplay_tool_diffartifact that summarizes the recorded vs current evidence (missing/unexpected attestation IDs, mismatched tool payloads). The error message includes the artifact SHA-256 so pipelines can fetch it via the artifact store. - Telemetry: Structured spans/logs use the
fleetforge.changeopstarget so OTEL collectors and the UI can display gate activity.
Acceptance tests (First Green Bar)
The Status & Acceptance page now owns the ChangeOps readiness checklist. Its Hello Fleet walkthrough yields the exact capability tokens, attestations, C2PA manifest, replay telemetry, and SCITT receipt that gates require—extend that single scenario when adding new criteria.
Telemetry requirements
Gate evaluations now require two telemetry feeds supplied in the request:
telemetry.replays[]– Each critical replay must includeattestation_match=true,tool_io_match=true, andtoken_drift <= 0.01. Any mismatch or missing replay evidence escalates tofollow_upordeny.telemetry.canary[]– Canary promotions must surface the attestation set they observed. Missing or mismatched attestation IDs deny the gate.
Gate responses include these structures in decision.scorecard.telemetry for
downstream tooling.
Decision semantics
Outcome values and recommended actions:
| Effect | Description | Typical response |
|---|---|---|
allow | Change meets policy thresholds (novelty, evals, budgets). | Merge or ship automatically; store the artifact. |
follow_up | Additional review needed (e.g., missing eval coverage). | Block merge until gates followup records acknowledgement. |
deny | Change violates policy thresholds. | Fail the pipeline, address issues, re-run gates check. |
Gate payloads include structured sections covering novelty scores, eval packs, replay parity, and budget impact so reviewers can trace the decision quickly.
Operational checklist
- Keep ChangeOps migrations (
0014_changeops_gates.sql) applied across environments. - Rotate the service account token used by CI and log gate IDs in release notes.
- Export decision artifacts and telemetry to your observability stack for compliance audits.
- Configure signing material for provenance and transparency feeds:
FLEETFORGE_TRUST_SIGNING_KEY(or_PATH) signs policy attestations, whileFLEETFORGE_SCITT_KEY(or_PATH) signs the emitted SCITT entries. - Select the transparency log backend via
FLEETFORGE_TRANSPARENCY_BACKEND(localby default). When set toscitt-http, provideFLEETFORGE_TRANSPARENCY_ENDPOINT(and optionallyFLEETFORGE_TRANSPARENCY_TOKEN). UseFLEETFORGE_TRANSPARENCY_DRY_RUN=1to record pseudo-receipts without calling the remote log andFLEETFORGE_TRANSPARENCY_TIMEOUT_SECSto override the HTTP client timeout.
Related resources
- Concept: ChangeOps governance
- How-to: Add a ChangeOps gate to CI
- Contract background: Phase 4 — ChangeOps Gates