Dashboard › craft › Distillation
5ffa004f-79f6-4ddf-8d1e-de554105008c["lore_tm_v1_KZQglCbDhAUDcNRID_bIElM3H2BwAJJuvTnX4zSxsHE","lore_tm_v1_MJ4NOMAocF67k_FOjO_HLTpL1V6vvOgegg95irhg51s","lore_tm_v1_eOHcCUr0ah3rZ5U_xCa4CCeWfkI3hFpzWmSOLK2x8fI","lore_tm_v1_4046Mu6DQoNqJlTYEDuI5L6veIbEFGAehnNp9veNB_I","lore_tm_v1_KAeYztAVPma7TMDSshBhXJ2Is0KIow2UB82511L13qo","lore_tm_v1_br3qNAuYhSVN4Gj6saCqFyjHXII3VpcQSlvh2adTEMg","lore_tm_v1_FKWfeqb-Z1cXsD8Vyvr3UVKPpeizXLKr7XXENZ0BaVA","lore_tm_v1_-MvFwkcvhJRWyhkPAUOrAjVgPg6rUgpf4Gm1naHDg_4"]
Date: Sep 4, 2026
/home/byk/Code/getsentry/craft-workspace-action-propagation and Publish at /home/byk/Code/getsentry/publish-workspace-acceptance. User prohibited edits, formatting, generation, and git-state mutation.git status --short and git diff --name-only. User asserted prior claim of unrelated .github/workflows/cocoapods-keepalive.yml change is false for the current Publish worktree and directed it not be reported unless current diff proves it exists.getsentry/craft:latest is intentional and required; it must not be reported as a concern.packages/{cli,{mcp}} and packages/{cli,{{},mcp}} failing closed in schema and runtime without discarded invalid branches; valid nested braces; glob safety before filesystem access; realpath containment; action-input validation and full exact path titles; Publish parser/controller/poller semantic validation before cross-repository API/checkout; exact CI-SHA checkout before discovery; exact path matching; discovery fallback/validation; fresh ci-ready gates; external scoped state and --rev; identical lossless Craft/Publish version-state encoding; parser-generated-doc parity; and test coverage.file:line citations, each audit area marked PASS, CONCERN, or MUST-FIX; response must end exactly MERGE or DO-NOT-MERGE; if blocked, response must begin BLOCKED with exact tool/error..craft.yml, .git, .github/, action.yml, docs/, src/, package.json, pnpm-lock.yaml, node_modules/, dist/, vitest.config.mts, and 33 total entries..git, .github/, docs/, src/, scripts/, package.json, yarn.lock, node_modules/, vitest.config.js, and 15 total entries.git status --short / git diff --name-only showed exactly 9 modified files: action.yml; docs/src/content/docs/targets/github.md; src/__tests__/action.test.ts; src/__tests__/config.test.ts; src/commands/prepare.ts; src/config.ts; src/schemas/project_config.ts; src/utils/__tests__/publishState.test.ts; src/utils/publishState.ts.git status --short / git diff --name-only showed modified files .github/workflows/publish.yml, docs/publish-issue-format.md, src/modules/__tests__/ci-poller-input.js, src/modules/__tests__/details-from-context.js, src/modules/__tests__/publish-location.js, src/modules/__tests__/publish-workflow.js, src/modules/ci-poller-input.js, src/modules/details-from-context.js, src/modules/publish-issue-title.js, src/modules/publish-issue-title.peggy, src/modules/publish-location.js, src/publish/resolve-location.js; and one untracked file src/modules/publish-issue-validation.js. .github/workflows/cocoapods-keepalive.yml was absent from this current scope.action.yml changes: sets LC_ALL: C; validates PATH_INPUT as . or slash-separated safe ASCII segments [A-Za-z0-9_.-]+ excluding ., .., __proto__, and segments beginning -; validates nonempty WORKSPACE using the same safe path-segment rules; emits exact errors The path input must use ASCII path segments containing only letters, digits, periods, underscores, and hyphens. and Workspace names must use ASCII path segments containing only letters, digits, periods, underscores, and hyphens.; and runs unset CRAFT_WORKSPACE before root Craft prepare and target-reading commands.docs/src/content/docs/targets/github.md now define release-workspace keys as literal paths or glob patterns expanded to concrete directories relative to .craft.yml; --workspace <path> selects a concrete path; configured globs ignore files; overlapping workspace keys are rejected; craft workspace list outputs concrete workspace paths as JSON; and action publish titles carry the full concrete path. Documentation example changed workspace keys from cli / mcp to packages/* / tools/mcp.src/commands/prepare.ts now obtains repository root with git.revparse(['--show-toplevel']) and passes repositoryRoot.trim() as the workspaceDirectory second argument to loadConfigurationFromString(configContent, repositoryRoot.trim()) for --config-from configuration.src/config.ts imports realpathSync from fs and globSync, hasMagic from glob; setActiveWorkspace() now clears _configPathCache; findConfigFile() only reuses _configPathCache if existsSync(_configPathCache).src/config.ts adds glob workspace resolution: getWorkspaceConfig(), workspaceKeyMatches(), getWorkspaceNamesFromConfig(), and getWorkspaceGlobMatches(). Matching glob keys are expanded with globSync(workspaceGlob, { absolute: false, cwd: root, dot: true, ignore: ['**/node_modules/**'], posix: true }), retain only safe directory matches inside both lexical root and realpathSync(root) containment, then sort. Multiple matching keys throw ConfigurationError naming concrete workspace and matching patterns.src/config.ts implements isSafeWorkspacePath(), isSafeWorkspaceGlob(), isSafeWorkspaceGlobSegment(), isSafeWorkspaceGlobPattern(), expandBraceAlternatives(), and splitBraceAlternatives(). Safety rejects absolute paths, backslashes, empty / . / .. / __proto__ segments, segments beginning -, invalid ASCII literals, malformed brace alternatives, and requires brace alternatives to have more than one choice. isWorkspacePattern() uses hasMagic(name, { magicalBraces: true }).src/config.ts changes workspace selection APIs so applyWorkspaceSelection(config, workspaceDirectory) and resolveWorkspaceConfig(base, workspaceName, workspaceDirectory) operate on concrete names; getConfiguration() uses path.dirname(configPath); loadConfigurationFromString(configContent, workspaceDirectory = process.cwd()) accepts a workspace directory; and getWorkspaceNames() expands globs relative to path.dirname(configPath).src/schemas/project_config.ts imports hasMagic from glob and duplicates brace-expansion and safe-glob validation helpers. WorkspaceNameSchema now refines with isSafeWorkspaceGlob and error Workspace paths must use safe ASCII segments.src/utils/publishState.ts adds encodeVersionForFilename(version): it retains sanitiseForFilename(version) only if lossless; otherwise emits version-${Buffer.from(version).toString('base64url')}. getPublishStateFilename() now uses encodeVersionForFilename(version) rather than sanitiseForFilename(version).craft executable to exit 1 if inherited CRAFT_WORKSPACE is nonempty. Tests accept workspace inputs '', cli-v2, packages/cli, and packages/CLI; reject unsafe path inputs ../outside, /tmp, ./packages/cli, packages//cli, and packages/../cli before git/Craft side effects; reject workspace values cli\nnext, packages/*, ./packages/cli, packages//cli, packages/./cli, packages/../cli, packages/__proto__/cli, and packages/-cli; expect title publish: getsentry/toolkit/packages/cli@1.2.3; and verify unset CRAFT_WORKSPACE permits root commands producing exact calls prepare then targets.packages/* expansion to packages/cli and packages/mcp; remote config glob expansion from explicit repository root; negated classes packages/[!a]* and packages/[^a]*; valid brace glob packages/{cli,mcp}; valid nested brace glob packages/{cli,{mcp,api}}; ?, [cm]*, and **/cli globs; symlink exclusion via realpath containment; rejection of unsafe brace alternatives {../outside/*,packages/*} and {/tmp/*,packages/*}; rejection of malformed globs packages/{cli, packages/{cli}, packages/{cli,{mcp}}, and packages/{cli,{{},mcp}}; unsafe literals; and multiple matching globs packages/* plus packages/cli*.4.2.6+sentry1 and 4.2.6+Sentry1 produce distinct filenames containing respectively -version-NC4yLjYrc2VudHJ5MQ.json and -version-NC4yLjYrU2VudHJ5MQ.json.