Maintaining the Local Workshop: Robby Russell on Why Mending Is the Job

Open on YouTube ↗
Overview

Robby Russell, founder of the Rails consultancy Planet Argon, gave the closing keynote at Rails World 2026. The central question: when producing code is getting cheaper, where does the most valuable engineering work actually happen? Russell's answer is that much of it lies in tending the environment a team works inside. That environment is a "local workshop" of patterns, workarounds and unwritten rules built on top of Rails. It matters more now that AI coding agents have to rediscover all of it every time their context resets.

31 min read

Russell framed the talk as reporting rather than prediction. The observations come from Planet Argon's client work, from roughly eight years of podcast interviews, and from conference hallway conversations. Russell described their role as that of a "field correspondent": the talk offers "field notes" about what is already happening, not forecasts of where software engineering will be in five months or five years.

0:13

Four Ways to Build the Same Integration

The talk opened with a consulting engagement. A company with a mature Rails application had roughly doubled its engineering team, to about 40 or 50 engineers, in a little over a year. Over the years it had built hundreds of integrations while onboarding customers. Each integration did roughly the same thing: receive data, transform and validate it, send some of it elsewhere, handle errors, retry, log what happened, and notify someone when things went wrong.

Yet the codebase contained four different patterns for doing this. One came from an idea an engineer had read on another company's engineering blog years earlier. Another came from a different team's blog. A later hire experimented and added a third approach, and experiments kept accumulating. Each approach technically worked and made sense when it was introduced. The problem, Russell said, was that none of the earlier approaches ever went away.

Russell asked the audience to imagine being an engineer who had joined six months earlier. When you hit one of the older integrations, do you follow the pattern you think the team uses now, or bring the old code in line with it? If you start cleaning up, how far do you go? Sometimes you just need to make a quick change and get out, and that, Russell noted, is exactly how old patterns survive. Nobody commits a change saying they have decided to make the platform confusing for every future hire. It happens gradually, one decision on top of another.

The company asked Planet Argon to review the code, interview the engineers, and help choose which approach to standardize on. On the surface this looked like a routine architecture engagement. The team asked the engineers to explain the patterns, describe the friction, identify which constraints still applied, and say what they would reach for if they had to build a new integration tomorrow. According to Russell, it quickly became clear that architecture was not the real problem. The problem was that nobody was willing to be the person who said, "We're doing it this way now."

Russell said they understood why. Most of the people working in the codebase had inherited the patterns rather than created them, and many had joined after the original engineers left. For some it was their first large Rails application. The company saw that as a strength of Rails: engineers with little Rails experience could become productive quickly. But those engineers arrived to find four competing approaches running in production, all apparently working. Who were they to decide which no longer fit?

How Oral Traditions Form

Russell pointed to a second reason this happens. Engineers are rarely hired with instructions to reconsider the development environment. They are hired to ship features, fix bugs and shorten the backlog, so they pick up the next ticket. While doing that work, they run into things. Russell offered a list, some of it deliberately exaggerated:

  • three different service object patterns in the codebase
  • saving one Active Record model triggers five callbacks, spawns two background jobs, broadcasts something, and sends a message to what seems to be a fax machine in an office known only through rumor
  • deploys take 18 to 32 minutes "depending on the day of the week and where the sun is"
  • changing one field in one form requires five changes across two repositories

None of these stop you from closing the ticket. They just make the work harder to navigate. So you assume the people who have been there longer must know a reason. If you ask, you hear something like, "Yeah, that's a little weird. I wouldn't worry about it too much today." Six months later a new hire asks you, and you give the same answer.

Eventually, Russell said, a team builds an oral tradition around avoiding things nobody understands anymore, and that tradition makes every old decision look intentional. A mature app contains deliberate choices, expired constraints, experiments that stuck around, and workarounds nobody has revisited. The difficulty is that "they're all written in the same font."

