Dashboard › publish › Distillation
f75ae047-92b5-47cc-8db2-a9a1fa869ae8["lore_tm_v1_THwOrJy0v0egSBfVYLInvHD0T8TcyRsBnJ11eZHfXs4","lore_tm_v1_2dOyTdfE26zd2bM-OJhvw0dPwq1GULwaIYXPs7-3_Ds","lore_tm_v1_rac5_xt3bsma-5gx4fH3n9tGgw4Iiscj_wf0as5oU-4","lore_tm_v1_c920hE_-kN3tDJFR0AKaGYjmAPSD-BcZkdaKRiK2nu0","lore_tm_v1_YJ0OCVfRSSGSOSpPN0LozayHue1YjwfxctLfJ3VBwQQ","lore_tm_v1_JjAn-sqrX-MK1ozXrlxzrDQwgDAN6LBFu4qmQE_9WTA","lore_tm_v1_LAV24z_Lay_w08FEucal1FtWYdyp4BvNi29LtOOOYng","lore_tm_v1_YZjKVlasI26qns-sK0zTS3be5-rx91d3_B2X4K4szeE","lore_tm_v1_yb4wdpP87XtHDd3aHRIV25qMbVoQeF5naPq_Vlry4Jw","lore_tm_v1_jmlriVvreVQe92xIJeGmy0BAIiRmUl1p_auY3wpYNh8","lore_tm_v1_sI6EWmk_UpqOMvZBz7-bGgAL7QInSOm0kapJRFxWOpk","lore_tm_v1__rAIN9ZHvC89Q7v1GQjW2DiahSB_1mhxoIlbsK5tc5s","lore_tm_v1_3S8LrtaMfhVW-zC3Z8Za8WRwCJibEyprIHCZuyEZBTE","lore_tm_v1_C6YNbDdPV5XnmY1VM-A6R384djm4cI-kqf6Ji8F0VT8","lore_tm_v1_doa3XA-_Z855PzHp_uGkHG1aAYHXI3CJHClva4xszCg","lore_tm_v1_4XLZl6_BkJFoUxAllSHU6oUYrYLqidn4LSDzl6B2m2w","lore_tm_v1_BQj24t6qq_oaUATxpt2x6TOje8LYoUvjeXN7-D5djQM"]
Date: Sep 10, 2026
src/modules/__tests__/ci-poller-input.js so valid resolver fixtures include complete issue snapshots with labels and separately assert the request digest for each title; coverage binds the raw title, body, and dry-run state so future changes cannot omit dry-run or normalize the title before hashing.yarn vitest run src/modules/__tests__/ci-poller-input.js src/publish/__tests__/validate-approval-attestation.js src/publish/__tests__/record-ci-ready-attestation.js src/publish/__tests__/ci-poller-workflow.js --printConsoleTrace completed with 4 test files passed and 32 tests passed in 661ms; Yarn completed in 1.27s.ci-ready after checking CI, even if ci-ready was already present; waiting-for-CI may concurrently remove it.dry-run state through PUBLISH_ARGS.PUBLISH_ARGS.src/publish/inputs.js calls detailsFromContext({ context: github.context }) and writes the JSON result to the result GitHub Actions output.dry-run state after the accepted label event but before authorization can create an attestation for the changed request under the older label event.src/publish/authorize-approval.js currently fetches live issue state and issue events before minting approval attestations. For automated approval it additionally fetches comments and requires: open issue, exact live title match, approved requester, allowlisted parsed path, current accepted event actor matching AUTO_APPROVAL_LABELER, and a valid automated approval attestation authored by github-actions[bot].src/publish/authorize-approval.js first calls authorizeApproval(), then fetches the live issue and events; it denies closed/title-changed issues, invalid requesters, case-insensitive self-approval, missing accepted events, or event actors differing from the approver. On success it calls createApprovalAttestation({ actor: event.actor, eventId: event.eventId, issue })..github/workflows/auto-approve.yml runs on issues: types: [opened] only when the actor is sentry-release-bot[bot] or getsantry[bot] and the title starts with publish: . It checks out with actions/checkout@11d5960a326750d5838078e36cf38b85af677262, creates an Internal App token with actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1, executes node src/publish/record-auto-approval-attestation.js, posts the resulting proof as an issue comment, and adds accepted only when the exact parsed release path exists in auto-approve-repos.txt.recordAutoApprovalAttestation() in src/publish/record-auto-approval-attestation.js fetches the live issue and rejects with "The automated approval request changed before approval" unless the issue is open, its title exactly equals issueTitle, and the opener login case-insensitively equals autoApprover; success calls createAutoApprovalAttestation({ autoApprover, issue }).issue object read from GITHUB_EVENT_PATH; untrusted issue text will not be interpolated into shell syntax.EXPECTED_REQUEST_DIGEST at every entry point.