# Release Calculator

## Analyze impact of including/excluding work items

> Calculate the impact of toggling work items on packages and linked releases

```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":{"CalculatorAnalysisRequestDto":{"type":"object","properties":{"releaseCandidateId":{"type":"string","description":"Release candidate ID"},"excludedWorkItems":{"description":"Work items to exclude","type":"array","items":{"type":"string"}},"includedWorkItems":{"description":"Work items to include","type":"array","items":{"type":"string"}},"mode":{"type":"string","description":"Calculator mode","enum":["include","exclude"],"default":"exclude"}},"required":["releaseCandidateId"]},"CalculatorAnalysisResultDto":{"type":"object","properties":{"candidateId":{"type":"string","description":"Release candidate ID"},"releaseName":{"type":"string","description":"Release name"},"original":{"description":"Original state before changes","allOf":[{"$ref":"#/components/schemas/OriginalStateDto"}]},"calculated":{"description":"Calculated state after changes","allOf":[{"$ref":"#/components/schemas/CalculatedStateDto"}]},"impact":{"description":"Impact summary","allOf":[{"$ref":"#/components/schemas/ImpactSummaryDto"}]},"warnings":{"description":"Warnings","type":"array","items":{"$ref":"#/components/schemas/CalculatorWarningDto"}},"suggestions":{"description":"Suggestions","type":"array","items":{"type":"string"}}},"required":["candidateId","releaseName","original","calculated","impact","warnings","suggestions"]},"OriginalStateDto":{"type":"object","properties":{"packages":{"description":"Original packages","type":"array","items":{"$ref":"#/components/schemas/PackageInfoDto"}},"workItems":{"description":"Original work items","type":"array","items":{"$ref":"#/components/schemas/WorkItemInfoDto"}},"totalCommits":{"type":"number","description":"Total commits"}},"required":["packages","workItems","totalCommits"]},"PackageInfoDto":{"type":"object","properties":{"package":{"type":"string","description":"Package name"},"path":{"type":"string","description":"Package directory path"},"versionNumber":{"type":"string","description":"Package version number"},"type":{"type":"string","description":"Package type"},"default":{"type":"boolean","description":"Whether this is the default package"},"dependencies":{"description":"Package dependencies","type":"array","items":{"type":"string"}},"domains":{"description":"Domains/release configs that include this package","type":"array","items":{"type":"string"}}},"required":["package","path","versionNumber"]},"WorkItemInfoDto":{"type":"object","properties":{"id":{"type":"string","description":"Work item ID"},"type":{"type":"string","description":"Work item type","enum":["jira","github","pr","other"]},"packageCount":{"type":"number","description":"Number of packages containing this work item"},"commitCount":{"type":"number","description":"Number of commits for this work item"}},"required":["id","type","packageCount","commitCount"]},"CalculatedStateDto":{"type":"object","properties":{"packages":{"description":"Remaining packages","type":"array","items":{"$ref":"#/components/schemas/PackageInfoDto"}},"workItems":{"description":"Remaining work items","type":"array","items":{"$ref":"#/components/schemas/WorkItemInfoDto"}},"excludedPackages":{"description":"Excluded packages","type":"array","items":{"$ref":"#/components/schemas/ExcludedPackageInfoDto"}},"totalCommits":{"type":"number","description":"Total commits after exclusion"}},"required":["packages","workItems","excludedPackages","totalCommits"]},"ExcludedPackageInfoDto":{"type":"object","properties":{"packageName":{"type":"string","description":"Package name"},"version":{"type":"string","description":"Package version"},"reason":{"type":"string","description":"Reason for exclusion","enum":["no-remaining-commits","user-excluded","dependency-excluded"]},"excludedWorkItems":{"description":"Work items excluded with this package","type":"array","items":{"type":"string"}},"excludedCommits":{"type":"number","description":"Number of commits excluded"}},"required":["packageName","version","reason","excludedWorkItems","excludedCommits"]},"ImpactSummaryDto":{"type":"object","properties":{"packagesRemoved":{"type":"number","description":"Number of packages removed"},"workItemsRemoved":{"type":"number","description":"Number of work items removed"},"commitsRemoved":{"type":"number","description":"Number of commits removed"},"linkedReleasesAffected":{"description":"Linked releases affected","type":"array","items":{"$ref":"#/components/schemas/LinkedReleaseImpactDto"}}},"required":["packagesRemoved","workItemsRemoved","commitsRemoved","linkedReleasesAffected"]},"LinkedReleaseImpactDto":{"type":"object","properties":{"release":{"type":"object","description":"Release information"},"impactType":{"type":"string","description":"Impact type","enum":["full","partial","cascade"]},"affectedPackages":{"description":"Affected packages","type":"array","items":{"type":"string"}},"severity":{"type":"string","description":"Severity level","enum":["low","medium","high","critical"]},"warning":{"type":"string","description":"Warning message"}},"required":["release","impactType","affectedPackages","severity","warning"]},"CalculatorWarningDto":{"type":"object","properties":{"type":{"type":"string","description":"Warning type","enum":["shared-commit","linked-release","partial-deployment","cascade-effect","incomplete-workitem"]},"severity":{"type":"string","description":"Warning severity","enum":["info","warning","critical"]},"message":{"type":"string","description":"Warning message"},"affectedPackages":{"description":"Affected packages","type":"array","items":{"type":"string"}},"affectedReleases":{"description":"Affected releases","type":"array","items":{"type":"string"}},"suggestion":{"type":"string","description":"Suggestion to resolve warning"}},"required":["type","severity","message"]}}},"paths":{"/sfp/api/release-candidates/calculator/analyze":{"post":{"operationId":"ReleaseCalculatorController_analyzeRelease","summary":"Analyze impact of including/excluding work items","description":"Calculate the impact of toggling work items on packages and linked releases","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorAnalysisRequestDto"}}}},"responses":{"200":{"description":"Analysis results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalculatorAnalysisResultDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Calculator"]}}}}
```