Over time people do get good at navigating all this. They learn where not to step, which tests need rerunning, which examples are safe to copy, and whom to ask before touching billing code. They learn that the README is "more of a historical document than a reliable set of instructions," and they learn the difference between what the application says and how the team actually works on it. The danger, Russell argued, is that the better we get at compensating for something, the less unusual it feels.

7:14

Makers and Menders

More than a decade ago, Russell came across a post by Andrea Goulet of Corgibytes describing "makers" and "menders." Paraphrasing: makers are drawn to creating something new that didn't exist before, while menders are drawn to tending, repairing, improving and extending what already exists. Russell identifies as a mender: give them something that mostly works, occasionally catches fire, and carries a 2013 comment reading "temporary workaround, remove after launch," and they're curious.

The distinction stuck with Russell because, despite how the industry talks about itself, most professional software work is not done on a blank canvas. Few engineers spend their days designing new architecture and shipping new features. Most are tending decisions already made: changing software without breaking what people depend on, updating dependencies, chasing regressions, reducing risk, and trying to remember why someone thought adding GraphQL would improve everything.

Engineers tell themselves that once a few maintenance issues are cleaned up, they will return to the "real" work: the innovative, fun, feature work. Russell called this a lie and repeated it for emphasis: "The lie is that tending to the system takes us away from the job." For most people, tending is a substantial part of the job. Sometimes the higher-leverage work is improving the conditions around the work, making the system easier to understand and changes safer to make, evaluate and trust. That, too, is mending. Often the original engineers are gone, and the current team has to work out what was intentional and what is simply "accumulated sediment."

Russell summarized the field notes this way: producing code has gotten easier and cheaper, but understanding what belongs, what can be trusted, and what should change still requires judgment, "at least for now."

Rails as a Shared Workshop

Russell argued that this theme fits Rails World in particular because Rails has spent more than 20 years improving what Russell calls "the workshop." It has done so not perfectly, not always consistently, and perhaps with a bit too much confidence. The community has invested in the environment around web application development: shared conventions, predictable structure, sensible defaults, reusable abstractions, documentation, open-source collaboration, arguments, online examples, prior art, and the steady removal of unnecessary decisions.

Rails did not eliminate complexity, Russell said, but it provided a common place to begin. In an unfamiliar Rails app you already have some idea where to trace a request, where database changes live, where background jobs typically run, and where tests are. That reduces the number of questions humans have to answer before they can start evolving an app. The answers aren't always perfect, but a shared answer is far more valuable than relitigating every decision.

On top of that shared base, every application builds a "local workshop" with its own patterns, shortcuts, tools, exceptions and assumptions. Those local choices become the environment the team works inside.

Rails also provides comparison. After working across several Rails applications, you start to recognize what is conventional, what is a reasonable local adaptation, and what is unusual. That comparison is how judgment and expertise develop, and it is also, Russell joked, what keeps them in business. But someone in their first mature Rails app lacks that comparative experience, so everything in the repository looks equally authoritative simply because it is there. Shared conventions give a baseline for asking better questions. Is this how Rails would normally approach it? If not, was the departure intentional? Did a constraint push the team another way, and does that constraint still exist? Or is this an experiment that never reached a conclusion?

Russell asked the audience to think of a folder, pattern, library or piece of infrastructure they know how to work around but aren't sure why it exists in its current form. If the honest answer to a colleague's question is "Yeah, that's a little weird," Russell said, "that's what it sounds like when context has disappeared."

Agents Read the Repository as Evidence

AI agents entering a Rails app benefit from the same conventions, Russell said. They already have a reasonable idea where to look and what patterns to expect, so they have fewer possibilities to consider before getting to work. The shared workshop is already teaching them.

But a Rails app can bury that leverage under years of conflicting local patterns, dead code, outdated instructions, unnecessary dependencies, and decisions nobody feels authorized to revisit. The framework can't prevent a team from building four competing answers to the same question, can't make them choose one later, can't decide when a local constraint has expired, and can't make people share what they've learned. That part, Russell said, still belongs to the team, "for now."

