ci(docs-truth): load the verifier from trusted history, not the candidate tree (HELM-198) - #58
Merged
SergeyAP merged 2 commits intoJul 24, 2026
Conversation
…date tree (HELM-198)
`docs-truth.yml` triggered on `pull_request` and resolved its reusable
workflow through a local path:
uses: ./.github/workflows/docs-truth-public.yml
secrets:
MINDBURN_ORG_READ_TOKEN: ${{ secrets.PLATFORM_DESIGN_SYSTEM_REPO_READ_TOKEN }}
On a `pull_request` run both the caller and a `./`-resolved reusable
workflow are read from the PR's merge tree. A branch PR could therefore
rewrite `docs-truth-public.yml` in the same PR that the workflow verifies,
and `secrets:` handed that rewritten workflow the org read token — a token
scoped to check out every private repo the gate touches
(`Mindburn-Labs/<subject>`, `/.github`, `/docs`, `/dev-orchestration`).
Not fork-reachable: GitHub withholds secrets from `pull_request` runs
originating in a fork. The reachable path is any principal that can push a
branch to this repo, which on this org includes autonomous agents.
Pin the reusable workflow to a merged commit instead. The subject checkout
still uses `github.event.pull_request.head.sha`, so the gate keeps verifying
the PR's content — only the verifier itself now comes from trusted history.
Every other caller in the org already pins this workflow (docs,
helm-ai-kernel, docs_for_team @3ce0af63; gitops-platform,
helm-ai-enterprise @f609d37a; mindburn-infra @3a85cbbd). `.github` was the
last repo still on the local path.
Cost: changing `docs-truth-public.yml` now takes two PRs — land the change,
then bump the pin. That is the intended trade.
Refs: HELM-198
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Strix is installed on this repository, but we couldn't run this PR security review because this workspace's trial has ended. Add a card to resume code reviews here. |
peycheff-com
approved these changes
Jul 23, 2026
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.
Problem
.github/workflows/docs-truth.ymltriggers onpull_requestand resolves its reusable workflow through a local path, while handing it the org read token:On a
pull_requestrun, both the caller and a./-resolved reusable workflow are read from the PR's merge tree. A branch PR can therefore rewritedocs-truth-public.ymlinside the same PR that workflow is verifying, andsecrets:hands the rewritten version a token scoped to check out every private repo the gate touches —Mindburn-Labs/<subject>,/.github,/docs,/dev-orchestration.Reachability
pull_requestruns originating in a fork, so the token is empty there..githubto read every private repo in the org.Fix
Pin the reusable workflow to a merged commit instead of
./.The subject checkout inside the reusable still uses
github.event.pull_request.head.sha, so the gate keeps verifying the PR's content — only the verifier itself now loads from trusted history.Why this shape
Every other caller in the org already pins this workflow.
.githubwas the last repo on the local path:@3ce0af63@f609d37a@3a85cbbd.github./— this PRCost
Changing
docs-truth-public.ymlnow takes two PRs: land the change, then bump the pin. That is the intended trade, and it matches what every other repo already lives with.Notes
git log --all. The merged ADRd55c03drecords that the containment PRs remained draft.claude/docs-truth-token-guard(ci(docs-truth): fail fast when the org read token is missing or unscoped #55) is a different fix — it fails fast on a missing/unscoped token and leavesdocs-truth.ymluntouched. It does not overlap with this change.PLATFORM_DESIGN_SYSTEM_REPO_READ_TOKEN→MINDBURN_ORG_READ_TOKENmapping is the HELM-311 stopgap and is deliberately untouched here.Found by a full 318-issue audit of the HELM AI Linear board against source-owned evidence. HELM-198 was reading as half-shipped because supporting probes and ADRs merged around it while the exposure itself went untouched.
Refs: HELM-198
🤖 Generated with Claude Code