Skip to content

Update Chainguard Actions overview for GA - #4029

Merged
matthewhelmke merged 8 commits into
chainguard-dev:mainfrom
matthewhelmke:actions-doc-updates-for-GA
Oct 5, 2026
Merged

matthewhelmke merged 8 commits into
chainguard-dev:mainfrom
matthewhelmke:actions-doc-updates-for-GA

Conversation

@matthewhelmke

Copy link
Copy Markdown
Collaborator

What this does

Updates the Chainguard Actions overview for the 2026-10-06 GA launch (DOCS-204), and corrects two errors on the existing page.

The quick start's first code sample told readers to reference a hardened action as chainguard-actions/<name>@main. That cannot resolve — there is no action definition on main — so anyone following the published quick start got a workflow that failed at the uses: line.

GA content

  • Hardening checks. New table covering all seven checks with the finding IDs that appear in HARDENING.md and their severities, matching the rulebook PMM approved for public use. The slide maps one-to-one onto chainguard-dev/guarded-actions/policy/checks/. Documents scope too: the checks read action.yml and .github/workflows/, and skip dist/, vendor/, node_modules/, and test fixtures.
  • Transitive dependencies. New section covering what is hardened today — nested uses: and image references pinned to immutable SHAs or digests, the action repo's own workflows held to the same ruleset, missing dependencies onboarded on request — and the two limits that remain.
  • Setup leads with the Guardener GitHub App. Split into creating the entitlement and installing the app. Links to the Guardener pages rather than restating their configuration reference, so the two cannot drift. The app is still in beta and the page says so.
  • Re-hardening. A ruleset change re-evaluates every action in the catalog, not only affected ones. Adds the mechanism: the policy SHA is computed over the ruleset, so any rule edit yields a new SHA and triggers the re-evaluation.
  • Provenance attestations. Documents attestations/provenance.intoto.jsonl, the signed SLSA provenance envelope on every version branch. No page mentioned it.

Corrections to the existing page

  • @main cannot resolve. main holds only README.md, LICENSE_CHAINGUARD, and source.json. Verified across 34 distinct repos with zero exceptions — 21 sampled evenly across the sorted org listing, the 11 oldest repos, and five named repos — checking each default branch for action.yml, action.yaml, and a root Dockerfile. The example now uses a version tag, with a note warning against @main.
  • The repository-contents section listed HARDENING.md and action.yml as main-branch files. They are on the version branches. Rewritten to distinguish the two, with a note to read the report on the branch you plan to use.
  • Adds chainctl actions discover --recursive and its $GITHUB_TOKEN requirement, plus chainctl actions list. All were missing.
  • Adds guidance on referencing by version tag versus commit SHA, presenting the tradeoff without recommending either pending a Product decision.
  • Catalog size updated to more than 1,000 actions.
  • Merges two duplicate "report an issue" headings.

Testing

npm run build completes clean and all pre-commit hooks pass. Verified in the rendered output that the checks table produces all seven rows with the escaped pipe in curl ... | bash intact, and that both in-page anchors resolve against the generated heading IDs.

Open

Two items sit with PMM and Product and do not block this PR: the transitive dependency scope, and whether to recommend a version tag or a SHA as the default. Both are recorded on DOCS-204.


Created in collaboration with Claude Code running Claude Opus 5 on 2026-09-21.

@matthewhelmke
matthewhelmke requested a review from a team as a code owner September 21, 2026 13:22
@netlify

netlify Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for ornate-narwhal-088216 ready!

Name Link
🔨 Latest commit 06e9e99
🔍 Latest deploy log https://app.netlify.com/projects/ornate-narwhal-088216/deploys/6ac00fe3a1ab900008a9d001
😎 Deploy Preview https://deploy-preview-4029--ornate-narwhal-088216.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@matthewhelmke
matthewhelmke marked this pull request as draft September 21, 2026 13:25
@vercel

vercel Bot commented Sep 23, 2026

Copy link
Copy Markdown

@matthewhelmke is attempting to deploy a commit to the Chainguard Team on Vercel.

A member of the Team first needs to authorize it.

@vercel

vercel Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
chainguard-docs-preview Ready Ready Preview Sep 28, 2026 3:12pm UTC

Request Review

Comment thread content/chainguard/actions/overview.md Outdated
@matthewhelmke

matthewhelmke commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator Author

Do not merge until 2026-10-05

matthewhelmke and others added 7 commits September 28, 2026 10:03
Add the hardening ruleset and transitive dependency behavior, and lead the
setup path with the Guardener GitHub App (DOCS-204).

- Document all seven hardening checks with their finding IDs, severities,
  and scope, matching the approved public rulebook
- Add a transitive dependencies section covering what is hardened today and
  the two limits that remain
