Skip to content

feat(release): develop to main - #950

Merged
bedatty merged 12 commits into
mainfrom
develop
Oct 21, 2026
Merged

bedatty merged 12 commits into
mainfrom
develop

Conversation

@bedatty

@bedatty bedatty commented Oct 21, 2026

Copy link
Copy Markdown
Contributor
Lerian

GitHub Actions Shared Workflows


Description

Type of Change

  • feat: New workflow or new input/output/step in an existing workflow
  • fix: Bug fix in a workflow (incorrect behavior, broken step, wrong condition)
  • perf: Performance improvement (e.g. caching, parallelism, reduced steps)
  • refactor: Internal restructuring with no behavior change
  • docs: Documentation only (README, docs/, inline comments)
  • ci: Changes to self-CI (workflows under .github/workflows/ that run on this repo)
  • chore: Dependency bumps, config updates, maintenance
  • test: Adding or updating tests
  • BREAKING CHANGE: Callers must update their configuration after this PR

Breaking Changes

None.

Testing

  • YAML syntax validated locally
  • Triggered a real workflow run on a caller repository using @this-branch or the beta tag
  • Verified all existing inputs still work with default values
  • Confirmed no secrets or tokens are printed in logs
  • Checked that unrelated workflows are not affected

Caller repo / workflow run:

Related Issues

Closes #

lerian-studio and others added 12 commits October 20, 2026 14:31
…it did

The blocked comment said only that the gate did not reach a verdict and
linked the run. True, and no help: the author opens the run and hunts for
the red job.

Measured on ungoliant-controller, whose first breaking change produced
exactly that comment. The cause was three steps away in the log - no
catch-all CODEOWNERS rule, no fallback reviewer, so the Environment could
not be created - and nothing on the pull request pointed at any of it.

The verdict already knew which half failed; it was writing it to the log
and telling nobody else. It now emits the stage, the outcome forwards it,
and the comment names it. The request case also names the cause that
actually occurs, since it is the one a reader cannot guess.

Empty keeps the neutral wording, so a caller that does not pass it is no
worse off. @radagast-lerian offered both options on #926 and I took the
cheaper one; this is the other.
…lock

