CI with verified workflow outcomes

Install the signed tools using Adoption. The maintained workflow example uses ordinary runner jobs and the same cohesix-journey Python/CLI interface as an operator. Copy it to .github/workflows/ in the adopting repository. Configure the protected cohesix-production environment with required reviewers and main-only deployment branches. Restrict the cohesix-controller runner group to that reviewed workflow; untrusted PR jobs must never run there. Pin action revisions under your repository’s review policy before production use. The example is not installed or enabled automatically.

Provision an operator-owned configuration, state volume, package trust and evidence CAS outside the runner workspace. COH_JOURNEY_CONFIG is a protected environment variable naming that absolute configuration. Secret references resolve private files or bounded environment values on the enrolled runner. They are never workflow inputs or uploaded artifacts. Do not run pull_request_target, fetch PR code in the protected job, execute unreviewed native artifacts or share production credential mounts with validation jobs. The validation job has read-only repository permission, no environment, no production credentials and no submission authority.

Derive the operation before admission using cohesix-journey identity. Identity binds workflow kind, purpose, immutable workload semantics and explicit rerun intent. For CUDA it includes each input’s exact bytes, stage dependency/runtime, topology and generated contract. For LoRA it includes the full requested input/profile, model, baseline generation and evaluation policy. The operation ID itself is excluded from its own hash. Never use run-attempt, current time or random identity on retry. Use rerun = "initial" for ordinary retry; an owner-approved deliberate rerun gets a new distinct string and fresh tickets. Changed input also produces a new operation.

After issuing the exact tickets, freeze the deployment. The private durable directory contains an atomic binding.json, planned.json, the existing recipe/controller journal and a sanitized outcome.json. An exclusive lock serializes retries across runner processes. Changed deployment/admission is refused under the same identity. A missing previously planned journal is refused; restore its exact retained state. CI must not delete state after a timeout or recreate it on an ephemeral runner. Native execution, Worker receipt and signed evidence remain the earlier owners.

cohesix-journey validate --config /srv/cohesix/journey.json
cohesix-journey run --config /srv/cohesix/journey.json --submit --wait-seconds 900
# A new runner with the same durable volume uses the identical command.
cohesix-journey run --config /srv/cohesix/journey.json --wait-seconds 60

validate checks configuration and immutable identity without credentials or submission. --submit can advance only unsubmitted work through the existing lifecycle with freshly resolved authority. An uncertain dispatch is queried; it is never blindly resubmitted. A new CUDA stage still requires current scope, expiry, revocation and resource checks. An expired LoRA operation requires the separately approved recovery-only workflow in Private LoRA release, never a replacement candidate ticket hidden inside a CI retry. Export/mirror independently signed graph/CAS objects to the configured controller evidence locations as part of the enrolled evidence workflow. A mere transport ACK cannot satisfy this gate.

Exit State Meaning
0 verified Shared coh verify rechecked the requested CUDA output or exact successful LoRA release.
10 pending Planned work has no submission.
11 running Submission acknowledged; requested terminal evidence is absent.
12 ambiguous Dispatch intent exists but ACK/terminal outcome is uncertain.
13 refused Configuration, authority, bounds or a submission was refused.
14 cancelled Verified cancellation; requested output was not completed.
15 recovered_failure Failed candidate restored its baseline; candidate release still failed.
16 failed Verified failure, including regression or failed rollback.
17 timeout Bounded wait expired; retain state and evidence and reconcile later.
18 invalid_evidence Missing, malformed, mismatched or rejected verification evidence/report.

Wait is 0–3600 seconds, with at most two seconds between inspections. Each fixed CLI call additionally has the existing 30-second/output bound; terminating a timed-out controller does not cancel a native operation. Only exit 0 greens the CI job. The final report carries operation identity, outcome, shared-report digest and evidence references. Retain the actual protected graphs/CAS and trust separately; a report hash or uploaded log alone is not verification authority. Never convert a refused, insufficient-evidence, timeout or successfully rolled-back candidate into success.