Repository navigation
feat(artifact-delivery): reuse a ready build of the same commit - #348
Merged
Merged
Conversation
Over 14 days, 264 public builds covered only 89 distinct builds, and each build makes about 9 GitHub reads. On 2026-09-30 those reads hung and builds failed for commits that were already built and signed. A public build now reuses a ready build of the same source when its attestation still verifies under the current trusted root, its policy and check versions are current, and R2 still holds the bytes. A request pinned to a built commit makes no GitHub read. An unpinned request still resolves on GitHub, so it never gets an older commit. The signer signs a fresh statement through the normal path.
Contributor
🤖 MERGED
GitHub merged this pull request.
d02033e9-543f-4b5d-8dd9-8811be9e712b Selected findings run after merge and open separate pull requests. |
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.
❓ Type of change
📚 Description
Over 14 days, 264 public Artifact builds covered only 89 distinct (Repository, commit, Skill path) builds, and each one made about 9 GitHub reads. On 2026-09-30 those reads hung, and builds failed for commits we had already built and signed. This is PR 2 of the GitHub mitigation plan.
A build now reuses a ready public build of the same source instead of loading it again:
The reuse key is the whole resolved source (Repository ID, owner, name, commit, tree, Skill path), a
readyResolution, and anavailableArtifact. The earlier attestation must still verify under the current trusted root, with the current policy version and check versions, and R2 must still hold the bytes. No earlier signature is copied. The build stages a new statement with this Resolution's time, and the signer signs it on the same path as a fresh build, after it hashes the R2 object again. The CLI sees the same response shape and the sameSkilld-Page-Urlheader. Private delivery stays out; it is off, and its access rules need their own review.Each decision emits
artifact-build-reusewithoutcomehit or miss, areasonon a miss, and the newartifact.resolutionId,artifact.reuseLookupandartifact.reusedFromfields, so the check-in can count hits.Loose ends I would like a view on:
find-skillon the default branch. Unless that branch moved, it now takes the reuse path, so a green smoke no longer proves the GitHub load and packaging path. I leftscripts/smoke-artifact-resolution.mjsalone because fix(artifact): retry GitHub reads once and time out page fetches #345 edits it. Pin a commit nobody has built? Or a scheduled fresh build?artifactsrow.ARTIFACT_POLICY_VERSIONis now also the switch that forces fresh builds: bump it when loading or packaging changes what one commit produces. I skipped a separate build version column so that the decision reads only signed fields.0131:0129is claimed by feat(indexnow): re-enable submission for the curated set #320 and0130is on main. The lookup still works without the index, only slower.nuxt.config.tswill need a small rebase against fix(artifact): retry GitHub reads once and time out page fetches #345 and fix(registry): serve skills-raw and skill-files from D1 #347.