# Release Candidates

## GET /sfp/api/release-candidates

> List active release candidates (excludes finalized)

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"ReleaseCandidateListDto":{"type":"object","properties":{"items":{"description":"List of release candidates","type":"array","items":{"$ref":"#/components/schemas/ReleaseCandidateDto"}},"total":{"type":"number","description":"Total count of release candidates"},"limit":{"type":"number","description":"Number of items returned"},"offset":{"type":"number","description":"Offset for pagination"}},"required":["items","total","limit","offset"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates":{"get":{"operationId":"ReleaseCandidatesController_listReleaseCandidates","summary":"List active release candidates (excludes finalized)","parameters":[{"name":"repositoryIdentifier","required":true,"in":"query","description":"Repository identifier (e.g., flxbl-io/sf-core)","schema":{"type":"string"}},{"name":"domain","required":false,"in":"query","description":"Filter by domain (e.g., core, auth, origination)","schema":{"type":"string"}},{"name":"branch","required":false,"in":"query","description":"Filter by branch (e.g., main, develop)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Limit results (1-200, default: 50)","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Offset for pagination (default: 0)","schema":{"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filter by status. Statuses: pending, in_progress, aborted. Note: finalized candidates are excluded by default.","schema":{"type":"string"}}],"responses":{"200":{"description":"List of release candidates","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateListDto"}}}},"400":{"description":"Bad request"},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Candidates"]}}}}
```

## POST /sfp/api/release-candidates

> Create or update a release candidate

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"CreateReleaseCandidateDto":{"type":"object","properties":{"repositoryIdentifier":{"type":"string","description":"Repository identifier (e.g., \"owner/repo\")"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"status":{"type":"object","description":"Initial status for the release candidate. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed (e.g., testing, staging).","default":"pending"}},"required":["repositoryIdentifier","domain","releaseName","commitSha","value"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates":{"post":{"operationId":"ReleaseCandidatesController_createReleaseCandidate","summary":"Create or update a release candidate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReleaseCandidateDto"}}}},"responses":{"201":{"description":"Release candidate created/updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"400":{"description":"Bad request"},"403":{"description":"Forbidden - Requires role: member, owner, application"},"409":{"description":"Conflict - version mismatch"}},"tags":["Release Candidates"]}}}}
```

## GET /sfp/api/release-candidates/latest

> Get the latest release candidate for a domain

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/latest":{"get":{"operationId":"ReleaseCandidatesController_getLatestReleaseCandidate","summary":"Get the latest release candidate for a domain","parameters":[{"name":"repositoryIdentifier","required":true,"in":"query","description":"Repository identifier (e.g., flxbl-io/sf-core)","schema":{"type":"string"}},{"name":"domain","required":true,"in":"query","description":"Domain name (e.g., core, auth, origination)","schema":{"type":"string"}},{"name":"branch","required":false,"in":"query","description":"Filter by branch (e.g., main, develop)","schema":{"type":"string"}}],"responses":{"200":{"description":"Latest release candidate","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"No release candidates found"}},"tags":["Release Candidates"]}}}}
```

## GET /sfp/api/release-candidates/by-commit/{commitSha}

> Get release candidates for a specific commit, grouped by domain

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/release-candidates/by-commit/{commitSha}":{"get":{"operationId":"ReleaseCandidatesController_getByCommit","summary":"Get release candidates for a specific commit, grouped by domain","parameters":[{"name":"commitSha","required":true,"in":"path","description":"Git commit SHA","schema":{"type":"string"}},{"name":"repositoryIdentifier","required":true,"in":"query","description":"Repository identifier (e.g., flxbl-io/sf-core)","schema":{"type":"string"}}],"responses":{"200":{"description":"Release candidates grouped by domain"},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Candidates"]}}}}
```

## GET /sfp/api/release-candidates/{id}

> Get a specific release candidate

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/{id}":{"get":{"operationId":"ReleaseCandidatesController_getReleaseCandidate","summary":"Get a specific release candidate","parameters":[{"name":"id","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Release candidate details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## DELETE /sfp/api/release-candidates/{id}

