Dashboard › craft › Distillation
900aac26-b2e7-4d2c-b956-2937a38f06de["lore_tm_v1_xGcMxCoIP2eM3iGj8lBQUzDtVHOdd0V1HHPVbcRw3FM","lore_tm_v1_J5T4aVkwscO-sn6IkCnfy7ZCc2bH-t3HjpYOqOa1iUE","lore_tm_v1_k1TcD6i_HHAc-XA9dgZsQs5-S4nAdkYWYIb6ZRuYOs4","lore_tm_v1_ag93VLzG24Mqza-TA7K43FckFYC6KwHVC2625EARgjk","lore_tm_v1_JPqa0ijSadlbCTNdoCaKh1kwAFbXJQv2O3oSsyW2V8M","lore_tm_v1_2-51fjLB--X5vaTsQwvLo5UpTRQbQGH_NlU__1duNww","lore_tm_v1_4uUMnSz-LLhWYfUrjqdTkGbIaoJr5_E08uG973iuu3c","lore_tm_v1_Ox2cAhTmbBdmiNcugLbKaWIGjocbGM6PMccem7yrWfo","lore_tm_v1_DVoAWM8w9-Fi0dDhcX2DJ4Em_5f0BFjsTjfmqVDbdjg","lore_tm_v1_44nvhKNYojVQtO9shswkAj9gZVpwFf97b0inKQ8LZ9w","lore_tm_v1_KgXTqDIWLKaGOO1x3KCSeJfiuUOvBGbUUOqbUpMxO7A","lore_tm_v1_Am3Ln404g7yXy9kDMT3ShBwZH8ONmFAt7-dUzZuR_zc","lore_tm_v1_BmvczXW475-r_Lodj_K7o58ga0oMOx-E6zA526OI-4I","lore_tm_v1_E5z-FB_bbYkX3p15Qs4yK3TwnPEHzx_AyxZ1iAI--x4","lore_tm_v1_m--voV_lSjVok2uGMXpo4bEu0ncdQgHOgdysrNOEsAw","lore_tm_v1_yqvXS9_h2a3gkjNtL4kEMqjKg2v1JVUpbaE7XPCTmz4","lore_tm_v1_4MIis2rS-3_-UvhrIeK9oMB9OgIOf4q07asHEQdkcW8","lore_tm_v1_PExjfy3tlb99183AILwyjDYIQ6H5wPFMhVHW9qnZqzw"]
Date: Aug 28, 2026
../publish-workspace-acceptance: modified src/modules/details-from-context.js and package.json; added scripts/generate-publish-issue-title-parser.js.src/modules/publish-issue-title.peggy defines the canonical PublishIssueTitle grammar: publish: , optional getsentry/, Repository, optional syntactic Path, optional legacy [workspace: <JsonString>], @, and Version, with end-of-input required.{ repo, path: path || "", version, ...(workspace ? { workspace } : {}) }; comments specify that a path suffix is syntactic only and the controller resolves a single segment as a workspace after checkout of the CI-approved revision.[A-Za-z0-9_.-], version characters to [A-Za-z0-9_.+-], and legacy workspace JSON strings to valid JSON quoting/escapes with no unescaped U+0000–U+001F characters.src/modules/publish-issue-title.js is generated by Peggy 5.1.0, has 861 lines, and exports StartRules: ["PublishIssueTitle"], SyntaxError: peg$SyntaxError, and parse: peg$parse.craft publish.src/modules/__tests__/details-from-context.js baseline fixture parses issue 223, title publish: getsentry/sentry@21.3.1, a body with merge target custom-branch, check-runs SHA 7e5ca7ed5581552de066e2a8bc295b8306be38ac, and checked targets github, npm[@sentry/node], docker[latest]; expected details are dry_run: "", merge_target: "custom-branch", path: ".", repo: "sentry", and version: "21.3.1".details-from-context tests cover versions containing + (4.2.6+sentry1); (default) merge targets producing merge_target: ""; legacy human-readable workspace title publish: getsentry/toolkit [workspace: "cli/v2"] @1.2.3; and escaped workspace cli [preview] "next".details-from-context tests accept safe Unicode workspace cli-日本語; reject a legacy workspace title with unexpected space before version (publish: getsentry/toolkit @1.2.3); reject invalid JSON escape \q with Invalid publish workspace JSON in title; reject empty, newline, NUL, tab, bidi U+202E, line-separator U+2028, and paragraph-separator U+2029 workspace names with Workspace names must be nonempty and cannot contain Unicode control, format, or separator characters.details-from-context tests reject checkout-escaping title path publish: getsentry/toolkit/../other@1.2.3 with Invalid publish issue path, and missing issue payload with Issue context is not defined..craft.yml is treated as a path-only checkout; workspace-discovery failure when a root config exists fails closed. Assistant stated intent to update the workflow and executable tests for this boundary.src/modules/__tests__/publish-workflow.js extracts the Set targets bash script from .github/workflows/publish.yml between the Set targets step and uses: docker://getsentry/craft:latest, then executes it with bash -e -c.publish-workflow test helper supplies CRAFT_PUBLISH_PATH, CRAFT_PUBLISH_REPO, CRAFT_PUBLISH_TARGETS_JSON='["github"]', CRAFT_PUBLISH_VERSION, optional CRAFT_PUBLISH_WORKSPACE, GITHUB_OUTPUT, and GITHUB_WORKSPACE; it requires a zero exit status and reads generated state JSON from the state_file output.publish-workflow tests expect root release (path: ".", repo: "sentry", version: "21.3.1") state filename .craft-state/craft/publish-state-getsentry-sentry-c232c383e26f-21.3.1.json; expected content is {"published":{"github":true}}.publish-workflow tests expect monorepo release (path: "./cli", repo: "toolkit", version: "1.2.3", workspace: "cli") state filename .craft-state/craft/publish-state-getsentry-toolkit-21cf7beaeda4-workspace-Y2xp-1.2.3.json; expected content is {"published":{"github":true}}.craft-workspace-action-propagation/Dockerfile builds with node:24.18.0-bookworm-slim, installs pnpm based on package.json Volta config using npm install -g pnpm@$(node -p "require('./package.json').volta.pnpm"), runs pnpm install --frozen-lockfile --quiet, and builds with pnpm build.node:24.18.0-bookworm; installs release tooling including git, jq, python3-packaging, python3-venv, ruby-full, maven, .NET SDK 9.0 and 8.0, Docker CLI/buildx, Erlang, Elixir, Rust minimal profile, cargo-hack, CocoaPods 1.16.2, Flutter 3.22.0, PowerShell 7.4.1, twine==6.1.0, pkginfo==1.12.1.2, and Wrangler 4.111.0.1.17.0, configures git config --global --add safe.directory '*', copies /usr/local/lib/dist/craft to /usr/local/bin/craft, sets CRAFT_BUILD_SHA=$SOURCE_COMMIT, and uses ENTRYPOINT ["craft"].ci-ready, rather than a branch fallback.craft-workspace-action-propagation/.craft.yml has minVersion: '2.14.0', automatic changelog policy, GitHub artifact provider requiring Build & Test artifacts craft-binary and craft-docs, plus pre/post release commands that change version with npm and commit/rebase/push the next development preminor version.npm; gcs bucket sentry-sdk-assets with /craft/{{version}}/ cache-control public, max-age=2592000 and /craft/latest/ cache-control public, max-age=300; registry app app:craft at https://downloads.sentry-cdn.com/craft/{{version}}/{{file}} with sha256 hex checksums; Docker targets release and latest; GitHub floating tag v{major}; and gh-pages.peg$parse at line 157; parsing routines peg$parsePublishIssueTitle, peg$parseRepository, peg$parseRepositoryCharacter, peg$parsePath, peg$parsePathSegment, peg$parseLegacyWorkspace, peg$parseJsonString, peg$parseJsonCharacter, peg$parseHexDigit, and peg$parseVersion; module export at line 857.src/commands/workspace_cmds/list.ts exports command ['list'], description List defined release workspaces as a JSON array, and handler() which prints formatJson(getWorkspaceNames()).craft-workspace-action-propagation/src/utils/strings.ts stores mustache.Context.prototype.lookup in originalLookup; renderTemplateSafe(template, context) sanitizes context, temporarily overrides lookup to collect unknown variable names, throws ConfigurationError("Unknown template variable(s): ${unknownList}. Available variables: ${availableVars}") when any are absent, and restores mustache.Context.prototype.lookup = originalLookup in a finally block.sanitizeObject(obj) throws Cannot normalize value: ${obj} for non-object/null inputs; recursively preserves booleans, strings, numbers, undefined, objects, converts null to undefined, drops other types, and duplicates dot-containing keys with dots replaced by __.View check runs link and that it would remove mutable default/allowlisted branch checkout behavior rather than retain a competing source of truth.Date: Aug 29, 2026
../publish-workspace-acceptance/src/modules/release-revision.js, src/publish/resolve-release-revision.js, and src/modules/__tests__/release-revision.js; modified src/modules/publish-location.js, src/publish/resolve-location.js, and src/modules/__tests__/publish-location.js.