{"slug": "found-a-useful-open-source-repo-called-undoable", "title": "Found a useful open-source repo called Undoable", "summary": "A new open-source tool called Undoable helps coding assistants make software changes reversible by planning, reviewing, splitting, testing, and rolling back modifications. The tool integrates with Claude, Codex, Cursor, and other assistants to catch rollback risks before merge, emphasizing that reversibility enables speed under uncertainty.", "body_md": "Make every code change reversible.\n\nUndoable is a multi-agent instruction pack for Claude, Codex, Antigravity, Cursor, Windsurf, Copilot Chat, and other coding assistants.\n\nIt teaches agents to plan, review, split, test, and roll back software changes with one operating principle:\n\nGood software changes are reversible.\n\nReversibility is not bureaucracy. It is speed under uncertainty.\n\nMost teams already know how to revert a commit. That is not the hard part.\n\nThe hard part is making sure a change can be safely backed out when production is already under pressure.\n\nA revert is easy only when the original change was designed for it:\n\n- behavior changes are not tangled with formatting, refactors, or dependency upgrades\n- migrations preserve old data and old clients long enough to roll back\n- fallback paths are removed after evidence, not in the same risky PR\n- rollouts have flags, guardrails, monitoring, and rollback triggers\n- tests verify both the new behavior and the old behavior you may need again\n\nUndoable helps your coding assistant catch those problems before merge.\n\nUndoable turns prompts like this:\n\n\"Refactor checkout, change retry behavior, upgrade SDK, and remove old fallback in one PR.\"\n\nInto a safer plan:\n\n\"Split into: mechanical refactor, SDK upgrade, behavior change behind flag, fallback cleanup later, rollback plan included.\"\n\nIt is not a generic code reviewer. Generic reviewers ask:\n\n\"Is this correct?\"\n\nUndoable asks:\n\n\"If this is wrong, can we safely back it out?\"\n\nUse Undoable before or during:\n\n- risky PRs\n- database, API, or data migrations\n- dependency upgrades\n- feature rollouts\n- large refactors\n- cleanup that removes fallback paths\n- changes that mix formatting, refactoring, and behavior\n\nExample requests:\n\n- \"Use Undoable to audit this diff.\"\n- \"Make this migration reversible.\"\n- \"Split this PR into undoable commits.\"\n- \"Write the rollback plan before implementation.\"\n- \"What would make this change scary to revert?\"\n\nCopy the relevant instruction file into your assistant's instruction, rule, skill, or plugin mechanism.\n\n| Assistant/workflow | Use this |\n|---|---|\n| Claude / skill-based assistants |\n|\n\n[AGENTS.md](/AkhilNam/undoable/blob/main/AGENTS.md)[.codex-plugin/plugin.json](/AkhilNam/undoable/blob/main/.codex-plugin/plugin.json)[.claude-plugin/plugin.json](/AkhilNam/undoable/blob/main/.claude-plugin/plugin.json)[.cursor/rules/undoable.mdc](/AkhilNam/undoable/blob/main/.cursor/rules/undoable.mdc)[.windsurf/rules/undoable.md](/AkhilNam/undoable/blob/main/.windsurf/rules/undoable.md)[.github/copilot-instructions.md](/AkhilNam/undoable/blob/main/.github/copilot-instructions.md)[prompts/undoable.md](/AkhilNam/undoable/blob/main/prompts/undoable.md)Tool-specific notes live in [adapters](/AkhilNam/undoable/blob/main/adapters). Native file mapping is documented in [docs/agent-portability.md](/AkhilNam/undoable/blob/main/docs/agent-portability.md).\n\nUndoable supports six modes:\n\n`plan`\n\n: design a reversible implementation before coding.`diff`\n\n: audit an existing diff for rollback risk.`split`\n\n: divide mixed work into reversible commits or PRs.`rollback`\n\n: write the backout plan before merge or deploy.`migrate`\n\n: handle schema, data, API, and compatibility changes.`pr`\n\n: produce PR review notes and merge wording focused on reversibility.\n\nIf you are unsure which mode to use, start with:\n\n```\nUse Undoable to audit this diff.\n```\n\n**Verdict:** Risky to undo\n\n**Main risks**\n\n- Retry behavior changed in the same PR as a checkout helper rename, so reverting the behavior also reverts review-neutral refactor work.\n- The fallback path was deleted before the new path has a compatibility window, so rollback may require rebuilding deleted code under pressure.\n- Tests only cover the new behavior, so rollback may silently break old clients.\n\n**Recommended split**\n\n- Mechanical helper rename with no behavior change.\n- SDK upgrade with version-specific tests.\n- Retry behavior change behind a flag or scoped guardrail.\n- Fallback cleanup after rollout evidence.\n\n**Rollback plan**\n\n- Disable the feature flag or restore the old route first.\n- Revert the behavior commit without reverting the mechanical refactor if it is safe.\n- Restore the fallback path if old clients or old data fail.\n- Run targeted checkout and API contract tests before and after rollback.\n\n**Verification commands**\n\n```\nnpm test -- checkout\nnpm test -- api-contract\n```\n\n\"Revert it\" is a recovery action. Undoable is a design constraint.\n\nTelling an agent to revert after the fact does not solve:\n\n- a migration that dropped data needed by the old code\n- a PR where the bug fix is tangled with a 60-file formatting change\n- an API change that broke old clients without a compatibility window\n- a dependency upgrade mixed with behavior changes, making failures hard to isolate\n- a deleted fallback path that is no longer available when rollback is needed\n- missing tests for the old behavior you are trying to restore\n\nUndoable makes the change cheaper to back out before the incident exists.\n\nUndoable includes a small offline starter eval suite in [benchmark/fixtures](/AkhilNam/undoable/blob/main/benchmark/fixtures). It measures whether an assistant detects reversibility risks, proposes useful splits, and includes rollback requirements.\n\nIt is intentionally modest. It is a starter benchmark, not a definitive scientific benchmark.\n\nRun it:\n\n```\npython benchmark/run_eval.py\npython benchmark/run_eval.py --predictions benchmark/predictions/undoable_sample_agent.json\npython benchmark/run_eval.py --predictions benchmark/predictions/undoable_sample_agent.json --strict\n```\n\nThe evaluator reports:\n\n- risk detection recall\n- risk precision\n- risk F1\n- split quality\n- rollback completeness\n- overall score\n- strict mode false-positive penalty\n\nSample results from the included predictions:\n\n| Prediction file | Strict | Risk F1 | Split Quality | Rollback Completeness | Overall |\n|---|---|---|---|---|---|\n`benchmark/predictions/baseline_generic_agent.json` |\nyes | 0.613 | 0.323 | 0.292 | 0.409 |\n`benchmark/predictions/undoable_sample_agent.json` |\nyes | 0.932 | 0.969 | 0.958 | 0.953 |\n\nYou can compare Claude, Codex, Antigravity, Cursor, Windsurf, Copilot Chat, or another assistant against the same fixtures.\n\n- Open a fresh assistant session.\n- Provide\n[prompts/undoable.md](/AkhilNam/undoable/blob/main/prompts/undoable.md). - Provide one fixture input from\n[benchmark/fixtures](/AkhilNam/undoable/blob/main/benchmark/fixtures). - Ask for JSON only using\n[evals/prediction_schema.json](/AkhilNam/undoable/blob/main/evals/prediction_schema.json). - Repeat for all fixtures.\n- Save the combined output under\n`benchmark/predictions/name.json`\n\n. - Score it with\n`python benchmark/run_eval.py --predictions benchmark/predictions/name.json --strict`\n\n.\n\nUse [evals/run_manual_eval.md](/AkhilNam/undoable/blob/main/evals/run_manual_eval.md) for the full manual workflow.\n\n[skills/undoable/SKILL.md](/AkhilNam/undoable/blob/main/skills/undoable/SKILL.md): canonical skill instructions.[prompts](/AkhilNam/undoable/blob/main/prompts): paste-in prompts for general assistants.[adapters](/AkhilNam/undoable/blob/main/adapters): tool-specific usage notes.[docs/agent-portability.md](/AkhilNam/undoable/blob/main/docs/agent-portability.md): native instruction file map.[benchmark](/AkhilNam/undoable/blob/main/benchmark): offline fixtures, predictions, evaluator, and sample results.[evals](/AkhilNam/undoable/blob/main/evals): protocol, schema, rubric, comparison template, and labeling guide.[docs](/AkhilNam/undoable/blob/main/docs): philosophy, modes, methodology, benchmark design, and launch copy.\n\n- Static/offline repo.\n- No API calls.\n- No external Python packages.\n- Benchmark scripts use Python stdlib only.\n- Adapter docs avoid unsupported install claims.\n\nContributions are welcome when they make Undoable sharper, easier to use, or easier to evaluate. Keep examples realistic, benchmark labels deterministic, and every warning connected to rollback difficulty.\n\nSee [CONTRIBUTING.md](/AkhilNam/undoable/blob/main/CONTRIBUTING.md).", "url": "https://wpnews.pro/news/found-a-useful-open-source-repo-called-undoable", "canonical_source": "https://github.com/AkhilNam/undoable", "published_at": "2026-06-17 06:23:43+00:00", "updated_at": "2026-06-17 06:52:55.694574+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-agents", "large-language-models", "ai-safety"], "entities": ["Undoable", "Claude", "Codex", "Cursor", "Windsurf", "Copilot Chat", "Antigravity", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/found-a-useful-open-source-repo-called-undoable", "markdown": "https://wpnews.pro/news/found-a-useful-open-source-repo-called-undoable.md", "text": "https://wpnews.pro/news/found-a-useful-open-source-repo-called-undoable.txt", "jsonld": "https://wpnews.pro/news/found-a-useful-open-source-repo-called-undoable.jsonld"}}