InstallHub
Manual Resolution
When automated merge fails or the administrator wants to inspect and choose resolution field-by-field, manual resolution provides a side-by-side diff view and field-level decision making.
When Manual Resolution is Triggered
- No
defaultConflictStrategyis set and the import pauses for review - Automated merge fails due to a three-way conflict (both existing and package changed the same field)
- The administrator explicitly requests manual resolution via the API
Manual Resolution API Flow
1
Import Pauses
When conflicts are found and no default strategy is configured, the import returns 202 Accepted with the ConflictReport and a resumeUrl.
2
Get Conflict Diff
For each conflict, retrieve the full side-by-side diff to understand what would change.
GET /api/installhub/packages/{importId}/conflicts/{conflictId}/diff
3
Choose Resolution
For each conflict, choose Replace, Merge, or Skip.
POST /api/installhub/packages/{importId}/resume
{
"resolutions": [
{ "conflictId": "conf-001", "strategy": "Replace" },
{ "conflictId": "conf-002", "strategy": "Skip" }
]
}
4
Import Resumes
The import continues with the chosen strategies applied and completes normally.
Conflict Diff Response
GET /api/installhub/packages/{importId}/conflicts/conf-001/diff
{
"conflictId": "conf-001",
"artifactType": "RuleSet",
"artifactName": "ApprovalRules",
"existing": {
"version": "1.1.0",
"content": { "rules": [{ "ruleId": "r1", "condition": "amount < 750" }] }
},
"package": {
"version": "1.2.0",
"content": { "rules": [{ "ruleId": "r1", "condition": "amount < 1000" }, { "ruleId": "r3", "name": "HighValueAlert" }] }
},
"diff": {
"changed": [{ "path": "rules[0].condition", "existing": "amount < 750", "package": "amount < 1000" }],
"added": [{ "path": "rules[1]", "package": { "ruleId": "r3", "name": "HighValueAlert" } }],
"removed": []
},
"suggestedStrategies": ["Replace", "Merge", "Skip"]
}
Import Expiry
A paused import (waiting for conflict resolution) is held in memory for 24 hours. If the resumeUrl is not called within that time, the import is automatically cancelled and must be re-initiated.
CI/CD Pipelines Should Not Use Manual Resolution
Manual resolution requires a human in the loop. For automated pipelines, always set a
defaultConflictStrategy to prevent the import from pausing. Use dry-run mode first to preview conflicts before the real import.