> Delete a release candidate

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/release-candidates/{id}":{"delete":{"operationId":"ReleaseCandidatesController_deleteReleaseCandidate","summary":"Delete a release candidate","parameters":[{"name":"id","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}}],"responses":{"204":{"description":"Release candidate deleted"},"403":{"description":"Forbidden - Requires role: owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## Compare release candidate with an environment

> Compares the release candidate packages against packages installed in a registered environment. When includeChangelog=true, computes detailed changelog with commits and work items for changed packages.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"CompareWithEnvironmentDto":{"type":"object","properties":{"environmentId":{"type":"string","description":"Environment ID to compare against"},"environmentName":{"type":"string","description":"Environment name to compare against (alternative to environmentId)"}}},"ReleaseComparisonDto":{"type":"object","properties":{"releaseCandidate":{"description":"Release candidate being compared","allOf":[{"$ref":"#/components/schemas/ReleaseCandidateDto"}]},"environment":{"type":"object","description":"Environment being compared against"},"comparison":{"type":"object","description":"Comparison results (only includes packages in the RC, not other packages in org)","properties":{"packagesToInstall":{"type":"array","items":{"$ref":"#/components/schemas/PackageComparisonDto"}},"packagesToUpdate":{"type":"array","items":{"$ref":"#/components/schemas/PackageComparisonDto"}},"unchanged":{"type":"array","items":{"$ref":"#/components/schemas/PackageComparisonDto"}},"totalChanges":{"type":"number"}}},"estimatedDeploymentTime":{"type":"number","description":"Estimated deployment time in minutes"},"changelog":{"type":"object","description":"Changelog data if includeChangelog=true was specified"},"linkedCandidates":{"type":"object","description":"Linked release candidates from other domains (non-finalized only)"}},"required":["releaseCandidate","environment","comparison","estimatedDeploymentTime","linkedCandidates"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]},"PackageComparisonDto":{"type":"object","properties":{"name":{"type":"string","description":"Package name"},"type":{"type":"string","description":"Package type (e.g., Unlocked, Source/Data, Managed)"},"isOutOfSync":{"type":"boolean","description":"Whether the package is out of sync across environments"},"versions":{"type":"object","description":"Version information per environment. Key is environment name, value is version info or null if not installed.","additionalProperties":{"oneOf":[{"$ref":"#/components/schemas/ArtifactVersionInfoDto"},{"type":"null"}]}}},"required":["name","type","isOutOfSync","versions"]}}},"paths":{"/sfp/api/release-candidates/{id}/compare":{"post":{"operationId":"ReleaseCandidatesController_compareWithEnvironment","summary":"Compare release candidate with an environment","description":"Compares the release candidate packages against packages installed in a registered environment. When includeChangelog=true, computes detailed changelog with commits and work items for changed packages.","parameters":[{"name":"id","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}},{"name":"includeChangelog","required":false,"in":"query","description":"Include detailed changelog with commits and work items (default: false)","schema":{"type":"boolean"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareWithEnvironmentDto"}}}},"responses":{"200":{"description":"Comparison results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseComparisonDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate or environment not found"}},"tags":["Release Candidates"]}}}}
```

## Compare release candidate with provided package versions

> Compares the release candidate packages against a provided set of package versions. Useful for comparing RC against local git state (from artifact tags at a specific ref). When includeChangelog=true, computes detailed changelog with commits and work items for changed packages.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"CompareToPackagesDto":{"type":"object","properties":{"packages":{"type":"object","description":"Package versions to compare against. Key is package name, value is version."},"baseLabel":{"type":"string","description":"Label for the comparison base (e.g., git ref, environment name)"}},"required":["packages"]},"CompareToPackagesResponseDto":{"type":"object","properties":{"releaseCandidate":{"description":"Release candidate being compared","allOf":[{"$ref":"#/components/schemas/ReleaseCandidateDto"}]},"baseLabel":{"type":"string","description":"Label for the comparison base"},"comparison":{"type":"object","description":"Comparison results"},"changelog":{"type":"object","description":"Changelog data if available"},"linkedCandidates":{"type":"object","description":"Linked release candidates from other domains (non-finalized only)"}},"required":["releaseCandidate","baseLabel","comparison","linkedCandidates"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/{id}/compare-to-packages":{"post":{"operationId":"ReleaseCandidatesController_compareToPackages","summary":"Compare release candidate with provided package versions","description":"Compares the release candidate packages against a provided set of package versions. Useful for comparing RC against local git state (from artifact tags at a specific ref). When includeChangelog=true, computes detailed changelog with commits and work items for changed packages.","parameters":[{"name":"id","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}},{"name":"includeChangelog","required":false,"in":"query","description":"Include detailed changelog with commits and work items (default: false)","schema":{"type":"boolean"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareToPackagesDto"}}}},"responses":{"200":{"description":"Comparison results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareToPackagesResponseDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## GET /sfp/api/release-candidates/{id}/changes

> Get change analysis for a release candidate

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"ChangeAnalysisDto":{"type":"object","properties":{"packages":{"description":"Package changes","type":"array","items":{"type":"string"}},"workItems":{"description":"Work items extracted from commits","type":"array","items":{"type":"string"}},"commits":{"description":"Commit information","type":"array","items":{"type":"string"}}},"required":["packages","workItems","commits"]}}},"paths":{"/sfp/api/release-candidates/{id}/changes":{"get":{"operationId":"ReleaseCandidatesController_getChangeAnalysis","summary":"Get change analysis for a release candidate","parameters":[{"name":"id","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}},{"name":"since","required":false,"in":"query","description":"Compare changes since this commit SHA or date","schema":{"type":"string"}}],"responses":{"200":{"description":"Change analysis","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeAnalysisDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## Delete all release candidates on a branch

> Bulk-deletes all release candidates associated with a given branch. Rejects if the branch is a configured project branch or part of a cascade.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"DeleteByBranchResultDto":{"type":"object","properties":{"branch":{"type":"string","description":"Branch name whose RCs were deleted"},"deletedCandidates":{"description":"List of deleted release candidate summaries","type":"array","items":{"$ref":"#/components/schemas/DeletedReleaseCandidateSummaryDto"}},"deletedCount":{"type":"number","description":"Number of deleted release candidates"}},"required":["branch","deletedCandidates","deletedCount"]},"DeletedReleaseCandidateSummaryDto":{"type":"object","properties":{"id":{"type":"string","description":"Release candidate ID"},"releaseName":{"type":"string","description":"Release name"},"domain":{"type":"string","description":"Domain"}},"required":["id","releaseName","domain"]}}},"paths":{"/sfp/api/release-candidates/by-branch/{branchName}":{"delete":{"operationId":"ReleaseCandidatesController_deleteByBranch","summary":"Delete all release candidates on a branch","description":"Bulk-deletes all release candidates associated with a given branch. Rejects if the branch is a configured project branch or part of a cascade.","parameters":[{"name":"branchName","required":true,"in":"path","description":"Branch name (e.g., unbundle-sales-15MAR26)","schema":{"type":"string"}},{"name":"repositoryIdentifier","required":true,"in":"query","description":"Repository identifier (e.g., flxbl-io/sf-core)","schema":{"type":"string"}}],"responses":{"200":{"description":"Release candidates deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteByBranchResultDto"}}}},"400":{"description":"Branch is protected (configured or cascade)"},"403":{"description":"Forbidden - Requires role: owner, application"}},"tags":["Release Candidates"]}}}}
```

