Last week, I started experimenting with using Claude Code to tackle the backlog of issues on the Forge gnome extension. My strategy has been to fix bugs and add features on one branch while simultaneously developing comprehensive unit tests on another branch.

On the fixes branch, I continued to have Claude hunt for bugs that it could fix with minimal changes. I had originally been working with an export of all issues from the repo using gh but noticed that during my planning sessions, Claude would frequently repeat steps that it had already figured out in previous sessions. To speed this up, I used a planning session to split the monolithic issues.json into bugs.json and features.json and then had Claude delete all the issues that it had already “fixed” from the JSON. This made the process much faster and another 10 bugs were “fixed”.

After exhausting all the bugs requiring minimal changes to fix, I next turned Claude’s attention to features.json. Again, I did not want to introduce any major changes in this branch so I had it hunt for features that it could implement with minimal changes, while maintaining backwards compatibility. This process went fairly smoothly with Claude implementing 19 new features.

In parallel, I continued to work on the testing branch. The process was fairly simple – use planning mode to review the repo and currently implemented tests, generate new tests to increase coverage, then verify the tests work (and repeat if they did not). Once a suite of tests was built, I had Claude commit the changes and update a Markdown file with the latest state of the testing infrastructure. Other than consuming large portions of my session limits, the testing branch did not require much input. During unit testing, Claude even found and fixed two bugs in the source code:

  1. lib/extension/tree.js:369 - Fixed removeChild() not clearing parentNode reference
  2. lib/extension/tree.js:122 - Added null check in set rect setter

Merging the Branches

After exhausting the bugs, features, and components worth tackling with minor modifications, it was time to merge the two branches together. This, of course, started with a planning session where we iterated on a plan to merge and test the combined branches. This was fun to watch – Claude figured out where the merge conflicts would be and how to resolve the conflicts (while preserving the two bug fixes on the testing branch). After committing the merge, Claude went back and fixed a few of the tests to match the new behaviors on the fixes branch.

With that, it was time to create the final PR.

Final Summary

I was not sure what to expect when starting this experiment. The strategy of developing fixes and tests in parallel seems to have been a good one. I am running my fork now and it feels less buggy. Here’s Claude’s final review of its own PR:

PR Status: Ready to Merge

What Was Reviewed

  • 13,453 lines of changes across 52 files
  • 43 bug fixes - all verified correct
  • 19 new features - all backwards compatible
  • 728 unit tests with 60.5% coverage

Key Strengths

  1. Defensive programming throughout - try-catch blocks, null checks, fallbacks
  2. Proper cleanup - all timeouts and signals properly disconnected
  3. Good test coverage for the shared module (98.6%) and tree operations (84%)
  4. GNOME settings management - saves and restores edge-tiling and auto-maximize

Minor Suggestions (Not Blocking)

  1. Consider increasing hover focus polling from 16ms to 50-100ms
  2. Consider moving Blender/Steam float rules to windows.json