| … | … | @@ -0,0 +1,174 @@ | |
| 144 | + | Effect.catchCause((cause) => | |
| 145 | + | Effect.gen(function* () { | |
| 146 | + | // Undo partial publication if persistence is unavailable, including children that inherited it. | |
| 147 | + | yield* git.renameBranch({ | |
🟠 High orchestration-v2/TemporaryBranchNaming.ts:147
If publication updates one sharer and a later update fails, this handler renames Git back to oldBranch, but a failure in sharing(renamed.branch) or a rollback dispatch aborts compensation. The already-updated thread then points to renamed.branch, which no longer exists, and attempted prevents another naming pass; persist and retry rollback reconciliation so a storage failure cannot abandon it.
No longer relevant as of bf5907721000daa03b3d25faac742f0f7640ee83
Fixed in bf59077. After Git rollback completes once, a separate scoped metadata phase retries reads and CAS-guarded writes with capped backoff; it never retries the completed Git rename. A real-Git/two-persisted-sharer regression fails before and now recovers both rows after a transient rollback-write failure. No-progress receipts still terminate. This is in-memory transient recovery: shutdown cancels it, restart does not resume it, and Git rollback failure retains its existing path; no cross-restart durability is claimed. Both R5 reviewers verified this scope.