Dashboard › craft › Distillation
a180ee63-5bd9-43f8-85c8-f57eebc5dede["lore_tm_v1_GBfT_C3QgAqRLV4Ls6S_DGEp2qm6_rK1zcaJrs_xs5o","lore_tm_v1_ucBi6QPn4bQG7QwmrozI-RjJ8pjqfjL0MCz9izLkchU","lore_tm_v1_2gM0Mrs4zwtUT9I8hV_Y2qRfiyNCpXJsCkx6N7QL1BI","lore_tm_v1_vPmiOTv7P9m5tNBZ8NEslbaWhNUwqB-i8jIQbiqSe3s","lore_tm_v1_zCGdM-degrItZYuIuMUoBNADPPGuOu4CKYz4wyxWsII"]
Date: Sep 4, 2026
src/modules/publish-issue-validation.js implements isPublishRepository(name) with /^[A-Za-z0-9_.-]+$/, rejecting ., .., __proto__, and leading -; isReleaseVersion(version) validates versions with /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-?([0-9a-z-]+(?:\.[0-9a-z-]+)*))?(?:\+([0-9a-z-]+(?:\.[0-9a-z-]+)*))?$/i.src/modules/ci-poller-input.js getCiPollerInput({ title, issueBody, revision }) parses and validates title repository, version, and path = \.${parsedTitle.path}`before callinggetReleaseRevision({ issueBody, repo }); returns repo: `getsentry/${repo}`, current revision, and version, and when a revisionargument is supplied returns updatedissueBodyviaupdateReleaseRevision({ issueBody, repo, revision })`.src/modules/details-from-context.js validates parsed title repository and version before deriving dry_run, parses and validates path = "." + titleDetails.path, then extracts optional merge_target using /^Merge target: (?<merge_target>[\w.\-/]+)$/m.src/modules/details-from-context.js extracts checked target IDs from a matched issue-body Targets section: TARGETS_SECTION_PARSER_REGEX is /^(?!### Targets$\s)(?: *- \[[ xX]\] \S+\s*$(?:\r?\n)?)+/m; checked targets use /^\s*- \[x\] (\S+)/gim; returned details include title fields, dry_run as "1" or "", merge_target, path, and targets.src/modules/publish-issue-title.peggy grammar defines RepositoryCharacter as [A-Za-z0-9_.-], constructs a path from one or more "/" PathSegment values, and accepts Version characters [A-Za-z0-9_.+-]+; title parsing still permits optional "getsentry/" and requires end-of-input via !..