## Optimize release for specific work items

> Find optimal package configuration for given work items and constraints

```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":{"OptimizationRequestDto":{"type":"object","properties":{"releaseCandidateId":{"type":"string","description":"Release candidate ID"},"targetWorkItems":{"description":"Target work items to include","type":"array","items":{"type":"string"}},"constraints":{"description":"Optimization constraints","allOf":[{"$ref":"#/components/schemas/OptimizationConstraintsDto"}]}},"required":["releaseCandidateId","targetWorkItems"]},"OptimizationConstraintsDto":{"type":"object","properties":{"mustIncludePackages":{"description":"Packages that must be included","type":"array","items":{"type":"string"}},"mustExcludePackages":{"description":"Packages that must be excluded","type":"array","items":{"type":"string"}},"mustIncludeWorkItems":{"description":"Work items that must be included","type":"array","items":{"type":"string"}},"mustExcludeWorkItems":{"description":"Work items that must be excluded","type":"array","items":{"type":"string"}},"maxPackages":{"type":"number","description":"Maximum number of packages","minimum":1},"preferExcludePackages":{"description":"Packages to prefer excluding","type":"array","items":{"type":"string"}},"optimizationGoal":{"type":"string","description":"Optimization goal","enum":["minimal","safe","balanced"],"default":"balanced"}}},"OptimizationResultDto":{"type":"object","properties":{"includedPackages":{"description":"Included packages","type":"array","items":{"type":"string"}},"excludedPackages":{"description":"Excluded packages","type":"array","items":{"type":"string"}},"includedWorkItems":{"description":"Included work items","type":"array","items":{"type":"string"}},"excludedWorkItems":{"description":"Excluded work items","type":"array","items":{"type":"string"}},"totalCommits":{"type":"number","description":"Total commits"},"metrics":{"description":"Optimization metrics","allOf":[{"$ref":"#/components/schemas/OptimizationMetricsDto"}]},"suggestions":{"description":"Optimization suggestions","type":"array","items":{"$ref":"#/components/schemas/OptimizationSuggestionDto"}}},"required":["includedPackages","excludedPackages","includedWorkItems","excludedWorkItems","totalCommits","metrics","suggestions"]},"OptimizationMetricsDto":{"type":"object","properties":{"packageCount":{"type":"number","description":"Number of packages"},"workItemCount":{"type":"number","description":"Number of work items"},"commitCount":{"type":"number","description":"Number of commits"},"sharedCommitRatio":{"type":"number","description":"Ratio of shared commits","minimum":0,"maximum":1},"exclusionSafety":{"type":"number","description":"Exclusion safety score","minimum":0,"maximum":1}},"required":["packageCount","workItemCount","commitCount","sharedCommitRatio","exclusionSafety"]},"OptimizationSuggestionDto":{"type":"object","properties":{"type":{"type":"string","description":"Suggestion type","enum":["exclude-package","include-package","exclude-workitem","include-workitem"]},"target":{"type":"string","description":"Target package or work item"},"reason":{"type":"string","description":"Reason for suggestion"},"impact":{"type":"object","description":"Impact of applying suggestion"},"confidence":{"type":"string","description":"Confidence level","enum":["high","medium","low"]}},"required":["type","target","reason","impact","confidence"]}}},"paths":{"/sfp/api/release-candidates/calculator/optimize":{"post":{"operationId":"ReleaseCalculatorController_optimizeRelease","summary":"Optimize release for specific work items","description":"Find optimal package configuration for given work items and constraints","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizationRequestDto"}}}},"responses":{"200":{"description":"Optimization results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptimizationResultDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Calculator"]}}}}
```

