Conversation
publish.yml now starts with portfolio-foundation's release-lineage, pinned at hseshadr/ci#50 head 3de1c4b. The job `if` (head_branch == default_branch) also passes for a dispatch on a tag named `main`; the lineage call proves from GitHub's run records that the candidate is a successful release-candidate.yml dispatch for exactly HEAD_SHA and that main contains it, before any artifact is downloaded. Event values reach the action's bash only as quoted env vars. OPERATIONS.md's release evidence and its docs contract name the new step. Draft: re-pin to the ci merge SHA after hseshadr/ci#50 merges. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015oBArfm762nN1r4F4Fst5a
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.
TL;DR
Draft on purpose. Pinned to hseshadr/ci#50 head
3de1c4b. That commit is not on cimainuntil #50 merges. Re-pin to the ci merge SHA after ci merges, then mark ready.publish.ymlnow starts withportfolio-foundation'srelease-lineage, exactly the step ci#50's fleet policy accepts. Modeled on edgeproc-core#60. The jobif(head_branch == default_branch) also passes for aworkflow_dispatchon a tag namedmain. Until now edge-proc's publisher had no lineage check at all, so that tag'srelease-candidate.ymlcould produce bytes the publisher would upload over OIDC. The lineage call proves from GitHub's run records that the candidate is a successfulrelease-candidate.ymldispatch here for exactlyHEAD_SHA, and thatmaincontains it, before any artifact is downloaded. Event values reach the action's bash only as quoted env vars.Claim touched: "a publisher only publishes bytes whose candidate run came from main".
Contract changes (called out on purpose)
test_should_keep_oidc_publisher_source_free_and_shell_freepinned the step list[download, pypi-publish]. It now pins[dagger (lineage), download, pypi-publish], still with norun:step.docs/OPERATIONS.mdsaid the OIDC job "only invokes pinned artifact download and official PyPI publish". It now names the lineage proof too, andtest_release_runbook_keeps_build_code_outside_the_oidc_jobpins the new wording.Evidence
test_workflow_security.py,test_release_contract_docs.py,test_sdist_contract.py)--publish-run-idpublisher-lineage${{ github.event.workflow_run.head_sha }}into lineage argsdagger-args-expressionuv run poe gate(lint, format, mypy strict, xenon A, pytest)validate_workflowon all workflowspublish.yml0 findings. The 3 remaining (shell-step×2,candidate-order) are inrelease-candidate.yml, same asmain, and #76 fixes themgit merge-treevsmain, #75, #76Merge order
module:SHA to ci#50's merge SHA and mark ready. Merge with ci: pin Foundation to the rerun created_at skew fix #75/fix(ci): shell-free release candidate that keeps the tag out of script text #76 in any order.feat/require-publish-lineage(which makes the lineage step required).Not verified
🤖 Generated with Claude Code
https://claude.ai/code/session_015oBArfm762nN1r4F4Fst5a