Dashboard › craft › Distillation
046ebb1f-3929-47cb-83df-1a4f603f6198["lore_tm_v1_6lSzvUjtUnaQXxc8WBmH_-JOy7-4VVxwconqkzWLfJc","lore_tm_v1_-88S7_TDVhMF7ARKplcTW4HGLcm3M0EVu7HlVyL9fMk","lore_tm_v1_c9cAeu48Fo3FF0q2KSlwiRyY1F38sSVruODCOGBXZfI"]
Date: Aug 26, 2026
/home/byk/Code/getsentry/publish-workspace-acceptance/src/modules/update-issue.js (84 lines). updateTargets({ octokit, stateFilePath, publishRepo, issue_number }) returns without action if stateFilePath is absent or does not exist; otherwise it concurrently fetches the issue through octokit.rest.issues.get(...) and reads/parses the state JSON with fs.promises.readFile(stateFilePath, { encoding: "utf-8" }), transforms the issue body, then updates it with octokit.rest.issues.update(...).update-issue.js, transformIssueBody(craftState, issueBody) replaces TARGETS_SECTION_PARSER_REGEX: declared targets matching TARGETS_PARSER_REGEX are rendered as - [x] <targetId> when craftState.published[targetId] is truthy, otherwise - [ ] <targetId>; targets present in craftState.published but absent from the issue section are appended with the same checked/unchecked representation.update-issue.js, updateIssue({ context, octokit }) obtains publishRepo from context.repo and issue_number from context.payload.issue.number, then concurrently calls updateTargets with process.env.CRAFT_STATE_FILE_PATH and removes the "accepted" label through octokit.rest.issues.removeLabel(...).craft-workspace-action-propagation/src/commands/__tests__/publish.test.ts lines 115–204. The runPostReleaseCommand test sets GITHUB_RUN_ID='9876', GITHUB_REPOSITORY='getsentry/sentry-cocoa', and RUNNER_OS='Linux', and asserts the spawned environment forwards these GITHUB_*/RUNNER_* variables while excluding NPM_TOKEN and DOCKER_PASSWORD; test credential values were supplied but are not recorded.publish.test.ts tests getPublishStateGitHubConfig: a resolved workspace GitHub config { owner: 'release-owner', repo: 'release-repo', projectPath: 'packages/cli' } with controller state identity 'getsentry/toolkit' resolves to { owner: 'getsentry', repo: 'toolkit' }, and getPublishStateFilename('1.2.3', ..., '/github/workspace/__repo__/packages/cli', 'cli') must match the equivalent explicit controller config; without controller identity, getPublishStateGitHubConfig(githubConfig, undefined) returns the original githubConfig object.action.yml:71-83, WORKSPACE nested in each step’s env, validation at action.yml:74-83 before first side effect at :84-94, workspace reaches both commands at :170-213, workflow callers forward it at .github/workflows/release.yml:122-150, regression coverage src/__tests__/action.test.ts:93-144.Cc, Cf, Zl, Zp at action.yml:74-82; publish-workspace-acceptance title parser rejects the same categories after JSON decoding at details-from-context.js:24-40; legacy titles omit workspace, empty action input is accepted (details-from-context.js:68-75, tests details-from-context.test.js:92-102 and action.test.ts:135-143); safe Unicode coverage at details-from-context.test.js:145-162, and unsafe controls/bidi/Zl/Zp coverage at :181-293.action.yml:263-270); controller state prepopulation uses title repository (publish.yml:191-233) and passes it to Craft only as CRAFT_PUBLISH_STATE_GITHUB_REPO (publish.yml:255-258); Craft applies override solely to getPublishStatePath (src/commands/publish.ts:715-731) and strictly parses it (:177-195); filename algorithms match workspace base64url and canonical cwd hashing (publish.yml:214-230, src/utils/publishState.ts:82-99); executable fixture verifies root and workspace filenames (publish-workflow.js:57-81).--workspace=$WORKSPACE, at action.yml:185-213; action.test.ts:93-104 verifies --config-from=untrusted cannot become a distinct option.publish.ts:736-755); publish updates use only explicit secure state path and skip missing paths (update-issue.js:7-24,65-81; workflow wiring publish.yml:296-302); title parsing is anchored and rejects traversal (details-from-context.js:24-30,45-47; tests details-from-context.test.js:164-179,295-310); workspace values use quoted environment variables and JSON encoding rather than shell/YAML interpolation (action.yml:76-82,263-270; publish.yml:190-195,224-230); both new harnesses are included in Vitest configuration and passed.pnpm test passed with 60 files, 1138 tests passed, 1 skipped; publish yarn test passed with 6 files and 25 tests; git diff --check passed against both supplied bases; no worktree files changed during review.