Agents also read the repository as evidence. A human newcomer eventually learns that one directory is current and another is being abandoned. Russell acknowledged that you can tell agents similar things today, but said an agent may simply see three plausible examples and have to relearn the distinction each time its context window is cleared. The ambiguity was always there; agents expose how much humans had learned to work around.

Russell's example was prompting an agent to "make CI faster." It might find an expensive step, improve caching or split jobs, and after a few cycles you might save a minute. That's useful. But you can't leave it running forever and expect CI to keep getting faster. Eventually it hits questions that aren't really about code: how much do we trust what it produces, can we test it, can we understand failures, can we trust the feedback, and how much risk will we tolerate? Russell said teams are still wrestling with these because they are questions about how teams want to operate.

Tidy First and a New Mythical Man-Month

Russell turned to Kent Beck's 2023 book Tidy First?. Its core idea: before making a difficult change, first make the change easier. If a ticket's requested behavior is straightforward but the surrounding code isn't, tidy that area first and keep the tidying separate from the behavior change. Simplified, one ticket might become two pull requests, each easier to approve than one large PR.

That rule, Russell argued, assumed tidying was expensive, because the person doing it paid in their own time. Hand the same rule to an agent, and one ticket can become several PRs: behavior changes, documentation, more tests, maybe dependency bumps. That looks productive until you are the one reviewing it all. Russell quoted Beck from the previous December saying that "the Genie produces code at a pace that no human reviewer can match," and stressed that review is only part of it. Someone still has to understand what changed, test it, coordinate it with everything else, and decide what belongs in the system.

Russell connected this to Fred Brooks, who wrote more than 50 years ago about why adding engineers doesn't give a matching increase in capacity: more output creates more coordination. Russell wondered aloud whether the industry has entered its own version of The Mythical Man-Month. The cause isn't hiring 20 more engineers overnight; it's suddenly being able to produce more work than teams can keep up with. All that output still has to land somewhere.

Russell noted one upside, jokingly: agents don't need feedback conversations. You can tell them their abstraction is bad or their PR too large, or simply clear the context, switch models and start over, with no need to schedule a one-on-one.

19:53

The Hotel Shower Problem

To illustrate how people compensate for bad environments, Russell asked how many audience members had spent an unreasonable amount of time that week figuring out their hotel shower, possibly standing there partially undressed, thinking they must be smarter than this. Many hands went up. Everyone knows how showers work, yet there they were turning knobs and pulling things to learn the local conventions. Tomorrow they'll be faster, and from the hotel's perspective the shower works fine.

Software teams do this constantly, Russell said. They know the app's seed task doesn't really work, so they have their own way of getting usable data locally. They know a certain error message means something completely unrelated. The software didn't improve; people learned to compensate. Russell showed a list of such frictions and promised to share the slides.

Humans are remarkably good at this. They remember exceptions, skip broken instructions, know which command not to run, and learn who holds undocumented context, until the workarounds feel normal. Agents, Russell said, don't necessarily build that same durable understanding. They search again, infer again, and burn tokens getting back to what the humans already know. The agent makes the cost of the workshop's friction far more visible.

Who Improves the Workshop Without a Platform Team?

Some organizations have platform engineering teams, or similarly named groups, focused on the environment around writing and operating software: developer setup, CI, deployment, internal tooling, safer production access, shared workflows. Their job is to make the environment easier to work in over time.

Russell cited two conversations. Austin Story at Doximity described an internal skills marketplace, so that useful workflows don't stay trapped in one engineer's local setup or prompt history. Brian Scanland at Finn, interviewed on Russell's podcast On Rails, described shared skills anyone across the organization can use, including non-engineers, plus wrappers around tools like Rails console and Rails runner that give agents more controlled ways into the production application. Different companies, similar patterns.

But most people in the room, Russell acknowledged, won't return to work to find five new hires dedicated to internal developer experience. On a team of 20, eight or three developers, who notices recurring friction and deals with it? The work doesn't disappear just because nobody owns it.