## Get exclusion strategies

> Find safe exclusion strategies for reducing release size

```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":{"ExclusionStrategyDto":{"type":"object","properties":{"name":{"type":"string","description":"Strategy name"},"description":{"type":"string","description":"Strategy description"},"excludablePackages":{"description":"Packages that can be excluded","type":"array","items":{"type":"string"}},"requiredExclusions":{"description":"Work items that must be excluded","type":"array","items":{"type":"string"}},"safetyScore":{"type":"number","description":"Safety score","minimum":0,"maximum":1},"savings":{"description":"Savings from applying strategy","allOf":[{"$ref":"#/components/schemas/ExclusionStrategySavingsDto"}]}},"required":["name","description","excludablePackages","requiredExclusions","safetyScore","savings"]},"ExclusionStrategySavingsDto":{"type":"object","properties":{"packages":{"type":"number","description":"Number of packages to exclude"},"commits":{"type":"number","description":"Number of commits to exclude"},"percentage":{"type":"number","description":"Percentage reduction"}},"required":["packages","commits","percentage"]}}},"paths":{"/sfp/api/release-candidates/calculator/strategies/{candidateId}":{"get":{"operationId":"ReleaseCalculatorController_getExclusionStrategies","summary":"Get exclusion strategies","description":"Find safe exclusion strategies for reducing release size","parameters":[{"name":"candidateId","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}},{"name":"targetReduction","required":false,"in":"query","description":"Target reduction percentage (0-1, default: 0.2)","schema":{"type":"number"}}],"responses":{"200":{"description":"List of exclusion strategies","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExclusionStrategyDto"}}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Calculator"]}}}}
```

## Get dependency visualization data

> Get dependency graph data for visualization

