Dashboard › craft › Distillation
29816402-3c97-418a-a229-7c0e72780e6d["lore_tm_v1_oN6FybcxXomOVCBODyKt6Xdnd0aCksuoObKGqmQMEzk","lore_tm_v1_7cz_nMBpK8T1I3zK0k0zeBtUIwhdxIUwZAIgGNOaEDQ","lore_tm_v1_eykFOG9KW7SeVvUDnq-98ejpchpoJNGTZHXMUxMOrvY","lore_tm_v1_IdpGMmIZqRKewYLlPOb3Qa9Rw-d5AjShEaCRqI_MYNQ","lore_tm_v1_tW5sQNc8hht1LhOTS_vH06TjPW7Es7VUblCMBbIV9Kc","lore_tm_v1_73SbVOWgCuO08uQ3C3mJ63cPYjxLVMR-rIKbwEo94wo","lore_tm_v1_ICUscdEMa2y5bJ_Yx34oPfu77Rj1TmVmsUhtIjGWB-s","lore_tm_v1_VekBGKnVS6iVHAPM5EMIY1U9Zc1rSrxd9ly2ju3RcsI","lore_tm_v1__okxxjzBNSR6YdzR39YZwsRVAXzuVrOq377_-sQSKfE","lore_tm_v1_7fgDSOvqSqSdJnRfL-6dmRCLGljilIpW67j6L27eQ0Q","lore_tm_v1_hRuPg2ysWMwKziEublUxo-ymK3mEzaDOle724DIs-ws","lore_tm_v1_gwlUu2js6dXzPMflS5CD3FT42b8NCQg2MD4x6LI2o0g","lore_tm_v1_UXLkCg5kTrLYrvgHQ40116cUK2I3E34nSNn6C8AcGRM","lore_tm_v1_DZzx5ZpKbJCuokGwRc-rk7hxS22QTVMAyu0jK95K4BE","lore_tm_v1_N-2qfqNKy-IN_oWLShTorMiJBCwClrAin6J4QQ6sfes","lore_tm_v1_3m5ZTiye0tI8WRzATh-l13IdB0M8AHhipOC644jMWw8","lore_tm_v1_GAKbBr7m36c9Yu9h8Z6hojASCKAz7Yj_rvRszf_8CEs","lore_tm_v1_1qd6I6kusDSyoLlssZ3a7MZizkRBnYY28yJonmmDiNE","lore_tm_v1_hxUxhvaR7sfvEgJ5zgSVAjAsiU8dAPk4T6A5FFGG9mc","lore_tm_v1_d7ArnkP7qkk_QJJADetAzMhyK4eoFz33s-okVLIXYdU","lore_tm_v1_016O_GwNL1NOyV_tk1IinfrgvFl9lMrd-YRdQLKgyxE","lore_tm_v1_WoGxqcjzNTH8swNNymlectvncYpaAdvUF-RrVZ-8yZc","lore_tm_v1_Gb1TK5Br0VCmM5xf5ktw9xXpCNBZxVtNBaa9LK7m2GU","lore_tm_v1_pNvhinWtP7bxcVX_eUbeDwXRFa4f0m7P4cnmmZcFhAg","lore_tm_v1_jkauyX3IJEB8LCSPcorAnAEhUS5At84dHgXMi9IMeoo","lore_tm_v1_RTv7s8xgUR9s8vO0jBa7r1JEFio78YHWA5mEznwGNPQ","lore_tm_v1_TmTXYGBgAJo_2oGUpsgvhQrjEhJlwmPIch7roGSrMxA","lore_tm_v1_lSNUJTldp4K3q3fIYf7iFJIuQMSY8BC9l9gj7QlP5Z8","lore_tm_v1_69r4oL4MEfbwhtqwixVmAIC2_DQKwkJKPV6kTwc9W0k","lore_tm_v1_fdT5A5vvTtDwxc21rqKuGTFUskaCA1grhGJF4Vk-MDY","lore_tm_v1_9ldXqPKrgUamOTk-OLuFWQQmja4XZcez4LSD56RuIT8","lore_tm_v1_MF-O0YZ4vxmAktvWPezYcSboo_1DMw_dA7yf8oT30Q8","lore_tm_v1_ndrNfdtQmpBNptsvVltQ-f1FpDXX0GSSttcE6lxRdFw","lore_tm_v1_sKduXfa7ToSnnM_epYhJOSrFE1bBE6xqa_ZRZFXcgtM","lore_tm_v1_yL02lSlGa1bITz5Ll8wvb-wZffHYPz7SVLcUPtb9uX4","lore_tm_v1_NIlObn_Rmv4zhUl2CplWTjo_pvRPzliD6fTv85bnIes","lore_tm_v1__vNxXiVQwegZZniwGieUSznFK2l0opRwjIKhnoby0zg","lore_tm_v1_frH73zgQZUu77Q8VSeXuCRLF8VmkUQNnmv_j4Ko8r34","lore_tm_v1_6gAyX6clZPYqpjlJBg5jVhMqK5M0z_dU-xp5gXIX7kw","lore_tm_v1_om9b4ycZuUabmPbeN2CkSeGj4by3LJ2-NQoFA5TCB4k","lore_tm_v1_pQpFGuMOhHL8JnwL_SQDotc-99WMmQ6fAAV59S_03N0","lore_tm_v1_51XZoA1Zsb881E7vPQ_-oyjpSF_ePQQl71-1Yix4o1o","lore_tm_v1_pbChQKaN9lUZ0FrsS6Lq3pKVf0Y3ZDAyI56lqt1j-bc","lore_tm_v1_C8E3C5hV7RmOa6njuQHbzmkHtmOOAb3j47LPljLNN18","lore_tm_v1_gAePdNT5xY1yu8gM-m9YRX0KGzXRHEGQAz0cQxfWeGQ","lore_tm_v1_ZRKV8djbnTcKLpqcQKWoZMr94-TbENh7kbJldj-5ql0"]
Date: Aug 29, 2026
../publish-workspace-acceptance/scripts/generate-publish-issue-title-parser.js was updated.node scripts/generate-publish-issue-title-parser.js succeeded under Yarn 1.22.22. Focused Vitest suite src/modules/__tests__/details-from-context.js, publish-location.js, release-revision.js, and publish-workflow.js passed: 4 files, 29 tests, duration 523ms. Vite warned that vitest.config.js:1:1 uses ESM syntax while loaded as CommonJS; recommended .mjs, nearest package.json "type": "module", or VITE_CONFIG_NATIVE_IGNORE_WARNING=true.pnpm-lock.yaml.publish-workspace-acceptance/package.json defines private package publish version 0.0.1, repository git@github.com:getsentry/publish.git, Volta Node 24.0.0 and Yarn 1.22.22; scripts include generate: node scripts/generate-publish-issue-title-parser.js, test: vitest run, lint: eslint src .github --ignore-pattern '!.github', and prettier: prettier --write src; dev dependency peggy: 5.1.0.src/modules/__tests__/publish-workflow.js test harness 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, CRAFT_PUBLISH_WORKSPACE, GITHUB_OUTPUT, and temporary GITHUB_WORKSPACE, then validates the state file. Tests assert: root sentry release 21.3.1 produces .craft-state/craft/publish-state-getsentry-sentry-c232c383e26f-21.3.1.json; monorepo toolkit, path ./cli, workspace cli, version 1.2.3 produces .craft-state/craft/publish-state-getsentry-toolkit-21cf7beaeda4-workspace-Y2xp-1.2.3.json; each state JSON equals { published: { github: true } }.docs/publish-issue-format.md then stated Publish title conventions: prefix publish: ; legacy form publish: getsentry/<repository><optional-path>@<version>; JSON-qualified workspace form publish: getsentry/<repository><optional-path> [workspace: <json-string>] @<version>; examples include publish: getsentry/sentry@21.3.1, publish: getsentry/toolkit/cli@1.2.3, publish: getsentry/toolkit/cli [workspace: "cli/v2"] @1.2.3, and publish: getsentry/toolkit [workspace: "cli [preview] \"next\""] @1.2.3. Existing issue parsing permits omitted getsentry/; repository and path character/path traversal restrictions, version characters, JSON-string semantic constraints, and separator distinction were documented.src/modules/publish-issue-title.peggy defines canonical PublishIssueTitle: publish: , optional getsentry/, Repository, optional slash-separated Path, optional legacy workspace suffix [workspace: <JsonString>], @, and Version, with end-of-input assertion. Repository/path tokens allow [A-Za-z0-9_.-]; version also allows +. JsonString captures quoted content; JSON parse remains authoritative escape validation to retain clear legacy workspace diagnostics. Grammar comments state path suffix is syntactic only and controller resolves a single segment as workspace only after checkout of CI-approved revision.../publish-workspace-acceptance/docs/publish-issue-format.md was updated.yarn.lock with Yarn then verify generated parser, workflow, and full controller suite..eslintrc.js, .git, .github/, .gitignore, AGENTS.md, auto-approve-repos.txt, docs/, LICENSE, node_modules/, package.json, pnpm-lock.yaml, README.md, scripts/, src/, vitest.config.js, and yarn.lock.yarn install with Yarn 1.22.22 succeeded and saved yarn.lock in 28.36s. Parser generation succeeded. Full vitest run passed: 8 files, 42 tests, duration 1.60s.src/modules/publish-issue-title.js had six unused parameters rejected by ESLint no-unused-vars: text at line 228, offset at 232, range at 236, location at 244, expected at 248, and error at 260.src/modules/publish-issue-title.js: no-control-regex at lines 70, 71, 84, 85, 178, and 179; no-useless-escape at 177 and 180; the six no-unused-vars generated parameters at 228/232/236/244/248/260; and no-empty at 307. Yarn exited code 1. Node emitted [DEP0169] warning for url.parse(); Vitest 4.1.0 warned unmet peer dependency vite@^6.0.0 || ^7.0.0 || ^8.0.0-0.// @generated by Peggy 5.1.0. and Peggy-generated peg$SyntaxError internals containing the lint-triggering regexes and helper parameters..eslintrc.js extends eslint:recommended, prettier, and plugin:yml/standard; disables yml/no-empty-mapping-value; sets ecmaVersion: "latest", es6: true, node: true; tests matching **/__tests__/**/*.js use module source type.eslint-disable; handwritten grammar and generator would remain normally linted.../publish-workspace-acceptance/scripts/generate-publish-issue-title-parser.js was updated.eslint src .github --ignore-pattern '!.github' passed in 0.97s. prettier --write src ran over all source files, including the generated parser and unrelated files. Full Vitest passed: 8 files, 42 tests, duration 1.10s..github/workflows/publish.yml, docs/publish-issue-format.md, package.json, src/modules/__tests__/publish-workflow.js, src/modules/details-from-context.js, and yarn.lock; untracked intended scripts/, compact parser/resolver modules/tests, and src/publish/resolve-location.js/resolve-release-revision.js; it also showed broad formatter changes to unrelated tracked source files and untracked pnpm-lock.yaml.Set target repo checkout branch) with Resolve CI-approved release revision invoking node .__publish__/src/publish/resolve-release-revision.js using PUBLISH_ARGS and issue body. Checkout now uses ref: ${{ steps.release-revision.outputs.revision }} and remains repository: getsentry/${{ fromJSON(steps.inputs.outputs.result).repo }}, authenticated via release-bot token with fetch-depth: 0.Resolve publish location after checkout. It calls needsWorkspaceDiscovery(input) from ./.__publish__/src/modules/publish-location, and when discovery is required and __repo__/.craft.yml exists, runs getsentry/craft:2.31.0 workspace list in Docker mounted at /github/workspace/__repo__; passes CRAFT_WORKSPACE_NAMES to node .__publish__/src/publish/resolve-location.js.steps.location.outputs.result supplies CRAFT_PUBLISH_PATH and CRAFT_PUBLISH_WORKSPACE for state setup and final publish. Craft image changed from mutable docker://getsentry/craft:latest to pinned docker://getsentry/craft:2.31.0; final command is cd __repo__/${{ fromJSON(steps.location.outputs.result).path }} && exec craft publish <version> --rev ${{ steps.release-revision.outputs.revision }}. State repository remains CRAFT_PUBLISH_STATE_GITHUB_REPO: getsentry/<input repo> to follow issue checkout identity rather than any workspace release-repository override.publish: , optional getsentry/, repository, optional path, optional legacy-workspace, @, version; root workspace releases use one trailing path segment as a potential workspace key. Craft rejects workspace with non-root checkout path; newly created workspace names must match ^[A-Za-z0-9_.-]+$ and retain exact spelling.View check runs, if checkout has root .craft.yml, craft workspace list gives exact workspace keys; a one-segment suffix matching a key is workspace, otherwise it remains checkout path; names are never normalized; absent root .craft.yml always uses checkout-path behavior; discovery failure with root configuration fails release. JSON-qualified workspace titles remain compatibility-only and are not newly created.details-from-context.js replaced its title regex with parsePublishIssueTitle from ./publish-issue-title; any parse failure raises Invalid publish issue title: '<title>'. It destructures parsed legacy workspace JSON for semantic handling, forms path as "." + parsedTitleDetails.path, rejects .. path segments, and returns parsed title details.package.json added generate script and peggy: 5.1.0; yarn.lock added peggy@5.1.0, @peggyjs/from-mem@3.1.3, commander@14.0.3, semver@7.7.4, and source-map-generator@2.0.6.yarn prettier rewrote unrelated existing source files, planned to remove only this churn, preserve compact controller work, and emit formatted parser directly from generator.src/libs/__tests__/github.js, src/libs/github.js, src/modules/post-workflow-details.js, src/modules/process-end-state.js, src/publish/inputs.js, src/publish/post-result.js, src/publish/post-workflow-details.js, and src/publish/update-issue.js.scripts/generate-publish-issue-title-parser.js and the eight formatter-churn files while restoring formatting changes..github/workflows/publish.yml, docs/publish-issue-format.md, package.json, src/modules/__tests__/publish-workflow.js, src/modules/details-from-context.js, src/modules/post-workflow-details.js, src/publish/inputs.js, and yarn.lock; the latter two module/publish files only differed by final newline additions.craft publish --rev.src/modules/__tests__/publish-workflow.js was updated.2.31.0 image exists yet. It would verify Craft --rev fallback and final cross-repository diff so controller can be staged behind required release without mutable-image fallback.