## PATCH /sfp/api/release-candidates/{id}/status

> Update release candidate status

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"UpdateReleaseCandidateStatusDto":{"type":"object","properties":{"status":{"type":"object","description":"New status for the release candidate. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed (e.g., testing, staging). Note: aborted and finalized statuses are locked and cannot be changed once set."}},"required":["status"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/{id}/status":{"patch":{"operationId":"ReleaseCandidatesController_updateStatus","summary":"Update release candidate status","parameters":[{"name":"id","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReleaseCandidateStatusDto"}}}},"responses":{"200":{"description":"Status updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## POST /sfp/api/release-candidates/find

> Find release candidate by repository, domain, and name

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"FindReleaseCandidateDto":{"type":"object","properties":{"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain name"},"releaseName":{"type":"string","description":"Release name"}},"required":["repositoryIdentifier","domain","releaseName"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/find":{"post":{"operationId":"ReleaseCandidatesController_findReleaseCandidate","summary":"Find release candidate by repository, domain, and name","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindReleaseCandidateDto"}}}},"responses":{"200":{"description":"Release candidate found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## PATCH /sfp/api/release-candidates/status-by-name

> Update release candidate status by repository, domain, and name

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/status-by-name":{"patch":{"operationId":"ReleaseCandidatesController_updateStatusByName","summary":"Update release candidate status by repository, domain, and name","parameters":[],"responses":{"200":{"description":"Status updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## Abort a release candidate

> Marks a release candidate as aborted. Once aborted, the release candidate's status cannot be changed.\
> &#x20;       Note: Finalized release candidates cannot be aborted.

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"AbortReleaseCandidateDto":{"type":"object","properties":{"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain name"},"releaseName":{"type":"string","description":"Release name"},"reason":{"type":"string","description":"Reason for aborting the release candidate"}},"required":["repositoryIdentifier","domain","releaseName"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/abort":{"post":{"operationId":"ReleaseCandidatesController_abortReleaseCandidate","summary":"Abort a release candidate","description":"Marks a release candidate as aborted. Once aborted, the release candidate's status cannot be changed.\n        Note: Finalized release candidates cannot be aborted.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbortReleaseCandidateDto"}}}},"responses":{"200":{"description":"Release candidate aborted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"400":{"description":"Cannot abort (already finalized)"},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Candidates"]}}}}
```

## Update packages in a release candidate

> Allows excluding packages from a release candidate or overriding their versions.\
> &#x20;       Note: Cannot update release candidates with locked statuses (finalized, aborted).

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"UpdateReleaseCandidatePackagesDto":{"type":"object","properties":{"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain name"},"releaseName":{"type":"string","description":"Release name"},"excludePackages":{"description":"Package names to exclude from the release candidate","type":"array","items":{"type":"string"}},"overrideVersions":{"type":"object","description":"Package versions to override. Key is package name, value is new version."}},"required":["repositoryIdentifier","domain","releaseName"]},"ReleaseCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier"},"repositoryIdentifier":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name"},"commitSha":{"type":"string","description":"Git commit SHA"},"branch":{"type":"string","description":"Git branch name"},"tag":{"type":"string","description":"Git tag"},"value":{"type":"object","description":"Release definition and metadata"},"version":{"type":"number","description":"Version number"},"createdAt":{"type":"string","description":"Creation timestamp"},"updatedAt":{"type":"string","description":"Last update timestamp"},"createdBy":{"type":"string","description":"Created by (email or \"application\")"},"updatedBy":{"type":"string","description":"Updated by (email or \"application\")"},"status":{"type":"object","description":"Release candidate status. Reserved statuses: pending, in_progress, finalized, aborted. Custom statuses are also allowed."},"statusChangedAt":{"type":"string","description":"Timestamp when status was last changed"},"statusChangedBy":{"type":"string","description":"Who changed the status"}},"required":["id","repositoryIdentifier","domain","releaseName","commitSha","value","version","createdAt","updatedAt","createdBy","updatedBy","status"]}}},"paths":{"/sfp/api/release-candidates/update-packages":{"patch":{"operationId":"ReleaseCandidatesController_updatePackages","summary":"Update packages in a release candidate","description":"Allows excluding packages from a release candidate or overriding their versions.\n        Note: Cannot update release candidates with locked statuses (finalized, aborted).","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReleaseCandidatePackagesDto"}}}},"responses":{"200":{"description":"Release candidate updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseCandidateDto"}}}},"400":{"description":"Cannot update (status locked or invalid packages)"},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"},"409":{"description":"Conflict - concurrent modification"}},"tags":["Release Candidates"]}}}}
```

## Notify release candidate of a deployment event

> Called when a release is deployed to an environment. This endpoint automatically updates\
> &#x20;       the release candidate status based on the environment category and deployment status:\
> &#x20;       \- Only successful deployments (Success) trigger status progression\
> &#x20;       \- Any successful deployment → status becomes 'in\_progress' (if currently pending)\
> &#x20;       \- Auto-finalization occurs only when deployed to ALL release category environments for the domain\
> &#x20;         (if autoReleaseFinalization is enabled in project settings)

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"ReleaseEventDto":{"type":"object","properties":{"repositoryIdentifier":{"type":"string","description":"Repository identifier (e.g., \"owner/repo\")"},"domain":{"type":"string","description":"Domain/release configuration name"},"releaseName":{"type":"string","description":"Release name that was deployed"},"environmentName":{"type":"string","description":"Environment name where the release was deployed"},"deploymentStatus":{"type":"string","description":"Deployment status: Success, PartialSuccess, or Failure. Only successful deployments trigger status progression.","enum":["Success","PartialSuccess","Failure"],"default":"Success"}},"required":["repositoryIdentifier","domain","releaseName","environmentName"]},"ReleaseEventResponseDto":{"type":"object","properties":{"updated":{"type":"boolean","description":"Whether the release candidate was updated"},"newStatus":{"type":"object","description":"The new status of the release candidate"},"previousStatus":{"type":"object","description":"Previous status before the update"},"intermediateCandidatesFinalized":{"type":"number","description":"Number of intermediate candidates auto-finalized"},"message":{"type":"string","description":"Message explaining what happened"}},"required":["updated"]}}},"paths":{"/sfp/api/release-candidates/release-event":{"post":{"operationId":"ReleaseCandidatesController_handleReleaseEvent","summary":"Notify release candidate of a deployment event","description":"Called when a release is deployed to an environment. This endpoint automatically updates\n        the release candidate status based on the environment category and deployment status:\n        - Only successful deployments (Success) trigger status progression\n        - Any successful deployment → status becomes 'in_progress' (if currently pending)\n        - Auto-finalization occurs only when deployed to ALL release category environments for the domain\n          (if autoReleaseFinalization is enabled in project settings)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseEventDto"}}}},"responses":{"200":{"description":"Release event processed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseEventResponseDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate or environment not found"}},"tags":["Release Candidates"]}}}}
```

## Get rolling analysis from baseline to latest candidate

> Performs comprehensive rolling analysis showing progression from last completed release to latest candidate. Results are cached (TTL configurable via ROLLING\_ANALYSIS\_CACHE\_TTL\_SECONDS env var, default 15 minutes).

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}},"schemas":{"RollingAnalysisDto":{"type":"object","properties":{"repository":{"type":"string","description":"Repository identifier"},"domain":{"type":"string","description":"Domain name"},"baseline":{"description":"Baseline release information","allOf":[{"$ref":"#/components/schemas/BaselineReleaseDto"}]},"orchestrationOrder":{"description":"Environment orchestration order","type":"array","items":{"type":"string"}},"currentEnvironmentStates":{"type":"object","description":"Current state of each environment","additionalProperties":{"type":"object","properties":{"currentRelease":{"type":"string","nullable":true},"packages":{"type":"object","additionalProperties":{"type":"string"}}}}},"candidates":{"description":"All candidates from baseline to latest (deprecated: use candidatesByBranch for branch-grouped data)","deprecated":true,"type":"array","items":{"$ref":"#/components/schemas/SimplifiedCandidateDto"}},"candidatesByBranch":{"description":"Candidates grouped by branch","allOf":[{"$ref":"#/components/schemas/BranchGroupedCandidatesDto"}]},"summary":{"description":"Comprehensive analysis summary","allOf":[{"$ref":"#/components/schemas/RollingAnalysisSummaryDto"}]},"analyzedAt":{"type":"string","description":"Analysis timestamp"}},"required":["repository","domain","baseline","orchestrationOrder","currentEnvironmentStates","candidates","candidatesByBranch","summary","analyzedAt"]},"BaselineReleaseDto":{"type":"object","properties":{"releaseName":{"type":"string","description":"Release name"},"createdAt":{"type":"string","description":"When the baseline release candidate was created"},"completedAt":{"type":"string","description":"When the release was completed/deployed"},"deployedEnvironments":{"description":"Environments where this release is fully deployed","type":"array","items":{"type":"string"}},"packages":{"type":"object","description":"Package versions in this release","additionalProperties":{"type":"string"}},"isDefaultBaseline":{"type":"boolean","description":"Whether this baseline was synthesized from default package baselines (no completed release exists)"},"branch":{"type":"string","description":"Git branch the baseline release candidate was created on (if known)"}},"required":["releaseName","createdAt","completedAt","deployedEnvironments","packages"]},"SimplifiedCandidateDto":{"type":"object","properties":{"id":{"type":"string","description":"Candidate ID"},"releaseName":{"type":"string","description":"Release name"},"branch":{"type":"string","description":"Git branch"},"commitSha":{"type":"string","description":"Git commit SHA"},"createdAt":{"type":"string","description":"Creation timestamp"},"incrementalChanges":{"description":"Changes from previous candidate","allOf":[{"$ref":"#/components/schemas/IncrementalChangesDto"}]},"cumulativeChanges":{"description":"Total changes from baseline","allOf":[{"$ref":"#/components/schemas/CumulativeChangesDto"}]}},"required":["id","releaseName","commitSha","createdAt","incrementalChanges","cumulativeChanges"]},"IncrementalChangesDto":{"type":"object","properties":{"packages":{"description":"Package changes","allOf":[{"$ref":"#/components/schemas/PackageChangesDto"}]},"summary":{"type":"object","description":"Summary metrics","properties":{"totalPackageChanges":{"type":"number"},"totalCommits":{"type":"number"},"totalWorkItems":{"type":"number"}}}},"required":["packages","summary"]},"PackageChangesDto":{"type":"object","properties":{"added":{"type":"array","description":"Added packages","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}}}},"updated":{"type":"array","description":"Updated packages","items":{"type":"object","properties":{"name":{"type":"string"},"fromVersion":{"type":"string"},"toVersion":{"type":"string"}}}},"removed":{"type":"array","description":"Removed packages","items":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}}}}},"required":["added","updated","removed"]},"CumulativeChangesDto":{"type":"object","properties":{"packages":{"description":"Package changes","allOf":[{"$ref":"#/components/schemas/PackageChangesDto"}]},"summary":{"type":"object","description":"Summary metrics","properties":{"totalPackageChanges":{"type":"number"},"totalCommits":{"type":"number"},"totalWorkItems":{"type":"number"}}},"cumulativeSummary":{"type":"object","description":"Additional cumulative metrics","properties":{"estimatedDeploymentTime":{"type":"number","description":"Estimated time in minutes"}}}},"required":["packages","summary","cumulativeSummary"]},"BranchGroupedCandidatesDto":{"type":"object","properties":{"byBranch":{"type":"object","description":"Candidates grouped by branch","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/SimplifiedCandidateDto"}}},"all":{"description":"Flat list of all candidates (for backward compatibility)","type":"array","items":{"$ref":"#/components/schemas/SimplifiedCandidateDto"}}},"required":["byBranch","all"]},"RollingAnalysisSummaryDto":{"type":"object","properties":{"deploymentPipeline":{"description":"Deployment pipeline state","allOf":[{"$ref":"#/components/schemas/DeploymentPipelineDto"}]},"progressMetrics":{"description":"Progress tracking metrics","allOf":[{"$ref":"#/components/schemas/ProgressMetricsDto"}]},"baselineToLatestSummary":{"description":"Summary from baseline to latest","allOf":[{"$ref":"#/components/schemas/BaselineToLatestSummaryDto"}]},"branchAnalysis":{"description":"Branch analysis if multiple branches involved","allOf":[{"$ref":"#/components/schemas/BranchAnalysisDto"}]}},"required":["deploymentPipeline","progressMetrics","baselineToLatestSummary"]},"DeploymentPipelineDto":{"type":"object","properties":{"environmentStatus":{"description":"Status of each environment","type":"array","items":{"$ref":"#/components/schemas/EnvironmentPipelineStatusDto"}},"blockers":{"description":"Identified blockers","type":"array","items":{"$ref":"#/components/schemas/PipelineBlockerDto"}}},"required":["environmentStatus"]},"EnvironmentPipelineStatusDto":{"type":"object","properties":{"environment":{"type":"string","description":"Environment name"},"currentRelease":{"type":"string","description":"Currently deployed release"},"candidatesInQueue":{"description":"Release candidates queued for this environment","type":"array","items":{"type":"string"}}},"required":["environment","candidatesInQueue"]},"PipelineBlockerDto":{"type":"object","properties":{"environment":{"type":"string","description":"Blocked environment"},"blockedCandidate":{"type":"string","description":"Blocked candidate release name"},"reason":{"type":"string","description":"Reason for blockage"}},"required":["environment","blockedCandidate","reason"]},"ProgressMetricsDto":{"type":"object","properties":{"candidatesFullyDeployed":{"type":"number","description":"Number of fully deployed candidates"},"candidatesInProgress":{"type":"number","description":"Number of candidates in progress"},"candidatesPending":{"type":"number","description":"Number of pending candidates"},"estimatedTimeToFullDeployment":{"type":"number","description":"Estimated time to deploy all candidates (minutes)"}},"required":["candidatesFullyDeployed","candidatesInProgress","candidatesPending"]},"BaselineToLatestSummaryDto":{"type":"object","properties":{"totalCandidates":{"type":"number","description":"Total number of candidates"},"totalUniqueWorkItems":{"type":"number","description":"Total unique work items"},"totalUniqueCommits":{"type":"number","description":"Total unique commits"},"packageProgressions":{"description":"How packages evolved through candidates","type":"array","items":{"$ref":"#/components/schemas/PackageProgressionDto"}}},"required":["totalCandidates","totalUniqueWorkItems","totalUniqueCommits","packageProgressions"]},"PackageProgressionDto":{"type":"object","properties":{"name":{"type":"string","description":"Package name"},"journey":{"type":"array","description":"Version journey through candidates","items":{"type":"object","properties":{"version":{"type":"string"},"candidateIndex":{"type":"number","description":"-1 for baseline"}}}}},"required":["name","journey"]},"BranchAnalysisDto":{"type":"object","properties":{"mainBranch":{"type":"string","description":"Main branch name"},"featureBranches":{"type":"array","description":"Feature branch analysis","items":{"type":"object","properties":{"branch":{"type":"string"},"candidateCount":{"type":"number"},"firstCandidate":{"type":"string"},"lastCandidate":{"type":"string"}}}}},"required":["mainBranch","featureBranches"]}}},"paths":{"/sfp/api/release-candidates/rolling-analysis/{repository}/{domain}":{"get":{"operationId":"ReleaseCandidatesController_getRollingAnalysis","summary":"Get rolling analysis from baseline to latest candidate","description":"Performs comprehensive rolling analysis showing progression from last completed release to latest candidate. Results are cached (TTL configurable via ROLLING_ANALYSIS_CACHE_TTL_SECONDS env var, default 15 minutes).","parameters":[{"name":"repository","required":true,"in":"path","description":"Repository identifier (e.g., flxbl-io/sf-core)","schema":{"type":"string"}},{"name":"domain","required":true,"in":"path","description":"Domain name (e.g., core, auth, origination)","schema":{"type":"string"}},{"name":"branch","required":false,"in":"query","description":"Filter by branch (e.g., main, develop)","schema":{"type":"string"}},{"name":"includeChangelog","required":false,"in":"query","description":"Include package changelogs (default: false)","schema":{"type":"boolean"}},{"name":"force","required":false,"in":"query","description":"Bypass cache and fetch fresh data (default: false)","schema":{"type":"boolean"}},{"name":"X-Cache-Key","in":"header","description":"Cache key used for this request","required":false,"schema":{"type":"string"}},{"name":"X-Cache-Status","in":"header","description":"HIT if served from cache, MISS if freshly computed","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Rolling analysis data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollingAnalysisDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Candidates"]}}}}
```