- Restructure setup into an entitlement step and a Guardener GitHub App step
- Correct the re-hardening bullet: a ruleset change re-evaluates every action
  in the catalog, not only affected ones
- Correct the repository contents section. The hardened action lives on the
  version branches; main holds only metadata. The quick start example used
  @main, which cannot resolve.
- Document the signed SLSA provenance attestation on each version branch
- Add a section on referencing by version tag versus commit SHA
- Add `chainctl actions discover --recursive` and `chainctl actions list`
- Update the catalog size to more than 1,000 actions
- Merge the duplicated request and report issue sections

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Corrects two substantive errors and adds the facts his review surfaced
(DOCS-204).

- Transitive dependencies: the nested-reference rewriting is implemented
  and enabled in production, not "in development" as previously written.
  The Linear states that conclusion rested on were stale. Reframed as
  rolling out, since no published action references a hardened
  counterpart yet, and added the three scope limits: composite actions
  only, exact-commit counterparts only, never when ambiguous.
- Document the static pre-pass as its own group of checks. It emits
  finding IDs that aren't in the policy ruleset, and one of them,
  `static-inline-injection`, is the most common finding in the catalog,
  so a reader could previously hit an ID this page couldn't resolve.
- State that the rebuild reproduces a JavaScript action's bundle rather
  than refreshing it, so a hardened release ships the dependency
  versions upstream shipped. Say plainly that dependency vulnerability
  management isn't part of hardening today.
- Recommend pinning to a commit SHA paired with Dependabot or Renovate,
  replacing the neutral tradeoff. A commit SHA is the only immutable
  reference in the catalog; re-hardening moves even fully qualified
  patch tags. A pin with no bumper is the one configuration that strands
  you, so the page says so.
- Explain that the entitlement doesn't gate consumption and can't, name
  the telemetry endpoint for egress allowlists, and note that an
  unreachable Chainguard cannot fail a customer's workflow.
- Guardener: automated migration needs `migrate.enabled: true`, which
  the page previously implied came with installation. Link the
  permissions table for administrator approval, and clarify that beta
  means the interface may change, not that it isn't deployed.
- Soften the attestation coverage claim and state that no customer-facing
  verification procedure exists yet.
- Fix the `hardcoded-credentials` and `unpinned-uses` rows, which omitted
  `aws_secret` and understated the image-reference match.
- telemetry.md: remove `actor` from the stored-metadata list. The service
  discards that claim, so the page over-reported what Chainguard keeps.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The documented output of `gh api ... commits/v47 --jq '.sha'` was
`25a1eb5aa…`, captured before that tag moved. The current value is
`4b4bd2ed9…`.

The value was never wrong, it went stale — re-hardening a published
version force-moves its tag, which is the behavior this page now
documents. Printing a fixed digest as the answer undercuts that, so the
example is updated and a note tells readers to run the command instead
of copying the digest. Found while reviewing the catalog org README for
DOCS-205, which carries the same stale value.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page sent readers to the chainguard-actions README "for deeper
technical details and some example migrations." That README is being
trimmed to a landing page that points back here (DOCS-205), so the
reference would have become circular. It now says what the org is
actually good for: finding a specific action and reading its hardening
report.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rebasing onto main brought in two changes that this branch's new text
predates: product naming corrected to the marketing style guide (chainguard-dev#4067)
and internal links pointed at canonical paths (chainguard-dev#4068).

- "Chainguard Guardener" becomes "Guardener". The style guide is explicit
  that the name is bare, with no article and no "Chainguard" prefix, and
  upstream applied that everywhere else.
- The link to the Guardener permissions table was pointing at
  `#permissions-the-guardener-requests`. Upstream renamed that heading to
  "Permissions Guardener requests", so the anchor no longer resolved.

The rebase itself picked up two upstream fixes automatically: the
`chainctl` install link is now the canonical `/platform/` path, and
"each Chainguard Action" is now "each hardened action", since the name is
plural.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Under "Each hardened action:", the first bullet read "Pulls the upstream
source at a pinned commit, reviews it using..." which made the action the
thing doing the pulling and reviewing. The pipeline does that.

Keeps the point of the earlier edit — not saying the action is "rebuilt
from source", which reads as though the rebuild improves the bundle — and
restores agreement with the stem and with the final bullet, which is also
passive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@matthewhelmke
matthewhelmke force-pushed the actions-doc-updates-for-GA branch from 28621cb to 50e1242 Compare September 28, 2026 15:05
matthewhelmke added a commit to matthewhelmke/.github that referenced this pull request Oct 2, 2026
Mae reviewed the equivalent line on chainguard-dev/edu#4029 and noted
that nothing is built or rebuilt for a YAML-only action — Chainguard
takes the upstream code and hardens it. That page was fixed; this one
was written from the earlier wording and kept "Is rebuilt from the
upstream source", so the correction never reached it.

Now matches the edu page word for word, which is the point of having one
of these documents link to the other.

The remaining mention of rebuilding is scoped to a JavaScript action's
bundle, which does get rebuilt from the upstream lockfile. That sentence
is the one establishing that the rebuild reproduces the bundle rather
than refreshing it, so it stays.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The hook is a runs.pre script only in JavaScript actions. Composite
actions run it as their first step, and Docker actions don't include it.
Also moves the egress allowlist tip onto the telemetry page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@tylerpaxton tylerpaxton left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

pushed 06e9e99 to fix the telemetry hook description. it's a pre script on JS actions, the first step on composite actions, and Docker actions don't have it. also moved the egress allowlist tip to the telemetry page.

on tag vs SHA: we're recommending SHA pinning, so the suggestions below make the page consistent with that.

Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
Comment thread content/chainguard/actions/overview.md
@matthewhelmke
matthewhelmke merged commit d5f0ea3 into chainguard-dev:main Oct 5, 2026
9 of 10 checks passed
@matthewhelmke
matthewhelmke deleted the actions-doc-updates-for-GA branch October 5, 2026 10:55
matthewhelmke added a commit that referenced this pull request Oct 5, 2026
## What this does

Applies Tyler Paxton's review of the Chainguard Actions overview. He
commented on [#4029](#4029) on
10-02; it merged on 10-05 before those comments were addressed, so this
is the follow-up (DOCS-204).

Nine requests, all applied. Three of them corrected factual errors on a
page that is now live, which is the reason this is worth reviewing
promptly rather than batching.

## Corrections

**A hardened action's `dist/` bundle is not rebuilt.** The page said
Chainguard rebuilds it, and that the rebuild reproduces rather than
refreshes the contents. Verified against the catalog: the git blob SHA
of `dist/index.js` in `tj-actions-changed-files@v47` and
`actions-checkout@v6` is identical to upstream at the pinned commit, so
the bundle is carried over verbatim. The conclusion the page drew was
right — a hardened release ships the same dependency versions as
upstream — but the stated mechanism wasn't. Mae Phillips raised this on
the intro bullet during #4029 and Tyler caught the same error further
down.

**Digest pinning covers `runs.image`, not Dockerfile `FROM` lines.** The
page described a single rule covering both. The image case is now
specific: for `runs.using: docker` with a `docker://` image, the
pipeline resolves the tag and rewrites the reference as
`image:tag@sha256:<digest>`. Confirmed on
`google-osv-scanner-action@v2.6.0`.

**Nested actions are swapped for hardened copies, and that is live.**
The page said references were pinned to upstream SHAs and described the
swap as rolling out. In composite actions the reference now points at
the hardened copy where one exists. Confirmed:
`actions-upload-pages-artifact@v5.0.0` calls
`chainguard-actions/actions-upload-artifact@92725eed # v7.0.0`. The
three scope limits stay, because coverage still grows as more of the
catalog is hardened.

## Pinning guidance

SHA pinning now reads as the default rather than an option. The quick
start shows a commit SHA with the tag as a comment instead of a bare
version tag, and the migration step no longer frames pinning as
conditional.

## Setup

Guardener also reads an org-wide `.chainguard/actions.yaml` from the
organization's `.github` repository, which matters for a section aimed
at more than a repository or two. Both setup steps now say so and link
the [org-level configuration
reference](/chainguard/guardener/github/configuration/#organization-level-configuration-with-the-github-repository).

The GitHub App is called the Chainguard App for GA, renamed on this page
only. Eight other pages still say "Guardener GitHub App" and are a
separate change. References to Guardener as the agent are unchanged,
matching Tyler's own suggested wording.

## Removed

"What the entitlement controls" is gone at Tyler's request. The
egress-allowlist tip it carried already lives on the [telemetry
page](/chainguard/actions/telemetry/).

Dropping it exposed something that section had been correcting: the
preceding line said the entitlement exists "to enable access to the
hardened actions hosted at `github.com/chainguard-actions`", and those
repositories are public. That line now states the step without
characterizing what the entitlement gates, which avoids both the
misleading claim and the explanation Tyler asked us not to publish.

## Testing

`npm run build` completes clean and all pre-commit hooks pass, including
the new page-weight check. Verified in the rendered output that every
in-page anchor resolves — including the new
`#replace-the-uses-line-in-each-workflow` cross-link — that the
cross-page org-level configuration anchor exists, and that nothing links
to the removed section.

## Not verified

Tyler's observation that Dockerfile `FROM` lines are unchanged from
upstream rests on his own check. Dockerfile-based actions are rare
enough that none appeared in a 22-repository sample, so I could not
reproduce it independently. It appears only in the scope line, not in
the rules this PR rewrote.

---
Created in collaboration with Claude Code running Claude Opus 5 on
2026-10-05.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants