{"record":{"id":"01bf04ec97a5bce5","repo":"Yeachan-Heo/oh-my-codex","slug":"canonical-scale-up-rollback-tracking-verification","errorCode":null,"errorMessage":"canonical_scale_up_rollback_tracking_verification_failed","messagePattern":"canonical_scale_up_rollback_tracking_verification_failed","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/team/scaling.ts","lineNumber":826,"sourceCode":"          };\n          const trackedManifestBytes = currentManifestBytes === null\n            ? null\n            : JSON.stringify({\n              ...(JSON.parse(currentManifestBytes) as Record<string, unknown>),\n              workers: trackedConfig.workers,\n              worker_count: trackedConfig.worker_count,\n              next_worker_index: trackedConfig.next_worker_index,\n            }, null, 2);\n          await commitTeamMembershipTaskTransaction(sanitized, leaderCwd, {\n            baseGeneration: currentConfig.config_generation ?? 0,\n            tasks: [],\n            config: { oldBytes: currentConfigBytes, newBytes: JSON.stringify(trackedConfig, null, 2) },\n            manifest: { oldBytes: currentManifestBytes, newBytes: trackedManifestBytes },\n            recoverToNewOnFailure: true,\n          });\n          const verified = await readTeamConfig(sanitized, leaderCwd);\n          if (!verified || rollbackWorkers.some((worker) => !verified.workers.some((entry) => entry.name === worker.name && entry.pane_id === worker.pane_id))) {\n            throw new Error('canonical_scale_up_rollback_tracking_verification_failed');\n          }\n          Object.assign(config, verified);\n        });\n      } catch (trackingError) {\n        return { ok: false, error: `scale_up_rollback_membership_persistence_failed:${String(trackingError)}` };\n      }\n\n      const cleanupDebt: string[] = [];\n      try {\n        await removeDispatchRequestsForWorkers(sanitized, [...rollbackWorkerNames], leaderCwd);\n      } catch (rollbackError) {\n        cleanupDebt.push(`authoritative_dispatch_cleanup_failed:${String(rollbackError)}`);\n      }\n      const rollbackPaneIds = [...new Set([\n        ...rollbackWorkers.map((worker) => worker.pane_id),\n        context.paneId,\n      ].filter((paneId): paneId is string => typeof paneId === 'string' && paneId.trim().startsWith('%')))];\n      const resolvedPaneIds = new Set<string>();","sourceCodeStart":808,"sourceCodeEnd":844,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/team/scaling.ts#L808-L844","documentation":"Thrown during scaleUp rollback: after persisting the rolled-back (old) config/manifest, re-reading the team config fails to verify that all rollback workers are present with matching name and pane_id — the rollback may not have fully persisted.","triggerScenarios":"A scale-up failure triggers rollback; the atomic config rewrite succeeds but verification finds missing or mismatched worker entries (name/pane_id) in the persisted config.","commonSituations":"Concurrent writers to team config during rollback, crash mid-persist, or injected failure testing of rollback persistence.","solutions":["Re-read the team config and compare worker entries against expected rollback membership","If inconsistent, restore the config from the oldBytes captured in the transaction record or recreate the team","Avoid concurrent scaling/shutdown operations on the same team"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// after any scaleUp failure, verify membership consistency\nconst cfg = await readTeamConfig(name, cwd); const ok = expected.every(w => cfg?.workers.some(e => e.name === w.name && e.pane_id === w.pane_id));","typeGuard":null,"tryCatchPattern":"try { await scaleUp(...) } catch (e) { if (e.message.includes('rollback_tracking_verification_failed')) await restoreConfigFromBackup(); else throw e; }","preventionTips":["Back up team config before scaling","Never run concurrent scaling or shutdown on one team","Disable failure-injection env vars outside tests"],"tags":["scaling","rollback","persistence","verification"],"backgroundTag":"rollback-verification-failed","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}