The caller-chosen secret name is correct; the credential identity contract is not. The action input must describe the values the runtime accepts. Keep the ci-bot ownership requirement and remove only the caller-side secret spelling; a generic credential pair would require a separate implementation change.
The caller-chosen secret name is correct; the credential identity contract is not. The action input must describe the values the runtime accepts. Keep the `ci-bot` ownership requirement and remove only the caller-side secret spelling; a generic credential pair would require a separate implementation change.
This drops the identity half of the input contract. The login step still sends this value with the hard-coded username: ci-bot at line 61, so a read:package token issued to another account is represented as supported but is authenticated under ci-bot and can fail. Keep the caller's secret name abstract, but state that the token must authenticate ci-bot and carry read:package; making the credential itself generic requires a username input too.
This drops the identity half of the input contract. The login step still sends this value with the hard-coded `username: ci-bot` at line 61, so a `read:package` token issued to another account is represented as supported but is authenticated under `ci-bot` and can fail. Keep the caller's secret name abstract, but state that the token must authenticate `ci-bot` and carry `read:package`; making the credential itself generic requires a username input too.
dev marked this conversation as resolved
ops
approved these changes 2026-08-26 13:37:15 +00:00
Cost: 0 additional build steps, registry calls, or CPU, memory, and network work. The 21-line delta changes README and input descriptions; the executable action steps are identical to main.
Cost: 0 additional build steps, registry calls, or CPU, memory, and network work. The 21-line delta changes README and input descriptions; the executable action steps are identical to main.
README.md:18 teaches PR workflows to inject an organization-wide package reader without a trust boundary. A contributor-controlled Dockerfile can disclose any private image that principal can read.
README.md:18 teaches PR workflows to inject an organization-wide package reader without a trust boundary. A contributor-controlled Dockerfile can disclose any private image that principal can read.
You change a PR Dockerfile to pull another private image and print it; the trusted main path has an unchecked PR twin. Read-only scope and token hiding don't protect contents. Restrict injection to trusted heads and a package-isolated principal.
You change a PR Dockerfile to pull another private image and print it; the trusted main path has an unchecked PR twin. Read-only scope and token hiding don't protect contents. Restrict injection to trusted heads and a package-isolated principal.
You need the credential identity in the operator contract. The caller-chosen secret name is clear, but a capability alone doesn't tell someone how to recover from the login failure produced by the fixed ci-bot username.
You need the credential identity in the operator contract. The caller-chosen secret name is clear, but a capability alone doesn't tell someone how to recover from the login failure produced by the fixed `ci-bot` username.
You supply a read:package token from another account, then this action submits it with the fixed username: ci-bot at line 61 and stops before the build. State that the token must belong to ci-bot, while leaving the caller's secret name open; accepting another account's token would require a matching username input. The failed login needs this recovery path in the input contract.
You supply a `read:package` token from another account, then this action submits it with the fixed `username: ci-bot` at line 61 and stops before the build. State that the token must belong to `ci-bot`, while leaving the caller's secret name open; accepting another account's token would require a matching username input. The failed login needs this recovery path in the input contract.
The credential identity contract is correct; the caller-side secret spelling remains open.
Reconciles prior review 6542:
action.yaml and README now require a ci-bot token carrying read:package, explain that the runtime username is fixed, and retain PACKAGE_READ_TOKEN only as an explicitly caller-chosen example.
The credential identity contract is correct; the caller-side secret spelling remains open.
Reconciles prior review 6542:
- `action.yaml` and README now require a `ci-bot` token carrying `read:package`, explain that the runtime username is fixed, and retain `PACKAGE_READ_TOKEN` only as an explicitly caller-chosen example.
ux
approved these changes 2026-08-26 13:52:21 +00:00
action.yaml now requires a ci-bot token, explains that the fixed username rejects another account's token, and the README gives the same replacement-token recovery while preserving the caller-chosen secret name.
You can now diagnose the login failure from the operator contract and replace the secret value with a ci-bot token carrying read:package; omit it for public bases.
Reconciles prior review 6546:
- `action.yaml` now requires a `ci-bot` token, explains that the fixed username rejects another account's token, and the README gives the same replacement-token recovery while preserving the caller-chosen secret name.
You can now diagnose the login failure from the operator contract and replace the secret value with a `ci-bot` token carrying `read:package`; omit it for public bases.
ops
approved these changes 2026-08-26 13:52:34 +00:00
README.md:28-31 now gates token injection on a trusted PR head and requires package-isolated ci-bot access, explicitly forbidding the organization-wide reader that let a contributor-controlled Dockerfile disclose unrelated private images.
Reconciles prior review 6545:
- README.md:28-31 now gates token injection on a trusted PR head and requires package-isolated `ci-bot` access, explicitly forbidding the organization-wide reader that let a contributor-controlled Dockerfile disclose unrelated private images.
perf
approved these changes 2026-08-26 13:53:19 +00:00
Observation: 29 insertions and 7 deletions, all README or input-description text.
Comparison: the parsed runs subtree SHA-256 matches main (776c657d7181174c387be2630e0eed17099583ec831f593f6e6d629d7a5d1ec8). Cost: 0 additional build steps, registry calls, CPU, memory, or network work.
Next measurement: recompare that subtree if the head changes.
Observation: 29 insertions and 7 deletions, all README or input-description text.
Comparison: the parsed `runs` subtree SHA-256 matches main (`776c657d7181174c387be2630e0eed17099583ec831f593f6e6d629d7a5d1ec8`). Cost: 0 additional build steps, registry calls, CPU, memory, or network work.
Next measurement: recompare that subtree if the head changes.
dev
merged commit b2540dcac2 into main2026-08-26 13:53:50 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Document the capability contract for private-base registry pulls without coupling the shared action to one caller secret name.
Changes
CI_BOT_TOKEN-specific action input text with the requiredread:packagecapability.Validation
yq eval "." action.yaml— action metadata parses.test "$(yq eval ".inputs.token.required" action.yaml)" = "false"— the input remains optional.! rg -n "CI_BOT_TOKEN" action.yaml README.md— caller-specific stale name is absent.git diff --check origin/main...HEAD— clean.Tracking
Fixes bug-s28h753sx24n
Attribution
Authored-By: Codex (GPT-5) noreply@openai.com
The caller-chosen secret name is correct; the credential identity contract is not. The action input must describe the values the runtime accepts. Keep the
ci-botownership requirement and remove only the caller-side secret spelling; a generic credential pair would require a separate implementation change.@@ -41,3 +40,1 @@when the Dockerfile's FROM is a PRIVATE fritzlab image (e.g. FROMcode.fritzlab.net/fritzlab/base) — the org is `limited`, so buildx can't pullit anonymously. Omit for public-base builds (e.g. base itself = FROM debian).Registry token with `read:package` capability forThis drops the identity half of the input contract. The login step still sends this value with the hard-coded
username: ci-botat line 61, so aread:packagetoken issued to another account is represented as supported but is authenticated underci-botand can fail. Keep the caller's secret name abstract, but state that the token must authenticateci-botand carryread:package; making the credential itself generic requires a username input too.ops ✅ — capability contract matches the proven pull-only credential; no runtime behavior changes.
Cost: 0 additional build steps, registry calls, or CPU, memory, and network work. The 21-line delta changes README and input descriptions; the executable action steps are identical to main.
README.md:18 teaches PR workflows to inject an organization-wide package reader without a trust boundary. A contributor-controlled Dockerfile can disclose any private image that principal can read.
@@ -14,12 +15,14 @@ chain.- uses: https://code.fritzlab.net/action/image-build@v1with:image: code.fritzlab.net/fritzlab/chronytoken: ${{ secrets.PACKAGE_READ_TOKEN }} # read:package; omit for public basesYou change a PR Dockerfile to pull another private image and print it; the trusted main path has an unchecked PR twin. Read-only scope and token hiding don't protect contents. Restrict injection to trusted heads and a package-isolated principal.
You need the credential identity in the operator contract. The caller-chosen secret name is clear, but a capability alone doesn't tell someone how to recover from the login failure produced by the fixed
ci-botusername.@@ -41,3 +40,1 @@when the Dockerfile's FROM is a PRIVATE fritzlab image (e.g. FROMcode.fritzlab.net/fritzlab/base) — the org is `limited`, so buildx can't pullit anonymously. Omit for public-base builds (e.g. base itself = FROM debian).Registry token with `read:package` capability forYou supply a
read:packagetoken from another account, then this action submits it with the fixedusername: ci-botat line 61 and stops before the build. State that the token must belong toci-bot, while leaving the caller's secret name open; accepting another account's token would require a matching username input. The failed login needs this recovery path in the input contract.New commits pushed, approval review dismissed automatically according to repository settings
New commits pushed, approval review dismissed automatically according to repository settings
The credential identity contract is correct; the caller-side secret spelling remains open.
Reconciles prior review 6542:
action.yamland README now require aci-bottoken carryingread:package, explain that the runtime username is fixed, and retainPACKAGE_READ_TOKENonly as an explicitly caller-chosen example.Reconciles prior review 6546:
action.yamlnow requires aci-bottoken, explains that the fixed username rejects another account's token, and the README gives the same replacement-token recovery while preserving the caller-chosen secret name.You can now diagnose the login failure from the operator contract and replace the secret value with a
ci-bottoken carryingread:package; omit it for public bases.ops ✅ — docs now bind the token to ci-bot and trusted PR heads; executable steps remain unchanged.
Reconciles prior review 6545:
ci-botaccess, explicitly forbidding the organization-wide reader that let a contributor-controlled Dockerfile disclose unrelated private images.Observation: 29 insertions and 7 deletions, all README or input-description text.
Comparison: the parsed
runssubtree SHA-256 matches main (776c657d7181174c387be2630e0eed17099583ec831f593f6e6d629d7a5d1ec8). Cost: 0 additional build steps, registry calls, CPU, memory, or network work.Next measurement: recompare that subtree if the head changes.