DAVID HILL Happy Wednesday and welcome to the show. I'm your host, David Hill, and I've got two guests with me today, Rachel Reitman and Andy Andrea, both friends from Ruby Conferences. And one of the things I love about Ruby Conferences is participating in or seeing those conversations where suddenly something clicks for somebody else and they have this idea. And I literally saw that happen with Rachel at RubyConf. She was practically vibrating at dinner. after this all happened. And so this is one of those moments where I was like, I actually saw this series of events kind of play out over the course of the conference and thought it would be really fun to talk about. And it all kind of stemmed originally, I think, from your talk at RailsConf, Andy. So could you kind of start us off and tell us about what your talk was about and kind of where things went from there? ANDY ANDREA The original talk was at Chicago Ruby last November, I want to say. I didn't really have a great idea for a talk at the time. So I said, well, I've been working on some stuff that I think is kind of weird and interesting with JSON schemas. And I've done some similar stuff to that in the past. So I threw together a talk on basically how you can use schemas across an entire application more than just your Rails schema .rb or just a simple swagger or something like that. And that talk went well. And it was, I think, very reasonable content. And then when I saw RubyConf's weird Ruby track, I thought, I can probably make this a lot weirder and worse, but in a way that's maybe interesting and can help people learn something, help myself learn something. So I decided what would happen if we tried to use the same schema across an app for everything that we could possibly think of, even if it was a horrible idea. And that was my talk. RACHEL WRIGHT MUNN i remember seeing your talk on the cfp i was part of the program committee for ruby comp and we use schemas really heavily over on ruby events for like validating our yaml files and also for like just understanding what's in them and like parsing them and so like when i saw your talk i was like ah i wonder what he's gonna talk about we use schemas really heavily i'm really curious what this talks about and just like wanted to see it and so Right, like, literally the week before RubyConf, I was trying to figure out how we could take our generators and just kind of, like, put them in these MCP tools. And, like, I'm playing around in my head with can we wrap them, right? Can we make it easier for us to call these MCP tools? And then I go to your talk just expecting, like, oh, you know, he's working with schemas. We use schemas in Ruby events. And then you did the... thing that i had been like trying to like figure out how to do for like maybe about a week in your talk just with a different type of schema yeah it was very interesting from my point of view as the speaker i think a lot of people maybe didn't quite fully understand when i gave my intro there are some things that you should not be doing in this this is going to be some weird stuff and so i had basically three types of people in the audience i had the people that were like ANDY ANDREA it was very interesting from my point of view as the speaker i think a lot of people maybe didn't quite fully understand when i gave my intro there are some things that you should not be doing in this this is going to be some weird stuff and so i had basically three types of people in the audience i had the people that were like is he doing? This is awful. Why would someone do this? And then the people that were gradually realizing that it was kind of a bit, and then Rachel was like bouncing off the walls at one point. So it was really nice because I think sometimes as a speaker, you know, you might just have a kind of passive audience that they're like really thinking about it. And I kind of got the full range of emotions. So I got to be like, yes, I'm doing my thing. This is truly bad, but not entirely bad, but also potentially useful. And that was the point. RACHEL WRIGHT MUNN It was fantastic. And then immediately afterwards, I remember like running up to the stage because, you know, like program committee, you're supposed to go up and be like, oh, thank you so much. You did such a great job. I think I ran up to you and I was just like, that's the thing. That's the thing. That's the thing I've been trying to figure out. And you did the thing, but it's just a different one. You didn't use a generator. I think you use like an open API, like swagger schema. ANDY ANDREA Yeah. RACHEL WRIGHT MUNN for like an API endpoint. So like you had literally said, like, here's how I took this API endpoint and I wrapped it in an MCP tool so that like an AI can use that MCP tool. And I was like, I want to do that with a generator. ANDY ANDREA Yeah, it was fun too, because of all the thinking I tried to do about, okay, where can you use schemas? I completely forgotten about generators, which is funny because I had literally created a bunch of generators at work, not too long ago, maybe a year or two. And then Someone had just turned them into cursor skills for us. And so I reviewed that. So it should have been top of mind, but just goes to show there's a lot of stuff you can do. DAVID HILL Well, I want to dive into that a little bit, actually, because I am not yet particularly well versed in a lot of the AI related things. I'm trying to fix that, but I have yet to use or attempt to even use MCP tools. Could you guys kind of talk more about that, what that means and why those would be useful skills for me to pick up? RACHEL WRIGHT MUNN So basically your model processes text, right? But the information it may need is somewhere else. Maybe it's on the other side of an API. Maybe it's an actual tool call that executes a function. But basically the model can't really... do anything on its own so even like when you think about things like the bash commands that it's running it's making tool calls in order to do those so the model context protocol which is what mcp is for is all about the model getting context from another call that it's done so for example the most common example i've seen is like weather apis if you want your model to tell you what the weather is like it will make something up it will tell you what the weather is but if you want it to be right it needs to call an api it needs to call an external service it needs some way to find out what the weather actually is execute that and then get the response and have that in its context that it can then use to say something useful about your travel planning itinerary or wrap it in a certain format or reformat the correct information okay it's also helpful on some like security side if you're fetching data from your database you don't have to give the model access to your full database you can just say this is the information you need ANDY ANDREA it's also helpful on some like security side if you're fetching data from your database you don't have to give the model access to your full database you can just say this is the information you need call this tool and then within the tool it's just your basic ruby code or whatever code that knows how to interact with your database and give back just the information that it needs which can be very helpful and avoids you know accidental table droppage or anything like that so the kind of epiphany that you had rachel of being able to connect the generators and ruby events wrapping them in mcp how does that play out exactly DAVID HILL the kind of epiphany that you had rachel of being able to connect the generators and ruby events wrapping them in mcp how does that play out exactly RACHEL WRIGHT MUNN We have a ton of YAML files to describe every single event. So many, so many YAML files. DAVID HILL many, so many YAML files. RACHEL WRIGHT MUNN It's like seven YAML files per event. It's a lot of YAML. So what I did is I started building out these generators because I started thinking about how are we going to get this data out of people's heads, out of these websites and into the correct structured format. And so I kind of had to make a decision early on. Do I want to go down the MCP route or do I want to go down a skill plus CLI route? Because with AI, those are the two big decisions. I should back up a little bit. We want a way to use AI to generate these PRs. That way I can open up GitHub on my phone and be like, hey, the SF Ruby site has updated. Please go fetch the information of it and turn it into the event data that we need. That's the big plan. The big plan is me being lazy. DAVID HILL Like all of the best developers ever. RACHEL WRIGHT MUNN And so I started thinking, what are my two options? And I was like, I can do MCP, which is AI native. It reaches for them. It goes for those MCP tools. But then I started thinking about our contributors. We have over, I think it was 161 last time I looked. It's probably closer to 170, 180 right now, but I don't want to quote an exact number. Contributors who are... contributing to the site and some of them have tokens some of them have ai and some of them don't like i went to a workshop rails girl sao paulo they didn't have ai things set up they were just calling it themselves and so that's kind of why i started going down the skill plus cli approach and i started thinking like what is a native interface for people to use that's going to feel familiar when we're generating these files and so i started heavily abusing rails generators in order to like and mutate these files and have them in exactly the right format and put comments where I want them and like all of the things that I'm looking for and then what happened is like we had two MCP tools already we had like a create CFP tool and I could not get it to use my generator instead of the MCP tool so I started plotting ways to like get rid of these MCP tools so it would use my generators. And I was like, well, if I could just take my generator and wrap it in an MCP, it would work. And that's kind of where I was in trying to figure out what that would look like. When I saw Andy's talk and I was like, oh my God, Andy, you're doing the thing. You're doing the thing that I want to do. You're just using an API instead of a generator. Did you know generators have parameters? RACHEL WRIGHT MUNN Y 'all need to laugh out loud, otherwise they're going to think I'm crazy on the podcast recording. ANDY ANDREA Oh my God. That reminds me of my very first conference talk. I was laughing at all of my own jokes and the audience largely was as well, but the audience wasn't miked. And so if you watch the recording, it's just like me cackling to myself. RACHEL WRIGHT MUNN I'm watching your faces like crack up and like no audio. Just like right back in Vegas. ANDY ANDREA like right back in Vegas. DAVID HILL Oh my gosh. That's so great. ANDY ANDREA One of my favorite things about when we were pairing on this, I'm sure we'll get back to this in a little bit, but. We planned a pair on the hack day and we both got busy with other things. And so we started pairing, I think after the closing keynote, we went to dinner and I'm like eating my sandwich. I finished my sandwich. I'm talking to people. And I just see out of the corner of my eye, my laptop slowly being pushed into my line of sight. RACHEL WRIGHT MUNN I was so excited. And I even picked the restaurant that we went to. What was it? We almost went to a Thai restaurant. But it was like sit down, fancy. I was like, nah, we got to pick a place where we can pull out the laptop. I remember seeing you at the closing meeting note and coming running up and being like, hey, we didn't get to do this in Hack Day. When are we going to make these MCP tools? DAVID HILL I think that's when I saw you because you guys were at the food court and you were literally vibrating. The excitement was visible about what you were getting ready to work on. RACHEL WRIGHT MUNN It was working. Like, I think at that point we had gotten one of them working. ANDY ANDREA Yeah, I think that's about right. It was, what, the CFP maybe was the first one we did or something? RACHEL WRIGHT MUNN That one's the simplest one. That's the first generator I did too, because I'm like, it's only four fields. But yeah, it was working and it was going through and doing the thing. We had like a prototype that was like almost... RACHEL WRIGHT MUNN perfect coming out of RubyConf. I think we had worked on it a little bit at lunch and then we worked on it afterwards. ANDY ANDREA Yeah, it really wasn't that long. RACHEL WRIGHT MUNN No, it was only like a couple of hours and we had it up and working. I credit a lot of that to you. I know that I came up and I was like, let's do this. This is the idea that I have. And there were a few times that I poked, but mostly it was you metaprogramming everything. ANDY ANDREA was you ANDY ANDREA Well, at that point, I had a lot of things to copy and paste, which was helpful. But I also just remember you were very patient with me as we were trying to figure out what we were doing, because I think I was just fried the whole conference. And it took me much longer than I would care to admit to understand what we were building. And then as soon as it clicked, I was like, oh, yeah, this is exactly what I had in my talk. RACHEL WRIGHT MUNN You can just wrap an API instead of a generator. And I remember that a lot of what I was doing was, oh, let's start with this one. Here are the intricacies of this generator. And I had been going deep with the Rails generator. So I was like, oh, here's where the thing is. But most of that stuff, I didn't know where to pull the parameters off of the generators or any of that stuff. But yeah. ANDY ANDREA Good old -fashioned in -person pair programming. Who'd have thought? Who'd have thought that that would be a valuable experience? Yeah. RACHEL WRIGHT MUNN have thought that that would be RACHEL WRIGHT MUNN it felt really good to work with somebody else who like understands the problem space and like what they're trying to do and i think that it was just good timing too yeah serendipitous one might even say so what ultimately happened with this project what's the current state of it merged not only merged i've been using it so like no no no like you don't understand DAVID HILL one might even say so DAVID HILL ultimately happened with this project what's the current state of it merged RACHEL WRIGHT MUNN only merged i've been using it so like no ANDY ANDREA like no RACHEL WRIGHT MUNN no no like you don't understand I have had a recent surge of, I think, six different event updates where I was able to just say, like, go look at this website and use the tooling and the skill and like run it. And I would say most of the time it reaches for the MCP tooling. And when it doesn't, it uses the generator from the skill. And to me, that's like a perfect result. I even went through and I did a comparison of like generators versus MCP tooling for generating. the rails world event because that one is upcoming and i'm giving a talk there about generators one of the things i was hoping to do is like compare the two sides and now that i literally have like a generator wrapped in an mcp tool it's so easy that's awesome so are you going to be talking about this as part of your talk or this is more generators in general the majority of it is generators in general DAVID HILL awesome so are you going to be talking about this as part of your talk or this is more generators in general the RACHEL WRIGHT MUNN majority of it is generators in general It'll ruin the twist. But like one of the things that I start with is the conversation that I had with myself of like skill plus DLI versus using an MCP tool. And then I get most of the way through and then I'm like, and MCP tool. I can do both with one thing because of this thing that Andy and I worked on. DAVID HILL I'm looking forward to seeing that. RACHEL WRIGHT MUNN Yeah, but it's been working really well. It's really good at generating the data. I feel like what AI is really good at is like taking this loose descriptive blob of text and like understanding the relationships between the data and what's happening and just calling something else that actually knows what to do with it. Right. And to me, RACHEL WRIGHT MUNN me, that's what the MCP tooling is all about. I actually I started to get into some of the differences between like MCP tooling versus some of the others. So like. Hang on, let me pull it up really quick. Yeah, okay. So one of the things I found was that if we were using the MCP tooling, we would see fewer errors and mistakes. And most of those errors would actually be the AI going back and modifying things. Let's see. But the big one was honestly that I was able to use smaller models as well. So the thing is that we have a lot of YAML I mentioned, and some of it's different. So for like our meetups, we have a completely different format than we do for the other ones. And we've changed format a couple of times over the years. So like one of the things that I struggle with a lot is there's this event name parameter that applies to meetups that doesn't apply to conference events anymore. And we're trying to deprecate it. And the AI consistently like brings that event name parameter back because it sees it in all of the old data. DAVID HILL it sees RACHEL WRIGHT MUNN it sees it in all of the old data. DAVID HILL Right. RACHEL WRIGHT MUNN we kind of have the option of going through and looking at all of the yaml files and cleaning them all up and like making them perfect so that every single one is a perfect example and even when we do that we miss some of the less frequently used options so like for example when it comes to like canceling events we actually have like a status cancelled if it just grabs the last year's event and copies that it's not going to know that exists and most of the time when i'm creating these i rarely see it reference the schema and it basically never gets the comments correct on them so like when we're doing our video files what we do is we have these to do's staggered to do's where it's like first to do where the speakers and the talks next to do put them in the right order once the schedule comes out and then the last to do add the videos right right with a generator i can do that i can add all of those the first time it gets published i can check into what information's there or not there and i can delete them as i go through with the ai it's going to see that final file with all the youtube videos and it's not going to know that we had those transitional to -dos in there handling intermediate data having deprecations or like things that you're moving away from all of those tend to trip it up RACHEL WRIGHT MUNN And the way that we've paired these MCP tools with these generators means that I'm constantly working with the newest version. I'm able to update it in one location and update data going forward without having to go back and correct everything that's happening in the past. DAVID HILL I've run into that problem myself recently. We were using augment before they changed their whole kind of plugin system. It would frequently reference. other areas in the code of like, oh, you've done it like this before. I was like, yeah, but that code is bad. I don't want to copy that code. Please do this in a more Rails -y way. Please be smarter about this. RACHEL WRIGHT MUNN What? It's like you have all of those migrations where it creates the migration and it creates it with like 0, 0, 0, 0, 0 instead of the timestamp. DAVID HILL Yeah, super helpful. Awesome. I think at the time we were talking about ways that we could even get the regular Rails generators and wrap them in EMCP tooling. RACHEL WRIGHT MUNN I think at the time we were talking about ways that we could even get the regular Rails generators and wrap them in EMCP tooling. DAVID HILL Oh dear. That would be interesting. Are you going to try to do that? ANDY ANDREA We ran into some hiccup with that related to like auto loading or something. RACHEL WRIGHT MUNN Yeah, that's right. I remember. Okay. So there's rails generators, sorted groups, and we were having issues with the requires. And then Matthew went and looked it up and was like, this is how we generate like the list. You can call help on your generators and it like lists out all of the generators that you could use. And this was the thing that required it was Rails generator sorted groups. And he wanted to filter based on that instead of calling descendants. And then we used descendants anyway. We merged descendants. I still remember his face being like, stop using descendants. ANDY ANDREA And I'm like, RACHEL WRIGHT MUNN I'm like, why did they make it and we're not allowed to use it? The other thing we ran into was descriptions. I've been using the usage section in order to inject context into like my AI, right? So I'll be like, here's 10 examples of how to use this CLI. And I'll be like, here's an example of a meetup. Here's an example of this CFP or a CFP without an end date or like a canceled event. things like that so i could show it if i say this this is what i want you to generate right like lightning talks is another example of a variant the usage is way too long to use as like an mcp tool description and so we were looking into different ways that we could like get a description stored on the mcp tool because the problem is i think especially for the rails ones most of them probably do use usage and obviously we could like generate one I had never done metaprogramming before. It kind of blew my mind to like watch you do it. But now I want to do it everywhere. Even though I know that that's the thing that you're not supposed to do. Yeah, I kind of want to do it everywhere now. But we could just do like generate and then the name of the generator. But I don't feel like that's descriptive enough for it to know to reach for it. ANDY ANDREA And the other thing is we never solved arguments. RACHEL WRIGHT MUNN the other thing is we never solved arguments. ANDY ANDREA Yeah, we did have a couple things. I think you left it on the PR, a couple of fast follow ideas that I meant to look into, and then life has been crazy. But yeah, I think the description, you added a constant, all of the custom generators that we're reading from, and if that constant isn't set, then I think we are just falling back to some silly little string with the name in there that's probably not terribly helpful, but is at least something. RACHEL WRIGHT MUNN Yeah, let me see. There's a description equals tool description. So the default is runs the generator type generator. ANDY ANDREA Yeah. So nothing beyond what the class tells you just with more words to say it. RACHEL WRIGHT MUNN But the MCP wants the description. DAVID HILL This is very, very weird and fascinating to me since I haven't really touched this side of the ongoing AI tech boom. ANDY ANDREA AI tech boom. ANDY ANDREA So you're using this actively to pull in data from different conferences and meetups and stuff. DAVID HILL pull in data from different conferences and meetups and stuff. I imagine your throughput for getting these types of events into the system has just skyrocketed. Are you still getting people doing manual data submissions as well? Or is this mostly replacing that? RACHEL WRIGHT MUNN You know, it's hard to tell. Okay. It's kind of interesting. So when I first introduced the generators. there were some suboptimal choices, some defaults that maybe shouldn't have been used. And so I could kind of tell if it was a generated one because I would look at it and go, oh, that's the default for like a venue description. You were supposed to delete that or replace that with a to -do or something like that. And like, no fault of their own. I think I'm actually going to change this. But one of the defaults I have is that it adds an accessibility options block. The problem is that I don't want to convey information that people haven't actually shared about the accessibility of a venue. Like my goal in adding that block was please fill out the accessibility information for your venue. The reality is that we're getting a block in all of the venue files. That's like true. Yes. For me, that told me if they're using the CLI, but it doesn't let me know whether or not they're using AI to generate it or whether a human is. Sometimes you can tell from the PR description. I think we all have seen AI PR descriptions. I can now tell from the event data skill because it's very structured and they all look almost exactly the same. And one of the things I recently did is I added GH image. Oh, by the way, GH image is so cool. It lets you add. a screenshot to github and like upload the screenshot to github from the command line which is not something you can do so you can have your ai put screenshots in your pr description and your comments which is something i am very passionate about wow but the thing is that people normally take small screenshots of the area and the robots tend to just screenshot the page and give me the whole thing and it's the whole long page so that's one difference that i've noticed but i can't actually tell i can say that we're getting a lot of contributions and that a lot of them are very high quality because we've done a lot of work to like improve that flow of things moving into the system I can say that I personally have tried like the MCP versus the generator approach. It's so smooth. It's like butter. I don't know what it is. The AI just wants to reach for those MCP tools and it just uses the generators every time. It still does this thing where it like reads all the files, but like because it's generating the files, it at least... It has the right format at one point before it goes in and edits them and adds event name to everything. Right. Because clearly I forgot it. DAVID HILL Okay. So kind of going back to the question a little bit, I guess, like how much would you say you're, no, I love this. Nothing wrong with what's gone on so far. Which is like talking about how your bandwidth of getting event data into the system, like how much has that improved with these tools? RACHEL WRIGHT MUNN So fast. So, so, so, so fast, like maybe 10, 15 minutes instead of over an hour. DAVID HILL Wow. I could see that being pretty significant, especially with the number of events that you're probably working on cataloging on Ruby events all the time. RACHEL WRIGHT MUNN Yeah. Before, just with life and balancing everything and PR reviews, backfilling old data wasn't really an option for me. Because one of the things that we try to do is we try to keep the upcoming conferences all up to date. Right. Like if we find it, we add it, we keep it up to date, DAVID HILL Right. Like if RACHEL WRIGHT MUNN we'll generate assets for it. In my head, I'm thinking I need to generate assets for the Pika Ruby event, but it's really hard because they didn't have a clear logo image. So like all of that stuff I was doing manually before. Right. And now it's very much a verification thing where I like have the website in this one side by side. I click all the links, I look through it and I'm done. Okay. DAVID HILL If people wanted to contribute to Ruby events, which they should absolutely do, they should absolutely. I did some open source contributions earlier this year. I don't remember if it was before RubyConf, but I had a lot of fun working on learning the system and trying to figure out how to contribute. Is there documentation for how people can use these tools to aid them in making contributions? RACHEL WRIGHT MUNN That would be a really, really good idea for someone like me to add. RACHEL WRIGHT MUNN Our documentation is based around like the skills and the CLIs and the generators. I don't think it's really been updated to represent an AI assisted flow. I'm kind of curious because like when I am creating a new event, it's literally like event data, go look at this site and load it. Yeah, I don't know. What would it look like to tell someone how to use AI? DAVID HILL That's kind of what I'm asking you. This process sounds really cool and I'm really fascinated. When we're in Austin for Rails world, I would love to see this in action to see how you're actually doing it. It also sounds like something like I would love to actually try to use this to contribute more regularly or to try and find ways to use what I learned of doing it. for Ruby events to maybe try and use that elsewhere. Right now, it feels very kind of abstract and hypothetical because I don't know the mechanics of how to actually make that happen. RACHEL WRIGHT MUNN Interesting. Okay. Yeah, I can see that. Yeah, I suppose I could whip something up. It feels like it would be short, though. DAVID HILL Short's better than nothing at the very minimum. I'm very curious and interested in this topic now. Things I obviously need to learn about so I can play with more toys. RACHEL WRIGHT MUNN So I've been going a little heavy on like building AI systems and tooling for them. But when you actually use them, it doesn't feel like you're actually doing anything particularly smart. A lot of the things that I'm doing are like one sentence long. I would like this, rename this, do this. But then the skills, the rules, the hooks. like the mcp tooling that feels like a whole different layer of engineering that you still have to learn and build out like harness engineering i think is what it's called so what's the question have we kind of moved from a world where we're like doing the engineering with the actual code to a world where the engineering happens at the harness layer and with verifications and DAVID HILL what's the question have RACHEL WRIGHT MUNN we kind of moved from a world where we're like doing the engineering with the actual code to a world where the engineering happens at the harness layer and with verifications and deciding which tools to plug into and whether it deserves an MCP or a CLI and which MCPs to use and which SAS providers to use for your CI and whether or not they've got a hosted or a dockerized like MCP tool. DAVID HILL In a lot of ways, I feel like we're definitely in some kind of a transition phase between the two extremes. Part of my curiosity on this topic is admittedly driven by some feedback I got from my manager recently that the upreps in the company are kind of expecting developers to dive headfirst into the AI stage and just actively try to think about how to use it in new and interesting ways to improve the business. And so I was just like, it moves so fast. I'm constantly just kind of like feeling like I'm so far behind because I'm like, three iterations of AI behind at this point over like I try to use codex or clog code to be essentially a glorified research assistant to be like this code base is really big it's years older than my time with the company so like I need to make some changes I don't really know where those changes need to live help me understand the context so I can actually do the work I'm supposed to be doing That's the extent of a lot of my AI usage at this point. And I know people like you guys are doing way more interesting things with it than what I currently am. And so I was like, I need to get more in the space that you guys are living in. ANDY ANDREA I think that sentiment might be everyone's sentiment, honestly. I don't remember who said this, maybe one of the keynote speakers or someone early on at RubyConf said something along the lines of like, can we please stop pretending that we know what we're talking about? Cause like, there's just so much that even if you know a lot, there's a lot that like some people have come up with that maybe you haven't learned about or some cool new skill or technique or workflow. And I feel that way personally all the time as well. ANDY ANDREA feel that way personally all the time as well. DAVID HILL That actually makes me feel a little bit better about myself. RACHEL WRIGHT MUNN I haven't learned how to use work trees yet. DAVID HILL I'm not sure I even know what work trees are, so. RACHEL WRIGHT MUNN Okay. Some people have like parallel development flows where they have multiple. RACHEL WRIGHT MUNN Oh. My understanding is it's like a completely separate Git repo. Each branch gets its own private version so it can make all the changes in parallel. DAVID HILL Oh, dear. RACHEL WRIGHT MUNN And then at the end, you somehow merge it all together. I used Git Butler. I feel like that. fits me in what I'm trying to do better. Git Butler's just like, I have multiple branches and I can apply multiple branches at once. Okay. RACHEL WRIGHT MUNN It's just real buggy and it's hard for PR reviews. DAVID HILL Well, I could see that being a problem then because those are still important. RACHEL WRIGHT MUNN Yeah. Well, let me rephrase that. DAVID HILL Well, let me rephrase that. RACHEL WRIGHT MUNN It's bad for PR reviews across forked repos. DAVID HILL Okay. RACHEL WRIGHT MUNN In my company, I can grab somebody else's branch, bring it down locally, spin it up and run it and poke it or whatever. But for Ruby Events, everybody's on their own separate forked repository. So I lean really heavily on GHPR checkout and then the PR number because that lets me just grab a PR from somebody else's code base, forked repository, whatever, and it brings that branch onto my computer so that I can test it. And that doesn't play nicely with Git Butler. DAVID HILL I'm learning about so many tools that I need to look out. I don't work regularly with forked repositories. So I was like, oh, that's a problem. Oh, and there's a solution for that too. That's really interesting. RACHEL WRIGHT MUNN Yeah, it's really cool. I hate fighting with my dev environment. I'm very bad at it. It hurts a lot. And I feel like that's the reason that I have gone so hard on learning about dev environments and like building them out. And to me, that's a lot of what kind of like the skills and the MCP tooling are, building a better dev experience. DAVID HILL Am I remembering correctly that part of your experience building dev environments was basically Dockerizing a whole bunch of stuff early on? And that's, I thought that was you. I couldn't remember for sure. RACHEL WRIGHT MUNN Dev containers. Yeah. So we were talking earlier about people contributing to Ruby events. I'm guessing both of you use the dev container. DAVID HILL were talking earlier DAVID HILL I don't remember if I did or not. RACHEL WRIGHT MUNN If you opened it up and I don't think I did, ANDY ANDREA don't think I did, but I use code spaces every day for my day job. So I was kind of excited about like running it on the quote unquote, like bare metal of my computer because it feels like, oh, this is like homey. I haven't done this in so long. RACHEL WRIGHT MUNN It's extra funny because dev environments are what power code spaces. ANDY ANDREA Well, yeah, yeah. RACHEL WRIGHT MUNN You were like, oh, I'm so sick of these Codespaces. And I'm like, I built one for this project. ANDY ANDREA It's not that I'm sick of it. It's just like, I remember my internet would go out and it wouldn't matter. I would just like keep on working because Codespaces is like all remote. And of course, if I'm running Docker locally, it still doesn't matter to me. But something about it just feels cozy to just go back to the old caveman Mac. DAVID HILL The old school way of doing it. Yeah, ANDY ANDREA the old school from five plus years ago. RACHEL WRIGHT MUNN I will admit, I use the dev containers in Docker. I don't use Codespaces. ANDY ANDREA I remember back, my first job was consulting environments. We were constantly moving back and forth between different applications and some of them were running really old things, whatever. And there were a couple that before my time, people had set up Vagrant for local dev. And I remember it was both cool and a pain in the butt because it seemed like every time I rotated onto that project, I had to fix something about the Vagrant setup. And then eventually we started using Docker and that made things a lot easier once we got kind of sense of how to use Docker properly. RACHEL WRIGHT MUNN Oh my God. I hated Vagrant too. ANDY ANDREA Yeah, it was not fun. ANDY ANDREA In theory, it was cool. RACHEL WRIGHT MUNN theory, it was cool. RACHEL WRIGHT MUNN Sometimes I feel that way about Docker. RACHEL WRIGHT MUNN But I can't imagine trying to like onboard contributors and all that without something like Docker because everybody has such different machines and being able to just say like, hey, throw this in Docker. I promise it's going to work. I actually for a little while was trying to get. So Docker has this Docker model runner. Well, they'll run AI models locally. I actually got it working. I was trying to set it up so that I could give you tokens, right? Like I could set up this local model and when you spun up the container, it would be set up with that model in Docker. But unfortunately, Gemma 4 just wasn't able to make two calls. So Gemma 4 wouldn't have been able to run the generators or the MCP tools. It would corrupt the message each time. Do y 'all actually know how tool calls happen? DAVID HILL No, I do not. It's wild. RACHEL WRIGHT MUNN wild. So the harness, right? Cloud code the application, open code the application, cursor the application, sends the model request and it sends a message. Here's how I accept tool calls as part of its initial prompt. And then the model spits back a like giant pile of text in it. And at the very bottom, it spits out in plain text the tool call. So it'll have like the little bash whatever and the parameters that it's expecting just output as like a little text thing at the bottom. And like maybe this is how all file communication or whatever works, but that just blows my mind that it's just like generate a little plain text thing. We'll regex it out in the harness and we'll run it. from the harness application situation. Because the model just generates text. It can't call anything. So they had to come up with a way to give you like a tool call. ANDY ANDREA model just generates text. RACHEL WRIGHT MUNN you like a tool call. ANDY ANDREA I do love it when I find out about real things that like, quote unquote, at least good engineers are doing. And I'm like, that seemed like a bad idea. This thing that I did like 10 years ago and it worked and I always said, yeah, I'll come back and refactor it. And that never happened. And it still continued to work and it still continued to feel like a bad idea, but it continued to work. So maybe it wasn't a bad idea. DAVID HILL And it still continued ANDY ANDREA it continued to work. So maybe it wasn't a bad idea. DAVID HILL And yet here we are. Wow. Okay. I mean, RACHEL WRIGHT MUNN I mean, that's basically the story of Herb as well, right? We're just reject stringing. concatenating all of these templates and Ruby parameters and stuff like that. ANDY ANDREA all of RACHEL WRIGHT MUNN The market was like, oh, let's build an actual parser for it. He was there too, by the way. I went and dragged him into our conversation to be like, hey, you're part of Ruby events too. Come here. Come look at this thing. This is the coolest thing ever. And then we stuck him on the wrong side of the laptop. RACHEL WRIGHT MUNN We could actually see what we were doing at dinner. It wasn't until he got to the game that he pulled the laptop out that he could actually see it working. ANDY ANDREA i remember he was also why are you using descendants everywhere what are you doing to the auto loader oh yeah we couldn't figure out for a minute there like the requires for it because we're over in like lib and stuff like that so none of the auto loading worked there was some weird thing where like because of the way that zeitwerk handled ANDY ANDREA are you doing to the auto loader oh ANDY ANDREA doing to the auto RACHEL WRIGHT MUNN we couldn't figure out for a minute there like the requires for it because we're over in like lib and stuff like that so none of the auto loading worked there was some weird thing where like because of the way that zeitwerk handled the cfp file and the way that thor handled it so generators use thor under the hood zightwork does auto loading and has strong opinions about how classes should be named i never actually ironed this down but the first one we worked on cfp has an issue with zightwork where if you name it capital cfp then it generates the wrong name when you try and call the actual generator so like if you do like ANDY ANDREA you try and RACHEL WRIGHT MUNN like if you do like bin rails g cfp all lowercase it can't find it because it's all caps cfp but zeitwerk does not like it if you're like okay fine i'll do lowercase cfp or i think capital c lowercase fp and so i couldn't get the two of them to reconcile unless i made sure that the generator lib was like outside of rails is auto loading but i think it's supposed to be anyway But that meant that we had to require everything when we called it inside of the script where we generated the MCP server and we generated all the tools. So for a brief period, we were just requiring every single generator. Oh dear. RACHEL WRIGHT MUNN We were just aggregating at the top of the file. ANDY ANDREA I always have such a hard time getting my require statements right. So it was like require rails .root .join, blah, blah, blah, blah, blah. There's like... 15 of them at one point and it's just one of those things as you're doing it like i want this to work i know this is not a good sign but i'm just gonna see what i can do most naive way possible to get it to work and i don't even remember if we fully got it working with that approach did we oh i think we did i think we did because we were just requiring yeah one point we gave up after RACHEL WRIGHT MUNN did i think we did because ANDY ANDREA we were just requiring RACHEL WRIGHT MUNN were just requiring yeah ANDY ANDREA one point we gave up after eight, and then I think we came back and added a couple more. Do you remember Mark and Matthew listing the top of the file and going like, RACHEL WRIGHT MUNN listing the top of the file and going like, what are you doing? And we're like, it works! DAVID HILL You're just following a red -green refactor methodology. You're going to refactor it later. Yeah. RACHEL WRIGHT MUNN But we did merge descendants. DAVID HILL All right. RACHEL WRIGHT MUNN No, it's so good, and it works. And it works and you've been using it and seeing really good, DAVID HILL it works and you've been using it and seeing really good, you know, strong benefits from what you built out of it. RACHEL WRIGHT MUNN A hundred percent. DAVID HILL Okay. Well, I might ping you later to try and get more information out of this on how this all works because there are clearly some things I need to learn about. But thank you both for coming on the show today. ANDY ANDREA Thank you so much. DAVID HILL so much. ANDY ANDREA This has been the Ruby on Rails podcast. It was a pleasure talking with Rachel Reitman and Andy Andrea today. DAVID HILL was a pleasure talking with Rachel Reitman and Andy Andrea today. And I'm really looking forward to seeing Rachel's talk at Rails World. And thank you for listening.