Be Q, Not Bond

Russell's answer drew on James Bond. Q runs MI6's research and development branch and builds the tools and gadgets, such as the pen that "will clearly become important 45 minutes later in the story." Bond gets the mission, the chase, the martini, and drives the expensive car into the ocean. Q improves the environment the mission takes place in.

Engineering culture, Russell said, encourages people to imagine themselves as Bond. But sometimes the most valuable person on the team is the one ensuring "that the next mission requires less heroism": building a safer tool, shortening feedback loops, removing a path nobody should take anymore, making it easier for the next engineer or agent to succeed. The gadget is only an artifact; the value is in what the next person or agent can do with it.

You Don't Need Permission to Do Your Job Well

When Russell talks with engineers about this kind of work, the same hesitation comes up: I was hired to build features and close tickets. You hit some friction, suspect there's a better way, but nobody asked you to fix it, so you keep working through the backlog. How do you decide whether it's worth the time? Are you breaking a commitment, overspending on a small problem, or learning something that will help someone else?

Russell was explicit that this isn't a call for reckless action. Going rogue for three months to build an internal developer portal nobody asked for "is not stewardship. That's a hostage situation." But spending a little time understanding recurring friction seems reasonable, and Russell said: "You do not need permission to do your job well." If you, your coworkers, or your agents keep hitting friction, alleviating it is part of the job. It doesn't have to be a big project: name the friction, find someone else who feels it, improve one small thing, and see what you learn.

Russell also offered, half-jokingly, a "new card to play." If questioned, you can say the team's AI agents kept hitting a snag that sent them into a death spiral and burned tokens looking for a workaround. Agents burning money, Russell observed, now provides an argument teams were never allowed to make when the waste was human time. The practical question is what the smallest responsible improvement would be that is visible, reversible, and useful to someone else. You may not own the whole workshop, but there's probably at least one drawer nobody has reorganized since 2019.

28:38

From FAFO to WUTS: Wonder, Unpack, Tinker, Share

Russell warned against leaving the conference to hunt for things to fix. These things come up naturally, and when one catches your eye, it helps to give that curiosity structure so you don't fall down rabbit holes.

Russell contrasted this with the familiar "FAFO" method: sitting at your code wondering what it does and what would happen if you deleted it. Poking software is sometimes the fastest way to understand it, though maybe not in production. As a more deliberate alternative, Russell proposed WUTS (pronounced "what's"): Wonder, Unpack, Tinker, Share. It is loosely inspired by inquiry-based learning and scientific experimentation, and by Russell's need to give a silly name to otherwise normal behavior. Russell stressed that it isn't a problem-solving framework, since engineers are already problem solvers.

Wonder starts with a small moment of surprise. Code isn't doing what you expected. Two people describe the same workflow very differently. A rake task only worked the second time. Russell treats that curiosity as a signal, while distinguishing it from being personally irritated by a naming decision someone made 12 years ago, which isn't worth dwelling on. The examples Russell suggested looking for are ordinary rather than architectural: a setup step you always forget, a warning everyone ignores, a comment referring to a vendor nobody mentioned during onboarding, or a timeout set to exactly 47 seconds.

Unpack means separating what you assume from what you can learn. It starts with archaeology: how did this get here, what problem was being solved, what constraints existed then? Code that looks ridiculous today may have made perfect sense six years ago. The key is resisting the jump from "huh" to "I know how to fix this." Gather evidence first: follow the behavior far enough to explain it, look at production, measure, read the history, and find the change that introduced it. If you still need more, find someone who might remember.

Sometimes the original engineer has left. Russell ran what they called a very unscientific poll on X and LinkedIn asking developers whether they would be willing to be tracked down about a decision made five years earlier at a company they no longer work for. Of a little over 200 responses, about eight in ten said they'd be willing to help. Russell's suggestion was to take git blame a step further and look people up on LinkedIn, but only after doing your own homework. Sometimes that homework reveals the thing that caught your attention was less interesting than it seemed, a step Russell said people often skip.

Tinker means making the smallest reversible change that yields useful information. Information is the goal; tinkering doesn't need to produce the finished solution, and learning your assumption was wrong can be the useful outcome.

Share is the step Russell thinks many teams skip entirely. It doesn't mean posting on Slack that you learned something weird. It means turning what you learned into something the next person can use: documenting constraints and recording decisions, but also building a tool so nobody has to remember the workaround, or showing someone how something works. The point is to put the knowledge back into the environment. The opening company, Russell noted, had experimented a great deal but hadn't consistently closed that loop, so engineers inherited four equally plausible answers.

Two Worked Examples

In the first example, a new engineer looks at order.save. It seems ordinary, but it triggers callbacks that spawn jobs, broadcasts, auditing, cache invalidation, and updates to a warehouse inventory system nobody mentioned during onboarding. The engineer wonders what actually happens, then unpacks by tracing callbacks and mapping side effects. Having done that work, the engineer shouldn't leave the understanding in their head. It could become a Mermaid diagram in the repository, or at least a sketch in the wiki.

The second example, which Russell said came from a real case Planet Argon found, is middleware untouched since 2018 that scrubs Unicode from incoming requests. Its comment says to remove it once the legacy mobile app is retired, and you're fairly sure that app was sunset before you were hired. Unpacking the history reveals it was added after a miserable weekend with hundreds of production errors in Bugsnag, which is more interesting than the comment suggested. Rather than deleting it, you add instrumentation or logging and wait. A week later it has fired 41 more times, none from the retired mobile app: the traffic comes from a crawler and from one partner's webhooks.

The behavior may not change at all, but the comment does, so the next person knows why the middleware exists and what depends on it. That's a useful outcome, Russell said, because "not everything old is wrong." The goal isn't eliminating every oddity in a codebase but distinguishing "intentional weirdness from forgotten weirdness."

Seeing Your Own Workarounds

People often stop noticing their own workarounds because they've become part of how they work, Russell observed, but it's easier to spot someone else's. Russell recommended sitting or pairing with a colleague on ordinary tasks and resisting the urge to help or instruct. Just observe: where do they pause, what do they repeat, what do they avoid, what workarounds have they developed? They may not notice these themselves. Russell also suggested watching agents, since they haven't learned the team's workarounds yet. In a Q-themed aside, Russell mentioned a small item in attendees' swag bags for their return to work.

A Letter to Your Replacement

Another exercise Russell uses to locate undocumented context: imagine it's your last day on the application and you're never coming back. Write a letter to your replacement that begins, "Dear replacement, welcome to the party. This is mostly a normal Rails application, except..." What's weird? What would you warn them about? Which commands should they avoid? Which areas depend on context you know isn't written down anywhere?

For extra credit, ask a few coworkers to write their own letters and compare them. Do they warn about the same things? Does one engineer know about a constraint no one else mentions? What gets written down, Russell said, is essentially the team's oral tradition, and the gap between what the application says and what the team knows is also part of the workshop.

What the 2026 Rails Community Survey Suggests

Russell shared an early finding from the 2026 Rails Community Survey, whose full results were still forthcoming. Asked where people struggle most when joining an existing project, respondents ranked first understanding the domain model and business logic, second understanding old or inherited code, and third a lack of documentation. Russell didn't find this surprising but saw a theme: the struggle isn't figuring out how to write the next piece of code but understanding the system just inherited. That points to where to invest: places where shared understanding is weak and rediscovery is expensive.

40:43

Make the Path Obvious

Russell grouped improvements into three broad categories. The first is making the path obvious. If a team regularly adds integrations, one approach is telling people to copy the most recent one, which works until the most recent one turns out to be an experiment. Alternatively, encode what the team has learned into a generator that creates the expected class, configuration, error handling, fixtures, stubs, documentation, whatever belongs in every integration. The decision becomes executable: humans and agents can use it, and reviewers appreciate the consistency.