charts.lerian.studio is built by GitHub Pages (Jekyll 3.10), which runs Liquid
over every .md. Upgrade guides carry Helm template snippets ({{ ... }}): they
raised hundreds of Liquid warnings and an unterminated one broke the whole
site build (LerianStudio/helm#2565 fixes the existing guides).

Generated guides that contain {{ or {% are now wrapped in
<!-- {% raw %} --> ... <!-- {% endraw %} -->: Liquid honours the tags and
GitHub's markdown view hides the comments. Raw markers are stripped from the
few-shot examples and from the model output first, so the model never echoes
them and the wrap is never nested (nested raw breaks Liquid too).
… logging it

The "Run govulncheck" step carried a bare `continue-on-error: true`, so a known
vulnerability in a consumer's dependency graph left the Security job green and
the finding sat in a job log nobody opens on a passing check.

Removing the flag outright would be a break for every repository on the channel:
the Go vulnerability database moves independently of the pull request, so a newly
published CVE in a common dependency would turn them all red at once, on pull
requests touching nothing related — the same shape of breakage x/vuln v1.8.0
already caused here.

So the step now branches on the exit code instead. Findings are always annotated:
a warning by default, an error — failing the job — when the new
`fail_on_govulncheck` input is true. The default keeps today's behaviour, and a
repository that has cleaned its graph can opt into the gate on its own schedule.

Closes #910
…name

A reusable workflow's check is reported as `<caller job> / ... / <job>`, and
the caller's job name lives in the consumer's own repository. Measured
across the 68 repositories consuming the umbrellas, the same gate produces
six distinct names:

  48  validate / PR Metadata / Breaking Change Approval / Breaking Change Approval
  18  validate / Breaking Change Approval / Breaking Change Approval
   5  ui / PR Metadata / ...
   1  validate_mcp / PR Metadata / ...
   1  Validate PR / ...
   1  Metadata Validation / ...

Required status checks match the context exactly, with no wildcard, so no
single organisation ruleset can require the gate - and a required check
that never arrives leaves the pull request pending forever, so listing all
six would block every repository that produces only one.

A commit status carries no job path. It is the reason `CodeRabbit` and
`Socket Security` read identically everywhere, and it removes the caller
from the name: set `BREAKING_APPROVAL_STATUS_CONTEXT` once and one rule
covers every repository.

Published on every run, including the ones with nothing to approve - out of
scope, no breaking commits, superseded all publish success. A status that
appears only sometimes cannot be required. `result` decides pass or fail;
the state only chooses the wording, and the two are not allowed to disagree.

`statuses: write` is deliberately not declared on the job: a called workflow
may only ask for permissions the caller already holds, so declaring it would
break every consumer that does not grant it - the same reasoning the file
already applies to `actions: read`. It goes through MANAGE_TOKEN, and warns
rather than failing when it cannot be written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… dead one

Three findings from CodeRabbit on #949, all valid.

**A superseded run published failure over its replacement.** The verdict
emits `state=superseded` with `result=failure` - confirmed by running it -
so the authority line turned the intended success into a failure and
published it. GitHub reads the latest status for a context, and a
superseded run can finish after the one that replaced it, so this would
block a pull request on a decision already given. Superseded now publishes
nothing, the same rule the comment and the close already follow.

My test could not see it: it passed the helper's default `result=success`
for every state, which is not what the verdict emits for this one. Each
state now carries its real result.

**No pending status before the wait.** The previous run's success stayed
current while this run sat at the Environment, so a rule requiring the
status would allow the merge on a decision nobody had given. The head SHA
does not have to change for that - `edited` re-runs on the same commit, and
retargeting a pull request moves it in or out of scope. The status now goes
pending in `request`, before `approval` can wait, and only when this run
will actually hold.

**The warning offered a remedy that does nothing.** It suggested granting
`statuses: write` on the caller's job. The job declares its own
`permissions:`, which replaces what the caller granted, so only
MANAGE_TOKEN can write it. Corrected in the warning, the input description
and the guide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two more from CodeRabbit on #949, both real.

**An older run could publish success over a newer run's pending.** Retarget
a pull request to an in-scope base without touching the head SHA: the old
out-of-scope run keeps going - `concurrency` covers the approval job alone,
not the workflow - reaches `state=none`, and publishes `success` after the
new run has set `pending`. GitHub reads the latest status for a context, so
a status-only rule would allow the merge before anyone decided.

`superseded` does not cover it. The head did not move and nothing was
cancelled, so the old run's `none` is a legitimate verdict about a scope
that no longer applies.

Both writers now read who wrote the context last and stop if that run is
newer. The run id is already in the `target_url` this gate writes, so the
ordering is readable without asking the runs API, and a status written by
anything else has no id to compare and is left alone.

**The doc's failure mode was wrong.** It said a rule requiring the status
would stay pending if the write failed. That is only true for a commit with
no status yet; where the SHA already carries `success` for the context, a
failed write leaves that success current and the merge is allowed. Now
stated, with the advice to require the gate's job alongside the status until
a run has written it at least once.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@bedatty
bedatty requested a review from a team as a code owner October 21, 2026 13:05
@coderabbitai

coderabbitai Bot commented Oct 21, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: LerianStudio/github-actions-shared-workflows/.coderabbit.yml
  • Review profile: ASSERTIVE
  • Plan: Essentials
  • Run ID: c945adf1-ff3a-4787-9417-a30567b4ba62

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@lerian-studio lerian-studio added size/L PR changes 500–999 lines documentation Improvements or additions to documentation workflow Changes to one or more reusable workflow files golang Changes to Go-related workflows notify Changes to notification composite actions (src/notify/) validate Changes to PR validation composite actions (src/validate/) composite Changes to any composite action manifest (src/**/*.yml) scripts Changes to shell scripts (src/**/*.sh) labels Oct 21, 2026
@lerian-studio

Copy link
Copy Markdown
Contributor

🛡️ CodeQL Analysis Results

Languages analyzed: actions

✅ No security issues found.


🔍 View full scan logs | 🛡️ Security tab

@lerian-studio

Copy link
Copy Markdown
Contributor

🔍 PR Validation Summary

✅ PR Mergeable — no blocking failures

Check Status Blocking
Source Branch ✅ success yes
PR Title ✅ success yes
PR Description ✅ success yes
Breaking Change Guard ✅ success yes
Commit Signatures ✅ success yes
PR Size ✅ success no
Auto Labels ✅ success no
PR Metadata ✅ success no

🔍 View workflow run

@lerian-studio

Copy link
Copy Markdown
Contributor

🔍 Lint Analysis

Check Files Scanned Status
YAML Lint 6 file(s) ✅ success
Action Lint 5 file(s) ✅ success
Pinned Actions 6 file(s) ✅ success
Markdown Link Check 6 file(s) ✅ success
Spelling Check 14 file(s) ✅ success
Shell Check 6 file(s) ✅ success
README Check 6 file(s) ✅ success
Composite Schema 1 file(s) ✅ success
Deployment Matrix no changes ⏭️ skipped

🔍 View full scan logs

@bedatty
bedatty merged commit 854e33f into main Oct 21, 2026
54 checks passed

This branch was successfully deployed

1 active deployment
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

composite Changes to any composite action manifest (src/**/*.yml) documentation Improvements or additions to documentation golang Changes to Go-related workflows notify Changes to notification composite actions (src/notify/) scripts Changes to shell scripts (src/**/*.sh) size/L PR changes 500–999 lines validate Changes to PR validation composite actions (src/validate/) workflow Changes to one or more reusable workflow files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants