{"id":8095235,"date":"2025-05-14T13:26:41","date_gmt":"2025-05-14T20:26:41","guid":{"rendered":"https:\/\/aadev22.local\/?post_type=aa_event_session&#038;p=8095235"},"modified":"2025-05-14T13:26:43","modified_gmt":"2025-05-14T20:26:43","slug":"ratcheting-to-zero-how-incremental-constraints-eliminate-technical-debt","status":"publish","type":"aa_event_session","link":"https:\/\/agilealliance.org\/resources\/sessions\/ratcheting-to-zero-how-incremental-constraints-eliminate-technical-debt\/","title":{"rendered":"Ratcheting to Zero: How Incremental Constraints Eliminate Technical Debt"},"content":{"rendered":"\n<p><em>Below is an AI summary of the event. <br><\/em><br>In this tech talk, Dave Mosher\u2014staff software consultant at Test Double\u2014presents <strong>\u201cRatcheting to Zero: How Incremental Constraints Eliminate Technical Debt.\u201d<\/strong> Drawing from a real-world case study, Dave explains how his team tackled over <strong>3,300 ESLint warnings<\/strong> in a JavaScript-to-TypeScript migration by building a ratcheting system into their CI\/CD pipeline.<\/p>\n\n\n\n<p>The talk walks through how the team:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Migrated their codebase using <code>any<\/code> types, which initially offered little real type safety.<\/li>\n\n\n\n<li>Introduced <strong>automated guardrails<\/strong> that capped the maximum number of lint warnings allowed.<\/li>\n\n\n\n<li>Blocked regressions by enforcing these caps via shell scripts in GitHub Actions.<\/li>\n\n\n\n<li>Used <strong>teamwide prioritization<\/strong> to rank ESLint rules by impact (e.g., those breaking hot reloads).<\/li>\n\n\n\n<li>Adapted to production fires with bypass mechanisms while maintaining overall momentum.<\/li>\n\n\n\n<li>Gradually lowered the cap over 10 months to reach zero warnings\u2014without halting feature development.<\/li>\n<\/ul>\n\n\n\n<p>Dave also highlights how this method:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Shifted the team&#8217;s culture, increasing engagement across disciplines and seniority.<\/li>\n\n\n\n<li>Provided leadership with visibility into progress and timelines.<\/li>\n\n\n\n<li>Avoided the pitfalls of \u201ctech debt sprints\u201d by <strong>amortizing improvements over time.<\/strong><\/li>\n\n\n\n<li>Can be extended to other areas like test coverage, accessibility, dependency pruning, and infrastructure cleanup\u2014<strong>anything quantifiable can be ratcheted.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>The talk concludes with practical takeaways on pairing automation with adaptability, and how focusing on <strong>\u201cthe how\u201d over Agile dogma<\/strong> can empower teams to meaningfully reduce technical debt while continuing to deliver value.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A practical case study on how Dave Mosher&#8217;s team used incremental ratcheting in CI\/CD to eliminate 3,300+ ESLint warnings and reduce technical debt without pausing feature development.<\/p>\n","protected":false},"author":8033092,"featured_media":8095117,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","categories":[906],"tags":[],"event_session_cat":[],"session_aud_level":[496],"event_session_type":[],"content_source":[1618],"event_session_tags":[],"class_list":["post-8095235","aa_event_session","type-aa_event_session","status-publish","has-post-thumbnail","hentry","category-technology","session_aud_level-practicing","content_source-agile-tech-talks"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/aa_event_session\/8095235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/aa_event_session"}],"about":[{"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/types\/aa_event_session"}],"author":[{"embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/users\/8033092"}],"replies":[{"embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/comments?post=8095235"}],"version-history":[{"count":0,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/aa_event_session\/8095235\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/media\/8095117"}],"wp:attachment":[{"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/media?parent=8095235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/categories?post=8095235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/tags?post=8095235"},{"taxonomy":"event_session_cat","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/event_session_cat?post=8095235"},{"taxonomy":"session_aud_level","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/session_aud_level?post=8095235"},{"taxonomy":"event_session_type","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/event_session_type?post=8095235"},{"taxonomy":"content_source","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/content_source?post=8095235"},{"taxonomy":"event_session_tags","embeddable":true,"href":"https:\/\/agilealliance.org\/wp-json\/wp\/v2\/event_session_tags?post=8095235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}