Dashboard › publish › Distillation
b5f1316a-7edb-4344-968d-8ad2273b724d["lore_tm_v1_M7jstKIbaTi8ThgHCmD34MJKIkGKWj0E3hnSolWStoY","lore_tm_v1_dauk2bo5j4ux5iYXpjoLtMia-00rUlh8Pf-cbqx_t3w","lore_tm_v1_WcblSi6C9tvnScBVHekcfBokDkg7nq2kKCy2SugMlXY","lore_tm_v1_RKBLZXXtLHDT7IlRaFmEii324yW7fPvtVpAuhjUaWKM","lore_tm_v1_0sTSjwef5WoYhAYbwvuP2t5kxYWp83ekrndd8hOCcwo","lore_tm_v1_ANKeeppUXBWg9GFqVpxeOamg-qWDszcq-Iu5eSjAW6g","lore_tm_v1_3RO3kTVpWjPUemQ0b7hth-ln9n1Is51Jgw8fXn3pAsA","lore_tm_v1_gOHsDQ48GTGxHOcE8GnkY9QSvsyP0uuZEIJR6OqI1_8","lore_tm_v1_ZQKK2Sj09yLtqkF2zI3HpxO9-Z20xHYoPquBHN8s3sw"]
Date: Aug 27, 2026
Read (view/discuss), Triage (manage issues/discussions/PRs without write), Write (push), Maintain (manage repository without sensitive/destructive actions), and Admin (full access including security management/deletion). Only Admin can manage individual, team, and outside-collaborator repository access; Write, Maintain, and Admin can approve/request changes on PRs with required reviews and push to assigned repositories..github/workflows/publish.yml comments/documented flow: adding accepted adds ci-pending and removes ci-failed when retrying; the publish job requires ci-ready, which the poller flips from ci-pending to prevent publishing without CI verification in an auto-approve race. Retry reset removes ci-ready so the poller’s subsequent --add-label emits a new label event, then adds ci-pending.ci-ready after checking/passing CI, including when ci-ready is already present, so the label event triggers publishing..github/workflows/ci-poller.yml polls only issues carrying both ci-pending and accepted; on passed CI it removes ci-pending and adds ci-ready; on check-run or commit-status failure it swaps ci-pending to ci-failed, removes accepted, posts a failure comment with failed checks/status contexts and https://github.com/${repo}/commit/${sha}/checks/, and instructs authors to re-add accepted after fixing CI. It disables the poller when all ci-pending issues resolve; comments identify manual triggers as accepted-label re-addition or workflow_dispatch..github/workflows/auto-approve.yml is named auto-approve non-sdks; it triggers on newly opened issues, has contents: read, and runs auto-approve on ubuntu-latest only when github.actor is sentry-release-bot[bot] or getsantry[bot] and issue title starts with publish: . It checks out only auto-approve-repos.txt using actions/checkout@v4 with sparse-checkout-cone-mode: false; obtains an internal-app token through actions/create-github-app-token@v3 using ${{ vars.SENTRY_INTERNAL_APP_ID }} and ${{ secrets.SENTRY_INTERNAL_APP_PRIVATE_KEY }}; extracts REPO via sed -n 's/^publish: \(.*\)@.*/\1/p'; and runs gh issue edit "$ISSUE_URL" --add-label accepted only if REPO is nonempty and exact-matches a line in auto-approve-repos.txt.vitest run src/modules/__tests__/approval-authorizer.js src/publish/__tests__/authorize-approval.js passed: 2 test files, 17 tests total—src/publish/__tests__/authorize-approval.js (3 tests, 14 ms) and src/modules/__tests__/approval-authorizer.js (14 tests, 20 ms); Vitest v4.0.17, Yarn v1.22.22.auto-approve-repos.txt contains 46 exact allowlisted release targets: 1. getsentry/arroyo; 2. getsentry/auto-type-annotate; 3. getsentry/devenv; 4. getsentry/infra-event-notifier; 5. getsentry/jest-sentry-environment; 6. getsentry/json-schema-diff; 7. getsentry/js-source-scopes; 8. getsentry/objectstore/clients; 9. getsentry/ophio; 10. getsentry/pdb; 11. getsentry/pyo3-python-tracing-subscriber; 12. getsentry/pytest-sentry; 13. getsentry/relay/py; 14. getsentry/responses; 15. getsentry/rust-proguard; 16. getsentry/rust-sourcemap; 17. getsentry/rust-usage-accountant; 18. getsentry/script-runner; 19. getsentry/sentry-api-schema; 20. getsentry/sentry-forked-djangorestframework-stubs; 21. getsentry/sentry-forked-django-stubs; 22. getsentry/sentry-forked-jsonnet; 23. getsentry/sentry-infra-tools; 24. getsentry/sentry-kafka-management; 25. getsentry/sentry-kafka-schemas; 26. getsentry/sentry-protos; 27. getsentry/sentry-redis-tools; 28. getsentry/service-registry; 29. getsentry/skrooge; 30. getsentry/snuba-sdk; 31. getsentry/statsdproxy; 32. getsentry/status-page-list; 33. getsentry/streams/sentry_streams; 34. getsentry/symbolic; 35. getsentry/taskbroker/clients; 36. getsentry/usage-accountant; 37. getsentry/watto; 38. getsentry/sentry; 39. getsentry/snuba; 40. getsentry/vroom; 41. getsentry/relay; 42. getsentry/symbolicator; 43. getsentry/taskbroker; 44. getsentry/uptime-checker; 45. getsentry/launchpad; 46. getsentry/self-hosted.ci-ready after passing CI, even if the label already exists; re-adding it deliberately emits the event that begins publishing after the waiting-for-ci race, and idempotence optimization would strand accepted releases.workflow_dispatch must always remain allowed for manual recovery, independent of the pending-work repository variable..lore.md documents four security/behavior constraints: authorization must use Publish’s exact title grammar—supporting qualified and legacy unqualified getsentry titles with valid paths—and reject malformed/unsupported titles before GitHub queries; trusted auto-approval provenance must be preserved independently of the label-event actor because the internal-app token becomes the actor; rejection cleanup must remove accepted after every failure path, including checkout/internal-app-token failures and permission API failures, by creating cleanup credentials before authorization, using continue-on-error, and failing unless authorized is exactly true; authorization and publication must bind to immutable identical parsed title/repository data or reject title changes to prevent title TOCTOU.yarn test / vitest run passed: 7 test files and 33 tests total. Passing files: src/modules/__tests__/update-issue.js (5 tests), src/modules/__tests__/post-workflow-details.js (1), src/modules/__tests__/approval-authorizer.js (14), src/publish/__tests__/authorize-approval.js (3), src/modules/__tests__/process-end-state.js (4), src/modules/__tests__/details-from-context.js (4), and src/libs/__tests__/github.js (2); Vitest duration 1.05 s, Yarn completion 1.52 s.GET /repos/{owner}/{repo}/collaborators returns outside collaborators, direct organization-member collaborators, team-granted members, default-organization-permission members, and organization owners; role_name is the highest effective role across repository, teams, organization, and enterprise grants, while the endpoint cannot distinguish organization-level from repository-level grants. It requires write, maintain, or admin repository privilege plus organization membership for organization-owned repositories; accepted permission filters are pull, triage, push, maintain, and admin. OAuth/classic PAT usage needs read:org and repo; changing collaborator permissions uses the same endpoint and returns 204; repository invitations are limited to 50 per 24 hours except invitations of organization members to organization repositories..github/workflows/publish.yml:62-65,90-98,174-176, .github/workflows/ci-poller.yml:80,90-100, and src/publish/authorize-approval.js:46-53 authorize the immutable accepted-event title only by persisting authorized, while poller/publisher consume the mutable current title; an actor authorized for repository A could retitle to B before CI completes. Recommended binding authorization and publication to identical immutable parsed title/repository data or rejecting title changes. 2. High fail-closed cleanup gap—checkout or internal-app-token failure skips later steps due to implicit GitHub Actions success(), and rejection depends on the potentially failed app token, leaving accepted attached; cited .github/workflows/publish.yml:35-45,67-80. 3. Medium auto-approval provenance failure—auto-approve.yml labels through an internal-app token, so the event actor is the app rather than originating getsantry[bot]; it also accepts sentry-release-bot[bot], allowing either rejection of legitimate allowlisted automation or authorization based on app repository role rather than exact trusted provenance; cited .github/workflows/auto-approve.yml:13,20-34, .github/workflows/publish.yml:62-65, and src/modules/approval-authorizer.js:2,17-21. 4. Low parser divergence—src/modules/approval-authorizer.js:3-4 accepts a broader title grammar than src/modules/details-from-context.js:24-26, risking approval of titles Publish later rejects; recommended one shared exact parser.write, maintain, or admin, failing closed for triage, read, unknown, and custom roles (src/modules/approval-authorizer.js:1,24-31); bot exception uses exact allowlist membership including release paths and skips lookup only for exact actor strings (src/modules/approval-authorizer.js:2,15-21, src/publish/authorize-approval.js:5-10); permission API failures throw and, once authorization starts, workflow rejection occurs, URL segments are encoded, and release token is neither logged nor persisted by checkout (src/publish/authorize-approval.js:12-33, .github/workflows/publish.yml:35-38,49-80); the public repository exposes no repository RBAC configuration because the gate makes live API decisions.