Damir Zekić's wroclove.rb 2018 talk subtitled '2016: A Debugging Odyssey in Six Chapters with an Epilogue'. Recounts debugging a silent performance bug where a Rails app using Spring and Guard slowed down more and more on every code reload. Walks through: (1) reproducing the bug, (2) git bisect plus a custom linear-search Ruby script to find the first bad commit (complicated by missing bundle install, missing db:migrate, and a deleted colleague's personal JS gem), (3) hypothesizing a memory leak and using heap dumps and the heapy gem, learning that Ruby doesn't return memory to the OS and observing suspiciously long-lived class DSL objects, (4) rendering rails-startup flame graphs across multiple boots (Safari could open them when Chrome crashed) and spotting a growing function in ActionDispatch::Routing::RouteSet#clear, (5) digging into Rails code to find it clears and rebuilds the URL/path helper modules on every reload, then benchmarking undef_method scaling super-linearly, and diving into Ruby's C source where undef_method adds a placeholder method and spends half its time clearing the method cache, (6) rooting it in the 'monolith' framework mounting business-action controllers at boot, surviving Spring's fork, and accumulating across reloads. Closes with the lesson 'Know thy app' (including your framework and libraries) and an epilogue about ActiveSupport's DescendantsTracker keeping classes alive. Also announces 'granite' — the open-sourced successor to 'monolith' — as a business-actions architecture gem.