```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":{"DependencyVisualizationDto":{"type":"object","properties":{"nodes":{"type":"object","description":"Graph nodes"},"edges":{"description":"Graph edges","type":"array","items":{"$ref":"#/components/schemas/VisualizationEdgeDto"}},"statistics":{"description":"Statistics","allOf":[{"$ref":"#/components/schemas/VisualizationStatisticsDto"}]}},"required":["nodes","edges","statistics"]},"VisualizationEdgeDto":{"type":"object","properties":{"from":{"type":"string","description":"Source node ID"},"to":{"type":"string","description":"Target node ID"},"type":{"type":"string","description":"Edge type","enum":["contains","requires","shares"]}},"required":["from","to","type"]},"VisualizationStatisticsDto":{"type":"object","properties":{"totalWorkItems":{"type":"number","description":"Total work items"},"totalCommits":{"type":"number","description":"Total commits"},"totalPackages":{"type":"number","description":"Total packages"},"sharedCommitRatio":{"type":"number","description":"Shared commit ratio"}},"required":["totalWorkItems","totalCommits","totalPackages","sharedCommitRatio"]}}},"paths":{"/sfp/api/release-candidates/calculator/dependencies/{candidateId}":{"get":{"operationId":"ReleaseCalculatorController_getDependencyVisualization","summary":"Get dependency visualization data","description":"Get dependency graph data for visualization","parameters":[{"name":"candidateId","required":true,"in":"path","description":"Release candidate ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Dependency visualization data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependencyVisualizationDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Calculator"]}}}}
```

## Calculate minimal package set

> Find the minimal set of packages needed for specific work items

```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":{"MinimalPackageSetDto":{"type":"object","properties":{"packages":{"description":"Required packages","type":"array","items":{"type":"string"}},"additionalWorkItems":{"description":"Additional work items included","type":"array","items":{"type":"string"}},"rationale":{"type":"object","description":"Rationale for each package","additionalProperties":{"type":"string"}}},"required":["packages","additionalWorkItems","rationale"]}}},"paths":{"/sfp/api/release-candidates/calculator/minimal-package-set":{"post":{"operationId":"ReleaseCalculatorController_calculateMinimalPackageSet","summary":"Calculate minimal package set","description":"Find the minimal set of packages needed for specific work items","parameters":[],"responses":{"200":{"description":"Minimal package set","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MinimalPackageSetDto"}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"},"404":{"description":"Release candidate not found"}},"tags":["Release Calculator"]}}}}
```

## Batch analyze multiple scenarios

> Analyze multiple work item combinations in a single request

