Dashboard › craft › Distillation
e305bcc0-7535-4ac4-b8ed-2452aa4f2f77["lore_tm_v1_Rk2qguV8klUnEYKkceUvuIOqSObL57mRS5SceTjYFek","lore_tm_v1_uvbGhdJn9hHKFsQXZp5Q0wQo3S8SFVjqal6fVnyQFio","lore_tm_v1_KCgCwSkR2bVqz79FtNDFt9z_q_mfyzoNpNQMhEOsb8Q","lore_tm_v1_EsML5c9zhFqO1VQ3_nwYTb9MBR36Ow3tvdfIMLstlUE","lore_tm_v1_WgQ510IjMI5ZDMGkfV0JVXAvWuV_BMfI2E0u1YgsjnA","lore_tm_v1_a9worWViZPeXN8iIHk9BSsnai_i7dse3DXaLce-UpUo","lore_tm_v1_AWCPUsmVI0QoO6bLA59AK-gAvJR2ZXwFlp3OecbZ_p8","lore_tm_v1_dAOT7s-Vp5kCvaR5EY38Z3sNP4wohogX-YjZ4w3Izn0"]
Date: Sep 8, 2026
/home/byk/Code/getsentry/publish-workspace-acceptance against baseline a81ab03; instructed not to modify files and to inspect the complete diff, source, workflows, docs, and tests.actions/checkout@v7 and ci-poller checkout at v7 while unrelated workflows remain intentionally untouched; title docs/parser parity; exact-SHA checkout; fail-closed workspace discovery; craft:latest; fresh CI gating and workflow_dispatch; and no unrelated CocoaPods churn.file:line findings, explicit PASS/FAIL status for requested constraints, and test gaps. User required the audit response to end exactly MERGE or DO-NOT-MERGE, and to state why if blocked before DO-NOT-MERGE.24.0.0.1.22.22 via Volta; do not use npm.yarn test, yarn test:watch, yarn test src/modules/__tests__/update-issue.js, yarn test -t "pattern", and yarn lint; formatting command is yarn prettier.__tests__/ matching source filename; camelCase variables/functions; UPPER_SNAKE_CASE constants/regex; CommonJS source and ES Modules test files; import order is Node built-ins, external packages, then local modules; Prettier defaults, double quotes, and required semicolons.v4.0.0 with globals enabled and mocks auto-cleared between tests; mock external dependencies before importing the module under test..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 paths were src/modules/__tests__/ci-poller-workflow.js, src/modules/__tests__/generate-publish-issue-title-parser.js, src/publish/__tests__/, and src/publish/discover-location.js.a81ab033098f151fbc291b7b0c934901405bb162 (a81ab03, subject feat: resolve workspace publish paths). Diffstat reported 15 tracked files changed, 1097 insertions(+), and 96 deletions(-); repository history shown also included 52ef600 feat: resolve compact workspace publish requests, b658ffa fix: validate publish workspace JSON, 33de3f1 feat: accept workspace publish requests, and 83d210b build(deps): bump js-yaml from 4.3.0 to 4.3.1 (#9174).src/publish/__tests__/ contains discover-location.js, resolve-location.js, and resolve-release-revision.js.workflow_dispatch for manual recovery..github/workflows/ci-poller.yml defines scheduled execution every 5 minutes (cron: "*/5 * * * *") plus workflow_dispatch with optional attempt input defaulting to "0". Job check-ci runs only when vars.CI_POLLER_HAS_PENDING == 'true' || github.event_name == 'workflow_dispatch', uses concurrency group ci-status-poller with cancel-in-progress: false, and checks out the publish controller with actions/checkout@v7 to .__publish__.ci-poller.yml retrieves sentry-internal-app and sentry-release-bot tokens using actions/create-github-app-token@v3; it uses the internal-app token for label changes and RELEASE_TOKEN through gh_api_release() for cross-repository API calls, preserving API failure status and warning on failure.ci-poller.yml polls open issues with both ci-pending and accepted labels (limit 200), writes each issue body exactly using printf '%s' "$issue" | jq -jr '.body' > "$body_file", and invokes node .__publish__/src/publish/resolve-ci-poller-input.js with PUBLISH_ISSUE_BODY_FILE, PUBLISH_TITLE, and optionally PUBLISH_REVISION.ci-poller.yml skips an issue when canonical input parsing fails, when canonical issue-body update resolution fails, or when resolved .issueBody is not a nonempty string; temporary files body_file, resolver_output_file, and updated_body_file are removed by an EXIT trap.ci-poller.yml resolves a release branch from repos/${repo}/commits/${issue_sha}/check-suites and then resolves its head through repos/${repo}/git/ref/heads/${branch}; API failures or empty results fall back to issue_sha. If the branch SHA differs, it regenerates the canonical body and updates via gh issue edit --body-file.ci-poller.yml retrieves combined commit status and paginated check runs for ${sha}; it skips the issue on API failures and waits if both total_checks and total_statuses are 0. It treats commit status success, or zero statuses when check runs exist, as status-OK; check-run conclusions success, neutral, and skipped as passing; and other completed conclusions as unsuccessful.ci-ready when CI passes.ci-poller.yml, CI pass requires status_ok == "true", pending_checks == "0", and unsuccessful_checks == "0"; it removes ci-pending, adds ci-ready, and comments that publishing is starting. Check-run failures or commit-status failures remove ci-pending and accepted, add ci-failed, and comment failed checks/status contexts plus a commit checks link.ci-poller.yml cleanup runs with if: always(), counts remaining open issues with both ci-pending and accepted, thenβif app token creation succeedsβsets CI_POLLER_HAS_PENDING to "false" when count is 0, otherwise "true". It self-dispatches ci-poller.yml while items remain pending using attempt + 1, capped at 60; after cap it relies on cron fallback.publish.yml evidence indicates two scoped checkout actions use actions/checkout@v7; it checks out a target repository, uses fetch-depth: 0, runs node .__publish__/src/publish/discover-location.js, invokes Craft through craft:latest, and configures XDG_STATE_HOME: /github/workspace/.craft-state. Comments state the poller adds ci-ready and the happy path is guaranteed to trigger.src/modules/publish-issue-title.peggy defines canonical issue-title grammar: publish: followed by optional getsentry/, Repository, optional slash-delimited Path, @, and Version, followed by end-of-input. RepositoryCharacter and PathSegment permit [A-Za-z0-9_.-]; versions permit [A-Za-z0-9_.+-]; parsed output is { repo, path: path || "", version }.src/modules/publish-issue-title.peggy defines ReleaseRevision from a request header requiring Requested by: @β¦, Merge target: with (default) or [A-Za-z0-9_./-]+, Quick links:, a View changes link, and a https://github.com/getsentry/${repo}/commit/${revision}/checks View check runs link. CheckRunsRevision accepts lowercase hexadecimal only and requires exactly 40 characters, returning { value, start, end }; newlines accept \r\n or \n.