Skip to content

fix(release-evidence): emit pasteable verify commands - #328

Merged
arrowplum merged 2 commits into
mainfrom
fix/release-evidence-verify-commands
Sep 11, 2026
Merged

fix(release-evidence): emit pasteable verify commands#328
arrowplum merged 2 commits into
mainfrom
fix/release-evidence-verify-commands

Conversation

@arrowplum

@arrowplum arrowplum commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

The "Verify it yourself" section of an evidence document listed ./verify-artifact.sh <path> lines. A reader opening the published page has no copy of that script, so the section verified nothing. Three defects, all in what the document hands a reader to run.

The commands were unrunnable. Replaced with a shell session using nothing but curl, jq and gh. It walks the digest, every repository holding those bytes, whether the seal names the file, the seal's own digest, the promotion records, the terminal attestation's back-reference to that digest, the build-info behind it, the pull request reviews, and the GitHub build provenance where one exists.

The property lookup reused the path from the digest lookup, which is the consumer-facing location. That location often carries no build.* properties: the maven, pypi and deb virtuals answer ?properties with "No properties could be found", and for a container the floating tag folder carries only docker.*. The properties sit on the timestamped path the build pushed, in a real repository. qualified() resolves there, which is pasteable() without the public-virtual preference.

The verify path could name the DEV copy of a release that reached PROD. stage_of_repo returns None for a key outside the -prod-public convention, so most_public(["ecosystem-rpm-prod-local", "ecosystem-rpm-dev-local"]) returns the DEV repo. verify_path() now prefers the repository the terminal promotion targeted, falling back to ranking. Fixing REPO_ENV_STAGE instead would shift resident_stages on every report and could change verdicts, so it was left alone.

The build lookup also names the metadata child rather than the artifact child where that is where the commit sits, since the artifact child carries no vcs block.

Opened with skip-jira, matching #303 which introduced the action.

Test plan

  • 15 new unit tests covering worked-example selection, the seal and promotion steps, the metadata-child note, the substitution hint, and both path helpers. 94 before, 109 after, all pass
  • The block generated for a PROD container release was executed top to bottom against live APIs: exit 0, nothing on stderr, no null or empty fields in 49 lines of output

- Replace ./verify-artifact.sh lines with shell the reader can run without the script
- Read build properties from a real repository: a virtual and a floating tag carry none
- Pick the verify path from the promotion record, not repo-key ranking
@arrowplum
arrowplum requested a review from a team as a code owner September 11, 2026 02:21

@alexs-aero alexs-aero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good.

nit: we should think about rewriting this python script to use templates instead of inline HTML code generation. This will offer more human readability.

@arrowplum
arrowplum merged commit 3e338ee into main Sep 11, 2026
71 of 75 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants