Dashboard › craft › Distillation
f0725367-d2e1-4294-a015-0d831d13bb3d["lore_tm_v1_3zmlcB-OuDmc9gZSZyz0DAS8La0_fiCYi6fIz55Qlj8","lore_tm_v1_rv8X6TB1DqrqXtHH2FVdQrf-pFoD9eKHsAvvfxsVg44","lore_tm_v1_sBdGjvVpjMBZkUZ-YiXYcXJ_LXn9tI1g2YhzmB_lX68","lore_tm_v1_g0mQ7p2bo3ATkrNCQbL7pC9GkAZXG2pFrrMsgoCOeRI","lore_tm_v1_WrLjzrrB_ldWeQ7mjEm6N-Hd_axZIo--tO_GRROcGAI","lore_tm_v1_5iSeJ1ASgeG5ayGTz2j2QWGB04_HK3GYzNN8uXcvEew","lore_tm_v1_t-u8r_gjCfBSExG7V6-I6V1Ry_zkAk8sAc3yPrQpZzM","lore_tm_v1_ySlv7UiGdCWgSzVfN1Pkh-dVcY8Gidv6pKDf44Ien2E","lore_tm_v1_cEmTTQIdDg5e6mEPOJcfQAaj2LyjhsHPbBSGZmpIlWk","lore_tm_v1_gN_MEoGZPslH4lEyI9bHyFszVbyoE7SFQvW1exGcJ48"]
Date: Sep 8, 2026
/home/byk/Code/getsentry/publish-workspace-acceptance, against branch baseline a81ab03 (a81ab033098f151fbc291b7b0c934901405bb162). User prohibited editing, formatting, regenerating, or otherwise mutating files; permitted only non-mutating commands/tests.git status/diff versus baseline plus relevant unchanged sources, workflows, and tests; report severity-ordered findings with precise current file:line citations, explicit PASS/FAIL for every required concern, testing gaps, and end exactly MERGE or DO-NOT-MERGE. If blocked, user required naming the exact blocker and ending DO-NOT-MERGE./checks path; duplicate check-runs-link detection; validated indexed revision replacements with byte preservation; output JSON serialization and valid JSON fallbacks; actions/checkout v7 for all requested checkouts; workflow gating plus workflow_dispatch; exact-SHA checkout before config discovery and fail-closed discovery; intentional docker://getsentry/craft:latest; generated docs/parser parity; tests/hygiene; and absence of unrelated CocoaPods diffs.AGENTS.md: project is Sentry Publish Repository, a GitHub Actions-based approval system for publishing releases across Sentry projects using Craft; it is pure CommonJS JavaScript on Node.js 24.0.0.1.22.22 must be used rather than npm; Volta pins Node 24.0.0 and Yarn 1.22.22; test command is yarn test, lint is yarn lint, formatting command is yarn prettier.require/module.exports; test files use ES modules; variables/functions use camelCase; constants/regex use UPPER_SNAKE_CASE; imports order Node built-ins, external packages, then local modules.switch default that throws new Error(\Unknown status: '${status}'`)`.v4.0.0 with globals enabled; mocks auto-clear between tests; external dependencies should be mocked before importing the module under test.src/libs/ contains shared utilities, src/modules/ core reusable business logic, and src/publish/ GitHub Actions entry points.@getsentry/releng (Release Engineering).feat/workspace-acceptance, with HEAD and merge-base both a81ab033098f151fbc291b7b0c934901405bb162..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.src/modules/__tests__/generate-publish-issue-title-parser.js, src/publish/__tests__/discover-location.js, src/publish/__tests__/resolve-release-revision.js, src/publish/__tests__/resolve-location.js, and src/publish/discover-location.js.1089 insertions(+), 92 deletions(-); src/modules/publish-issue-title.js has 750 added lines and scripts/generate-publish-issue-title-parser.js has 102 changed lines.package.json defines generate as node scripts/generate-publish-issue-title-parser.js, check:generated as node scripts/generate-publish-issue-title-parser.js --check, and test as yarn check:generated && vitest run; dependencies include @actions/core ^2.0.0, @actions/github ^7.0.0, and @sentry/node ^10.0.0; dev dependencies include peggy 5.1.0 and vitest ^4.1.0.workflow_dispatch for manual recovery.ci-ready; waiting-for-ci removes ci-ready first so a fresh labeled event fires..github/workflows/publish.yml waiting-for-ci job runs only for an open issue whose newly applied label is accepted and whose title starts with publish: (lines 26-34)..github/workflows/publish.yml marks accepted issues cleanly for CI by removing ci-failed and ci-ready, then adding ci-pending via gh issue edit (lines 42-58); comments explain removal of ci-ready is required because an already-present label would prevent a later add-label event from triggering publish.yml..github/workflows/publish.yml uses actions/create-github-app-token@v3 with SENTRY_INTERNAL_APP_ID/SENTRY_INTERNAL_APP_PRIVATE_KEY for waiting-for-CI token acquisition (lines 35-40), enables CI_POLLER_HAS_PENDING=true best-effort with dedicated CI_POLLER_APP_CLIENT_ID/CI_POLLER_APP_PRIVATE_KEY (lines 73-88), and triggers gh workflow run ci-poller.yml using the app token because GITHUB_TOKEN workflow-dispatch events are suppressed (lines 90-96)..github/workflows/publish.yml publishes only on an open issueβs ci-ready label event when labels include accepted and ci-ready and exclude ci-pending and ci-failed (lines 98-115)..github/workflows/publish.yml currently uses actions/checkout@v6 for the publish-repository checkout at lines 119-123 and target-repository checkout at lines 159-167, rather than the user-requested v7..github/workflows/publish.yml target checkout binds repository to getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}, checks out ref: ${{ steps.release-revision.outputs.revision }}, uses Release Bot app token, and sets fetch-depth: 0 (lines 151-167)..github/workflows/publish.yml runs src/publish/discover-location.js after the target checkout, with PUBLISH_ARGS and PUBLISH_REPOSITORY_DIRECTORY=__repo__ (lines 169-174)..github/workflows/publish.yml checks target path containment using realpath -m "/github/workspace/__repo__/$CRAFT_PUBLISH_PATH" and fails if it is outside /github/workspace/__repo__ (lines 198-208); it writes Craft state under $GITHUB_WORKSPACE/.craft-state/craft, outside __repo__/, to prevent target-repository prepopulation (lines 190-229)..github/workflows/publish.yml intentionally uses mutable docker://getsentry/craft:latest for the Craft publishing step (lines 231-241)..github/workflows/publish.yml passes CRAFT_MERGE_TARGET from parsed input, pins CRAFT_PUBLISH_STATE_GITHUB_REPO to getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}, and uses separate GitHub tokens for GHCR and cross-repository GitHub API access (lines 242-289).src/modules/publish-issue-title.peggy defines canonical publish titles as publish: followed by optional getsentry/, a repository composed of [A-Za-z0-9_.-], optional slash-separated path segments of the same charset, @, and version [A-Za-z0-9_.+-]+, with end-of-input required (lines 7-34).src/modules/publish-issue-title.peggy defines ReleaseRevision as a request header at the beginning of the issue body (line 39). The header requires: Requested by: @ plus non-newline requester; blank lines; Merge target: plus merge target; blank lines; Quick links:; blank lines; a View changes link; then a View check runs link at https://github.com/getsentry/<repo>/commit/<revision>/checks with only an optional trailing slash (lines 41-47).src/modules/publish-issue-title.peggy restricts check-runs revisions to exactly 40 lowercase hexadecimal characters and returns the revision plus indexed byte offsets start and end from location().start.offset/location().end.offset (lines 50-56).src/modules/publish-issue-title.peggy provides CheckRunsLinkCount, which counts occurrences beginning with - [View check runs]( across the full body, intended to protect the header resolution against appended decoy links (lines 58-62).src/modules/publish-issue-title.peggy accepts merge target (default) or [A-Za-z0-9_./-]+; request-header indentation is [ \t]*; blank lines may contain indentation; and newlines may be \r\n or \n (lines 64-85).