You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(release): dispatch crate publishing with its own workflow identity - #26
The release-plz pipeline currently calls crates.yml as a reusable workflow. crates.io rejects its OIDC authentication because the caller is release-plz.yml, while the configured trusted publisher expects crates.yml. The failed run is 37628308831: package verification passed, authentication returned HTTP400, and publishing never ran.
Dispatch crates.yml as a separate workflow with the exact new release tag instead. Only the dispatch job receives actions:write; it no longer requests an ID token. The publishing workflow requires a tag, checks its own workflow identity and repository before checkout/authentication, and checks out refs/tags/<tag>. Dry runs continue to skip both authentication and publication. No crates.io account configuration changes.
Validation: 11 offline controls pass under a clean HOME escape guard. They execute the production dispatcher and publisher validation shell, accept stable/prerelease/build tags, reject forks, the former reusable-caller identity, missing/invalid tags, and propagate a failed dispatch without retry. Workflow YAML parses successfully. The controls run in ordinary PR CI.
Observed before: the reusable caller produced HTTP400, expected crates.yml but received release-plz.yml. Source controls after: the dispatcher invokes a separate crates.yml workflow at main with an explicit tag; the former caller identity is refused before authentication. A hosted dry run is still outstanding; it will not prove successful registry authentication because that step is deliberately skipped.
PR fix(render): honor thickness on semantic line regions #25 @ 4802322: independent — Disjoint source paths. This publisher repair is the prerequisite and lands first; the semantic-line fix in PR25 remains frozen until main is green. Separate branches preserve that operator-directed landing order; neither proposal absorbs or rewrites the other.
SOURCE APPROVE at 276ef53 — Pixelsrc PR26. Native registration REFUSED; no accepted artifact.
One independent non-author post-green full review of all five paths, author Gennaro. Fresh hosted head: 13 SUCCESS + expected PyPI conditional SKIP. Current native classifier cf2db005 matches origin/main, exact record 81935fb30e3f01459f55fdd680e9bcbe06c699eb76a72c51024f43031aafba3a T3/unavailable null, base686b366c09313c31d5fd21f0f8b9571f8a30dd8c.
The proposal replaces the reusable crates caller with a separate workflow_dispatch of crates.yml at main carrying an explicit validated release tag. Only dispatch has actions:write; publication alone requests id-token:write. Publisher validates its repository/workflow and tag before checkout/authentication, checks out refs/tags/tag, and dry-run skips both auth and publication. No account/token configuration change or publication is authorized by this review.
Validation: 11 production-script/source controls PASS plus 6 independent production-validator controls (stable/prerelease/build positive, newline injection, Unicode digits, lookalike workflow path, fork workflow and old reusable caller negatives), both HOME157+5 CLEAN/command0. Whole inverse restores exact base tree713f37d15840679e2046c07bf4f037f2f3bdf8f1. Clean isolated detached review tree; no source edits, push, tag, upload or remote workflow dispatch.
Native review command REFUSED because exact base main has failed crates.io publish workflow367491690:push/check15368 crates.io / Publish to crates.io. This is the pre-existing publication failure the proposal addresses; no exception was fabricated or forced. Tim must obtain normal exact-base admission before recording/landing this retained source verdict. Hosted dry-run remains outstanding; actual registry authentication/publication is not proven by offline controls or this approval.
Evidence archive /srv/fleet/aegis/grant-pixelsrc26-review-20261024 includes current-risk.json, controls.guard.log, independent.guard.log, independent.py, inverse.patch and review-registration.log. The PR body links aegis-8t76.1, which actually tracks the separate line-thickness PR25; preserve that item's ownership/scope and use parent aegis-8t76 for this review evidence, not a closure of the thickness task.
scbrown
changed the title
Dispatch crate publishing with its own workflow identity
fix(release): dispatch crate publishing with its own workflow identity
Oct 24, 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
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.
The release-plz pipeline currently calls
crates.ymlas a reusable workflow. crates.io rejects its OIDC authentication because the caller isrelease-plz.yml, while the configured trusted publisher expectscrates.yml. The failed run is 37628308831: package verification passed, authentication returned HTTP400, and publishing never ran.Dispatch
crates.ymlas a separate workflow with the exact new release tag instead. Only the dispatch job receivesactions:write; it no longer requests an ID token. The publishing workflow requires a tag, checks its own workflow identity and repository before checkout/authentication, and checks outrefs/tags/<tag>. Dry runs continue to skip both authentication and publication. No crates.io account configuration changes.Validation: 11 offline controls pass under a clean HOME escape guard. They execute the production dispatcher and publisher validation shell, accept stable/prerelease/build tags, reject forks, the former reusable-caller identity, missing/invalid tags, and propagate a failed dispatch without retry. Workflow YAML parses successfully. The controls run in ordinary PR CI.
Observed before: the reusable caller produced HTTP400, expected
crates.ymlbut receivedrelease-plz.yml. Source controls after: the dispatcher invokes a separatecrates.ymlworkflow at main with an explicit tag; the former caller identity is refused before authentication. A hosted dry run is still outstanding; it will not prove successful registry authentication because that step is deliberately skipped.GitHub documents that reusable workflows retain caller identity and that
workflow_dispatchis a GITHUB_TOKEN trigger exception.Bead: aegis-8t76.1
Overlap preflight: 8d2795a1c06e2861917ef8a04bf07f0a4d8a25e03375a63b6f9b9486d84b180b