Dashboard › craft › Distillation
8564a248-378e-451b-942f-505d64b16da7["lore_tm_v1_eE3hAr1nnFoElVD-Ke_riweoycxHDqmURhbGv8pXKuk","lore_tm_v1_SNAfxA0M0988q0w1bPZsqIwZEIToPlWjBC4M9Mu7Yjk","lore_tm_v1_d0tbPkwrGlaEBHG5e3U64PDCg6283S9VTGdIgKoh7KI","lore_tm_v1_i-H6OcpeuyF3wlqRB_1RGOUwZcaetwY8Kkl0Ee_Ocuc","lore_tm_v1_KrC8TJtN-zp8zdLsgmNdam_GYtEeFVM2T0NGB94QD3I","lore_tm_v1_-F_wr39IRTFos87TP6t7Nkn3Xy_r9CvTDI_dccIapXc","lore_tm_v1_-BzPPiPEK52yiUMAyv0KtKeRcFi6h-9gJOcqjEmAqQM","lore_tm_v1_a-JOHcPxZgCTRcMLV44x7X10hK6atrHxCmom9EerTLI","lore_tm_v1_pOmuslJdBTexQwSyVLoR1LhtRQxwhd9Jw2i6w75ld9Y","lore_tm_v1_QmM9QpCb2kgSZS8cMFLZrpQ7PPpZrLA6jab2DxjCfmk","lore_tm_v1_Tp9-QxAjljpgCxJibioBtoarq64CXIQypuzPKR2mcVs","lore_tm_v1_iYnuYUxs8a3qUcoOCuOwxIBS7BCa8YCVHC0xY5d6oyU","lore_tm_v1_kcHVmtD-ZOHbCe32PdADywAPoEOOQNWy-EkqTKG1j-o","lore_tm_v1_gC5Fk3xobGADU_QJNnAWnyLT776aSpBhsAd-mKKU33Q","lore_tm_v1_aa0hYyxOtkf2UxWhPCm7V0GjRybKWho2PYjZu6Yk_rQ","lore_tm_v1_rxaBJRtX82xRH5xEwmFde9LztM4Eez81jInsrRlnva4","lore_tm_v1_DxUT0nBuEi3Mrt_Z05tFUwC5fq8jaaeaDNU75EyBaBg","lore_tm_v1_RkxZaQ55eGNlZVFHXEA5ucniqnLY-6RcLvQvmGuzMng","lore_tm_v1_N8IU-iayR6OwDnsFPPq3vO8CVo5f0X-IF2BFrwEbyEU","lore_tm_v1_qTQFx3Pa6WHWiJus4G5qPeUojnC0CGPFRSRIN_QpfDs","lore_tm_v1_fnRzKUaTsd2733eG5HrDnm_O3MAK5fgLdsiX7Y-Bam8","lore_tm_v1_0cO3Cii94eVeSiC2DIlTEHiEjpxz-ptDl7TPAEjHFro","lore_tm_v1_q-gR-D0hlETSmGzVK05X-OQhp3zA-ZO6Bg4XNBABt3o","lore_tm_v1_a4uAEkXepDGJsQIkY8vj-dphSQQbjango7kLzrP_aFE","lore_tm_v1_pazMNirhmYQj7-2Gg4PQvXxz9-DF5-LJar1QPxFhVTg","lore_tm_v1_H2B6DX0Hfd-OjfO1S2lfKpymPglm-Mso20yjb1tfKMY","lore_tm_v1_31vEUPl3yAY65ssrDf_UoaxIYq_AqOA19MiHW3Rm23I","lore_tm_v1_CIdtTk5A11kFAnipcSQqcQ8YhcrUcaHT-C_vBPt6jis","lore_tm_v1_-6Ja3-xLsXbmgE1e2ebHOhR9pnPszW-pWFbZqOCWP3w","lore_tm_v1_rYMphPIUy3ibYgOrdGq8jJcnGUAH4d3nlAqxmyXDOnY","lore_tm_v1_TQmXq1CJ05Eu3Mgn7nduZR7NHGwQX2_1ZsuPgSmym8Q","lore_tm_v1_NcABvGNQYhZ-XOmoCwEz8sFbxaS18CJLXLydL1zNhcc","lore_tm_v1_C99ZO-1V1iPIvj1gS0RPROu7fBlqfEkfQi_zwEAGUzM","lore_tm_v1_p_-cngq5aShAZ1Yc7sjKRPIJTDGpxlMy-zC2NhV0nA4","lore_tm_v1_KHZwD25CGF140B79NYkXdWJuEQC4T0RZP_83nnFiiwk","lore_tm_v1_rjY57W4I8MS6Y2FCH52MVanECaEGEnF31AevwdWXCBU","lore_tm_v1_IlKKEdGvDTH5AY5NlZRpzYTJYZjNTtfhGlBj1OgJYUQ","lore_tm_v1_54U3BWD8B2YsplWIj8BZJKeCkh0V4umYfC7jTCr5Peg","lore_tm_v1_D9akYqPICOqMDzxc2fxDFny0szZEMlSgPfjvyEzJmxI","lore_tm_v1_r6z_nXH1kgrQKmiGOo9Sb0UtLHn8XWqPkgCDajA_pd8","lore_tm_v1_CxfNL1TgbjiWW9SvNLMkwWP_M3WjDPDHZi3JriVJZQo","lore_tm_v1_wNqyHJ1w-XFazwgiGdgGliGAOkubJVOWtJod9o66dlg","lore_tm_v1_Q1BlAJfAhpQXHY-4OLApjcakodtlhMhtkuY0BcrdLnA"]
Date: Aug 29, 2026
.github/workflows/publish.yml updated in /home/byk/Code/getsentry/publish-workspace-acceptance.craft publish --rev; planned to verify resolver contracts and pinned-image availability before adding workflow coverage.src/modules/publish-location.js in publish-workspace-acceptance defines resolvePublishLocation({ path, workspace, workspaceNames }): explicit workspace immediately returns { path, workspace }; otherwise all discovered names must satisfy isWorkspaceName, or it throws Error("Craft workspace discovery returned an invalid workspace list."); an exact single ./<segment> path matching a discovered workspace returns { path: ".", workspace: <segment> }; all other paths return { path }.isWorkspaceName(name) accepts only string names other than __proto__ matching /^[A-Za-z0-9_.-]+$/.src/publish/resolve-location.js parses PUBLISH_ARGS and CRAFT_WORKSPACE_NAMES (default "[]"), rejects a non-array workspace discovery result with Error("Craft workspace discovery returned an invalid workspace list."), and writes resolvePublishLocation({ path: input.path, workspace: input.workspace, workspaceNames }) to the result GitHub Actions output.src/modules/release-revision.js defines CHECK_RUNS_LINK matching a Markdown line - [View check runs](https://github.com/getsentry/<repo>/commit/<40-lowercase-hex-SHA>/checks/), with optional trailing slash after checks. getReleaseRevision({ issueBody, repo }) requires the matched repository to equal repo; otherwise it throws Expected a View check runs link for getsentry/${repo} in the publish issue body.; it returns the matched 40-character revision.src/publish/resolve-release-revision.js parses repo from PUBLISH_ARGS, calls getReleaseRevision({ issueBody: process.env.PUBLISH_ISSUE_BODY || "", repo }), and writes the result to GitHub Actions output revision.workspace from trailing one-segment paths classified only against exact discovered workspace keys; planned coverage for CI revision link and resolver boundary.src/modules/__tests__/release-revision.js uses REVISION="7e5ca7ed5581552de066e2a8bc295b8306be38ac" and tests: (1) extracts that revision from getsentry/toolkit check-runs link; (2) rejects getsentry/other link when repo="toolkit"; (3) rejects missing check-runs link. Rejections expect an error beginning Expected a View check runs link for getsentry/toolkit./home/byk/Code/getsentry/publish-workspace-acceptance/src/modules/__tests__/publish-location.js.src/modules/__tests__/publish-location.js tests: (1) exact case-sensitive discovered key CLI converts ./CLI to { path: ".", workspace: "CLI" } with discovery ["cli", "CLI"]; (2) ./packages remains checkout path when only cli is a workspace; (3) multi-segment ./packages/cli remains checkout path even when cli is discovered; (4) legacy explicit workspace cli/v2 is preserved for root path; (5) discovery value cli-日本語 is rejected with invalid-workspace-list error.workspace list, and proposed 2.31.0 did not exist. Chosen approach: finish/test controller contract without falling back to latest; deployment requires Craft to ship the command. Rejected alternative: mutable latest image.scripts/generate-publish-issue-title-parser.js reads src/modules/publish-issue-title.peggy, generates a CommonJS parser using peggy.generate() with grammarSource: "publish-issue-title.peggy", and writes src/modules/publish-issue-title.js.publish-workspace-acceptance/.github/workflows/publish.yml, src/modules/__tests__/release-revision.js, and src/modules/__tests__/publish-location.js.workspace list; it identified 2.31.0 as the required immutable tag, planned deterministic controller coverage/documentation and validation without mutable-image fallback.src/modules/publish-issue-title.peggy canonical grammar parses publish: , optional getsentry/, ASCII repository [A-Za-z0-9_.-]+, optional slash-separated path segments with the same grammar, optional legacy [workspace: <JSON-string>] qualifier, and version [A-Za-z0-9_.+-]+; it returns { repo, path: path || "", version, ...(workspace ? { workspace } : {}) }. Grammar comment specifies path suffix is syntactic only and controller resolves a single segment as workspace after checking out the CI-approved revision.LegacyWorkspace grammar requires literal [workspace:, a valid JSON string, then ] ; JSON characters reject unescaped controls \u0000-\u001F and permit supported JSON escapes including \u plus four hex digits.src/modules/__tests__/publish-workflow.js extracts the Set targets shell script from .github/workflows/publish.yml using a regex ending at docker://getsentry/craft:latest; runs it with bash -e -c, CRAFT_PUBLISH_TARGETS_JSON='["github"]', and temporary GITHUB_WORKSPACE/GITHUB_OUTPUT; reads the emitted state_file and its content..craft-state/craft/publish-state-getsentry-sentry-c232c383e26f-21.3.1.json for path=".", repo sentry, version 21.3.1; expect workspace filename .craft-state/craft/publish-state-getsentry-toolkit-21cf7beaeda4-workspace-Y2xp-1.2.3.json for path="./cli", repo toolkit, workspace cli, version 1.2.3; both expect {"published":{"github":true}}.2.31.0 made workflow non-deployable; planned controller validation and staged-rollout documentation while keeping checkout/compact-resolution changes testable without mutable fallback.publish.yml workflow: waiting-for-ci runs for open issues labeled accepted with titles beginning publish: ; it obtains an app token, removes ci-failed and ci-ready, adds ci-pending, comments approval/retry text, best-effort sets CI_POLLER_HAS_PENDING=true with a dedicated poller app token, and runs gh workflow run ci-poller.yml.publish job runs only for open issues whose triggering label is ci-ready, which retain accepted and ci-ready and lack ci-pending/ci-failed; it has timeout-minutes: 90, checks out controller contents to .__publish__, installs Node 24/Yarn dependencies, parses inputs, conditionally posts start details, and resolves CI-approved release revision using PUBLISH_ARGS and issue body.--rev checkout contract because controller passes a detached CI-approved SHA; Craft must accept a SHA that Git cannot map to a branch name.src/commands/__tests__/publish.test.ts:241 sets mockGit.revparse = makeChainable('main').src/commands/__tests__/publish.test.ts handleReleaseBranch mock constructs chainable SimpleGit methods including checkout, pull, merge, push, branch, remote, revparse, raw, status, and diff; existing tests verify default --no-ff --no-edit merge, fallback -s resolve after conflict (including when merge --abort fails), and conflict reporting.--rev uses git name-rev --no-undefined, which can reject a valid detached CI SHA before fallback processing. Planned fix: narrow checkout-path change plus regression so controller’s pinned revision works.src/commands/__tests__/publish.test.ts includes state-identity tests: getPublishStateGitHubConfig(resolvedWorkspaceGithub, "getsentry/toolkit") must return { owner: "getsentry", repo: "toolkit" } even when workspace config resolves { owner: "release-owner", repo: "release-repo", projectPath: "packages/cli" }; state filename then uses checkout repo identity. Without controller state identity, resolved GitHub config is retained. Malformed identity getsentry/toolkit/extra is rejected.action.yml, docs/src/content/docs/targets/github.md, src/__tests__/action.test.ts, src/__tests__/config.test.ts, src/config.ts, src/index.ts, and src/schemas/project_config.ts; untracked src/commands/workspace.ts and src/commands/workspace_cmds/.name-rev finds no ref, while retaining branch-name checkout when Git resolves one; planned focused regression.publish-workspace-acceptance/package.json: package publish version 0.0.1, Volta Node 24.0.0/Yarn 1.22.22; scripts generate, test (vitest run), test:watch, lint, and prettier; dev dependency peggy: 5.1.0; dependencies include @actions/core:^2.0.0, @actions/github:^7.0.0, and @sentry/node:^10.0.0.craft-workspace-action-propagation/src/commands/publish.ts and src/commands/__tests__/publish.test.ts.ghcr.io/...:2.31.0 is absent; Craft image workflow publishes commit-SHA and latest tags rather than semver. Assistant planned to check declared Craft release version before pinning controller invocations to corresponding immutable Docker Hub release tag.craft-workspace-action-propagation/package.json declares @sentry/craft version 2.31.0-dev.0, with CLI bins craft and sentry-craft both at dist/craft.2.31.0-dev.0 that workspace list has not shipped and first release containing it will be 2.31.0; planned direct Docker Hub semver-tag check because GHCR emits only commit/mutable tags.2.31.0-dev.0 confirms command is unshipped; planned to keep controller PR blocked on Craft merge/release if immutable Docker Hub 2.31.0 tag is absent.no such manifest: docker.io/getsentry/craft:2.31.0.2.31.0 release image is absent from both registries. Decision: replace invalid GHCR reference with intended immutable Docker Hub release tag and document deployment prerequisite; rejected mutable latest fallback.publish-workspace-acceptance/.github/workflows/publish.yml updated.docs/publish-issue-format.md documents title formats: legacy publish: getsentry/<repository><optional-path>@<version> and workspace publish: getsentry/<repository><optional-path> [workspace: <json-string>] @<version>. Examples: publish: getsentry/sentry@21.3.1; publish: getsentry/toolkit/cli@1.2.3; publish: getsentry/toolkit/cli [workspace: "cli/v2"] @1.2.3; publish: getsentry/toolkit [workspace: "cli [preview] \"next\""] @1.2.3.getsentry/ remains optional when parsing existing issues; new Craft requests include checkout repository identity. Repository names permit ASCII letters/digits/., _, -; optional paths permit letters/digits/_, ., /, - and disallow .. segments; versions permit letters/digits/_, ., +, -.Cc, Cf, Zl, or Zp; JSON escaping makes printable brackets/quotes unambiguous. Legacy forms have no space before @; workspace forms have a space after ] before @.Requested by, optional Merge target, Quick links including View changes and View check runs, accepted approval label, and ### Targets checkbox list. Checked targets are skipped and preserved on refresh; secure Craft publish-state updates checkboxes after failed releases; unchecking retries a target. (default) means target repo’s default branch.