Dashboard › craft › Distillation
e4beb266-f61a-45fe-92c9-53dc3f386536["lore_tm_v1_d0jfQuRj0KrKrayl5bhD5-Q7L3WAKb7iH-5PEVv2bDc","lore_tm_v1_3f7TDoVveNuS5vDM6Vkv8VQb8_yAMnRhdCMBzqp6X8k","lore_tm_v1_CB7lJNwD5-3MS8e5iF_QQe6hACTwf7x4gSH3ie397GQ","lore_tm_v1_n1Kh0UdThgAoxtI3kxb-JUgupQnN1uwtQeBOag7937Q","lore_tm_v1_dhw-vK70cac_I1RH9opA5c97whj11Vc1pJ5_t3Xie_w","lore_tm_v1_I9zyd5SjeyivWBDINnXsaQKeR6A2OJumEOsVnJwnlsk","lore_tm_v1_Me5-asUaDOzvZx3r2xnESPPAX7vksFwgiQ0SUF4b-Po","lore_tm_v1_48IZ1FRxE2puFOjftgEyYKK_AHq8hb_O0PoldGIZznI","lore_tm_v1_Bj-RqearSGWPhAyDocWhMFWB6B8RM6LsBGmXN3Ugry0","lore_tm_v1_383gOA-tvL6kH8uu-WRTwcLVnE5MdxrrmI297r1c-0Q"]
Date: September 8, 2026
yarn run v1.22.22 ran eslint src .github --ignore-pattern '!.github' successfully in 1.19s.publish: getsentry/sentry@21.3.1 and publish: getsentry/toolkit/packages/cli@1.2.3.[A-Za-z0-9_.-]+, excluding ., .., __proto__, and segments beginning with -; Craft preserves exact spelling and never normalizes names.4.2.6+sentry1 is valid..craft.yml causes craft workspace list to provide concrete workspace paths; a suffix exactly matching one is a workspace, while every other suffix remains a checkout path..craft.yml always means checkout-path behavior; discovery errors when root configuration exists fail the release.docs/publish-issue-format.md documents canonical Peggy grammar generated from src/modules/publish-issue-title.peggy: title format is publish: , optional getsentry/, repo, optional slash-delimited path, then @version; parsed output is { repo, path: path || "", version }.Requested by: @<actor>, Merge target: <branch-or-(default)>, then Quick links: containing exactly one View changes line followed by exactly one View check runs line for the checkout repository; Merge target is required and (default) denotes the target repository default branch.- [x] <target-id> under ### Targets; checked targets are skipped as already published or user-requested skips, and can be manually unchecked for retry. Craft refresh preserves checked entries; failed-release checkbox updates come from secure Craft publish-state.accepted starts CI waiting; publishing starts only after the CI poller adds a fresh ci-ready label to an open accepted issue lacking ci-pending and ci-failed; dry-run requests dry-run mode.src/modules/details-from-context.js detailsFromContext({ context }) requires context.payload.issue, parses the title via parsePublishIssueTitle, validates titleDetails.repo with isPublishRepository and version with isReleaseVersion, maps a dry-run label to dry_run: "1" otherwise "", prefixes parsed path with ".", and rejects invalid paths with isPublishPath.detailsFromContext obtains mergeTarget using getReleaseRevisionDetails({ issueBody: context.payload.issue.body || "", repo: titleDetails.repo }), extracts checked target IDs using TARGETS_SECTION_PARSER_REGEX and CHECKED_TARGETS_PARSER_REGEX, converts (default) to merge_target: "", and returns title details plus dry_run, merge_target, path, and targets.src/modules/__tests__/publish-workflow.js extracts the Set targets Bash script from .github/workflows/publish.yml, runs it with CRAFT_PUBLISH_PATH, CRAFT_PUBLISH_REPO, CRAFT_PUBLISH_TARGETS_JSON: '["github"]', CRAFT_PUBLISH_VERSION, optional CRAFT_PUBLISH_WORKSPACE, GITHUB_OUTPUT, and temporary GITHUB_WORKSPACE, then reads its state_file output and state JSON.Inform start, target checkout, location resolution, target state setup, and Craft publishing; checkout uses ref: ${{ steps.release-revision.outputs.revision }}, discovery runs node .__publish__/src/publish/discover-location.js with PUBLISH_REPOSITORY_DIRECTORY: __repo__, Craft image is not pinned to getsentry/craft:2.31.0, and publishing runs craft publish <version> --rev <CI-approved revision>.github.event.label.name == 'ci-ready', issue labels accepted and ci-ready, and absence of ci-pending and ci-failed.sentry@21.3.1 to write .craft-state/craft/publish-state-getsentry-sentry-c232c383e26f-21.3.1.json, and monorepo toolkit workspace packages/cli@1.2.3 to write .craft-state/craft/publish-state-getsentry-toolkit-c232c383e26f-workspace-cGFja2FnZXMvY2xp-1.2.3.json; both state payloads equal { published: { github: true } }.4.2.6+sentry1 and 4.2.6+Sentry1 do not collide, using distinct URL-safe-base64 filename endings -version-NC4yLjYrc2VudHJ5MQ.json and -version-NC4yLjYrU2VudHJ5MQ.json.src/publish/resolve-release-revision.js parses process.env.PUBLISH_ARGS || "{}", requires repo or throws Publish input must define a repository., and outputs revision through @actions/core core.setOutput, using getReleaseRevision({ issueBody: process.env.PUBLISH_ISSUE_BODY || "", repo }).src/modules/publish-location.js resolvePublishLocation({ path, workspaceNames }) validates the publish path and every discovered workspace name; "." returns { path }, an exact workspace-name match returns { path: ".", workspace }, and all other valid paths return { path }.isPublishPath accepts only "." or "./" paths whose slash-separated segments pass isSafeWorkspaceSegment; safe segments match /^[A-Za-z0-9_.-]+$/, exclude ., .., __proto__, and cannot begin with -..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__/ci-poller-workflow.js, src/modules/__tests__/generate-publish-issue-title-parser.js, src/publish/__tests__/, and src/publish/discover-location.js..github/workflows/ci-poller.yml: line 157 accepts an empty string resolver body, and line 162 edits the issue with that empty file, allowing an empty issueBody to erase an issue. A read-only jq check confirmed {"issueBody":""} passes; test coverage at src/modules/__tests__/ci-poller-workflow.js:160-166 covers only a missing property, not empty string.actions/checkout@v6 at .github/workflows/publish.yml:120,159, while CI poller uses v7 at .github/workflows/ci-poller.yml:52; src/modules/__tests__/publish-workflow.js:63-97 does not assert checkout versions.src/modules/release-revision.js:38-45 validates replacement SHA and slices parsed offsets correctly, but src/modules/__tests__/release-revision.js:127-134 only uses toContain; recommended adding equality coverage for CRLF, trailing bytes, and unrelated appended content./checks slash; global duplicate check-runs detection; canonical merge-target authority and grammar; isolated-subshell poller error skips; missing/non-string resolver-body blocking; trailing-byte handling and temporary cleanup; generator marker validation and generated parity; JSON output serialization and fallbacks; fresh ci-ready gate and workflow_dispatch; exact-SHA checkout and fail-closed discovery; intentional getsentry/craft:latest; and absence of CocoaPods changes or unrelated workflow upgrades.yarn test -- --printConsoleTrace passed with 91 tests, yarn lint passed, generated-file check passed, and git diff --check a81ab03 passed; working tree remained unchanged after checks.DO-NOT-MERGE.