Dashboard › publish › Distillation
891423e6-6472-4eb9-9f78-778fcb204b41["lore_tm_v1_wToKO4ozUyZ6kHHMSp1EvCc5hG7t7pQZNUjp2_PRjhM","lore_tm_v1_qV67Hhnea0akabGt1zIX4OmZaMNCNmZCaTL3xr6I1qg","lore_tm_v1_DWMLfTRf5yE-8FIcX4CcWZ1-xOkTTUcsJhMedsEWac4","lore_tm_v1_8HodPHp74A0ZogrvNvjGS-EabU3GZkjgUtG23qqPqEI","lore_tm_v1_pqqQ902z42inckhkt8ER_kycr08w1n0SaDNP1EiwbTY","lore_tm_v1_P6BXTpWfIDUgZVjzLUcTx6CuAzhHRdsOpGtmL0tKfUg","lore_tm_v1_-voIediGeCY8PemBpRoAN1Kfoubx8y4ewVv1sZybiEk","lore_tm_v1_ecMF0nZwD5NbLe7QoFwAi6C87hS5mAOpKTjaNOb1d94","lore_tm_v1_XiR904Phgob90ihCHDCd-hRf5jp9owfeTkUVMYKTM0A","lore_tm_v1_JDF5sHQhiBMgNHtpdSe0iD0d_YuBtBqTAb3C1lZHg40","lore_tm_v1_bvRLdjAA17Ztj_V1e1l3ox8z26rpIT6uziHl0jyiGk8"]
/home/byk/Code/getsentry/publish/src/modules/__tests__/details-from-context.js is 279 lines and tests detailsFromContext() and parsePublishTitle().detailsFromContext() parses "publish: getsentry/sentry@21.3.1" with requester @BYK, merge target "custom-branch", and selected targets into { dry_run: "", merge_target: "custom-branch", path: ".", repo: "sentry", targets: ["github", "npm[@sentry/node]", "docker[latest]"], version: "21.3.1" }.detailsFromContext() preserves version "4.2.6+sentry1" from title "publish: getsentry/sentry-forked-django-stubs@4.2.6+sentry1".parsePublishTitle() parses qualified title "publish: getsentry/sentry-javascript/packages/core@10.0.0" as { path: "/packages/core", repo: "sentry-javascript", version: "10.0.0" } and legacy title "publish: sentry-javascript@10.0.0" as { path: "", repo: "sentry-javascript", version: "10.0.0" }."(default)" is normalized to merge_target: ""; merge-target parsing uses the canonical request header and ignores a later Merge target: decoy.detailsFromContext() retains the concrete workspace suffix from "publish: getsentry/toolkit/packages/cli@1.2.3" as path: "./packages/cli" with repo: "toolkit" and version: "1.2.3".detailsFromContext() rejects "publish: getsentry/toolkit @1.2.3" with Invalid publish issue title, "publish: getsentry/toolkit@1.2.3/other" with Invalid publish issue title, and missing issue context with Issue context is not defined./home/byk/Code/getsentry/publish/src/modules/__tests__/process-end-state.js is 249 lines and tests "failure", "cancelled", "success", and unknown publication statuses."failure", processEndState() posts exactly one issue comment beginning Failed to publish. with run logs at https://github.com/getsentry/sentry/actions/runs/1234?check_suite_focus=true#step:8 and a branch-deletion link querying version 21.3.1."cancelled", processEndState() posts exactly one issue comment beginning Publish workflow cancelled. with the same focused run-log and branch-deletion links."success", processEndState() posts Published successfully: [run#1234](https://github.com/getsentry/sentry/actions/runs/1234) and closes issue "211" in getsentry/publish.getWorkflowRun throws "unavailable", the close operation must already have occurred.processEndState() throws Unknown status: 'undefined' for an absent status and performs neither comment creation nor issue update./home/byk/Code/getsentry/publish/src/modules/__tests__/publish-location.js is 88 lines and tests resolvePublishLocation().resolvePublishLocation() classifies exact full workspace path "./packages/CLI" against ["packages/cli", "packages/CLI"] without case normalization, returning { path: ".", workspace: "packages/CLI" }."./packages" with workspace ["cli"] returns { path: "./packages" }, and "./packages/cli" with workspace ["cli"] returns { path: "./packages/cli" }; root path "." remains { path: "." }.resolvePublishLocation() rejects unsafe publish paths "./.", "./..", and "./packages/../other" with Invalid publish path..".", "..", "packages/./cli", "packages/../cli", "packages/__proto__/cli", "packages/-cli", "packages/foo]", "packages/foo!", "packages/foo^", "packages/../cli", and "cli-日本語" with Craft workspace discovery returned an invalid workspace list. or the equivalent message without the terminal period./home/byk/Code/getsentry/publish/src/modules/__tests__/release-revision.js is 152 lines and tests getReleaseRevision() and updateReleaseRevision() using REVISION = "7e5ca7ed5581552de066e2a8bc295b8306be38ac".getReleaseRevision() extracts the CI-approved 40-character SHA only from the canonical request-header View check runs URL for getsentry/toolkit; it accepts CRLF bodies and URLs both with and without a trailing slash after /checks.getReleaseRevision() rejects a check-runs URL lacking /checks, a URL for another repository, and complete Quick-links/request-header blocks that do not occur at the start of the issue body with Expected a View check runs link for getsentry/toolkit.getReleaseRevision() rejects decoy or embedded additional check-runs links outside the canonical request header with Expected exactly one View check runs link in Quick links.updateReleaseRevision() changes only the canonical request-header SHA while preserving CRLF and trailing content; replacement revisions "A".repeat(40), "a".repeat(39), and "a".repeat(41) are rejected with Release revision must be a lowercase 40-character SHA../home/byk/Code/getsentry/publish/src/modules/__tests__/update-issue.js is 220 lines and tests updateIssue() and transformIssueBody().updateIssue() uses the workflow-provided CRAFT_STATE_FILE_PATH exactly as .craft-state/craft/publish-state-getsentry-sentry-c232c383e26f-21.3.1.json; when it exists, state { published: { lol: true, hey: false, github: true } } updates issue targets to checked github and lol, unchecked pypi and hey.updateIssue() does not modify the issue body; when CRAFT_STATE_FILE_PATH is absent because target setup was skipped, it does not call fs.existsSync() or update the issue.updateIssue() removes the "accepted" label from issue "211" in getsentry/publish whether or not parsed publish inputs or a Craft state file are available.transformIssueBody() rewrites the Targets section from publication state while preserving the canonical request header and explanatory footer; for "npm[@sentry/node]": true, "aws-lambda": true, github: false, and foo: true, it emits checked npm, checked aws-lambda, unchecked github, then checked foo in that order./home/byk/Code/getsentry/publish/src/publish/__tests__/discover-location.js is 66 lines and tests discoverLocation() and getWorkspaceNames().discoverLocation() preserves checkout path "./packages/cli" when the root Craft configuration is absent.docker with pinned image getsentry/craft@sha256:9a4a5d5efa44a00c2215078ead39800d4aaa5a97908b94f45a64d7d506d6e14b and arguments containing "workspace" and "list"; returned ["packages/CLI"] maps "./packages/CLI" to { path: ".", workspace: "packages/CLI" }.getWorkspaceNames() fails closed with Craft workspace discovery returned an invalid workspace list. when Craft returns "{}" or only "\n"./home/byk/Code/getsentry/publish/src/publish/__tests__/resolve-release-revision.js is 20 lines; missing workflow input with PUBLISH_ARGS: "" and PUBLISH_ISSUE_BODY: "" must fail via Publish input must define a repository. rather than Unexpected end of JSON input./home/byk/Code/getsentry/publish/README.md documents the release flow as: 1. developer triggers release workflow, 2. SDK repo runs craft prepare, 3. artifacts are built and a release branch created, 4. artifacts upload to GitHub, 5. an issue is created in getsentry/publish, 6. a release manager reviews it, 7. adding "accepted" triggers publication, 8. artifacts download from GitHub, 9. craft publish publishes to registries, 10. success closes the issue while failure updates it.sentry-cli, SDKs, and symbolicator utilities require explicit approval; internal dependencies such as arroyo may use auto-approval because their later bump into Sentry requires another explicit approval.production environment, which permits only main deployments and disallows administrator bypass.SENTRY_INTERNAL_APP_PRIVATE_KEY and SENTRY_RELEASE_BOT_PRIVATE_KEY are organization-level secrets whose cross-repository exposure boundary must be managed separately by Security./home/byk/Code/getsentry/publish/docs/key_rotation_vault_changes.md states three secret vaults exist: SDKs/OSS is available to a range of employees including some who departed; Shared is available to all engineers including some who departed; Ops is available to operations and none of those users departed.release/* branches are pushed./home/byk/Code/getsentry/publish/docs/rfc.md defines central-publish requirements: rapidly rotate NPM, PyPI, Cargo, Docker, and other tokens without workflow disruption; restrict token access; require manager or senior-engineer approval for SDK releases under SOC/ISO policy; and centralize repeated per-project release configuration."accepted", closes successful issues, and auto-approves OSS CalVer releases unless blocked./home/byk/Code/getsentry/publish/AGENTS.md defines the project as a pure JavaScript CommonJS GitHub Actions approval system using Node.js 24.0.0, Yarn 1.22.22, and Vitest v4.0.0; npm must not be used.yarn install; all tests with yarn test; watch mode with yarn test:watch; one file with yarn test src/modules/__tests__/update-issue.js; matching tests with yarn test -t "pattern"; lint with yarn lint; format with yarn prettier; and combine file/name filtering with yarn test src/modules/__tests__/update-issue.js -t "specific test name".require/module.exports, tests use ES module import/export, all filenames use kebab-case, test files reside in __tests__/ with the source filename, variables/functions use camelCase, and constants/regexes use UPPER_SNAKE_CASE.yarn prettier before committing.throw new Error(\Unknown status: '${status}'`)`.fs.existsSync(CRAFT_STATE_FILE_PATH) before reading, returning early when absent.v4.0.0 with globals enabled and automatically cleared mocks; external dependencies should be mocked before requiring the module under test, and inline snapshots are appropriate for complex output.@getsentry/releng; durable agent knowledge is stored in /.lore.md.