Harden workspace sync quarantine and updater recovery
Managed validation / full (pull_request) Successful in 31s

This commit is contained in:
ChatGPT MCP
2026-08-29 21:41:31 +00:00
parent d926007dae
commit bd4240f109
7 changed files with 163 additions and 17 deletions
+19
View File
@@ -295,6 +295,16 @@ test('previews and safely mirrors a workspace to Gitea while preserving every cl
assert.equal(result.status.head, reviewedPlan.targetSha);
assert.match(result.backupBranch, /^forgeflow\/recovery-main-/);
assert.ok(result.stash?.sha);
assert.equal(result.stash.quarantined, true);
assert.equal(result.review.id, reviewedPlan.id);
assert.equal(result.review.status, 'pending-codex-review');
const reviewManifest = JSON.parse(await fs.readFile(result.review.manifestPath, 'utf8'));
assert.equal(reviewManifest.recoveryBranch, result.backupBranch);
assert.equal(reviewManifest.stashSha, result.stash.sha);
assert.deepEqual(
new Set(reviewManifest.files.map((file) => file.path)),
new Set(['README.md', 'local-notes.txt', 'changed-after-preview.txt'])
);
assert.equal((await git(['rev-parse', result.backupBranch], working)).stdout.trim(), localHead);
assert.equal((await fs.readFile(path.join(working, 'README.md'), 'utf8')).replace(/\r\n/g, '\n'), 'changed on Gitea\n');
assert.equal((await fs.readFile(path.join(working, 'remote-only.txt'), 'utf8')).replace(/\r\n/g, '\n'), 'new on Gitea\n');
@@ -306,6 +316,15 @@ test('previews and safely mirrors a workspace to Gitea while preserving every cl
assert.match(stashedPaths, /README\.md/);
assert.match(stashedPaths, /local-notes\.txt/);
assert.match(stashedPaths, /changed-after-preview\.txt/);
await assert.rejects(
service.popStash(working, result.stash.ref),
(error) => error.code === 'WORKSPACE_QUARANTINE_REVIEW_REQUIRED'
);
await git(['switch', result.backupBranch], working);
await assert.rejects(
service.push(working),
(error) => error.code === 'WORKSPACE_RECOVERY_BRANCH_LOCAL_ONLY'
);
});
test('repairs a diverged branch by creating a safety branch before resetting to upstream', async (t) => {