Dashboard › craft › Distillation
0349a0fa-cc19-4236-98e3-17ecc6bbb84c["lore_tm_v1_rHI7ueQmmxz0j4CdeCvhlc2wm0MRT5QzDlL2O6lyYrQ","lore_tm_v1_HjTtPErEZu6FMq045ZunyVPE0jxpzlUx869QFaJqp2w","lore_tm_v1_E9GjUXGqALgJMpxO6o_A-se9r_cu4yqbQ5xxGxWvO14","lore_tm_v1_txJlgGn_GycplMgbhI_uY7iIo6Z3MK-EOUsY-A_4pXE","lore_tm_v1_UGy_dqRTnr7T2I0mChXY0ZVn-fqQd_IvSnyEASY_SMA","lore_tm_v1_4HgIsvwHmm_xQRSIg4JHTZqkJFxE72ljR2YaexYsNek","lore_tm_v1_7isVhYTzTViwadKnohuDka53oyGTWs2wrVWaW5hbnZc","lore_tm_v1_M6CYbJzwQXXF0bMtL1GpdVy1NxZh0v-_ZgBq2G7uigc","lore_tm_v1_b8YZYrsK5pkZq5NyG84s0kY_RXe00qQiDhm9sVEKhzU","lore_tm_v1_3Bir7f1tyBOgCtr_yJMNhEI2wU-Tmj-ZzjRwNUaS63c","lore_tm_v1_gIorNRt0TXECNP35GbhQYgyqA-fkTTFPHtbL4jLBU_c","lore_tm_v1_u4DlYhR-a-EV7Cmu-v_9n3UeBw8h1xri0dPK2hdGZXQ","lore_tm_v1_mnmFyV3WycW8r4V3xLCw-vpZdVUBrx7YtycuhhXLB28","lore_tm_v1_yUoQACoXpBCdhfo-9SjNesxJFUK3DE5UwXltPwfd7oI","lore_tm_v1_6aQrVs1K8_i5_Q8RaTXcbQPug5_GPi-WyenK7nPE8RE","lore_tm_v1_nE1EIP489WX8dlnxlBFhBbv7-MoFozdlr0mZa5KYa1A","lore_tm_v1_dDqj14O9MDpAeaV75mJ--g7NeSD-SzgQ9jDgGzRE4GI","lore_tm_v1_vUanDW8-1-PiJyuw6o-jMpUlbZs8bQI5rN_4qBTojM8","lore_tm_v1_J11ZSGrnj65ORozaLHCi43GZiFncZ8TEl5-mzUN_Eto","lore_tm_v1_Hn9Z4LGFDAWqdCcEb4lp6bRbbpRLS6a1GTlQ61VxTdg","lore_tm_v1_Cm_05yJdmG1ifb17XSrYfJlMUtNAJFenphTMueKEwI0"]
Date: Sep 8, 2026
/home/byk/Code/getsentry/publish-workspace-acceptance, with no file edits, formatting, artifact generation, git-mutating commands, or state changes. Requested review of the complete diff against origin/main and relevant surrounding source/tests/workflows; evidence-based severity-ordered findings with exact file:line references; explicit PASS/FAIL for each contract; exact final verdict MERGE or DO-NOT-MERGE; exact blocker if blocked; and only a final audit report.Merge target; exactly one global - [View check runs]( occurrence including embedded and outside-header strings; URL bound to requested getsentry repository, a 40-character lowercase hexadecimal revision, /checks, and optional terminal slash; error/update behavior remains correct.getsentry/craft:latest, fail-closed discovery, and state handling.checkout@v7 request.24.0.0; Yarn classic 1.22.22 is required and npm must not be used; code owned by @getsentry/releng.switch (status) default case throwing new Error(\Unknown status: '${status}'`)`..craft.yml always means checkout-path behavior.[A-Za-z0-9_.-]+; repository identities use the same safe-token rule; neither may be ., .., __proto__, or start with -; Craft preserves exact spelling; versions must be valid Craft semantic versions, with build metadata such as 4.2.6+sentry1 valid.getsentry/ remains optional when parsing existing publish-issue titles.View check runs revision, a root .craft.yml causes craft workspace list to supply exact concrete workspace paths; an exact suffix match is a workspace and any other suffix remains a checkout path; discovery errors with root configuration fail the release.Requested by: @<actor>, Merge target: <branch-or-(default)>, Quick links:, - [View changes](compare-url), and - [View check runs](checks-url); Merge target is required; (default) means the target repository default branch; permitted branch characters are letters, digits, _, ., /, and -.accepted starts CI waiting; publishing starts only when the CI poller adds a fresh ci-ready label to an open accepted issue with neither ci-pending nor ci-failed; dry-run enables dry-run mode.ci-ready..github/workflows/ci-poller.yml, .github/workflows/publish.yml, docs/publish-issue-format.md, scripts/generate-publish-issue-title-parser.js, src/modules/__tests__/publish-workflow.js, src/modules/__tests__/release-revision.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-location.js, and src/publish/resolve-release-revision.js; untracked src/modules/__tests__/generate-publish-issue-title-parser.js, src/publish/__tests__/, and src/publish/discover-location.js.HEAD/origin/feat/workspace-acceptance at a81ab033098f151fbc291b7b0c934901405bb162 (feat: resolve workspace publish paths); origin/main at 83d210b29553ea6f4d97508821724a834c43856e (build(deps): bump js-yaml from 4.3.0 to 4.3.1 (#9174)); preceding branch commits are 52ef600 feat: resolve compact workspace publish requests, b658ffa fix: validate publish workspace JSON, and 33de3f1 feat: accept workspace publish requests.origin/main reports 26 files changed, 2,673 insertions, and 93 deletions; current uncommitted diff reports 12 files changed, 918 insertions, and 67 deletions.src/modules/release-revision.js: getReleaseRevisionDetails({ issueBody, repo }) requires parse(issueBody, { startRule: "CheckRunsLinkCount" }) === 1, otherwise throws Expected exactly one View check runs link in Quick links for getsentry/${repo}.; parses ReleaseRevision, throws contextual expected-link error on parse failure or repository mismatch; getReleaseRevision() returns revision.value; updateReleaseRevision() replaces only the parsed revision range.src/modules/publish-issue-title.peggy: PublishIssueTitle parses publish: , optional getsentry/, safe-token repository, optional slash-separated safe-token path, @, and version token. RequestHeader requires Requested by, blank lines, indented Merge target, blank lines, indented Quick links, blank lines, View changes, then a View check runs URL matching https://github.com/getsentry/<repo>/commit/<40 lowercase hex revision>/checks with optional /; ReleaseRevision starts from RequestHeader; CheckRunsLinkCount globally counts literal - [View check runs]( occurrences.scripts/generate-publish-issue-title-parser.js: grammar source is src/modules/publish-issue-title.peggy; generated parser output is src/modules/publish-issue-title.js; documentation output is docs/publish-issue-format.md; generateDocumentation() requires <!-- BEGIN GENERATED TITLE GRAMMAR --> through <!-- END GENERATED TITLE GRAMMAR --> and throws Could not find the generated title grammar in the documentation. if absent; extracts grammar between // BEGIN TITLE GRAMMAR and // END TITLE GRAMMAR, throwing Could not find the publish issue title grammar. if absent; generates CommonJS Peggy parser with allowed start rules PublishIssueTitle, ReleaseRevision, and CheckRunsLinkCount; --check throws stale-parser or stale-documentation errors, otherwise writes parser and documentation.docs/publish-issue-format.md presents generated title grammar from src/modules/publish-issue-title.peggy, documents canonical examples publish: getsentry/sentry@21.3.1 and publish: getsentry/toolkit/packages/cli@1.2.3, and documents selected target handling: checked - [x] <target-id> entries in ### Targets are read; Craft refresh preserves checked entries; failed-release checkboxes are updated from secure Craft publish-state and checked targets are skipped on retry unless manually unchecked.src/modules/publish-issue-validation.js: isPublishRepository(name) accepts /^[A-Za-z0-9_.-]+$/ excluding ., .., __proto__, and leading -; isReleaseVersion(version) validates semantic-version-like strings with numeric major/minor/patch, optional prerelease, and optional build metadata.src/modules/details-from-context.js: parses issue title with parsePublishIssueTitle; throws contextual invalid-title, invalid-repository, invalid-version, and invalid-path errors; detects dry-run label as "1" else ""; turns parser suffix into path = "." + titleDetails.path; extracts Merge target via /^Merge target: (?<merge_target>[\w.\-/]+)$/m, defaulting merge_target to ""; extracts checked targets from the matched Targets section.src/publish/inputs.js: invokes detailsFromContext({ context: github.context }) and serializes its result with core.setOutput('result', JSON.stringify(result)).src/publish/resolve-release-revision.js: parses process.env.PUBLISH_ARGS || "{}", requires repo or throws Publish input must define a repository., then writes getReleaseRevision({ issueBody: process.env.PUBLISH_ISSUE_BODY || "", repo }) to output revision.src/publish/discover-location.js: getWorkspaceNames() returns [] if <repositoryDirectory>/.craft.yml does not exist; otherwise executes docker run --rm --volume ${path.resolve(repositoryDirectory)}:/github/workspace/__repo__ --workdir /github/workspace/__repo__ getsentry/craft:latest workspace list; invalid JSON or a non-array result throws Craft workspace discovery returned an invalid workspace list.; discoverLocation() resolves input path using discovered names; main() parses PUBLISH_ARGS || "{}", requires input.path, defaults PUBLISH_REPOSITORY_DIRECTORY to __repo__, and JSON-serializes output result.src/modules/publish-location.js: resolvePublishLocation({ path, workspaceNames }) rejects invalid paths and any workspace list whose members fail isWorkspaceName, with Craft workspace discovery returned an invalid workspace list.; returns { path } for root path "."; for non-root paths, returns { path: ".", workspace } only if path.slice(2) exactly appears in workspaceNames; otherwise returns { path }. Safe segments match /^[A-Za-z0-9_.-]+$/ and exclude ., .., __proto__, and leading -.src/publish/resolve-location.js: parses PUBLISH_ARGS || "{}" and CRAFT_WORKSPACE_NAMES || "[]"; rejects a non-array workspace list with Craft workspace discovery returned an invalid workspace list.; JSON-serializes resolvePublishLocation({ path: input.path, workspaceNames }) to output result.src/publish/resolve-ci-poller-input.js writes JSON serialization of getCiPollerInput({ issueBody: process.env.PUBLISH_ISSUE_BODY || "", title: process.env.PUBLISH_TITLE || "", revision: process.env.PUBLISH_REVISION || "" }) directly to stdout.src/modules/ci-poller-input.js: parses/validates title repository, version, and path; obtains current revision via getReleaseRevision({ issueBody, repo }); if a revision argument is supplied, includes issueBody: updateReleaseRevision({ issueBody, repo, revision }); returns repo: getsentry/${repo}, current revision, and version.