```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":{"CalculatorAnalysisResultDto":{"type":"object","properties":{"candidateId":{"type":"string","description":"Release candidate ID"},"releaseName":{"type":"string","description":"Release name"},"original":{"description":"Original state before changes","allOf":[{"$ref":"#/components/schemas/OriginalStateDto"}]},"calculated":{"description":"Calculated state after changes","allOf":[{"$ref":"#/components/schemas/CalculatedStateDto"}]},"impact":{"description":"Impact summary","allOf":[{"$ref":"#/components/schemas/ImpactSummaryDto"}]},"warnings":{"description":"Warnings","type":"array","items":{"$ref":"#/components/schemas/CalculatorWarningDto"}},"suggestions":{"description":"Suggestions","type":"array","items":{"type":"string"}}},"required":["candidateId","releaseName","original","calculated","impact","warnings","suggestions"]},"OriginalStateDto":{"type":"object","properties":{"packages":{"description":"Original packages","type":"array","items":{"$ref":"#/components/schemas/PackageInfoDto"}},"workItems":{"description":"Original work items","type":"array","items":{"$ref":"#/components/schemas/WorkItemInfoDto"}},"totalCommits":{"type":"number","description":"Total commits"}},"required":["packages","workItems","totalCommits"]},"PackageInfoDto":{"type":"object","properties":{"package":{"type":"string","description":"Package name"},"path":{"type":"string","description":"Package directory path"},"versionNumber":{"type":"string","description":"Package version number"},"type":{"type":"string","description":"Package type"},"default":{"type":"boolean","description":"Whether this is the default package"},"dependencies":{"description":"Package dependencies","type":"array","items":{"type":"string"}},"domains":{"description":"Domains/release configs that include this package","type":"array","items":{"type":"string"}}},"required":["package","path","versionNumber"]},"WorkItemInfoDto":{"type":"object","properties":{"id":{"type":"string","description":"Work item ID"},"type":{"type":"string","description":"Work item type","enum":["jira","github","pr","other"]},"packageCount":{"type":"number","description":"Number of packages containing this work item"},"commitCount":{"type":"number","description":"Number of commits for this work item"}},"required":["id","type","packageCount","commitCount"]},"CalculatedStateDto":{"type":"object","properties":{"packages":{"description":"Remaining packages","type":"array","items":{"$ref":"#/components/schemas/PackageInfoDto"}},"workItems":{"description":"Remaining work items","type":"array","items":{"$ref":"#/components/schemas/WorkItemInfoDto"}},"excludedPackages":{"description":"Excluded packages","type":"array","items":{"$ref":"#/components/schemas/ExcludedPackageInfoDto"}},"totalCommits":{"type":"number","description":"Total commits after exclusion"}},"required":["packages","workItems","excludedPackages","totalCommits"]},"ExcludedPackageInfoDto":{"type":"object","properties":{"packageName":{"type":"string","description":"Package name"},"version":{"type":"string","description":"Package version"},"reason":{"type":"string","description":"Reason for exclusion","enum":["no-remaining-commits","user-excluded","dependency-excluded"]},"excludedWorkItems":{"description":"Work items excluded with this package","type":"array","items":{"type":"string"}},"excludedCommits":{"type":"number","description":"Number of commits excluded"}},"required":["packageName","version","reason","excludedWorkItems","excludedCommits"]},"ImpactSummaryDto":{"type":"object","properties":{"packagesRemoved":{"type":"number","description":"Number of packages removed"},"workItemsRemoved":{"type":"number","description":"Number of work items removed"},"commitsRemoved":{"type":"number","description":"Number of commits removed"},"linkedReleasesAffected":{"description":"Linked releases affected","type":"array","items":{"$ref":"#/components/schemas/LinkedReleaseImpactDto"}}},"required":["packagesRemoved","workItemsRemoved","commitsRemoved","linkedReleasesAffected"]},"LinkedReleaseImpactDto":{"type":"object","properties":{"release":{"type":"object","description":"Release information"},"impactType":{"type":"string","description":"Impact type","enum":["full","partial","cascade"]},"affectedPackages":{"description":"Affected packages","type":"array","items":{"type":"string"}},"severity":{"type":"string","description":"Severity level","enum":["low","medium","high","critical"]},"warning":{"type":"string","description":"Warning message"}},"required":["release","impactType","affectedPackages","severity","warning"]},"CalculatorWarningDto":{"type":"object","properties":{"type":{"type":"string","description":"Warning type","enum":["shared-commit","linked-release","partial-deployment","cascade-effect","incomplete-workitem"]},"severity":{"type":"string","description":"Warning severity","enum":["info","warning","critical"]},"message":{"type":"string","description":"Warning message"},"affectedPackages":{"description":"Affected packages","type":"array","items":{"type":"string"}},"affectedReleases":{"description":"Affected releases","type":"array","items":{"type":"string"}},"suggestion":{"type":"string","description":"Suggestion to resolve warning"}},"required":["type","severity","message"]}}},"paths":{"/sfp/api/release-candidates/calculator/batch-analyze":{"post":{"operationId":"ReleaseCalculatorController_batchAnalyze","summary":"Batch analyze multiple scenarios","description":"Analyze multiple work item combinations in a single request","parameters":[],"responses":{"200":{"description":"Batch analysis results","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CalculatorAnalysisResultDto"}}}}},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Calculator"]}}}}
```

## Get preset exclusion scenarios

> Get common preset scenarios for quick analysis

```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/calculator/presets":{"get":{"operationId":"ReleaseCalculatorController_getPresetScenarios","summary":"Get preset exclusion scenarios","description":"Get common preset scenarios for quick analysis","parameters":[],"responses":{"200":{"description":"List of preset scenarios"},"403":{"description":"Forbidden - Requires role: member, owner, application"}},"tags":["Release Calculator"]}}}}
```
