runward gate
Version updated for https://github.com/stranxik/runward to version v0.34.0.
- This action is used across all versions by 0 repositories.
Action Type
This is a Composite action.
Go to the GitHub Marketplace to find the latest changes.
Action Summary
Runward automates the verification of engineering decisions behind AI-generated code. It ensures that every critical architectural decision is written down and checked deterministically, preventing potential errors in production. The action helps teams to ensure that they have a clear chain of evidence for their software systems.
What’s Changed
Three decisions from the 2026-08-12 product review land: the construction gate becomes usable in CI, and the gate is made as strong as its headline. This release deliberately reddens some previously green missions — the migration note below names exactly which, and the one-line fix for each.
runward check --through <phase-id> — the construction gate (ADR-0053)
A required check --strict exits 1 for the whole build, because later-phase deliverables are unfilled by definition — so it was unusable in CI during construction, and teams hacked a partial-green with jq or || true. --through <phase-id> certifies a declared PREFIX: every phase up to and including <phase-id> is crossed on evidence, nothing past it. It narrows only the phase counters; the 0/1/2 exit contract, the seal and the six phases are untouched, and the phase-global integrity checks (corpus, seal, unratified ADRs, drift) are NOT scoped, so a regression at or below the horizon still reds — the horizon is a floor, not a ceiling. It refuses --freeze (a seal certifies a full crossing) and an unknown id, both exit 2; it prints a loud “not a completion verdict” banner and carries additive JSON (through, horizon, gaps.deferred). The wiring contract is in the ADR: the release / merge-to-main gate stays the full check --strict; --through is a construction progress signal, never the sole required release check.
The gate is made as strong as its headline (ADR-0051)
- Symbols match at an identifier boundary.
#guardFieldsno longer matches a file that contains onlyguardFieldsLegacy. A renamed identifier — the exact “moved or renamed” case the violation message names — now reds instead of silently passing, and a seal can no longer sit on a pointer whose identifier no longer exists. Non-identifier symbols (dotted, quoted) keep their exact-substring semantics. - Five more rules carry an evidence signature (6 of 64, up from 1):
resilience-retry-backoff,resilience-multi-provider-fallback,security-mcp-server-pinning,security-code-execution-sandbox,security-tool-change-reapproval— each a conventional idiom the rule text prescribes, each with anonScopestating what a match does NOT prove. Rules whose idiom is illustrative rather than a code token stay unsigned, and the refusals are named in the commit. - The run names the signed share of the verdict: “N of M
appliedrow(s) rest on a signed rule”. Counted, never gated; additive JSON (evidence.signed).
Overclaim rules externalized (ADR-0050 decision 2, structural part)
The forbidden-claim list moves out of the CLI test into src/lib/claims-rules.ts, shipped with the package, so a site-build guard can consume the same list from the pinned dependency — one source, no drift. No behaviour change; the guard’s three meta-guards are intact. ADR-0050 stays proposed (its site-copy decisions need the site repo).
Migration — this release reddens some green missions on purpose
After runward update refreshes a mission’s rule corpus (or on the next check --strict for a mission that judges against the package corpus), two populations turn red. Both are the mechanism working, and each has a one-line fix:
- A pointer symbol that was a fragment of the real identifier. If an
appliedrow’s#SYMBOLpassed only because it is a substring of a larger identifier (e.g.#guardFieldsoverguardFieldsLegacy), it now reads “symbol not found”. Fix: point at the real identifier, or drop the#SYMBOLto keep the bare path. - A prose
appliedrow on one of the five newly-signed rules. A signature makes file-backed evidence mandatory forappliedrows, so anappliedrow that carried only prose (nofile:/test:pointer whose content matches the idiom) now reds with “cited, not applied”. Fix: point the row at evidence that carries the rule’s shape, or answern/a/deviatedwith a reason — a rule the mission does not implement was never meant to beapplied.
The two reference missions (runward’s own, and the shipped request-triage example) are strict-green under this release; every change was validated in both directions on each.