Dashboard › craft › Distillation
d21dba93-0aac-4c54-ba92-44a8a80d426c["lore_tm_v1_OfMtzuS9ed3zb6avKzxMvIpCm0UeNivzjmoam7YUj7k","lore_tm_v1_u0KTjaMcLTS5-HqUyxPShQT1rljjHcq9pOB2Qm0LkLw","lore_tm_v1_86_-FaFMjsUCY9by9J__GryHaXHV96ZRAFUzyxV68mY","lore_tm_v1_Exe22p1-phu9xq3c-D1_z-OhSDOm6780BM9hYeN5eqQ","lore_tm_v1_H4TbpmX7NN4uvuuf9ZOdHwyTTFUx5pVReZR54mdweUQ","lore_tm_v1_MtnF691GiQbCuGR8FI0f9XNT5JMNNu6Rc2z31QG7DlM"]
Date: Sep 8, 2026
AGENTS.md states this is the Sentry Publish Repository, a GitHub Actions-based approval system for publishing releases across multiple Sentry projects using Craft; it is a pure JavaScript CommonJS project targeting Node.js 24.0.0.yarn install, yarn test, yarn test:watch, yarn test src/modules/__tests__/update-issue.js, yarn test -t "pattern", yarn lint, and yarn prettier.__tests__/ matching source names; camelCase variables/functions; UPPER_SNAKE_CASE constants/regexes; CommonJS source and ESM test files; imports ordered Node built-ins, external packages, then local modules; Prettier defaults, double quotes, and semicolons.switch (status) default branch that throws new Error(\Unknown status: '${status}'`)`.@getsentry/releng (Release Engineering team)./home/byk/Code/getsentry/publish-workspace-acceptance contains 15 top-level entries: .eslintrc.js, .git, .github/, .gitignore, AGENTS.md, auto-approve-repos.txt, docs/, LICENSE, node_modules/, package.json, README.md, scripts/, src/, vitest.config.js, and yarn.lock..github/workflows/ci-poller.yml, .github/workflows/publish.yml, docs/publish-issue-format.md, scripts/generate-publish-issue-title-parser.js, src/modules/__tests__/details-from-context.js, src/modules/__tests__/publish-workflow.js, src/modules/__tests__/release-revision.js, src/modules/details-from-context.js, src/modules/publish-issue-title.js, src/modules/publish-issue-title.peggy, src/modules/release-revision.js, src/publish/inputs.js, src/publish/resolve-ci-poller-input.js, src/publish/resolve-location.js, and src/publish/resolve-release-revision.js; untracked additions are src/modules/__tests__/generate-publish-issue-title-parser.js, src/publish/__tests__/, and src/publish/discover-location.js.src/modules/publish-issue-title.js accounts for 750 added lines and scripts/generate-publish-issue-title-parser.js for 91 changed lines.a81ab03 on feat/workspace-acceptance tracking origin/feat/workspace-acceptance, commit message feat: resolve workspace publish paths; preceding relevant commits are 52ef600 feat: resolve compact workspace publish requests, b658ffa fix: validate publish workspace JSON, and 33de3f1 feat: accept workspace publish requests.*/5 * * * *.workflow_dispatch for manual recovery.publish.yml waiting-for-ci job runs for an open issue labeled accepted whose title starts with publish: ; it removes ci-failed and ci-ready, adds ci-pending, comments on the issue, best-effort sets CI_POLLER_HAS_PENDING=true, and triggers gh workflow run ci-poller.yml -R "$GITHUB_REPOSITORY" using an app token.publish.yml publication gate requires an open issue whose labeled event is ci-ready, with both accepted and ci-ready present and neither ci-pending nor ci-failed; documented intended invariant is that the poller always adds ci-ready after checking CI, while waiting-for-ci first removes it so a fresh label event fires..github/workflows/publish.yml currently uses actions/checkout@v6 for both the publish repository checkout at .__publish__ (line 120) and target repository checkout at __repo__ (line 159); target checkout uses ref: ${{ steps.release-revision.outputs.revision }}, repository getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}, Release Bot token, and fetch-depth: 0.publish.yml resolves inputs with node .__publish__/src/publish/inputs.js, resolves CI-approved revision with node .__publish__/src/publish/resolve-release-revision.js using PUBLISH_ARGS and PUBLISH_ISSUE_BODY, then discovers the publish location with node .__publish__/src/publish/discover-location.js after exact-revision target checkout.publish.yml sets Craft target state under $GITHUB_WORKSPACE/.craft-state/craft, validates CRAFT_PUBLISH_PATH remains inside /github/workspace/__repo__, hashes canonical container cwd using sha1sum | cut -c1-12, and writes publish-state-${owner_sanitised}-${repo_sanitised}-${cwd_hash}-${workspace_prefix}${version_component}.json; state path is deliberately outside __repo__/ to prevent repository-prepopulated Craft state.publish.yml invokes intentionally unpinned docker://getsentry/craft:latest, changes to __repo__/${{ fromJSON(steps.location.outputs.result).path }}, and runs craft publish ${{ fromJSON(steps.inputs.outputs.result).version }} --rev ${{ steps.release-revision.outputs.revision }} with XDG_STATE_HOME=/github/workspace/.craft-state, CRAFT_MERGE_TARGET, CRAFT_WORKSPACE, and CRAFT_PUBLISH_STATE_GITHUB_REPO=getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}.src/modules/publish-issue-title.peggy defines canonical publish issue title grammar as publish: , optional getsentry/, repository characters [A-Za-z0-9_.-], optional slash-delimited path segments using the same character class, @, and version characters [A-Za-z0-9_.+-], with end-of-input enforcement.RequestHeader grammar requires the issue body to begin with Requested by: @ followed by a non-newline value; blank lines; indented Merge target: with either (default) or [A-Za-z0-9_./-]+; blank lines; indented Quick links:; a View changes link; then an indented View check runs link exactly under https://github.com/getsentry/<repo>/commit/<revision>/checks, allowing only an optional terminal slash.CheckRunsRevision accepts lowercase [0-9a-f]+ only when length is exactly 40 and returns { value, start, end } based on parser location offsets; ReleaseRevision parses RequestHeader followed by arbitrary remaining body content, and CheckRunsLinkCount counts all - [View check runs]( occurrences globally.