Dashboard › publish › Distillation
8dc540b9-38d9-4af9-baad-9135403ad030["lore_tm_v1_E5vm2BahgxDSuVXnx3CWg1PAZ2MBC8hORhrLejSgTO0","lore_tm_v1_KTIiaXm_U3rdbFSAE3uVddC0TFfJktNBYI7x8MBS8M4","lore_tm_v1_Jeqo59ejN0A90OpyXdgvZFO5eLX8VfDxpCUJbHGxVHw","lore_tm_v1_HASx-T9Bi2GKmmj_T755RuUFV3bfQiMcbVyCxdC2Qn0","lore_tm_v1_URpcHQ4eWqbKacnjhvC4lsISBMhJKiLJcPRyiXdMFRQ","lore_tm_v1_40nG6eU3eigo0h4Qcob-XkFkfxBvkety36RLCucdbPY","lore_tm_v1_5PC8-Sh-uKwI85ASPo8OEAXLDDn18jFRT7Ljhh18KgE","lore_tm_v1_pWq7zHAwQagdCbZYmgtARUilWlXOiius0VMPbBMqPx4","lore_tm_v1_oBlX82tXqkAWJF-nXNddC6s06ApEsZhKGsIx33R9C1s","lore_tm_v1_YmuC8bkz1ZHNq0sKjezb8QiW7k3qozPbSiapa--ZrmQ","lore_tm_v1_EtZVggFrIuszlm9rB3t4FcCnWPVarl_G6BKZEd2e6HY","lore_tm_v1_LaBNpb_wjdDEUhi10pNfFv6HT-pjz1m0yjmlnao5luA"]
Date: Aug 29, 2026
yarn vitest run succeeded: 10 test files passed and 46 tests passed. Test duration was 1.72s (transform 195ms, import 1.39s, tests 237ms); Yarn completed in 2.25s.src/modules/__tests__/post-workflow-details.js (1 test), src/publish/__tests__/validate-approval-attestation.js (6), src/publish/__tests__/authorize-approval.js (3), src/modules/__tests__/approval-attestation.js (4), src/publish/__tests__/record-ci-ready-attestation.js (2), src/modules/__tests__/approval-authorizer.js (14), src/modules/__tests__/process-end-state.js (4), src/modules/__tests__/update-issue.js (5), src/modules/__tests__/details-from-context.js (5), and src/libs/__tests__/github.js (2)..github/workflows/ci-poller.yml, .github/workflows/publish.yml, AGENTS.md, src/libs/__tests__/github.js, src/libs/github.js, src/modules/__tests__/details-from-context.js, src/modules/details-from-context.js, src/modules/post-workflow-details.js, src/modules/process-end-state.js, src/modules/update-issue.js, src/publish/inputs.js, src/publish/post-result.js, src/publish/post-workflow-details.js, and src/publish/update-issue.js; untracked files included .lore.md, approval-attestation/authorizer modules and tests, src/publish/__tests__/, src/publish/authorize-approval.js, src/publish/record-ci-ready-attestation.js, and src/publish/validate-approval-attestation.js..github/workflows/ci-poller.yml had 117 additions/changes; .github/workflows/publish.yml had 97 additions; src/modules/update-issue.js had 35 changes; src/modules/__tests__/details-from-context.js had 22 changes.yarn eslint src .github --ignore-pattern '!.github' failed solely on pre-existing .github/workflows/cocoapods-keepalive.yml:1:7: yml/plain-scalar error “Must use plain style scalar”; 1 error, 0 warnings, potentially fixable with --fix.cocoapods-keepalive.yml scalar violation and chose targeted lint/format validation for changed JavaScript and workflows, followed by attestation-diff inspection.eslint src passed in 0.81s..github/workflows/ci-poller.yml, .github/workflows/publish.yml, src/modules/approval-attestation.js, src/modules/approval-authorizer.js, src/modules/details-from-context.js, related module tests, src/publish/authorize-approval.js, src/publish/record-ci-ready-attestation.js, src/publish/validate-approval-attestation.js, and their tests; all matched files used Prettier style.ci-ready after checking CI; waiting-for-ci first removes any existing ci-ready so a fresh labeled event triggers publish.yml on the happy path..github/workflows/publish.yml lines 1–270. Workflow triggers on issue labeled events; concurrency group is ${{ github.event.issue.title }} with cancel-in-progress: false; permissions are contents: read, issues: write, and packages: write.publish.yml job waiting-for-ci runs only when accepted is the added label, issue is open, and title starts publish: . It checks out with actions/checkout@v6 and persist-credentials: false, creates an internal-app token, and creates a getsentry release-bot token with continue-on-error: true.waiting-for-ci runs src/publish/authorize-approval.js with APPROVAL_TOKEN, APPROVAL_ACTOR, APPROVAL_ISSUE_NUMBER, APPROVAL_ISSUE_REPOSITORY, and APPROVAL_ISSUE_TITLE; on authorization success with authorized == 'true', it posts approval_attestation as an issue comment using github.token.waiting-for-ci validates the posted approval proof via src/publish/validate-approval-attestation.js using APPROVAL_TOKEN: github.token and APPROVAL_ATTESTATION_AUTHOR: github-actions[bot]. If authorization, attestation posting, or validation fails, it removes accepted, comments “Approval is invalid or could not be verified. Re-add the accepted label to retry after resolving the issue.”, and exits 1.waiting-for-ci removes ci-failed and ci-ready, then adds ci-pending using the internal-app token. It comments either “Retrying — CI was previously failed. Checking CI status now.” or “Approved. Checking CI status on the release branch. Publishing will start automatically when CI passes.”waiting-for-ci best-effort enables the cron poller by setting repository variable CI_POLLER_HAS_PENDING to "true" using a dedicated poller-app token, then triggers ci-poller.yml through gh workflow run using the internal-app token because GITHUB_TOKEN-originated workflow_dispatch events are suppressed.publish.yml job publish runs only for open issues where added label is ci-ready, current labels include both accepted and ci-ready, and exclude ci-pending and ci-failed; timeout is 90 minutes. It validates approval with REQUIRE_CI_READY_ATTESTATION: "true" before proceeding, and on failure removes accepted, posts the standard invalid-approval retry message, and exits 1.ci-poller.yml permissions changed from issues: read to issues: write, added checkout via actions/checkout@v6 with persist-credentials: false, and replaced sed parsing of publish: owner/repo[/path]@version titles with approval-attestation validation before CI processing.ci-ready after either protected value changes: the issue title or the latest accepted-label event.ci-ready.accepted event observed before CI checks, so a later re-approval prevents the ci-ready transition even when a new attestation arrives quickly.src/publish/__tests__/validate-approval-attestation.js (298 lines), which imports validateApprovalAttestation, createApprovalAttestation, and createCiReadyAttestation; afterEach() restores Vitest mocks.validate-approval-attestation.js regression tests cover: accepting a current accepted event with a trusted github-actions[bot] approval attestation; rejecting after title changes from publish: getsentry/sentry-javascript@10.0.0 to publish: getsentry/sentry-python@10.0.0; rejecting after accepted is removed; and rejecting when accepted is re-added with a new event ID (100 replaced by 200).accepted and ci-ready label, approval attestation tied to accepted event { actor: "contractor", eventId: "100" }, and CI-ready attestation tied to the ci-ready label actor sentry-internal-app[bot]; they reject a manually added ci-ready label whose actor is contractor, even if a syntactically matching CI-ready attestation exists.