Repository navigation
ci: chant run results as a status source for ci tick, with signed run statements (#4044) - #4062
Merged
Merged
Conversation
…a runner key (#4044) ci.green.source (or --source) runs reads Op runs from the run ledger on chant/lifecycle in place of forge check runs. A phase's patterns match Op names, and a run counts for its gitSha only when its record carries an op-run/v1 statement signed by a runner key holding the runner role at base. chant run <op> --key or CHANT_RUNNER_KEY signs the record as it settles. Tags made from runs are signed and name each run's id, env, signer and statement. GitLab and Forgejo are covered through chant runs. (#4044)
lex00
force-pushed
the
feat/4044-run-status-source
branch
from
October 17, 2026 04:12
7d681ba to
bc96748
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #4044
ci tickcan take chant's own Op runs as its status source, counting only runs whose record a runner key signed. This gives GitLab, Forgejo and any forge without check runs green and revoked tags (the #4021 decision).ci.green.source: "checks" | "runs"in the declaration, or--source checks|runsonci tickandci list(the flag wins).checks, GitHub check runs, stays the default. Withrunsthe tick needs no forge token.runs, a phase's patterns match Op names. A run counts for the commit in its record'sgitSha; the latest run of each Op on a commit wins by end time.okpasses,failfails, and a run stopped at a gate or decision point leaves the phase undecided.chant run <op> --key <pem>orCHANT_RUNNER_KEYsigns the record as the run settles, with predicatehttps://intentius.io/chant/op-run/v1over the commit, id, Op, env, status and a SHA-256 of the record. The key must be underrunnersin.chant/trust.jsonat HEAD with therunnerrole. A bad--keystops the run before it starts; a badCHANT_RUNNER_KEYwarns and records the run unsigned. Signing code loads only when a key is given, so level-0 projects still load no workspace code.runsit fetcheschant/lifecyclefirst (never forced, stopping if diverged), and always needs a runner key except under--dry-run. Its tags are signed as in trust: signed green tags and run statements, a role for who may cut a release, signed release records #4031, withsource: "runs"and each run'sopRun(id, env, signer, statement).ci list --source runsjudges undecided commits from the local ledger, refuses--forge, and addsopRunandignoredRuns.cli/ci.mdxhas a "Chant runs as the status source" section; the--forge gitlab|forgejorefusal now points at--source runs.Level-0 output changes
On the exceptions page and #2525:
chant run <op>given a key addsstatementto its ledger record and--json; a badCHANT_RUNNER_KEYwarns; help gainsrun --keyand--source; the--forge gitlab|forgejorefusal text changed;ci list --jsongainsopRunandignoredRunsunderruns. No golden moved.Acceptance
ci-green-runs.test.ts"a commit is tagged green from signed local Op runs, and the tag names and carries them": real Ops throughrunOpLocally, temp repo, throwaway key, no forge; it verifies the tag and run statements and that a second tick changes nothing).--sourceprecedence.Checks
npx tsx scripts/typecheck.ts: no regressions (26 baselined)npx tsx scripts/check-lexicons.ts: no untracked tier-1 failuresGITHUB_SHA,GITHUB_RUN_IDandCIset, after rebasing on mainop/factory.e2e.test.tsfailureslint-docs-sentences(no regressions),lint-prompts,check-docs-diataxis,./scripts/build-docs.sh: passchant/lifecycle(4275740), its 100ci/*tags and.git/chant/were unchanged by the test runs.Limits: the tick reads the run ledger of the directory it runs in, not other members'
_members/<m>/runs;ci workflowstill writes only a GitHub Actions file; readers verify a tag's own signature and don't re-verify the run statements inside it.