Repository navigation
Conversation
… environments and OIDC
P0: publish.yml uploaded the public CloudFormation templates
(templates/latest/, what customers deploy) from any branch when a PR was
labeled `publish` or the workflow was dispatched, using long-lived AWS keys.
publish.yml:
- triggers: push to master (template/workflow paths) + workflow_dispatch;
drop PR `labeled` and schedule triggers
- job guarded by `github.ref == 'refs/heads/master'` and the protected
`publish-templates` environment (required reviewers, master-only)
- AWS via GitHub OIDC (`role-to-assume` from environment var
AWS_S3_PUBLISH_ROLE_ARN; fails closed if unset); no stored keys
- `permissions: {}` default, job gets contents:read + id-token:write
- actions pinned to commit SHAs, persist-credentials: false, concurrency
group, bucket/region fixed in-file, no `${{ }}` in run scripts
dockerhubpublish.yml (same any-branch exposure for the DockerHub token):
- only master or tags; `dockerhub-publish` environment; permissions;
SHA pins; env vars instead of `${{ }}` interpolation in run scripts
DEVELOP.md documents the IAM trust/permission policies, environment setup
and retiring/rotating the old AWS keys and DockerHub token.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review W1-C1: workflow-level group let a skipped non-master dispatch cancel a pending master publish run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rsions Review W1-SC1/SC4: the tag-push trigger never matched a real tag, and keeping a tag path would let any tag creator reach the DockerHub token through the environment's tag policy. Validate matrix values before writing GITHUB_ENV so a newline in the dispatch input cannot inject env vars. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tire keys) Review W1-SC2/SC3/O1-O8/S1-S5: environments are auto-created unprotected, so lock them before creating the IAM role and before merge; replace (not move) the DockerHub token; verify before deleting old keys; CHANGELOG states the operator dependency; refresh stale DockerHub section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review W2: with default write GITHUB_TOKEN and 'Allow GitHub Actions to approve pull requests' on, a writer's workflow can approve its own PR and reach master, defeating the master-only gates. Runbook now disables that and sets read-only default permissions; ci.yml/scan.yml declare explicit permissions so they keep working. Also: release tag must match a forge-base tag, push only the release tag, name DOCKERHUB_TOKEN, and don't 'test' the DockerHub path with a republish. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… audit other secrets Review W3: switching the default token to read-only before merge breaks master's scan.yml, so do it after merge (the approval checkbox is the actual control and stays pre-merge). Retire old DockerHub creds right after the template publish verifies instead of waiting for a release. Disable admin bypass on the environments. Flag the unused GRAPHISTRY_GHA_CI_* repo secrets for owner review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ult, no-bypass) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sh; document the chain graphistry/graphistry base.yml dispatches this workflow on master with cuda_versions '["13", "12"]' and polls it for 30 min; the N.N-only check would have failed every such run, and the stale '["12.8", "11.8"]' default matches no current forge-base tag. Validation now accepts N or N.N (still rejects newlines). DEVELOP.md describes the graphistry-driven path as the normal one. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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 (P0)
publish.ymluploaded the public CloudFormation templates tos3://graph-app-kit-repo-public/templates/latest/from any branch, either by adding thepublishlabel to a PR or by dispatching the workflow manually. These are the templates customers deploy from the README "Launch Stack" buttons. The upload used long-lived AWS keys stored as repo secrets, with nopermissions:limits and actions referenced by tag (checkout@v3).dockerhubpublish.ymlhad the same any-branch exposure for the DockerHub token.Fix
publish.ymlmaster(only when templates or the workflow change) andworkflow_dispatch. The PRlabeledand schedule triggers are removed.github.ref == 'refs/heads/master', inside thepublish-templatesenvironment (required reviewers, master-only).role-to-assume; no stored keys. IfAWS_S3_PUBLISH_ROLE_ARNis unset, the job fails closed.permissions: {}; the job gets onlycontents: read+id-token: write.persist-credentials: false, job-level concurrency keyed by ref.${{ }}interpolation inrun:.dockerhubpublish.ymldockerhub-publishenvironment. This is how graphistry CI already drives it (base.ymldispatches on master withcuda_versions '["13","12"]'and polls the run); the workflow name, dispatch trigger, and master ref are preserved for that chain.cuda_versionsentries are validated (NorN.N), so a newline can't inject intoGITHUB_ENV; default is now["13","12"]to match currentgraphistry-forge-basetags.publish.yml.ci.yml/scan.ymldeclare explicit least-privilegepermissions:, so the repo's default token can later be switched to read-only.DEVELOP.md: ordered one-time setup runbook (IAM trust/permission policies included) and the graphistry→graph-app-kit release chain.CHANGELOG.mdupdated.Verification
actionlint1.7.7 passes on all changed workflows;.agents/skills/review/scripts/anti_pattern_scan.shreports 0 signals on this range (on master it flags AP020/023/024/025/026 onpublish.yml).gh api/git ls-remote; inputs checked against each action'saction.ymlat the pinned SHA.s3:PutObjectsuffices (small single-part uploads, SSE-S3, no ACL).ci-labeled run is the live test of the DockerHub chain.Review (
.agents/skills/review, fixes=inline)4 waves until convergence, isolated per-dimension subagents (spec, correctness, supply chain, operability), per-finding adversarial verification; later findings verified with
gh api.Post-review: research of graphistry's CI/CD found the automated dispatch chain and a validation bug that would have failed it; fixed in bc8c03b. Verdict triage at
important: PASS.Deferred:
docker loginafter build; unusedversioninput; upgrade/pin actions inci.yml/scan.yml; pre-existingscan.ymlsarif_filebug (workflow disabled).🤖 Generated with Claude Code