Skip to content

fix(release): develop to main - #601

Merged
bedatty merged 23 commits into
mainfrom
develop
Jul 21, 2026
Merged

bedatty merged 23 commits into
mainfrom
develop

Conversation

@bedatty

@bedatty bedatty commented Jul 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 #

fredcamaral and others added 21 commits July 9, 2026 23:04
Add one 'OpenAPI spec drift gate' step to the tests matrix job, after the
test-run steps and with the same working-directory as its siblings. It
probes Makefile targets via 'make -n' (the house auto-detect pattern the
'Detect Makefile test target' step already uses) in order:
check-api-spec > check-generated-artifacts > check-openapi-spec >
check-huma-spec. The first target that exists runs as a hard gate — a
stale committed OpenAPI spec fails the job. No matching target (or no
Makefile) logs one line and succeeds, so repos opt in by exposing a
detectable target (canonical: check-api-spec).

validate-api-docs is deliberately excluded from the probe list: it is an
unverified swag-family target and auto-adopting it could break PRs
org-wide; repos on that target join later via a verified check-api-spec
alias.

Claude-Session: https://claude.ai/code/session_013kJ9BuhVsVJXVBivdKLNt2
The drift gate probed four target names (check-api-spec,
check-generated-artifacts, check-openapi-spec, check-huma-spec) and ran the
first that existed. check-generated-artifacts is not unique to any opting-in
repo — it is a boilerplate-standard target across many org repos, including the
swag-family BACEN-rail consumers br-sta, br-ccs and br-sisbajud (all
on: pull_request callers of this workflow). Their target chains into a swag
check that exit 1s when swag is absent; the tests job never installs swag and
ubuntu-latest does not ship it, so the gate would fail under set -e and block
EVERY PR in those repos the moment the shared-workflow ref bumps. Probing the
other boilerplate names likewise auto-adopts unverified targets org-wide,
front-running the per-repo verification later waves require.

Fix: probe exactly one target, check-api-spec — a name no repo exposes yet, so
adoption is genuinely opt-in. Repos join by aliasing their own verified check
into check-api-spec. Comment block updated to match; behavioral test confirms a
check-generated-artifacts-only repo is skipped, not run.

Claude-Session: https://claude.ai/code/session_013kJ9BuhVsVJXVBivdKLNt2
Raise cosign_max_attempts default from 3 to 5, cap the exponential
backoff at cosign_max_delay (default 60s), and randomize it (equal
jitter) to avoid thundering-herd retries against Rekor.

Closes #450
Clamp the persistent delay variable to max-delay (not just the sleep
value) to avoid unbounded growth across retries, and add max-delay to
the README/docs configuration examples.
vars.RUNNER_LABEL remains the primary runner selector; the secondary
fallback (when the var is unset) is now GitHub's own ubuntu-latest
runner instead of the blacksmith label, both in hardcoded runs-on
values and in runner_type input defaults. gitops-update.yml is
untouched — it has its own vars.GITOPS_RUNNERS fallback logic.
Renamed vars.RUNNER_LABEL to vars.GENERAL_RUNNERS across all shared
workflows for clarity. gitops-update.yml (vars.GITOPS_RUNNERS) and the
Ungoliant release-diff jobs (vars.UNGOLIANT_RUNNERS) already use their
own dedicated runner variables and were not part of this rename.
…ritative

Addresses CodeRabbit findings on PR #600:
- Restore blacksmith-4vcpu-ubuntu-2404 (or 'blacksmith' for gptchangelog.yml,
  matching its pre-existing value) as the final fallback/default across all
  reusable workflows, per the repo's documented runner policy
  (.claude/commands/gha.md, workflow.md). vars.GENERAL_RUNNERS remains the
  primary override.
- api-dog-e2e-tests.yml and end-to-end-tests.yml: drop the vars.GENERAL_RUNNERS
  override entirely — these jobs require network-reachable runners
  (eveo-lxc-runners) and must keep inputs.runner_type authoritative.
- go-fuzz.yml and release-notification.yml: dry-run summaries now report the
  effective resolved runner instead of the raw input.
Addresses CodeRabbit/zizmor template-injection findings on go-fuzz.yml:91 and
release-notification.yml:152. The resolved runner (vars.GENERAL_RUNNERS ||
input/literal) is now passed through a step-level env var and printed via the
shell variable instead of being interpolated directly into the run: block.
@bedatty
bedatty requested a review from a team as a code owner July 21, 2026 19:59
@coderabbitai

coderabbitai Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7dc2b5fb-47ce-40ff-b5ee-334170648bca

📥 Commits

Reviewing files that changed from the base of the PR and between fc099c6 and 5b96532.

📒 Files selected for processing (1)
  • src/config/workflow-runs-cleanup/action.yml

Summary by CodeRabbit

  • New Features

    • CI and release workflows now support a configurable shared runner setting (GENERAL_RUNNERS) with automatic fallback.
    • Added an optional OpenAPI spec drift check to Go pull request validation.
    • DockerHub publishing is enabled by default for JavaScript and TypeScript builds.
    • Image signing retry behavior now supports capped exponential backoff with randomized delays.
  • Improvements

    • Image signing now defaults to 5 retry attempts, with updated guidance and documentation to match the new retry model.
  • Chores

    • Updated workflow-run cleanup tooling to a newer pinned version.

Walkthrough

The pull request standardizes GitHub Actions runner selection through vars.GENERAL_RUNNERS, adds an OpenAPI drift gate to Go analysis, changes DockerHub publishing defaults, updates a cleanup action pin, and enhances cosign signing retries with capped exponential backoff and jitter.

Changes

Workflow infrastructure

Layer / File(s) Summary
Cosign retry policy and wiring
src/security/cosign-sign/action.yml, src/security/cosign-sign/README.md, docs/build-workflow.md, .github/workflows/build.yml
Cosign retries default to five attempts, use a configurable 60-second cap, apply equal jitter, and receive cosign_max_delay from the build workflow.
Go validation and runner resolution
.github/workflows/go-*.yml
Go workflows prefer vars.GENERAL_RUNNERS; Go tests also run make check-api-spec when that target exists.
PR analysis and language workflow runners
.github/workflows/frontend-pr-analysis.yml, .github/workflows/js-pr-validation.yml, .github/workflows/pr-*.yml, .github/workflows/typescript-*.yml, .github/workflows/js-release.yml
Analysis, validation, release, and TypeScript jobs use the shared runner override; DockerHub publishing defaults change to enabled in applicable workflows.
Shared workflow runner resolution and maintenance
.github/workflows/*.yml, src/config/workflow-runs-cleanup/action.yml
Release, notification, Helm, cleanup, maintenance, and self-validation jobs resolve runners from GENERAL_RUNNERS; the workflow cleanup action pin moves to the v2.1 commit.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related issues

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title describes a release merge, but the diff is workflow runner and cosign retry updates, so it is misleading. Rename it to reflect the main workflow changes, such as shared runner overrides and cosign retry updates.
Description check ⚠️ Warning The template is present, but the Description, Testing, and Related Issues sections are effectively empty. Fill in the Description with affected workflows and behavior changes, add testing/validation details, and complete the issue reference.
✅ Passed checks (3 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

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

v2.0.6 targets Node.js 20, which GitHub deprecated and now force-runs
on Node.js 24 with a warning on every cleanup job run. v2.1 uses
runs.using: node24 natively. Inputs are unchanged between versions.

Closes #522
@lerian-studio lerian-studio added size/M PR changes 200–499 lines documentation Improvements or additions to documentation workflow Changes to one or more reusable workflow files typescript Changes to TypeScript or Frontend workflows security Changes to security workflows or vulnerability reporting policy labels Jul 21, 2026
@lerian-studio lerian-studio added golang Changes to Go-related workflows notify Changes to notification composite actions (src/notify/) validate Changes to PR validation composite actions (src/validate/) routine Changes to periodic maintenance routines (self-routine.yml and related reusables) changelog Changes to changelog generation composite actions (src/changelog/) composite Changes to any composite action manifest (src/**/*.yml) build Changes to build and artifact composite actions (src/build/) labels Jul 21, 2026
@lerian-studio

lerian-studio commented Jul 21, 2026 •

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
PR Size ✅ success no
Auto Labels ✅ success no
PR Metadata ✅ success no

🔍 View workflow run

@lerian-studio

lerian-studio commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

🛡️ CodeQL Analysis Results

Languages analyzed: actions

Found 2 issue(s): 2 Medium

Severity Rule File Message
🟡 Medium actions/untrusted-checkout/medium .github/workflows/build.yml:300 Potential unsafe checkout of untrusted pull request on non-privileged workflow.
🟡 Medium actions/untrusted-checkout/medium .github/workflows/version-propagation.yml:62 Potential unsafe checkout of untrusted pull request on non-privileged workflow.

🔍 View full scan logs | 🛡️ Security tab

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/backmerge.yml:
- Line 48: Replace the shared vars.GENERAL_RUNNERS override with the approved
blacksmith-4vcpu-ubuntu-2404 runner for every affected job: expand and sync in
.github/workflows/backmerge.yml (48, 140), branch cleanup in
.github/workflows/branch-cleanup.yml (48), workflow dispatch in
.github/workflows/dispatch-helm.yml (100), AWS release in
.github/workflows/go-lambda-release.yml (73), release preparation, publishing,
aggregation, changelog generation, major-tag updates, and latest-release
enforcement in .github/workflows/release.yml (113, 171, 413, 474, 504, 540), and
S3 uploads in .github/workflows/s3-upload.yml (127).

In @.github/workflows/gptchangelog.yml:
- Line 58: Update the runs-on expressions for both workflow jobs to fall back to
the required blacksmith-4vcpu-ubuntu-2404 label when vars.GENERAL_RUNNERS is
unset and no runner input is supplied; preserve the existing GENERAL_RUNNERS
override.

In @.github/workflows/js-release.yml:
- Line 81: Revert the enable_dockerhub input default in the release workflow to
false, preserving the existing opt-in behavior for DockerHub login and
publishing when callers explicitly enable it.

In @.github/workflows/self-pr-validation.yml:
- Line 39: Update every runs-on expression in the self-* PR validation workflow,
including the entries near the referenced jobs, to use the approved hosted
runner blacksmith-4vcpu-ubuntu-2404 directly instead of vars.GENERAL_RUNNERS. Do
not allow repository variables or self-hosted labels to select the runner for
fork-controlled validation.

In @.github/workflows/slack-notify.yml:
- Line 44: Constrain runner selection in the reusable workflow jobs by replacing
the configurable runner expressions with the mandated
blacksmith-4vcpu-ubuntu-2404 runner or an approved hosted-runner mapping. Apply
this change at .github/workflows/slack-notify.yml:44,
.github/workflows/stale-issue.yml:38, and .github/workflows/stale-pr.yml:38.

In @.github/workflows/typescript-build.yml:
- Line 54: Revert the workflow_call input default for enable_dockerhub to false
in the TypeScript build workflow, preserving existing callers’ behavior unless
they explicitly opt in to DockerHub publishing.

In `@src/security/cosign-sign/action.yml`:
- Around line 115-126: The retry jitter logic around capped_delay must handle
odd caps correctly. Update the half calculation to use a ceiling half and derive
the RANDOM range from the capped delay, ensuring sleep_time stays within the
intended jitter window and max-delay: 1 does not produce immediate retries.
- Around line 24-27: Validate the retry inputs before the signing loop begins,
covering max-attempts, initial-delay, and max-delay as integers with nonnegative
delay values and max-attempts of at least one. Reject invalid or negative values
before any arithmetic, modulo, or sleep operations, while preserving the
existing retry behavior for valid inputs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5041fc70-70e4-45f9-b6e3-37e038b927d2

📥 Commits

Reviewing files that changed from the base of the PR and between 11d0f8e and fc099c6.

📒 Files selected for processing (38)
  • .github/workflows/backmerge.yml
  • .github/workflows/branch-cleanup.yml
  • .github/workflows/build.yml
  • .github/workflows/dispatch-helm.yml
  • .github/workflows/frontend-pr-analysis.yml
  • .github/workflows/go-ci.yml
  • .github/workflows/go-fuzz.yml
  • .github/workflows/go-lambda-release.yml
  • .github/workflows/go-pr-analysis.yml
  • .github/workflows/go-pr-validation.yml
  • .github/workflows/go-security.yml
  • .github/workflows/gptchangelog.yml
  • .github/workflows/helm-alpha-cleanup.yml
  • .github/workflows/helm-alpha-release.yml
  • .github/workflows/helm-release-notification.yml
  • .github/workflows/helm-update-chart.yml
  • .github/workflows/helm-upgrade-doc.yml
  • .github/workflows/js-pr-validation.yml
  • .github/workflows/js-release.yml
  • .github/workflows/labels-sync.yml
  • .github/workflows/lerian-lib-version-check.yml
  • .github/workflows/pr-security-scan.yml
  • .github/workflows/pr-validation.yml
  • .github/workflows/release-notification.yml
  • .github/workflows/release.yml
  • .github/workflows/s3-upload.yml
  • .github/workflows/self-pr-validation.yml
  • .github/workflows/slack-notify.yml
  • .github/workflows/stale-issue.yml
  • .github/workflows/stale-pr.yml
  • .github/workflows/typescript-build.yml
  • .github/workflows/typescript-ci.yml
  • .github/workflows/typescript-release.yml
  • .github/workflows/version-propagation.yml
  • .github/workflows/workflow-runs-cleanup.yml
  • docs/build-workflow.md
  • src/security/cosign-sign/README.md
  • src/security/cosign-sign/action.yml

# ----------------- Expand Rules -----------------
expand:
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ vars.GENERAL_RUNNERS || 'blacksmith-4vcpu-ubuntu-2404' }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Shared runner override violates the reusable-workflow security contract.

The new vars.GENERAL_RUNNERS precedence allows privileged jobs to run on arbitrary labels instead of the required Blacksmith runner. Revert these expressions or add a strict approved-runner allowlist before merging.

  • .github/workflows/backmerge.yml#L48-L48: keep expand on the approved runner.
  • .github/workflows/backmerge.yml#L140-L140: keep sync on the approved runner.
  • .github/workflows/branch-cleanup.yml#L48-L48: keep branch cleanup on the approved runner.
  • .github/workflows/dispatch-helm.yml#L100-L100: keep workflow dispatch on the approved runner.
  • .github/workflows/go-lambda-release.yml#L73-L73: keep AWS release on the approved runner.
  • .github/workflows/release.yml#L113-L113: keep release preparation on the approved runner.
  • .github/workflows/release.yml#L171-L171: keep publishing on the approved runner.
  • .github/workflows/release.yml#L413-L413: keep aggregation on the approved runner.
  • .github/workflows/release.yml#L474-L474: keep changelog generation on the approved runner.
  • .github/workflows/release.yml#L504-L504: keep major-tag updates on the approved runner.
  • .github/workflows/release.yml#L540-L540: keep latest-release enforcement on the approved runner.
  • .github/workflows/s3-upload.yml#L127-L127: keep S3 uploads on the approved runner.

As per path instructions, all jobs in reusable workflows must use blacksmith-4vcpu-ubuntu-2404.

📍 Affects 6 files
  • .github/workflows/backmerge.yml#L48-L48 (this comment)
  • .github/workflows/backmerge.yml#L140-L140
  • .github/workflows/branch-cleanup.yml#L48-L48
  • .github/workflows/dispatch-helm.yml#L100-L100
  • .github/workflows/go-lambda-release.yml#L73-L73
  • .github/workflows/release.yml#L113-L113
  • .github/workflows/release.yml#L171-L171
  • .github/workflows/release.yml#L413-L413
  • .github/workflows/release.yml#L474-L474
  • .github/workflows/release.yml#L504-L504
  • .github/workflows/release.yml#L540-L540
  • .github/workflows/s3-upload.yml#L127-L127
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/backmerge.yml at line 48, Replace the shared
vars.GENERAL_RUNNERS override with the approved blacksmith-4vcpu-ubuntu-2404
runner for every affected job: expand and sync in
.github/workflows/backmerge.yml (48, 140), branch cleanup in
.github/workflows/branch-cleanup.yml (48), workflow dispatch in
.github/workflows/dispatch-helm.yml (100), AWS release in
.github/workflows/go-lambda-release.yml (73), release preparation, publishing,
aggregation, changelog generation, major-tag updates, and latest-release
enforcement in .github/workflows/release.yml (113, 171, 413, 474, 504, 540), and
S3 uploads in .github/workflows/s3-upload.yml (127).

Source: Path instructions

jobs:
prepare:
runs-on: ${{ inputs.runner_type }}
runs-on: ${{ vars.GENERAL_RUNNERS || inputs.runner_type }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Use a valid runner fallback.

runner_type defaults to blacksmith, so when vars.GENERAL_RUNNERS is unset and callers omit the input, both jobs resolve runs-on to blacksmith instead of the required blacksmith-4vcpu-ubuntu-2404 label. Use that exact label as the expression fallback or update the input default.

As per coding guidelines, reusable workflow jobs must use blacksmith-4vcpu-ubuntu-2404.

Also applies to: 248-248

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/gptchangelog.yml at line 58, Update the runs-on
expressions for both workflow jobs to fall back to the required
blacksmith-4vcpu-ubuntu-2404 label when vars.GENERAL_RUNNERS is unset and no
runner input is supplied; preserve the existing GENERAL_RUNNERS override.

Source: Coding guidelines

description: 'Enable pushing to DockerHub'
type: boolean
default: false
default: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Do not enable DockerHub publishing by default without a breaking-change migration.

Changing enable_dockerhub from false to true opts callers that omit this input into the DockerHub login/publishing path, which can publish images unexpectedly or fail when DockerHub credentials are not configured. Revert the default to false, or document this as an intentional breaking change and update callers.

Proposed safe default
-        default: true
+        default: false
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
default: true
default: false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/js-release.yml at line 81, Revert the enable_dockerhub
input default in the release workflow to false, preserving the existing opt-in
behavior for DockerHub login and publishing when callers explicitly enable it.

changed-files:
name: Detect Changed Files
runs-on: blacksmith-4vcpu-ubuntu-2404
runs-on: ${{ vars.GENERAL_RUNNERS || 'blacksmith-4vcpu-ubuntu-2404' }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Keep PR validation on an approved hosted runner.

These expressions allow vars.GENERAL_RUNNERS to select a self-hosted runner for pull-request validation. That would execute fork-controlled workflow content on a persistent runner, violating the repository’s explicit self-hosted-runner restriction and increasing compromise risk. Keep this self-* workflow on blacksmith-4vcpu-ubuntu-2404, or enforce an allowlist that excludes self-hosted labels.

Also applies to: 63-63, 78-78, 93-93, 108-108, 125-125, 138-138, 153-153, 168-168, 183-183, 198-198, 240-240

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/self-pr-validation.yml at line 39, Update every runs-on
expression in the self-* PR validation workflow, including the entries near the
referenced jobs, to use the approved hosted runner blacksmith-4vcpu-ubuntu-2404
directly instead of vars.GENERAL_RUNNERS. Do not allow repository variables or
self-hosted labels to select the runner for fork-controlled validation.

Source: Coding guidelines

notify:
name: Send Notification
runs-on: ${{ inputs.runner_type }}
runs-on: ${{ vars.GENERAL_RUNNERS || inputs.runner_type }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Constrain runner selection for all reusable workflows.

These changes allow reusable workflows to run on arbitrary or self-hosted labels, violating the repository requirement that reusable workflow jobs use blacksmith-4vcpu-ubuntu-2404.

  • .github/workflows/slack-notify.yml#L44-L44: replace the unconstrained vars.GENERAL_RUNNERS || inputs.runner_type expression with the mandated runner or an approved hosted-runner mapping.
  • .github/workflows/stale-issue.yml#L38-L38: apply the same runner constraint.
  • .github/workflows/stale-pr.yml#L38-L38: apply the same runner constraint.
📍 Affects 3 files
  • .github/workflows/slack-notify.yml#L44-L44 (this comment)
  • .github/workflows/stale-issue.yml#L38-L38
  • .github/workflows/stale-pr.yml#L38-L38
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/slack-notify.yml at line 44, Constrain runner selection in
the reusable workflow jobs by replacing the configurable runner expressions with
the mandated blacksmith-4vcpu-ubuntu-2404 runner or an approved hosted-runner
mapping. Apply this change at .github/workflows/slack-notify.yml:44,
.github/workflows/stale-issue.yml:38, and .github/workflows/stale-pr.yml:38.

Source: Coding guidelines

description: 'Enable pushing to DockerHub'
type: boolean
default: false
default: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Do not silently enable DockerHub publishing for existing callers.

Changing the workflow_call default from false to true means callers that omit enable_dockerhub now pass true to the Docker build action. The downstream workflow conditionally logs in to DockerHub when enabled (.github/workflows/build.yml Lines 311-315), so existing callers may unexpectedly require DockerHub credentials and publish images. Revert the default or document and version this as a breaking change.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/typescript-build.yml at line 54, Revert the workflow_call
input default for enable_dockerhub to false in the TypeScript build workflow,
preserving existing callers’ behavior unless they explicitly opt in to DockerHub
publishing.

Comment on lines +24 to +27
max-delay:
description: Maximum delay in seconds between retry attempts. Caps the exponential backoff before jitter is applied.
required: false
default: "60"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Validate retry inputs before arithmetic.

max-delay accepts arbitrary strings, but the signing loop uses it with -gt, division, modulo, and sleep. Values such as -2 can produce RANDOM % 0, while non-numeric values fail at runtime. Validate max-attempts, initial-delay, and max-delay once before signing, enforcing integer ranges and at least one attempt.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/security/cosign-sign/action.yml` around lines 24 - 27, Validate the retry
inputs before the signing loop begins, covering max-attempts, initial-delay, and
max-delay as integers with nonnegative delay values and max-attempts of at least
one. Reject invalid or negative values before any arithmetic, modulo, or sleep
operations, while preserving the existing retry behavior for valid inputs.

Comment on lines +115 to +126
local capped_delay="$delay"
if [ "$capped_delay" -gt "$MAX_DELAY" ]; then
capped_delay="$MAX_DELAY"
fi
local half=$((capped_delay / 2))
local sleep_time=$((half + RANDOM % (half + 1)))
echo "::warning::cosign sign failed (attempt $attempt/$MAX_ATTEMPTS) — retrying in ${sleep_time}s (base ${capped_delay}s, jittered)…"
sleep "$sleep_time"
delay=$((delay * 3))
if [ "$delay" -gt "$MAX_DELAY" ]; then
delay="$MAX_DELAY"
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the odd-delay jitter calculation.

half=$((capped_delay / 2)) floors odd values; with max-delay: 1, sleep_time is always 0, causing immediate retries despite a one-second cap. Use a ceiling half and calculate the random range from the capped delay so the result remains within the intended jitter window.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/security/cosign-sign/action.yml` around lines 115 - 126, The retry jitter
logic around capped_delay must handle odd caps correctly. Update the half
calculation to use a ceiling half and derive the RANDOM range from the capped
delay, ensuring sleep_time stays within the intended jitter window and
max-delay: 1 does not produce immediate retries.

@lerian-studio

lerian-studio commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

🔍 Lint Analysis

Check Files Scanned Status
YAML Lint 37 file(s) ✅ success
Action Lint 35 file(s) ❌ failure
Pinned Actions 37 file(s) ❌ failure
Markdown Link Check 2 file(s) ✅ success
Spelling Check 39 file(s) ✅ success
Shell Check 37 file(s) ✅ success
README Check 37 file(s) ✅ success
Composite Schema 2 file(s) ✅ success
Deployment Matrix no changes ⏭️ skipped
❌ Failures (2)

Action Lint

.github

  • .github (line 615) — �[31m❌ [actionlint] The command ran successfully and some problem was found (found 4 errors, linted 35 files), exit code: 1�[0m

.github/workflows/go-ci.yml

  • .github/workflows/go-ci.yml (line 171) — shellcheck reported issue in this script: SC2162:info:13:39: read without -r will mangle backslashes
  • .github/workflows/go-ci.yml (line 171) — shellcheck reported issue in this script: SC2086:info:23:43: Double quote to prevent globbing and word splitting
  • .github/workflows/go-ci.yml (line 171) — shellcheck reported issue in this script: SC2086:info:15:15: Double quote to prevent globbing and word splitting
  • .github/workflows/go-ci.yml (line 171) — shellcheck reported issue in this script: SC2086:info:14:13: Double quote to prevent globbing and word splitting

Pinned Actions

.github/workflows/go-ci.yml

  • .github/workflows/go-ci.yml (line 162) — External action not pinned by SHA: uses: actions/checkout@v6.0.3 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 149) — External action not pinned by SHA: uses: golangci/golangci-lint-action@v9 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 143) — External action not pinned by SHA: uses: actions/setup-go@v6 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 140) — External action not pinned by SHA: uses: actions/checkout@v6.0.3 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 129) — External action not pinned by SHA: uses: fgrosse/go-coverage-report@v1.3.0 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 124) — External action not pinned by SHA: uses: actions/download-artifact@v8 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 121) — External action not pinned by SHA: uses: actions/checkout@v6.0.3 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 104) — External action not pinned by SHA: uses: actions/upload-artifact@v7 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 85) — External action not pinned by SHA: uses: actions/setup-go@v6 (use full commit SHA with a # vX.Y.Z comment)
  • .github/workflows/go-ci.yml (line 82) — External action not pinned by SHA: uses: actions/checkout@v6.0.3 (use full commit SHA with a # vX.Y.Z comment)
⚠️ Warnings (3)

Pinned Actions

.github

  • .github (line 178) — Found 2 internal action(s) not pinned to a version. Consider pinning to vX.Y.Z.

.github/workflows/release-notification.yml

  • .github/workflows/release-notification.yml (line 183) — Internal composite must use floating major tag (e.g. @v1) or develop/main for testing: uses: LerianStudio/github-actions-shared-workflows/src/notify/slack-release@v1.18.0
  • .github/workflows/release-notification.yml (line 171) — Internal composite must use floating major tag (e.g. @v1) or develop/main for testing: uses: LerianStudio/github-actions-shared-workflows/src/notify/discord-release@v1.18.0

🔍 View full scan logs

@bedatty
bedatty temporarily deployed to create_release July 21, 2026 20:06 — with GitHub Actions Inactive
@lerian-studio lerian-studio added the config Changes to repository configuration composite actions (src/config/) label Jul 21, 2026
@bedatty
bedatty merged commit e8c5365 into main Jul 21, 2026
2 checks passed

This branch was previously deployed

1 inactive deployment
create_release — 5b965328 Deployed Jul 21, 2026 by bedatty
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build Changes to build and artifact composite actions (src/build/) changelog Changes to changelog generation composite actions (src/changelog/) composite Changes to any composite action manifest (src/**/*.yml) config Changes to repository configuration composite actions (src/config/) documentation Improvements or additions to documentation golang Changes to Go-related workflows notify Changes to notification composite actions (src/notify/) routine Changes to periodic maintenance routines (self-routine.yml and related reusables) security Changes to security workflows or vulnerability reporting policy size/M PR changes 200–499 lines typescript Changes to TypeScript or Frontend workflows 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.

4 participants