Russell distinguished three tools. A repository instruction says "this is how we work." A canonical example says "this is the one we currently mean." A generator says "start here." All reduce the number of plausible choices, but the generator gives you a starting point instead of asking you to interpret one. Russell called this "Rails-style leverage" applied to the local workshop. For agents, Russell said they would much rather hand over a generator reflecting current expectations than ask an agent to search the repository, find 242 plausible examples, and synthesize a 243rd. Russell allowed, though, that agents might work around this anyway.

Make Feedback Fast and Trustworthy

The second category is feedback: fast feedback that lies isn't helpful, and slow feedback everyone ignores isn't either. Every engineering environment has a hidden user manual that nobody wrote, reviewed or approved, but everyone learns. Stop running the full test suite locally because it takes too long. Staging is rarely reliable. Certain warnings are always ignored. The environment taught those rules.

Agents inherit the same hidden manual. They still wait on CI and still have to judge whether a failure means anything. Attaching a fast coding agent to a slow, unreliable feedback loop leaves it operating inside a slow, unreliable system. Russell suggested asking where everyone is waiting, what takes 40 minutes that could take five, which errors send people digging through old Slack threads, and what feedback arrives so late that people have already moved on. Not every check needs to be instant; some should take time or run closer to production. The goal is the right feedback at the right stage.

Here Russell offered a second image alongside Q: the guitar tech. Russell, a musician, said being a guitar tech might have been a dream job in another life. The tech tunes instruments for the next song, stays nearby to help when something starts going wrong, and after the show fixes whatever caused problems so nobody has to deal with them tomorrow. They seem to work for the musician, but really they work for the audience. For software teams, Russell said, that audience is the people using the software.

Make Mistakes Cheaper to Reverse

The third category is making mistakes cheaper to reverse. Russell deliberately did not say "prevent mistakes," calling that "a lovely ambition but a terrible operating model." If every experiment feels irreversible, people stop experimenting. That isn't laziness; they're managing risk.

Russell described the familiar pattern: one deployment, migration or forgotten config file, and three engineers spend days debugging production. The mistake wasn't the expensive part; recovery was. After a few such incidents, the team learns to be careful, not touch that, get more people in the room, and wait until Monday. That fear becomes part of the workshop. Feature flags, reversible migrations, preview environments and smaller deploys give teams somewhere safer to be wrong. They don't eliminate mistakes but make recovery cheaper, and when recovery is cheap people explore. When it's terrifying, they stop touching things.

Reduce Obsolete Choices

Across all three categories, Russell added one more practice: removing obsolete choices. Every abandoned pattern still in the codebase keeps teaching that "this is one way we do things around here." Engineers tend to assume leverage comes from adding something, but sometimes it comes from removing what nobody should use anymore. "Deletion is an architectural decision," Russell said. Improving the workshop can mean building a tool, labeling a drawer, or documenting why an odd tool still needs to be there. The goal is making the preferred way a bit more obvious to whoever, or whatever, comes next.

"We're Doing It This Way Now"

Returning to the opening company, Russell said it didn't really need outside experts to find the right architecture; there probably wasn't a perfect answer. There was a choice that fit the current system well enough to document, test, generate, review consistently and improve later. What they needed was someone willing to say, "We've learned enough from these experiments. We're doing it this way now." Not forever, just long enough to stop making the same decision independently every time.

Russell suggested the same thing is likely happening in the audience's own codebases. Teams work inside decisions made for different moments. Some still fit, some were temporary, some were left behind by a former coworker, and years later nothing indicates which is which, because they're "all still written in that same damn font."

Russell closed by asking people to pay attention when something makes them pause, follow that curiosity, and when they learn something useful, give the next person a place to start. That person might join in six months, or might be an agent arriving tomorrow morning with none of the team's accumulated workarounds. Not everyone needs to be Bond; sometimes the valuable work is putting a better tool in someone else's hands so the next mission needs less heroism. Russell's final claim was that the engineers who create the most leverage won't just be the ones producing more inside the workshop, but the ones improving it.