## Get environment-specific progression analysis

> Analyzes progression for a specific environment including pending candidates

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/release-candidates/rolling-analysis/{repository}/{domain}/environment/{environment}":{"get":{"operationId":"ReleaseCandidatesController_getEnvironmentProgression","summary":"Get environment-specific progression analysis","description":"Analyzes progression for a specific environment including pending candidates","parameters":[{"name":"repository","required":true,"in":"path","description":"Repository identifier (e.g., myorg/myrepo)","schema":{"type":"string"}},{"name":"domain","required":true,"in":"path","description":"Domain name","schema":{"type":"string"}},{"name":"environment","required":true,"in":"path","description":"Environment name","schema":{"type":"string"}},{"name":"includeChangelog","required":false,"in":"query","description":"Include package changelogs","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Environment progression analysis"},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Candidates"]}}}}
```

## Assess deployment risk for next candidate

> Provides risk assessment for the next deployment to a specific environment

```json
{"openapi":"3.0.0","info":{"title":"sfp server","version":"51.3.0"},"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"JWT","type":"http","in":"header"}}},"paths":{"/sfp/api/release-candidates/rolling-analysis/{repository}/{domain}/environment/{environment}/risk":{"get":{"operationId":"ReleaseCandidatesController_assessDeploymentRisk","summary":"Assess deployment risk for next candidate","description":"Provides risk assessment for the next deployment to a specific environment","parameters":[{"name":"repository","required":true,"in":"path","description":"Repository identifier (e.g., myorg/myrepo)","schema":{"type":"string"}},{"name":"domain","required":true,"in":"path","description":"Domain name","schema":{"type":"string"}},{"name":"environment","required":true,"in":"path","description":"Environment name","schema":{"type":"string"}}],"responses":{"200":{"description":"Deployment risk assessment"},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Candidates"]}}}}
```
