Dashboard › craft › Distillation
7e285c81-dc77-44db-8902-a6128615aaad["lore_tm_v1_oSq80dTjqnsCBIhOI6_r2RcKopAHjZXOfRYF7d6vYlo","lore_tm_v1_iYWWH9RKihgwkcua7cFy7i2lNrrIg9nqpMRvEoJ_IqI","lore_tm_v1_XT3MF8LA4HxwdFi6B5CHpRSB4dLTizGGpaQAerpLIP8","lore_tm_v1_GmHaOqD2eOSEyyavTyy1jYflgYA2yp2jWt8hxnWWxBs","lore_tm_v1_hXTDJoIuYlOdPmJ_tgtqjKcwLPj9ZGcUFiT1Ktfoz9I","lore_tm_v1_XjXl6fmRWvyFdsRvf7e4Icnq8VKHUYA0ZfUteazuLvI","lore_tm_v1_9Y-eksh9d8-l9jhm6ilJH4kFBK7FJVlBIC-dddHcmis","lore_tm_v1_hH5tqUn2nO88JivE0cv6olEDtAzMFbpdH71zzmSfGqQ","lore_tm_v1_Q5U1tm8F9Mo7rZxo2_825qlzCBnLyOKz93PVAdxcgyE","lore_tm_v1_DZ9JDLsZObCPpqv2zzLiht64COQi6Zjlsl5bD_nnFAc","lore_tm_v1_NV6Hdvv-eFnhlYOtSMTELsFdMQXjxABaM16I3Ehn7gk","lore_tm_v1_SePCJKWX0XRr0N3vJaKZEfZhpkZufkPg1lOdxJ1jRGE","lore_tm_v1_8bTX5hgyL70yvVpqvrydMheQB5ZPejcWG5-OruTMFQI","lore_tm_v1_9sqO2MBd9ezZhc9a7w1d1htfFgk-9NkP9ukQCz9_m4A","lore_tm_v1_v_2RLanBk8EclIDGjSWfVda2Kn_EOP1a1jm6lmpm5KQ","lore_tm_v1_n_k3xQcrA7KWJAF8vJ1RzRMP1cejrAbiJ7cGAWStVao","lore_tm_v1_meOC1MhzDHwf7gerpPXtcimWQvoQZLQmf4Ibia-EM-Y","lore_tm_v1_N16hfvSxKWk-lVPhYImKiEho5oOZu3CfzfCcKHIQ7Ss","lore_tm_v1_NJ_86YaMGQB85BXEDUHBsrAYLQaKFUDNASp_XY6g8E8","lore_tm_v1_DColj6qCL61TlFqj6MNz4qcZfgT2pXhpXhNxxuleUOA","lore_tm_v1_qwkiDgwzZnFozj8kuO9wd5QervtHyERZTjV9RT76IQk","lore_tm_v1_9_GeiW41QtZL-ENVU-o9eeBig7_C8WD3Boyg8AXJACA","lore_tm_v1_3VolfSkB43ir6nrXUDtFsbiQ50YLzCVQ8du1witX2X4","lore_tm_v1_jl_G17xgcGHFgPCL55DW5aKi212jlfunGXslhbLTEd4","lore_tm_v1_8EsKhGWfpuWE2u15RZlCMHvzqPNwJV3o8JJfCI2TsKo","lore_tm_v1_sweykDVwBvMx9kGvnb2IBbS-xzdjypiySLvExoRRFFM","lore_tm_v1_xEwJNHUDrqA3AhWwLWTnf28Y0hFEo1a1zqm0AqbEAzo","lore_tm_v1_-MRZYwvdX27gKRIPGOKO0bbxeQn0ZhNG_rydpQdGXmc","lore_tm_v1_u2-xXiIoXv1Lx9Fg8keqIA7Gw3qFOXHvp1_GidOF_NU","lore_tm_v1_Zr7X8VSET0-N2e7M-6CJ7Dn7iNyDMiAQ6h_8fcMg2L0","lore_tm_v1_5LfxyboJ51y2l3_hIV2SHVJA6xFh9WYxRKcT54RelRQ","lore_tm_v1_qieY7BGMWFiQ3t-74Rw_MZEawsRiu-64EITHanwGFJw","lore_tm_v1_H2VFWT5RRojIThE3WPrisi2IVPk8bZed3iB5oN6RbKU","lore_tm_v1_BGy5nFDTie2YGUvlyD8C7WQSdVeD2yPU2nb_9klbo6I","lore_tm_v1_x5v7M6eycN-ehWJoXyGJJS227VdkGEJTBEvww16lVCo","lore_tm_v1_hPmicYxcUkFvA6yl_eCvgm_HB1PtzFTF8wySBg7cBjM","lore_tm_v1_5DgnceAJ_2gRPlOh8pRl1z3oGAz3BBsM6L_UMacUlGQ","lore_tm_v1_kZ88tsD8cz_1OkVupOSStoZzMQUrFDnxvBLIHSRMess","lore_tm_v1_MD1ZkY0csQ5KhuivR-q1uzlKelZETWv_RjePaKlmkSM","lore_tm_v1_UjgIKLaUhLA0sPFKwqsmvUVfbi0WzvdRWKXAPzoG85U","lore_tm_v1_JHQ9uzX1w3lVA9B7jkPyTC3tIKkOdtVVkznYn2yaz00","lore_tm_v1_Dqngj4VaQSlzMgeQgeJ4CSBfBlsw8GmHn21zzbgjhpU","lore_tm_v1_iI2tngpPm2XyFGF_mwSwkOF8CfDtzO1gh3lsyXO-RN0","lore_tm_v1_Ep81h0oiPjzPV4oWww0WeAsQPWFrGqGnUiXH8CU87A4","lore_tm_v1_M2q9cDAtvqo0SoOh9CKHMBbMa13dI5MQA12Pu7FNj48","lore_tm_v1_v3kQy1HVlgEM26GwHxRkwg3bhXjYCzAPgM8rzW71UgQ","lore_tm_v1_MYSap3QLbI8V0vzK7_wmIOg-DrbNOxXjyQ7IsqJRPlE","lore_tm_v1_cvAihN-rx9EIGWolsyYZmHZiYLsJ2imm74sQHgxBleA","lore_tm_v1_mhgFXMCHsSWNyvcyEbBEvl8lKptszD5h0bIJIznXvc0","lore_tm_v1_Qq6oV7vH91jr0wInXhdAPUMBF7ZEA5z3-iKhr2yVtSw","lore_tm_v1_-fnzRTLOKunH8lXr8ZMibgAH6wRf7v7ETfGBWBUUJCo","lore_tm_v1_XvHBz29j8ad9sIY2QJqxvLPbRbJLwREgXWJvtVzcFUY","lore_tm_v1_u9E_aXnwhgrrq4cRQa-AJPZuja3bfBGh-c72HEZpiNA","lore_tm_v1_CCV5XyJXO4dRegRGrZDW-zVwE0opz_Sn0UDqzIWPFWI","lore_tm_v1_70qN_e1to-5ECZK-MQW3hgHT_W_VjFWItw_3Mwwk4mU","lore_tm_v1_QFo2ubTxPoLyqvY_DiKSa5TKjoRi-xOpz105R4NIycQ","lore_tm_v1_IHUs3oblL2y7a29-AKOaBXE6rRScZqFDznW5R3KrgXs","lore_tm_v1_3IXIwhCxM7dgvH8PJpLshxs1Sk9i3rETq6iGzi3Rb-s","lore_tm_v1_sCuCMqvJxfhdcIDY90b0lKnJqCguaAt4pNxvwtttgfs","lore_tm_v1_bcOp4rhEyV000p-NVrgG-ObuCC0U47IRilTx8lUaLQ8","lore_tm_v1_9eQSk51_qrBpdbQu_v0WjxvmVqqGWTTmyJKzQAblpU0","lore_tm_v1_x3s_Hyl44SFIQzv0HEE3cx-WIdCY_wv6d8z3NVWNjZw","lore_tm_v1_A-b33ISBzsoigHVfElJI__XpEYs_1EzD-lZAek5JnDk"]
Date: Sep 2, 2026
.github/workflows/ci-poller.yml could not support controller-accepted legacy publish titles. Planned fix: make the poller use the same title parser, add regressions, and remove an untracked pnpm lockfile..github/workflows/ci-poller.yml must always allow workflow_dispatch for manual recovery. check-ci runs when vars.CI_POLLER_HAS_PENDING == 'true' || github.event_name == 'workflow_dispatch'; schedule is every 5 minutes ("*/5 * * * *"), and manual dispatch has optional attempt input defaulting to "0".actions/create-github-app-token@v3 twice: steps.token with SENTRY_INTERNAL_APP_ID / SENTRY_INTERNAL_APP_PRIVATE_KEY for local label changes, and steps.release-token with SENTRY_RELEASE_BOT_CLIENT_ID / SENTRY_RELEASE_BOT_PRIVATE_KEY, owner: getsentry, for cross-repository API calls. It selects up to 200 open issues with both ci-pending and accepted labels.src/modules/release-revision.js originally used CHECK_RUNS_LINK to match a View check runs URL for getsentry/<repo>/commit/<40-lowercase-hex revision>/checks, and getReleaseRevision({ issueBody, repo }) required the matched repository to equal repo.src/modules/__tests__/release-revision.js, publish-location.js, publish-workflow.js, update-issue.js, process-end-state.js, post-workflow-details.js, details-from-context.js; and src/libs/__tests__/github.js.getReleaseRevision() accepted a decoy View check runs link outside the Quick links section. Planned fail-closed canonical-link extraction in both controller paths, alongside the CI-poller title-parser fix.WorkspaceNameSchema in src/schemas/project_config.ts permitted only ^[A-Za-z0-9_.-]+$ and explicitly rejected __proto__ because assigning that key to a regular object mutates its prototype. CraftProjectConfigSchema allows optional workspaces: z.record(WorkspaceNameSchema, WorkspaceSchema) and rejects top-level github.projectPath when workspaces exist.src/publish/inputs.js calls detailsFromContext({ context: github.context }) and sets GitHub Action output result.action.yml validates that inputs.workspace cannot be combined with inputs.path other than "."; it originally checked workspace names with ^[A-Za-z0-9_.-]+$ and emitted “Workspace names must use only ASCII letters, digits, periods, underscores, and hyphens.”Quick links revision helper; make .github/workflows/ci-poller.yml consume the resolver’s JSON output; reject . and .. at both Craft entry points; and update the publish-workflow state test to use real compact resolution.src/modules/__tests__/publish-location.js failed because expected test test("rejects invalid discovered workspace names", () => { was not present.src/modules/__tests__/publish-location.js behavior included: discovery required for { path: "./cli" } but not "./packages/cli", ".", or explicit workspace; exact one-segment workspace "CLI" resolves to { path: ".", workspace: "CLI" } without normalization; nonworkspace and multi-segment suffixes remain checkout paths; legacy explicit "cli/v2" is preserved and does not validate discovery; workspace plus non-root path throws “A publish workspace must use the repository root path.”; discovered "cli-日本語" throws “Craft workspace discovery returned an invalid workspace list”.craft-workspace-action-propagation/src/schemas/project_config.ts, action.yml, src/__tests__/config.test.ts, src/__tests__/action.test.ts; and publish-workspace-acceptance/src/modules/publish-location.js, src/modules/__tests__/publish-location.js.src/modules/release-revision.js failed because the file had already changed. Current implementation used global CHECK_RUNS_LINK, QUICK_LINKS, issueBody.matchAll(CHECK_RUNS_LINK), and required exactly one matching check-runs link whose matched text occurs in the captured Quick-links block; otherwise it throws “Expected exactly one View check runs link in Quick links for getsentry/${repo}.”publish-workspace-acceptance/src/modules/ci-poller-input.js.getCiPollerInput({ title, issueBody }) in src/modules/ci-poller-input.js calls parsePublishIssueTitle(title), then returns { repo: \getsentry/${repo}`, revision: getReleaseRevision({ issueBody, repo }), version }`.src/publish/resolve-ci-poller-input.js, which writes JSON for getCiPollerInput({ issueBody: process.env.PUBLISH_ISSUE_BODY || "", title: process.env.PUBLISH_TITLE || "" }) to stdout.node .__publish__/src/publish/resolve-ci-poller-input.js with PUBLISH_ISSUE_BODY and PUBLISH_TITLE; parsing failure warns and skips issue. It reads JSON .repo, .version, .revision; resolves branch from the original commit’s check suites, resolves branch head if available, otherwise falls back to issue SHA, and if changed updates the issue body by replacing ${issue_sha} with ${sha}.src/modules/__tests__/ci-poller-input.js..github/workflows/ci-poller.yml, src/modules/release-revision.js, src/modules/ci-poller-input.js, src/publish/resolve-ci-poller-input.js, and tests release-revision.js / ci-poller-input.js.node scripts/generate-publish-issue-title-parser.js --check, then yarn check:generated && vitest run src/modules/__tests__/release-revision.js src/modules/__tests__/ci-poller-input.js src/modules/__tests__/publish-location.js src/modules/__tests__/publish-workflow.js. Result: 24 passed and 3 failed of 27 tests across 4 files. Failures: two release-revision decoy/duplicate Quick-links tests received generic repository-link error rather than canonical-link error; publish-workflow expected state hash 21cf7beaeda4 but received checkout-root hash c232c383e26f.src/modules/release-revision.js and src/modules/__tests__/publish-workflow.js.rejects a missing CI-approved revision expected old generic “Expected a View check runs link for getsentry/toolkit” but received fail-closed “Expected exactly one View check runs link in Quick links for getsentry/toolkit.”src/modules/__tests__/release-revision.js to expect the canonical fail-closed error.ci-poller.yml must check out controller source before calling the shared resolver, and planned the required workflow checkout step.docs/publish-issue-format.md failed because the expected bare View check runs context did not match..github/workflows/ci-poller.yml with the controller checkout requirement.View check runs revision and listing root .craft.yml workspace keys; exact key matches are workspaces and all other suffixes remain checkout paths; the controller never normalizes names; missing root .craft.yml always means checkout-path behavior; discovery errors with root configuration fail the release.publish: getsentry/toolkit [workspace: "cli/v2"] @1.2.3; legacy workspace titles require repository-root path; parsed paths cannot contain ..; Quick links include View changes and View check runs; accepted starts publishing and dry-run requests dry-run mode.docs/publish-issue-format.md to document the canonical Quick-links contract.eslint src .github --ignore-pattern '!.github'.vitest run src/__tests__/config.test.ts src/__tests__/action.test.ts src/commands/__tests__/publish.test.ts had 3 files / 83 tests passing. Craft lint had 0 errors and 7 pre-existing warnings: five unused variables in src/commands/publish.ts at lines 482, 499, 515, 521, 527, and two _err warnings in src/utils/git.ts at lines 241 and 249.@typescript-eslint/no-unused-vars; current Craft lint output nevertheless reported 7 warnings attributed to that rule.Quick links, while preserving the rejection of decoy matching.src/modules/release-revision.js and src/modules/__tests__/release-revision.js to accept the documented Quick-links layout while requiring exactly one canonical check-runs link.prettier was not installed (/usr/bin/bash: prettier: command not found).yarn exec prettier failed with exit code 2 because it received no file path/parser: “No parser and no file path given, couldn't infer a parser.”package.json has scripts: generate, check:generated, test, test:watch, lint, and prettier: "prettier --write src"; dev dependency prettier: "^2.2.1"; Volta pins Node 24.0.0 and Yarn 1.22.22.src/modules/ci-poller-input.js, src/modules/release-revision.js, src/modules/__tests__/ci-poller-input.js, src/modules/__tests__/publish-location.js, and src/modules/__tests__/release-revision.js.src/modules/ci-poller-input.js, publish-location.js, release-revision.js, tests ci-poller-input.js, publish-location.js, publish-workflow.js, release-revision.js, and src/publish/resolve-ci-poller-input.js.src/__tests__/action.test.ts noncompliant.src/__tests__/action.test.ts, rerun remaining Craft checks, then complete Publish verification.src/__tests__/action.test.ts; Craft formatting then passed and node build.mjs passed, with source-map upload skipped because SENTRY_AUTH_TOKEN was absent.src/modules/publish-issue-title.peggy: “No parser could be inferred”..peggy formatting error as expected because Prettier lacks a Peggy parser; planned to exclude only that unsupported grammar, remove newline-only churn, then request final read-only review.src/modules/post-workflow-details.js and src/publish/inputs.js; both had only an added final newline. Modified Publish files also included .github/workflows/ci-poller.yml, .github/workflows/publish.yml, docs, package.json, parser-related modules/tests, and yarn.lock; new files included parser grammar/generated parser, location/revision resolvers, and CI-poller input resolver/tests.src/modules/post-workflow-details.js and src/publish/inputs.js changes would be explicitly excluded from staging.src/modules/__tests__/ci-poller-input.js failed because expected single-line assertion context did not match the formatted multiline assertion.ci-poller-input test fixture uses revision 7e5ca7ed5581552de066e2a8bc295b8306be38ac and Quick links containing toolkit compare/check-runs URLs; it verifies both compact title publish: getsentry/toolkit/cli@1.2.3 and legacy title publish: toolkit [workspace: "cli/v2"] @1.2.3 resolve to { repo: "getsentry/toolkit", revision: REVISION, version: "1.2.3" }.src/modules/__tests__/ci-poller-input.js; formatted it; regenerated parser check passed; targeted ci-poller-input.js and release-revision.js tests passed (2 files / 12 tests); Publish ESLint passed.