{"id":3498,"date":"2026-02-24T23:58:58","date_gmt":"2026-02-24T23:58:58","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/02\/24\/the-dongle-died-at-midnight-winforms-agent-saved-my-german-moms-business-trip\/"},"modified":"2026-02-24T23:58:58","modified_gmt":"2026-02-24T23:58:58","slug":"the-dongle-died-at-midnight-winforms-agent-saved-my-german-moms-business-trip","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/02\/24\/the-dongle-died-at-midnight-winforms-agent-saved-my-german-moms-business-trip\/","title":{"rendered":"The Dongle Died at Midnight \u2013 WinForms Agent Saved my German Mom\u2019s Business Trip"},"content":{"rendered":"<p>An 82-year-old German industrial engineer, a 22-year-old UI framework, and an AI that finally understands WinForms Designer serialization walk into a hotel room at midnight. There\u2019s no punchline. Just a dead dongle and a dead \u2026 line. Well, I admit, it\u2019s sort of hard to believe, but how these three are connected is really no joke. But let\u2019s connect the dots, and start with my mom, who I\u2019d say is the main character in this absolutely true story.<\/p>\n<p>This post walks through the full journey \u2014 from capturing requirements in German via Teams, to transforming a messy transcript into an English specification using LLMs, to generating Designer-compatible WinForms code through cascaded prompting \u2014 and what it reveals about prompt-driven development.<\/p>\n<p>My mom is\u2014let\u2019s use the grammatically fitting tense here\u2014<em>retiring<\/em>. Present Continuous. Emphasis on the <em>-ing<\/em>. In 2007, she turned 65 and officially retired, but kept working in her profession as a REFA-engineer with her own, little but effective consultancy business. Since then, every autumn, she declares: \u201cNext February, I\u2019m definitely retiring for good.\u201d<\/p>\n<p>If you\u2019ve never heard of REFA, well, don\u2019t worry. It\u2019s a pretty European thing. Actually mainly used in Germany and the adjacent countries alright, and the methodology never really made it over the pond. We get to that later in more detail. In any case, the following story is not made up\u2014it\u2019s 100% true. It happened exactly as described here. Well, to be fair, it happened the way I remember it for those parts of the story where I didn\u2019t have notes or better memory aids. And I have quite a few of those aids, which, by the way, makes them an important part of the story\u2014but more on that also later.<\/p>\n<h2>As if I do not have enough to do already<\/h2>\n<p>The day IT happened was a day when I had been particularly undisciplined. I looked at my Todo list, and once again it became painfully clear: you cannot make open items disappear by staring at them. I was supposed to write quite a few of those typical year-end reflection pieces for a series of colleagues and\u2014of course\u2014my manager. And that\u2019s something that never really flows easily from my fingertips. What was easier, though, was listening to Dara O\u2019Briain, my favorite comedian, who had somehow made his way into my current YouTube playlist.<\/p>\n<p>\u201c\u2026I\u2019m a numbers guy, I\u2019m a dweeb all right and I apologize, I am a bit of a nerd\u2026\u201d Oh, are you, Dara? Guess who else is and cannot concentrate. \u201c\u2026and I am sorry, if you\u2019re into homeopathy\u2014it\u2019s water! How often does this need to be said\u2026\u201d And before he could continue his rant about this particular field of medicine, my phone rang. Saturday, 1:30 PM Redmond time is pretty unusual for someone to call from here, which in my case makes Germany as the origin of the call more likely. But that\u2019s then again also concernedly late for Germany and could only mean one thing: my mom. My problem: I <em>heard<\/em> the phone but couldn\u2019t see it. My definitely not Dara O\u2019Briain-compatible assumption: mobile phones are only physically present when you don\u2019t need them. The moment they ring, they teleport somewhere else. I tried to track-down the ringing, while Dara continued \u201c\u2026well, they get on my nerves with their \u2018well, science doesn\u2019t know everything.\u2019\u2014see, science knows it doesn\u2019t know everything\u2026 otherwise, it\u2019d stop!\u2026\u201d I had to join the laughter of the crowd. Noticing the ringing getting louder, and being literally on a good trajectory, I nodded while Dara continued: \u201c\u2026but just because science doesn\u2019t know everything doesn\u2019t mean you can fill in the gaps with whatever fairy tale most appeals to you\u2026\u201d Damn, Dara, I couldn\u2019t agree more. And, oh, there it was. The phone. My mom.<\/p>\n<h2>German-style naming \u2013 \u201cVerband f\u00fcr Arbeitsstudien und Betriebsorganisation eV\u201d<\/h2>\n<p>Growing up in Germany, I always thought every German compound word starting with the prefix \u201cReich-\u201d would be so negatively connoted that I probably shouldn\u2019t even go near it. And I know, especially in the 80s and 90s, A LOT of my fellow Germans thought that way. So whenever friends and classmates from school asked, \u201cHey, what do your parents do?\u201d, I stated truthfully my dad is a traveling salesman, and \u2013 without going into explaining that REFA term any further \u2013 my mom was a REFA engineer. Which is not only true, it\u2019s also something nobody could really do anything with\u2014<em>even<\/em> in Germany, where the whole REFA thing had been invented back in 1924. And although the original abbreviation\u2014not a secret, mind you\u2014\u201dReichs-Committee for Working-Time Determination\u201d was renamed around the 1970s to \u201cVerband f\u00fcr Arbeitsstudien und Betriebsorganisation e.V.\u201d (Work Studies and Business Organization Association), in German-speaking countries the REFA methodology for optimizing workplace ergonomics and time studies was and still is known pretty much exclusively by these four letters: <a href=\"https:\/\/en.wikipedia.org\/wiki\/REFA\">REFA<\/a>. And the reason it is such an important part of the economy in the German-speaking area of Europe is that it is one of the very few methodologies which is accepted and agreed on by most of the unions and bigger companies\u2019 own work councils.<\/p>\n<p>\u201cHey, how are you doing?\u201d I asked my mom. \u201cDon\u2019t even get me started,\u201d she replied. \u201cHere, when I try to start it\u2026\u201d<\/p>\n<p>It took me a moment to find out what \u2018it\u2019 was. But from context and level of indignance, it was quickly pretty clear that she was talking about her very special, Windows Win32-based consulting\u2014or better: time-study\u2014software.<\/p>\n<p>She continued, \u201cit says something about a General Protection Fault in Model something-or-other, and then, well anyway, I can\u2019t take any time-span samples. And the support-folks already tried using Windows Quick Assist, hung around in my Surface (Go 3, let me add) for more than an hour, but they couldn\u2019t figure out anything meaningful either. I\u2019m here at my client\u2019s (\u2026industrial laundry plant\u2026) in Waibstadt, and I can\u2019t do \u2026!\u201d Well, let\u2019s not translate what she said next\u2014but know that she can \u201cswear like a Pipe Sparrow,\u201d as they say in German, although the correct translation of that bird is presumably Reed Bunting. We just call them Pipe Sparrows in German. Anyway. Conclusion: The reporting part of the software would run without the dongle, alright. But the time study module\u2014which was literally why she was there\u2014not a chance to get that repaired and running.<\/p>\n<h2>So, What Happened to Her?<\/h2>\n<p>My mom uses a time study software from a reputable German ISV that specializes in REFA methodology. The principally very solid, well-designed software for the domain, maintained by professionals who actually understand industrial time studies, has one catch: the actual time <em>tracking<\/em> functionality requires a hardware dongle. Classic software protection from an era when copy protection meant physical dongles, not cloud licensing.<\/p>\n<p>And here\u2019s where hardware reality meets the modern Surface ecosystem: The dongle uses USB-A. The Surface Go 3 \u2013 a remarkably light and portable Windows tablet that\u2019s perfect for walking industrial floors all day \u2013 has only USB-C. So naturally, my mom was using some kind of USB hub. Convenient, yes. Robust when you\u2019re carrying it between industrial ironer stations daily? Not so much.<\/p>\n<p><img data-opt-id=1789996939  fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/SurfaceGo.webp\" alt=\"Surface Go 3 with USB-C attached mini-hub with connected software dongle and USB memory stick\" \/><\/p>\n<p>Now, this is all assumptions, and bottom line: It also doesn\u2019t really matter (or rather didn\u2019t, when the effect of the symptoms became clear): Over time, either the hub itself developed a cable break, or the USB-C port on the Surface had simply fatigued from all that dangling weight. A dongle, mostly hanging off a hub hanging off a tablet that gets moved around industrial laundries? That\u2019s a mechanical failure waiting to happen. So, they tried, then I tried, but ultimately: no dice. The GPF was there to stay.<\/p>\n<h2>Why Ask an 82-Year-Old on a 500-Mile Journey<\/h2>\n<p>So, here\u2019s the question: Why would an industrial laundry fly in (well, trust Deutsche Bahn to transport) an 82-year-old REFA time-study engineer from 500 miles away? The answer is: <em>experience<\/em>. Specifically, experience in one critical aspect of REFA methodology that can\u2019t be automated. And here is where I\u2019d ask you to bear with me with some German terms: Starting with the so-called <em>Leistungsgrad<\/em> (degree of performance) \u2013 a special form of visually and from observation assessed performance rating of employees, usually working in production plants.<\/p>\n<p><img data-opt-id=1664326120  fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/IndustrialIroner.webp\" alt=\"Photo collage showing an industrial ironer machine with multiple operator stations\" \/><\/p>\n<p>When my mom conducts <em>Zeitaufnahmen<\/em> (time studies), she\u2019s not just clicking a stopwatch. She\u2019s measuring <em>Ablaufabschnitte<\/em> (process steps) \u2013 in the case of the ironer: <a href=\"https:\/\/www.youtube.com\/watch?v=iUD3lyn9bVk\">grabbing laundry, clipping it in<\/a>, handling pieces that fall out \u2013 and for each step, she\u2019s estimating whether the worker is operating at 100% normal pace, faster, or slower. That judgment call, honed over decades, is what makes the resulting work values fair. Too generous, and the company overpays. Too strict, and workers can\u2019t achieve bonuses no matter how hard they try.<\/p>\n<p>This was important because this particular client had just installed new industrial ironers. These massive units process hundreds of kilograms of linens per hour, operated by teams of up to five workers per station. The company pays incentive wages: base salary plus bonuses when teams exceed the performance baseline. But to calculate that baseline fairly, you need accurate time studies. And for accurate time studies on new equipment, you need someone with the experience to judge \u201cnormal\u201d performance on day one.<\/p>\n<p>That\u2019s the win-win: The laundry gets a fair, union-approved wage system that improves productivity. The workers get transparent performance targets and real earning potential. And my mom gets to keep doing what she\u2019s loved doing for \u2013 let\u2019s not count the years too precisely.<\/p>\n<h2>Why This Business Case Is a Perfect WinForms Scenario<\/h2>\n<p>Let\u2019s pause and recognize what we have here, because it matters for understanding why this is your absolute typical WinForms Line of Business application type, and also, why WinForms development has been so successful and popular (and honestly, still is):<\/p>\n<ol>\n<li><strong>It\u2019s culturally and geographically specific.<\/strong> REFA methodology is a Central European thing \u2013 primarily German-speaking countries. The terminology (<em>Zeitaufnahme<\/em>, <em>Ablaufabschnitt<\/em>, <em>Leistungsgrad<\/em>) doesn\u2019t translate cleanly. This is industrial engineering born from post-war German manufacturing culture, still practiced today in ways that would seem antiquated to Silicon Valley but are perfectly rational in context.<\/li>\n<li><strong>It\u2019s incredibly niche.<\/strong> How many time study applications for incentive wage systems in industrial laundries exist? How many developers have ever heard of <em>Zeitarten<\/em> (time types like \u201cmachine time\u201d, \u201chandling time\u201d, \u201cinterruption time\u201d)? This is domain knowledge that lives in REFA training books and practitioners\u2019 heads \u2013 not Stack Overflow threads.<\/li>\n<li><strong>It\u2019s exactly what WinForms was designed for.<\/strong> A specialized tool, very user-interaction demanding, for a specialized profession, running on a Surface tablet in an industrial environment. No web framework needed. No cloud dependency. Just a robust, offline-capable Windows application that does one thing really well: capture time measurements accurately.<\/li>\n<\/ol>\n<p>This is the WinForms sweet spot: domain-specific, business-critical, and economically viable only because development effort can be contained. In the past, building such an application would require either (a) a developer spending weeks learning REFA methodology, or (b) a REFA expert learning to code \u2013 neither economically feasible for such a narrow use case. (But, just as a side-remark, often enough the main target audience for classic Visual Basic V4 to V6 at the time, and \u2013 for what it\u2019s worth \u2013 Python today.)<\/p>\n<h2>A Year Earlier: No Chance. But Now?<\/h2>\n<p>Under the normal IT-industry circumstances we learned to love over the last 40 years, that phone call would at that point have reached nearly the finish line. It may have turned me into an amateur therapist \u2013 listening sympathetically, maybe offering to cover unexpected hotel costs. But that would have been it. But \u2013 something fundamentally shakes the industry up. And that\u2019s why and where I got bold for the first time in the IT space beyond the Microsoft walls \u2013 and also yet oddly confident at the same time. Because an idea popped into my head, which was: building a replacement application from scratch. From scratch? In a weekend? While she\u2019s on-site? Was I kidding myself?<\/p>\n<p>See, this was no longer constrained by the status quo of Rapid Application Development from just a year ago \u2013 the discipline that made WinForms famous and accepted for over 25 years. This was, well, this <em>is<\/em> now Rapid-RAD, if you will. And not without a bit of pride, I might add: WinForms was the exact right candidate for it, since the new Visual Studio Copilot-based WinForms Expert Agent I had been working on the previous months had just found its way into the latest released VS version, and was now waiting for me to test it under absolute real-life conditions.<\/p>\n<p>But this wasn\u2019t a year ago. This was November 2025. And I had Visual Studio 2026, GitHub Copilot, and \u2013 crucially \u2013 the understanding that I didn\u2019t need to be a REFA engineer myself. I just needed enough domain-specific knowledge to follow her explanations, and then by asking targeted questions to capture what my mom knows. And guess what: That\u2019s exactly how a typical User Story collecting, Customer\/Product Owner\/Developer meeting is supposed to be done!<\/p>\n<p>\u201cMom,\u201d I said, \u201cI think I might actually be able to help you. Not with the dongle \u2013 that\u2019s dead. But maybe I can build you something that lets you do your time recordings. At least well enough to get through this assignment.\u201d<\/p>\n<p>There was a pause. My mom has seen enough technology promises to be skeptical. But she also knows I wouldn\u2019t make offers lightly \u2013 ones I can only attempt to deliver.<\/p>\n<p>\u201cOkay,\u201d she said. \u201cWhat do you need from me?\u201d<\/p>\n<h2>\u201cTell Me Everything\u201d \u2013 Via Microsoft Teams<\/h2>\n<p>\u201cLet\u2019s do a Teams call,\u201d I said. \u201cI need you to explain exactly what you do during a time study. What buttons you see on your Surface\u2019s screen, when and why you press them, what data you capture, what the workflow looks like. Everything.\u201d<\/p>\n<p><img data-opt-id=21984326  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/MomAndKlaus1.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Mom and son doing a Teams call\" \/><\/p>\n<p>For about an hour and a half, my mom walked me through the entire process: how she defines process steps before starting, how each step gets a numbered button, how the master clock runs continuously while individual timings are captured per button press, how interruptions are categorized, how the data exports to CSV for further analysis in Microsoft Excel.<\/p>\n<p>She told me about the industrial ironer stations, the clips that carry laundry through heated rollers, the percentage of pieces that fall out, and why machine counts never match actual operator workload. She explained performance rating \u2013 how she walks the floor first to get a sense of \u201cnormal,\u201d then adjusts measurements when workers speed up because they\u2019re being observed (which, by the way, would actually hurt their incentives later \u2013 just saying).<\/p>\n<p>And somewhere in there, she told me about the time she stood in an operating room during <em>actual<\/em> surgeries with a <em>sterilized clipboard<\/em>, measuring process differences using washed, sterilized reusable surgery cloth versus throw-away surgery cloths for a hospital cost analysis. But that\u2019s a story for another time. (Guess what though \u2013 washing won.)<\/p>\n<p>The call ended past midnight German time. My mom went to bed, probably still skeptical but at least feeling heard. I had a Teams recording and an automatically generated German transcript, and the rest of the Saturday.<\/p>\n<p><img data-opt-id=1970832343  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/MomAndKlaus2.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Mom explains the REFA time study approach in Teams meeting\" \/><\/p>\n<h2>From Transcript to Specification: Enter Copilot<\/h2>\n<p>While she went to bed, I got to work. In this case, the time difference between Germany and Washington State was actually quite helpful.<\/p>\n<p>I started with the Teams transcript. It was a \u2026 well, let\u2019s say, it started out actually pretty usable, until it was not. And I\u2019m not sure whether having the conversation in German helped the quality. We had:<\/p>\n<ul>\n<li>Speakers talking over each other, which considerably screwed up the transcript quality and led to<\/li>\n<li>misaligned timestamps, and then of course,<\/li>\n<li>both my mom and I have ADHD (yes, I\u2019m convinced at least aspects of it are heritable), so during those 90 minutes we were naturally jumping between topics: domain terms mixed with personal anecdotes and tangents about industrial crane manufacturers in the Saudi Arabian desert.<\/li>\n<\/ul>\n<p>But here\u2019s where it got interesting.<\/p>\n<p>I fed the transcript to Copilot with a prompt to this effect:<\/p>\n<pre><code class=\"language-markdown\">I need your help with the following content: This is a transcript with sections that don't reliably reflect what was said. The root cause is most likely that people were talking over each other in their enthusiasm. Please straighten this up and rewrite the sections that clearly don't make sense in context. The goal is to create coherent, meaningful discussion paragraphs that flow logically from one to the next.<\/code><\/pre>\n<p>Now, you could argue: isn\u2019t this changing what was said? Well, maybe. Maybe that happened here and there. And maybe you could be of the opinion that if Teams had done a better job transcribing what was said, <em>then<\/em> I could or should have proceeded and based the next steps on that. Because now the information was not reliable and not usable?<\/p>\n<p>I don\u2019t see it that way. There\u2019s enough information in the <em>resulting<\/em> form of the transcript that it could be enriched by what another LLM was trained on for error correction to get the transcript <em>sufficiently precise<\/em>. That\u2019s, FWIW, the <em>Project Captain\u2019s<\/em> judgment call, and in my experience when working with LLMs and the different Copilot incarnations of the current zeitgeist, a <em>permanently continuing<\/em> task. Guide and conduct Copilot (and yes, if that means consulting or including additional Copilots, that\u2019s totally legitimate!) through your knowledge and experience to the best possible outcome, where <em>you<\/em> are the guardrail \u2013 not as the technical source of truth, but ultimately as the responsible and reliable instance that neither another human nor an LLM \u2013 what did Dara say? \u2013 will \u201cfill in the gaps with whatever fairy tale most appeals to you.\u201d<\/p>\n<pre><code class=\"language-markdown\">This is a German transcript of a conversation between me and my mother about REFA time studies. Please separate the private\/personal content from the domain-specific explanations. Then create a structured requirements document for a time study application based on what she described.<\/code><\/pre>\n<p>When I read the result, I made that call, and I decided that for what I wanted to achieve, the result had a high enough confidence level to base the next steps on:<\/p>\n<p><img data-opt-id=632509175  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/Copilot_ResultingDocuments.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"The result of extracting topic-dependent information into new documents\" \/><\/p>\n<p>So, within seconds\u2026 OK, make it about an hour in total, Copilot had:<\/p>\n<ul>\n<li><strong>Step 1:<\/strong> Cleaned up the original docx that came from Teams, which I had only very quickly purged of information that had been just too personal. The resulting transcript was WAY better than the original Teams transcript and would work as a basis for what I had in mind: _transskript<em>bereinigt.md<\/em> (<em>bereinigt<\/em> meaning <em>cleaned up<\/em>).<\/li>\n<li><strong>Step 2:<\/strong> Identified and set aside the personal tangents (the OR story, the career history, the retirement jokes) into a neat little document called _gabys<em>memoir.md<\/em>.<\/li>\n<li><strong>Step 3:<\/strong> The same prompt yielded 2 other documents: A glossary in German around REFA so I could bring myself up to speed, and the same glossary translated into English.<\/li>\n<li><strong>Step 4:<\/strong> The actual prompt document for Copilot in Visual Studio, which basically held the extracted core workflow of the WinForms app I wanted it to create: start clock, define process steps, assign numbered buttons, capture times per button press, handle interruptions, export to CSV.<\/li>\n<\/ul>\n<p>Part of that were also the list of required UI elements: a master clock, configurable process step buttons, interrupt categories, a running log of measurements. This also included noted edge cases my mom had mentioned: what happens when you forget to stop the clock, how \u201cempty\u201d time segments are handled, why certain button numbers (18, 19, 40) are reserved for standard interrupt types.<\/p>\n<p>I had gone from \u201cmy mom is stranded with a broken dongle\u201d to \u201cI have a complete functional specification\u201d in less than two hours. Most of that time was the original Teams call, mind you, and a good 60 minutes of that we also had fun mocking the state of the German train system.<\/p>\n<p>Now that I had everything, came the real test: Could Copilot actually <em>build<\/em> the thing?<\/p>\n<h2>Entering Copilot in Visual Studio and the New Agent Support<\/h2>\n<p>Agents in Visual Studio are very much a work in progress. And I think it\u2019s safe to assume that we\u2019re rather at the beginning of that journey. This, by the way, is also the main reason for Visual Studio\u2019s new update cadence \u2013 it\u2019s simply a necessity to keep pace with the development. Both to provide the latest capabilities in terms of utilizing the most advanced Large Language Models (ChatGPT, Anthropic\u2019s Claude Sonnet and Opus, Google\u2019s Gemini, and what have you), but also to provide the security guardrails, which are certainly more than a \u201cnice-to-have.\u201d<\/p>\n<p>But here\u2019s the thing: With every new feature around Copilot Chat and Agents, we also need to provide users an option to include that feature for an Ask or an Agent task \u2013 or not. That\u2019s why \u2013 specifically for WinForms \u2013 the first attempts to let an agent create something useful in terms of WinForms LOB (Line-of-Business) apps can be both impressive and underwhelming at the same time. Here, let me show you what I mean.<\/p>\n<p>First, let\u2019s quickly revisit how we can work with Copilot best for WinForms apps, and what the different Copilot modes actually mean. The linchpin for everything Copilot is the GitHub Copilot Chat tool window, which you\u2019ll typically see in a tab cluster along with the <em>Solution Explorer<\/em>, most likely the <em>Git Changes<\/em> tool window, and the good old <em>Property Grid<\/em>.<\/p>\n<p><img data-opt-id=372570877  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/ShowingCopilotChatToolWindow.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot of the Copilot Chat Window and the pulldown menu with which you can activate it should you not see it\" \/><\/p>\n<p>Should you <em>not<\/em> see the Chat Window, just click on the Copilot symbol in the upper right corner of Visual Studio\u2019s UI and activate it with <em>Open Chat Window<\/em>.<\/p>\n<p>OK, so we\u2019ve made sure we\u2019re in the Chat Window, we\u2019ve enabled Agent mode (using some free model initially to later see the difference), and now we\u2019re typing our first app generation prompt and sending it off. And for that, let\u2019s not begin with the more complicated REFA stuff, let\u2019s keep it simple, for a Time Tracking approach, we all know.<\/p>\n<pre><code class=\"language-markdown\">Create a minimalistic WinForms Time Tracking App with:\r\n\r\n**Main Form:**\r\n- A UserControl for time entry with fields: Start Time, End Time, Task Description, and an \"Is Break\" checkbox\r\n- A ListView (Details mode) showing all entries for the current day\r\n- A StatusStrip displaying: Total Attendance, Working Time, Break Time\r\n\r\n**Validation:**\r\n- Plausibility check on time input (end &gt; start, valid times)\r\n- No overlapping entries allowed for the same day\r\n\r\n**Editing:**\r\n- Clicking a ListView entry loads it into the UserControl for editing\r\n- Deleting entries\r\n\r\n**Persistence:**\r\n- One JSON file per day (auto-named by date)\r\n- Open\/edit\/save day files\r\n- Options dialog to set the default storage directory<\/code><\/pre>\n<p>The result can be\u2026 let\u2019s call it: suboptimal.<\/p>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"1000\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/FirstAgentCodedTest.webm\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/FirstAgentCodedTest.webm<\/a><\/video><\/div>\n<p>As you can see in that animated gif: The button sizes are completely off \u2013 you can barely read the captions. Same for the table headers. Controls don\u2019t resize when the Form resizes. These things should work out of the box.<\/p>\n<p>The results also depend on the model you\u2019re using and how well it was trained on WinForms data.<\/p>\n<p>But while these hiccups are fixable, the biggest issue is (also visible in the gif): open a Form in the Designer, and you get either nothing or the \u201cWhite Screen of Darn\u201d:<\/p>\n<p><img data-opt-id=241158267  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/WhiteScreenOfDarn.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot of a typical WinForms Designer 'White Screen of Darn'\" \/><\/p>\n<p>Without certain adjustments, the code Copilot creates isn\u2019t compatible with the WinForms Designer.<\/p>\n<h3>Choose Your Options \u2013 and Use the Model Wisely<\/h3>\n<p>You can and should adjust GitHub Copilot options for WinForms. The model you use largely determines outcome quality: cheaper models exist, but the more expensive ones usually yield <em>way<\/em> better results.<\/p>\n<p>I personally get the best results with Anthropic\u2019s Claude models. Sonnet 4.5 produces results that never stop amazing me. And Opus 4.5\u2026 you just <em>have<\/em> to see for yourself.<\/p>\n<p>Regardless of model choice, make sure these options are activated in <em>Tools\/Options<\/em> under <em>GitHub<\/em>:<\/p>\n<p><strong><a href=\"https:\/\/learn.microsoft.com\/visualstudio\/ide\/copilot-agent-mode\">Enable Agent mode in the chat pane<\/a>: Relevant for WinForms!<\/strong><br \/>\nUnlike Ask mode, Agent mode autonomously handles multi-step tasks, edits code across files, runs terminal commands, monitors build\/test results, and iterates until complete. Access it via the mode dropdown in Copilot Chat.<\/p>\n<p><strong><a href=\"https:\/\/learn.microsoft.com\/visualstudio\/ide\/mcp-servers\">Enable MCP server integration in agent mode<\/a>:<\/strong><br \/>\nConnects Agent mode to Model Context Protocol (MCP) servers for extended capabilities. MCP lets Copilot interact with external tools like GitHub issues, Azure resources, and databases. Configure servers via <code>.mcp.json<\/code> files.<\/p>\n<p><strong><a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/introducing-planning-in-visual-studio-public-preview\/\">Enable Planning<\/a>: Relevant for improving Quality in WinForms!<\/strong><br \/>\nFor complex requests, Copilot generates a Markdown plan with task breakdown, research steps, and progress tracking. Takes more time but yields magnitudes better results for WinForms tasks.<\/p>\n<p><strong><a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/introducing-planning-in-visual-studio-public-preview\/\">Enable View Plan Execution<\/a>: Useful for WinForms!<\/strong><br \/>\nShows real-time progress during Planning execution. I recommend keeping the result as part of your project and GitHub history.<\/p>\n<p><strong><a href=\"https:\/\/learn.microsoft.com\/visualstudio\/ide\/copilot-chat-context\">Enable project capability specific instructions<\/a>: <em>Most important setting for WinForms!<\/em><\/strong><br \/>\nAutomatically injects framework-specific guidance based on detected project type. For Windows Forms, Copilot receives relevant conventions and patterns without manual configuration.<\/p>\n<p><strong><a href=\"https:\/\/learn.microsoft.com\/visualstudio\/ide\/copilot-context-overview\">Enable memories for repo-level preferences<\/a>: Useful for WinForms!<\/strong><br \/>\nCopilot learns project-specific coding standards from your interactions and saves them to <code>.editorconfig<\/code>, <code>CONTRIBUTING.md<\/code>, or <code>README.md<\/code>. Not WinForms-specific, but helpful for team work.<\/p>\n<p>With those options set and one of Anthropic\u2019s latest models, the result is spectacular:<\/p>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"1000\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/SecondAgentCodedTest.webm\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/SecondAgentCodedTest.webm<\/a><\/video><\/div>\n<p>That little app is now usable right from the get-go:<\/p>\n<ul>\n<li>HighDPI-proofed layout using TableLayoutPanel consistently throughout.<\/li>\n<li>Proper spacing and logical control grouping \u2013 way more intuitive.<\/li>\n<li>StatusStrip correctly positioned at the bottom with a sensible grab handle.<\/li>\n<li>Most importantly: Forms and UserControls are WinForms Designer compatible.<\/li>\n<\/ul>\n<h2>How Relevant is the Human Language?<\/h2>\n<p>Remember that my mom and I held our Teams conversation in German? I asked Copilot (the web-based version using ChatGPT o1) to generate the Visual Studio prompt in English from that German transcript.<\/p>\n<p>You might think this was just preference or convenience. After all, LLMs work based on <em>meaning<\/em> rather than literal words \u2013 so there shouldn\u2019t be translation issues, right?<\/p>\n<p>Well, yes and no. And this is where it gets interesting.<\/p>\n<h3>The English Advantage (Whether We Like It or Not)<\/h3>\n<p>Does the human language of a prompt <em>actually<\/em> matter for code generation quality?<\/p>\n<p>A <a href=\"https:\/\/arxiv.org\/abs\/2408.09701\">2024 study on multilingual code generation<\/a> found significant disparities when using non-English prompts. Using Chinese instructions led to an average <strong>17.2% drop in Pass@1 rates<\/strong> for base models generating Python code. For instruction-tuned models, still a 14.3% drop. CodeLlama-34B\u2019s Java generation <strong>plummeted by 37.8%<\/strong> with Chinese instead of English instructions.<\/p>\n<p>The researchers tested obvious fixes: prompt translation, data augmentation, fine-tuning. None adequately solved the problem.<\/p>\n<p>Even GPT-4 shows \u201cslightly varying error profiles\u201d across languages \u2013 and struggles more with Hindi and Chinese compared to European languages.<\/p>\n<h3>Why Does This Happen?<\/h3>\n<p>When you prompt in English, the model draws from its massive English training corpus. Prompt in German, Chinese, or Hindi, and you\u2019re asking it to work with a smaller, less refined slice of its knowledge.<\/p>\n<p>One researcher put it bluntly: models maintain somewhat independent \u201cpiles\u201d of knowledge per language, and how these inform each other during generation isn\u2019t entirely clear \u2013 but they behave quite independently. English simply has the largest pile.<\/p>\n<p>This isn\u2019t a moral judgment \u2013 it\u2019s just current training reality. Most leading LLMs come from English-dominant companies: OpenAI, Anthropic, Google, Microsoft. Even DeepSeek, a Chinese company, <a href=\"https:\/\/arxiv.org\/html\/2404.19368\">shows the same English-favoring pattern<\/a>.<\/p>\n<h3>What About Code-Mixing?<\/h3>\n<p>Here\u2019s another wrinkle: many developers naturally code-mix with AI assistants. You might write \u201cDenglisch\u201d: \u201cErstelle eine Funktion, die den user input validated.\u201d Seems natural, right?<\/p>\n<p>Research using a benchmark called <a href=\"https:\/\/arxiv.org\/html\/2505.05063v1\">CodeMixBench<\/a> found that code-mixed prompts <strong>consistently degrade Pass@1 performance<\/strong> compared to pure English. Degradation worsens at higher mixing levels, and smaller models (1B-3B parameters) suffer more.<\/p>\n<p>The takeaway? Even partial German (or Spanish, or Chinese) introduces friction.<\/p>\n<h3>The Cascaded Prompt Pattern<\/h3>\n<p>What\u2019s the practical solution for international teams? Based on a bit of research, but most of all my own experience, I suggest the <strong>Cascaded Prompt Pattern<\/strong>:<\/p>\n<ul>\n<li><strong>Capture requirements in the native language.<\/strong> Let stakeholders express domain requirements in whatever language they\u2019re most comfortable with. You\u2019ll get more precise, complete information. If you use AI for audio transcript, use further AI\/LLM passes to ensure the best knowledge data basis.<\/li>\n<li><strong>Translate and restructure to English.<\/strong> Use an LLM to convert native-language input into a well-structured English prompt. This isn\u2019t just translation \u2013 it\u2019s transformation into a format optimized for code generation.<\/li>\n<li><strong>Improve and verify.<\/strong> Have the LLM review that once more for clarity, precision, and completeness.This is also where grammar matters more than you\u2019d think. Consider:\n<ul>\n<li><strong>\u201cLet\u2019s eat, grandma!\u201d<\/strong> \u2013 calling grandma to dinner<\/li>\n<li><strong>\u201cLet\u2019s eat grandma!\u201d<\/strong> \u2013 suddenly we\u2019re generating code for a cannibal simulator<\/li>\n<\/ul>\n<p>The classic \u201conly\u201d placement disaster:<\/p>\n<ul>\n<li><strong>\u201cGive the intern access only to the test database.\u201d<\/strong> \u2013 intern gets test DB, all is well<\/li>\n<li><strong>\u201cOnly give the intern access to the test database.\u201d<\/strong> \u2013 ambiguous: do others get access too?<\/li>\n<li><strong>\u201cGive only the intern access to the test database.\u201d<\/strong> \u2013 suddenly <em>only<\/em> the intern has access, everyone else is locked out<\/li>\n<\/ul>\n<p>For non-native English speakers, these pitfalls multiply:<\/p>\n<p><strong>German thinking:<\/strong> \u201cGib dem Praktikanten nur Zugriff auf die Testdatenbank.\u201d<\/p>\n<p>This could become:<\/p>\n<ul>\n<li><img data-opt-id=165024845  data-opt-src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/2705.png\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\u2705\" class=\"wp-smiley\" \/> \u201cGive the intern access only to the test database\u201d \u2013 correct, limiting scope<\/li>\n<li><img data-opt-id=1422879373  data-opt-src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/26a0.png\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\u26a0\" class=\"wp-smiley\" \/> \u201cOnly give the intern access to the test database\u201d \u2013 wait, what about everyone else?<\/li>\n<li><img data-opt-id=1112876390  data-opt-src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/274c.png\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\u274c\" class=\"wp-smiley\" \/> \u201cGive only the intern access to the test database\u201d \u2013 congratulations, you just locked out your entire team<\/li>\n<\/ul>\n<p>An LLM reviewing your prompt can catch these subtleties before they derail code generation.<\/p>\n<\/li>\n<li><strong>Execute in English.<\/strong> Run code generation against the polished English prompt for best output quality.<\/li>\n<li><strong>Limit tokens without changing meaning.<\/strong> LLMs know about LLMs \u2013 we humans use filler words that add no concrete content. \u201cStraighten up\u201d or \u201cshorten\u201d requests help keep context windows manageable.<\/li>\n<\/ul>\n<p>Cascaded Prompting gives you native-language precision for requirements gathering <em>and<\/em> English-language performance for code generation. Best of both worlds.<\/p>\n<h3>What that does improve for Your Team<\/h3>\n<p>If you\u2019re working internationally:<\/p>\n<ul>\n<li>Colleagues gathering requirements in their native language are <em>improving<\/em> requirement quality by expressing themselves naturally.<\/li>\n<li>But the <em>execution<\/em> prompt should be English \u2013 not because English is \u201cbetter,\u201d but because that\u2019s where models perform best today.<\/li>\n<\/ul>\n<p>That prompt for my mom\u2019s software? No one really wrote it, yet it became nearly 15 KB of precise solution description. I believe prompts responsible for major code generation should be part of your solution. I always create a Copilot subdirectory to hold generation prompts and major refactoring requests.<\/p>\n<p><img data-opt-id=1264680304  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/PromptAsMarkdownInSolution.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot of a prompt excerpt as part of the project\" \/><\/p>\n<h2>Cede Magnum Opus<\/h2>\n<p>So, at this point, we were at the ideal base situation:<\/p>\n<ul>\n<li>We got the Options set which were ideal for WinForms Agent runs.<\/li>\n<li>We had an English prompt, which was generated and probably edited and then rechecked by an LLM.<\/li>\n<li>We planned to get one of the most sophisticated Models to work \u2013 Anthropic\u2019s new Opus 4.5.<\/li>\n<\/ul>\n<p>It was time to say: Give it a go, let\u2019s run it and see what happens!<\/p>\n<h3>IntelliSense in your prompt, references to your solution files<\/h3>\n<p>What I always did, before I let Copilot loose and take over: I created the project. I wanted to make sure I got the project naming right, I set the correct Target Framework, and the whole solution landed in the right folder. And, if it wasn\u2019t a \u201cneed a tool for the next 3 minutes\u201d-kind of app, then I also created a GitHub repo. And so, here is how I started:<\/p>\n<ul>\n<li>I created the GitHub repo, and called it <em>RefaTimeStudies<\/em>.<\/li>\n<li>I cloned the repo locally.<\/li>\n<li>I created a subfolder src, and in that folder I created a new WinForms project, like so:<\/li>\n<\/ul>\n<p><img data-opt-id=608245493  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/CreateWinFormsProject.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot depicting the creation of the new WinForms 'RefaTimeStudies' project in CSharp\" \/><\/p>\n<ul>\n<li>Once Visual Studio had the project created, I renamed <code>Form1<\/code> into <code>FrmMain<\/code>, because this was the first thing I did since VB4 times. It\u2019s a habit. A quirk.<\/li>\n<li>I also went through all existing code files, and changed the namespaces definition to be file scope namespaces. (And yes, that is something, we\u2019re planning to address for WinForms templates in .NET 11 \u2013 promised!)<\/li>\n<li>I created a solution folder, named <code>_solution folder<\/code>. I really start that name with an underscore to make sure that folder really sits on top of everything else.<\/li>\n<li>In the file explorer, I created a .github folder, and I further created a subfolder named AppPrompts. Everything I had generated so far, I copied into that folder, added it in VS to that solution folder, and that was the baseline I checked in as the initial app frame commit, with a Solution structure that looked like this:<\/li>\n<\/ul>\n<h3>IntelliSense for References in Prompts<\/h3>\n<p>Now, here\u2019s where Visual Studio\u2019s Copilot Chat really shines: you can work in two distinct modes\u2014<strong>Ask<\/strong> and <strong>Agent<\/strong>\u2014and understanding the difference is crucial for effective development.<\/p>\n<p><strong>Ask mode<\/strong> is your traditional Q&amp;A experience. You ask a question, Copilot answers. It\u2019s great for quick queries, code explanations, or getting help with a specific line of code. Think of it as having a knowledgeable colleague sitting next to you who\u2019s happy to look things up but won\u2019t take the keyboard from you. Actually, that\u2019s pretty much where the original name \u2018Copilot\u2019 came from. And of course, it is very useful to also have small code snippets amended, or to check for typos and straighten up a paragraph of blog post text\u2014like I just did with this very paragraph I just finished writing. (OK, this is VS Code, not Visual Studio, granted. But the approach for Ask mode is exactly the same in both.)<\/p>\n<p><img data-opt-id=502590176  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/AskMode1.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing how to request a task in the inline ask mode\" \/><\/p>\n<p><img data-opt-id=353936261  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/AskMode2.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing the result of the executed task\" \/><\/p>\n<p><strong>Agent mode<\/strong>, on the other hand, is where the magic happens for multi-step tasks. When you switch to Agent mode (via the dropdown in the Copilot Chat window), you\u2019re not just asking questions \u2013 you\u2019re delegating. The Agent can autonomously edit files across your solution, run terminal commands, monitor build results, and iterate until the task is complete. For building our REFA time-study app, Agent mode was essential: it needed to create multiple files, extend the existing project structure, implement the WinForms Designer-compatible code, and handle all the interdependencies between them.<\/p>\n<p><img data-opt-id=1966310772  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/CopilotModeSelector.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing the mode dropdown selector in Copilot Chat, with 'Agent' mode selected\" \/><\/p>\n<p>But here\u2019s where it gets even better: you don\u2019t have to type out lengthy prompts in the chat window. Visual Studio Copilot Chat supports file references directly from your solution. Simply type a <code>#<\/code> (hash symbol) in your prompt, and IntelliSense springs to life, showing you all files in your solution that you can reference. Type <code>#.md<\/code> and it filters to show only Markdown files\u2014perfect for when you have a well-crafted prompt document ready to go.<\/p>\n<p>This is precisely what I did: after having used the web portal of the LLM of my choice (use Copilot, ChatGPT, Claude \u2013 whatever makes you happy!) to generate and refine the main REFA time-study prompt in English, I saved it as <code>refa_timestudies_prompt.md<\/code> in the solution. Now, instead of pasting thousands of characters of instructions into the Copilot chat window, I could simply write something like: \u201cUse the specifications in #refa_timestudies_prompt.md to build this WinForms application.\u201d<\/p>\n<p>This is cascaded prompting in action: first, an LLM helps craft the prompt \u2013 I did that with Anthropic\u2019s Claude Sonnet. Then, another LLM (through Copilot in Visual Studio \u2013 I chose Anthropic\u2019s Opus 4.5 back then \u2013 but I\u2019ll be honest: I did it again for this blog post, out of curiosity about the results with Opus 4.6) consumes that prompt to generate the actual code.<\/p>\n<p>The prompt document becomes part of your solution\u2014versioned, reviewable, and reusable. It\u2019s not just a convenient shortcut; it\u2019s a documentation artifact that captures exactly what your application should do, in a format that both humans and machines can understand.<\/p>\n<h3>The direction I dare to suggest for prompt-driven development<\/h3>\n<p>And my honest opinion is: we should drive the development of tools with way more focus on that. Coding is a developer\u2019s way to express <em>intent<\/em>. But so is writing prompts. The argument against treating prompts on the same level as code is that compiler output is predictable, while LLM-generated source code is not\u2014and that\u2019s true on a certain level. But the question is how relevant that difference really is. Bottom line: we will only be able to truly review or unit-test the new and often insane amounts of code we\u2019re now dealing with when our review and test principles reach the same abstraction level as code generation itself.<\/p>\n<p>And think about it: you\u2019re not really reviewing the generated IL code, or writing unit tests in IL, when you use a tool like the C# compiler or the VB compiler to express your intent for what an app should do in which circumstances, right? You\u2019re reviewing C# and you\u2019re writing the unit tests in C#\u2014so why aren\u2019t we exploring feasible ways to review in natural language, or write the unit tests for the results in natural language? Because that doesn\u2019t work? Well, I would even agree\u2014for now. But I would also say: let\u2019s find a way to <em>make<\/em> that work!<\/p>\n<p><img data-opt-id=475113901  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/CopilotHashIntelliSense.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing the '#' IntelliSense dropdown in Copilot Chat, displaying available Markdown files to reference\" \/><\/p>\n<p>And then Copilot WinForms Expert Agent did its thing:<\/p>\n<ul>\n<li>It created everything\u2014Forms, UserControls, models, data structures, the whole nine yards.<\/li>\n<li>It encountered a few errors in its own generated code, but identified and fixed them autonomously.<\/li>\n<li>Total generation time: about 15 minutes. Not bad for what would have taken me days to build manually.<\/li>\n<\/ul>\n<p>The first thing I tested when Copilot completed its run: could I open the Forms in the Designer? This is where the WinForms Expert Agent earns its keep. Getting the separation of concerns right\u2014ensuring Designer-managed code lands in the <code>.Designer.cs<\/code> file while business logic stays in the main code file\u2014took considerable effort. In complex Forms, there might still be edge cases. We\u2019re getting there \u2014 but, 3 months after release to production, my pulse still increases by 30 beats per minute while waiting for the Designer to come up.<\/p>\n<p>Lo and behold, though, everything opened perfectly in the WinForms Out-Of-Proc Designer. No errors, no glitches, no \u201cWhite Screen of Darn.\u201d<br \/>\nAnd actually, the layout was pretty cool, too. But, ok, I get it, I might be biased.<\/p>\n<p>In the Designer at least.<\/p>\n<h2>Second Customer Iterations<\/h2>\n<p>The first <em>run<\/em> was\u2026 somewhat OK. OK-ish. On the surface. But there were \u2013 let\u2019s say: misunderstandings.<\/p>\n<p>Here, let\u2019s look. In the very first version Copilot generated back in December with Opus 4.5, the English UI was mostly OK. But the German version had \u2013 surprise \u2013 problems with the umlauts. Don\u2019t we all love Unicode, particularly when it\u2019s not used? My last name here in the US has many, many variants. In the Microsoft internal system, I became Loffelmann after I migrated to Redmond from Munchen. In the Campus pharmacy, it\u2019s usually Loeffelmann. Most of the time. But of course, my most favorite ones are still L ffelmann and L\u00c3\u00b6ffelmann.<\/p>\n<p><img data-opt-id=240027384  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/FirstDraftIssue_UnicodeIssuesInUI.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing issues with German umlauts in the localized UI\" \/><\/p>\n<p>So, as you see \u2014 the Diamond in question (that\u2019s probably $10 in the pun jar right there) found its way into the UI here as well. And trying to fix this directly in the resource file was also not as simple as I would have thought:<\/p>\n<p><img data-opt-id=549115293  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/FirstDraftIssue_UnicodeIssuesInResourceFile.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing an error message dialog on opening Visual Studio's resource editor\" \/><\/p>\n<p>And while those weren\u2019t really show stoppers back then, three months later the quality is yet again way better, but still not perfect:<\/p>\n<p><img data-opt-id=1173850394  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/FirstDraftIssue_Opus_46.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing umlaut issues in the Opus 4.6 version of the localized UI\" \/><\/p>\n<p>Obviously, though, those things were all pretty superficial and therefore would also have been pretty quick to fix. But. What about the domain-specific part? Did Copilot understand what my Mom really wanted?<\/p>\n<h2>Know what the customer wants, not what the customer says they want<\/h2>\n<p>This is where prompt-driven development enters a domain that is very, very painful for many developers. I\u2019ve heard developers often say \u201cCopilot can be made to do what I want. But I have to tell it in great detail!\u201d Well, guess what. Every Scrum Product Owner hears that and says \u201cWelcome to my world!\u201d \u2014 they know how to translate \u201ccustomerish\u201d into \u201cwork-item-ish\u201d that the developer then understands, aaand \u2014 when it\u2019s an experienced Scrum Product Owner \u2014 which is spelled out so unambiguously well that it does not leave much leeway for the decisive areas of the domain specifics. But enough play to get the best of the developer\u2019s creativity, enthusiasm, and out-of-the-box thinking into the work. It\u2019s a constant juggling of compromises and fine-tuning, and exactly that is prompt-driven development. Leave \u201ctemperature\u201d for uniqueness and originality, but nail the essentials with the predictability of JSON-structured LLM code generation. We all know by now, both are possible and reliably possible. The art is how you guide the LLM to produce what you want. And also, to be honest, it gets easier with every new dot-release.<\/p>\n<h3>The hour of truth \u2013 what did Customer Mom say<\/h3>\n<p>Well, as soon as I shared my screen, and she saw the dialog: \u201cAch herje, das ist aber mal dunkel\u2026\u201d (Yeah, mom, it is not particularly bright. That\u2019s why we call it dark mode. And it was one of the most requested features, and your son\u2014) \u201c\u2026und wie soll man denn in nur einer Zeile die Beschreibung eingeben, ne, so geht das nicht.\u201d (Well, the time study description in one line\u2026she\u2019s got a point. Should have been a multiline TextBox.) \u201c\u2026au\u00dferdem\u2026\u201d<\/p>\n<p>So\u2026we tested what we have, and it became, let\u2019s say, a somewhat longer list. I thought it might be entertaining to show it in its original German, pretty much unedited version of the change notes \u2013 should you be curious what it means, just use Copilot to have it translated. Should you then also want to know, what it means in terms of REFA \u2013 then also ask Copilot. Use it for your own experiments \u2013 I hope, it can serve as the right and typical document for testing, experimenting and ramping up.<\/p>\n<pre><code class=\"language-Markdown\"># Nachbesserungsanfrage nach Besprechung\r\n\r\n* Das Eingabefeld f\u00fcr \"Definition Name\" einen deutlichen gr\u00f6\u00dferen Zeichensatz verwenden, damit die Orientierung in der Maske gewahrt ist. Wir sollten von 16 Punkt Schritgr\u00f6\u00dfe ausgehen und Fettschrift.\r\n\r\n* Das Description-Feld muss mehrzeilig sein (mindestens 4 Zeilen hoch) und einen Scrollbar haben.\r\n\r\n* Aktuell k\u00f6nnen Daten in die Grundfelder eingegeben werden, bevor auf _New Definition_ geklickt wurde \u2013 das Speichern schl\u00e4gt dann fehl. Die Buttons und Textfelder sollten daher initial deaktiviert sein und erst nach Klick auf _New Definition_ aktiv werden.\r\n\r\n* Die drei Schaltfl\u00e4chen am unteren Rand in die Toolbar konsolidieren.\r\n\r\n* Die Toolbar soll kontextabh\u00e4ngig nur die jeweils relevanten Schaltfl\u00e4chen anzeigen (gesteuert durch eine interne Logikmatrix). Wichtig ist es aber dennoch, dass die Breite der MenuItems stets gewahrt bleibt, damit ihr jeweiliger Inhalt nicht abgeschnitten wird.\r\n\r\n  Beispiele f\u00fcr die ToolStripButton-Steuerungslogik:\r\n\r\n    * Solange keine Definition erstellt (_New Definition_) oder geladen (_Open Definition_) wurde, werden _Add Step_ und _Export CSV_ nicht angezeigt.\r\n    * Wenn eine Definition keine Process Steps enth\u00e4lt, kann keine Zeitaufnahme gestartet werden.\r\n    * Wenn kein Step in der Liste vorhanden oder markiert ist, wird _Remove Step_ nicht angezeigt.\r\n    * ...\r\n\r\n* Die Schaltfl\u00e4chen im ToolStrip sollten die in den Optionen definierte Mindestgr\u00f6\u00dfe haben, zuz\u00fcglich 5 px \u00d7 Scalingfaktor Padding, sowie eine gezeichnete Umrandung mit abgerundeten Ecken. Es gibt eine neue .NET 10 API f\u00fcr abgerundete Rechtecke, die vielleicht in diesem Kontext nutzbar ist.\r\n\r\n* Bei aktiviertem DarkMode muss die Farbgebung im DataGridView angepasst werden. Dabei sollen absolute Farbwerte statt SystemColors verwendet werden, um die Farbnuancen gezielt steuern zu k\u00f6nnen.\r\n\r\n* Das Padding der GroupBox, die das DataGridView enth\u00e4lt, sollte an den seitlichen R\u00e4ndern etwas gr\u00f6\u00dfer sein.\r\n\r\n* Wir sollten Order # in Step No\/Schritt Nr. umbenennen.\r\n\r\n* Wir ben\u00f6tigen eine zus\u00e4tzliche Spalte mit dem Titel \"Codierung\/Code No\".\r\n\r\n* Schaltfl\u00e4chen mit Pfeil nach oben\/unten hinzuf\u00fcgen (Icons aus einem Symbolzeichensatz generieren), um Ablaufabschnitte zu verschieben. Wichtig: Verschoben werden kann nur in numerische L\u00fccken. Beispiel: Bei den Schritt-Nr. 1, 2, 3, 5, 7, 9, 10 kann 10 auf Position 8 oder 6 springen, und 1 kann auf 4, 6, 8 oder 11 springen. Die Schritt-Nr. wird dabei entsprechend aktualisiert.\r\n\r\n* Beim \u00c4ndern der Schritt-Nr. wird die gesamte Ablaufzeile verschoben, sofern der neue Wert noch nicht existiert. Andernfalls muss eine Fehlermeldung erscheinen \u2013 doppelte Schritt-Nr. sind nicht erlaubt.\r\n\r\n## \u00c4nderungen bei Zeitaufnahmen\r\n\r\nDie Buttons der Zeitaufnahmen sollten linksb\u00fcndig, untereinander angeordnet sein, und neben der Schritt Nr. auch den Code als Aufschrift beinhalten. Neben der Schaltfl\u00e4che sollten die ersten Zeichen der Schrittbeschreibung angezeigt werden. Die einzelnen Ablaufabschnitte m\u00fcssen aber w\u00e4hrend der Zeitaufnahme deutlich von einander visual getrennt sein, damit die Orientierung gewahrt bleibt. Es k\u00f6nnte hier sinnvoll sein, die Schaltfl\u00e4chen in einem eigenen Panel mit abgesetztem Hintergrund zu platzieren.\r\n\r\nAm unteren Rand des Bildschirms soll es ein zus\u00e4tzliches Texteingabefeld geben, in dem man f\u00fcr den aktuelle Arbeitsablauf-Schritt Notizen eingeben kann. Diese Notizen sollten in der CSV-Exportdatei in einer eigenen Spalte mit exportiert werden. GGf. m\u00fcsste hier das interne Datenmodell angepasst werden, um die Notizen pro Schritt zu speichern.\r\n\r\n## Dom\u00e4nenspezifische, notwendige \u00c4nderung bei Einheiten und Zeitarten\r\n\r\nDie Funktionsbeschreibung der Einheiten war faktisch falsch. Die Einheiten werden nur f\u00fcr einen gesamten Ablauf definiert, nicht pro Schritt. Daher muss die Einheit in der Definitionstabelle definiert werden, und die Schritte sollten nur die Zeitarten (tr, te, tg) enthalten.\r\n\r\nDie entsprechenden Umbauarbeiten sind damit:\r\n\r\n* Anpassen des Datenschemas, sodass die Einheiten in der Definitionstabelle definiert werden und nicht in den Schritten.\r\n* Hinzuf\u00fcgen eines neuen Eingabefelds f\u00fcr die Einheit in der Definitionserstellung\/-bearbeitung.\r\n* Anpassen des Datenschemas f\u00fcr die Schritte, sodass sie nur die Zeitarten (tr, te, tg) enthalten (siehe untenstehende Tabelle und Bedeutung)\r\n* Sowohl Einheiten der Definition als auch die Zeitarten in den Schritten haben nur dokumentarischen Charakter, sie haben keinen Einfluss auf die Berechnung der Zeiten oder die Logik der Ablaufsteuerung.\r\n\r\nDie Zeitarten laut REFA haben folgende Bedeutung:\r\n\r\n| Code | Bezeichnung             | Beschreibung                                                      |\r\n| ---- | ----------------------- | ----------------------------------------------------------------- |\r\n| tb   | Brachzeit               | Zeit, in der der Werker w\u00e4hrend des Maschinenbetriebs unt\u00e4tig ist |\r\n| ter  | Erholungszeit           | Erholungspausen zur k\u00f6rperlichen\/geistigen Regeneration           |\r\n| tg   | Grundzeit               | Direkte Ausf\u00fchrungszeit f\u00fcr die Kernaufgabe                       |\r\n| th   | Hauptzeit               | Zeit, in der das Werkst\u00fcck aktiv bearbeitet wird                  |\r\n| tn   | Nebenzeit               | Hilfszeit (Beladen, Entladen, Positionieren)                      |\r\n| tp   | Pers\u00f6nliche Verteilzeit | Zeit f\u00fcr pers\u00f6nliche Bed\u00fcrfnisse                                  |\r\n| tr   | R\u00fcstzeit                | Vorbereitungs- und Nachbereitungszeit je Auftrag                  |\r\n| ts   | Sachliche Verteilzeit   | Zeit f\u00fcr betriebliche St\u00f6rungen (Werkzeugwechsel usw.)            |\r\n| tt   | T\u00e4tigkeitszeit          | Zeit der tats\u00e4chlichen menschlichen T\u00e4tigkeit                     |\r\n| tv   | Verteilzeit             | Zus\u00e4tzliche Zeitzuschl\u00e4ge (pers\u00f6nlich + sachlich)                 |\r\n| tw   | Wartezeit               | Unvermeidbares Warten (prozessbedingt)                            |\r\n| te   | Zeit je Einheit         | Gesamtausf\u00fchrungszeit je produzierter Einheit                     |<\/code><\/pre>\n<h3>Context, context and again, context<\/h3>\n<p>Now. There were several options, which I now had:<\/p>\n<ul>\n<li>I could have taken this whole German change-request-monster and fed it directly into the prompt. But remember what we said earlier? Try to apply instructions in the English language, the results will often be noticeably better.<\/li>\n<li>I could have translated this, let\u2019s say, in Anthropic\u2019s Web-Portal, or in Microsoft\u2019s Copilot Web-Portal, or also directly here in the Copilot chat into an English prompt, let\u2019s say, CustomerChangeRequest.md.<\/li>\n<li>I could also have requested Copilot to write a detailed English prompt which would have held the change request instructions in <em>maximum detail<\/em> to <em>generate<\/em> the actual changes.<\/li>\n<\/ul>\n<p>And I went for option 3 for the following reasons.<\/p>\n<h3>Now, we\u2019re really cascading<\/h3>\n<p>a) When you add customer changes yourself, you change the requested spots where the intention is stated. In C#, that\u2019s the C# code that you change. In VB, the VB code, and so on. Well, when you apply prompt-driven development, you already had one very detailed prompt with all the intentions phrased out for the first version. Now, to get to the change-request prompt, you want to not only generate that prompt <em>just<\/em> based on the customer\u2019s change request. You also want to take the complete existing codebase into account, which sort of re-engineers missing natural language information from the existing code-base <em>back<\/em> into the prompt that you\u2019re generating, to make it even more precise! But that\u2019s not the only reason, because:<\/p>\n<p>b) Since you can apply all the customer change requests pretty quickly, you create a new branch right after you generated the loooong change request prompt, but right before you let Copilot then implement those changes!<\/p>\n<p>Because, now this happens: Copilot generates the changes, and you start the App 10 minutes later, and you see, \u201cdamn \u2014 I actually forgot to amend 2 little details.\u201d Now, two things you can do:<\/p>\n<ol>\n<li>You prompt these changes in. But then, the big change request prompt that you have is no longer in sync with your changed codebase, which you want to show your customer in an hour, and maybe go from there, and create the next bigger change request prompt, for the V3 version of the app.<\/li>\n<li>You prompt to modify the big change request prompt based on the latest finding. And what then happens is almost fascinating to see (and is not only what I\u2019d suggest to do, but also what I did). But when you see the screenshot, the benefits of that approach become immediately clear:<\/li>\n<\/ol>\n<p><img data-opt-id=474982238  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/RefactoringTheChangeRequestPrompt.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing Copilot refactoring the change request prompt and taking the whole solution into account\" \/><\/p>\n<p>Copilot takes the whole existing Solution into account by finding the relevant references which will <em>later<\/em> be subject to change. That of course increases the quality of the resulting prompt tremendously.<\/p>\n<p>But the second positive effect is: You will later find the delta of the changed prompts in GitHub exactly as you would find changed code in the past in GitHub. You move the phrasing of your intent just one level up \u2014 but the principle of how you do it is the same.<\/p>\n<p>And with an increased reliability of the results which Copilot will produce with newer models, it\u2019s not only the scaling of writing the code that works \u2014 it will also solve the scaling of reviews and unit tests:<\/p>\n<p>When something does not work as planned, you start at that level. If you already detect a flaw in the prompts, which you made part of your source code \u2014 or rather, intent statements \u2014 then looking at the code is probably no longer necessary. At least not at the point where you are still in the iterating phase, because approaching it this way, you are not adding to the existing code. You roll an existing change at the code base completely back, iterate the <em>prompt<\/em> and then generate again. And since with each iteration the prompt gets more precise, the resulting code does the same.<\/p>\n<p>Does that mean, reviewing on source code level will be a thing of the past? I don\u2019t know. I would openly state \u201cI would say cautiously optimistic claim \u2018yes\u2019, while I am thinking \u2018Hell, yeah, absolutely&#8217;\u201d. But I would not say that openly. Not yet.<\/p>\n<p>Now \u2014 after the change request prompt run \u2014 where did that bring us? Honestly: pretty far, as you can tell from the following animated gif which shows the design of a first complete time study definition template. And please note: Up to this point, we did not touch the WinForms Designer or the code editor a single time for any change. We just used those to <em>look<\/em> at preliminary results. But\u2026 that was all.<\/p>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"1000\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/AblaufabschnittEditing.webm\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/AblaufabschnittEditing.webm<\/a><\/video><\/div>\n<p>And the whole definition of the specs which resulted from the conversation with my mom, including the amendments of the change requests \u2014 every single thing had been implemented down to the exact point I also would have understood the specs to be implemented.<\/p>\n<p>Honestly: Once in a while I even thought \u2014 wow, nice job, Copilot \u2014 that layout based on TableLayoutPanels is really slick and \u2014 which is really remarkable for WinForms, believe me, <em>I<\/em> know what I am talking about \u2014 even HighDPI compliant!<\/p>\n<h2>Observing the generation and reacting on demand<\/h2>\n<p>While developing the WinForms Expert Agent, I do not know, how many little WinForms Tools I wrote, and more so: How often I wrote them again and again. One thing I learned during that process:<\/p>\n<p>You could just go away and do something else, while Copilot is writing the next feature of your App. But \u2026 you could also observe what it\u2019s doing and act, when you see, what it\u2019s currently thinking might be ending in a dead end.<\/p>\n<p><img data-opt-id=474982238  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/RefactoringTheChangeRequestPrompt.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Animated gif showing the rearrangements of steps via the up and down arrows\" \/><\/p>\n<p>Now, think about this from the perspective of how a customer would describe how those arrows are supposed to work. What should a click on the Down button do? Decrease the order number? That would move the whole entry <em>up<\/em>. So, increase the order number? That would move the entry down visually, yes \u2014 but it wouldn\u2019t <em>lower<\/em> anything. \u201cDown\u201d is one of those words that means opposite things depending on whether you\u2019re thinking about the visual position or the numeric value. Classic ambiguity trap \u2014 and exactly the kind of thing that causes subtle bugs in production.<\/p>\n<p>Here\u2019s what actually happened. I was reading along while Copilot was working through step 5 of its plan \u2014 the up\/down arrow implementation. And as I watched its reasoning unfold in real time, I saw it wrestling with <code>FindGapBelow()<\/code> and scanning logic for free slots between entries. That\u2019s when the thought hit me: <em>wait, did we get the semantics right?<\/em><\/p>\n<p><img data-opt-id=1433324625  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/ObservingStep5AndInteracting.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing Copilot's reasoning about the down arrow during step 5 of the plan\" \/><\/p>\n<p>So I interrupted. I stopped the generation, read what it had figured out more carefully, and then prompted my concern:<\/p>\n<pre><code class=\"language-text\">Oh wait. Maybe we have confused down and up arrow. Because: is the down arrow the arrow that points down? Or the arrow which decreases the order no value? Because down for me means moving the row down, but that works by increasing the value.\r\n\r\nIf you'd agree, please take that base into account, and take that into account for the current plan.<\/code><\/pre>\n<p>And here\u2019s the beautiful part: Copilot didn\u2019t just blindly \u201cfix\u201d it. It actually double-checked the existing implementation, confirmed the semantics \u2014 down arrow (\u25bc) moves the row down visually, which means <em>increasing<\/em> the order number, which calls <code>FindGapBelow()<\/code> to find a <em>higher<\/em> value \u2014 and concluded: \u201cNo changes needed \u2014 the logic is correct as implemented.\u201d<\/p>\n<p><img data-opt-id=167403767  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/ContinueingAfterInterrupting.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot showing Copilot confirming the up\/down arrow logic is already correct\" \/><\/p>\n<p>It was a false alarm. But here\u2019s why this matters:<\/p>\n<p><strong>Tip: Watch the generation, don\u2019t just wait for it.<\/strong> Copilot\u2019s \u201cthinking\u201d phase isn\u2019t just a loading screen \u2014 it\u2019s a window into its reasoning. Reading along lets you catch misunderstandings <em>before<\/em> they turn into code. In this case, my interruption cost maybe 30 seconds. Had the semantics actually been wrong, it would have saved a debugging session.<\/p>\n<p><strong>Tip: Interrupt early, not late.<\/strong> If you see Copilot heading in a direction that feels off, stop it. Don\u2019t wait for the full generation to complete and then try to untangle the result. A short clarifying prompt mid-generation is vastly cheaper than a corrective prompt after 200 lines of wrong code exist.<\/p>\n<p><strong>Tip: Trust but verify \u2014 and let Copilot verify, too.<\/strong> Notice that I didn\u2019t tell Copilot to <em>change<\/em> anything. I raised a concern. It investigated, showed its work, and arrived at the right conclusion independently. That\u2019s the conductor-orchestra dynamic in action: you flag a potential issue, the orchestra re-checks its sheet music, and either corrects course or confirms it was right all along.<\/p>\n<h2>Bringing It Home<\/h2>\n<p>Was the result\u2014which I could finally install on my mom\u2019s machine via Quick Assist\u2014a polished, production-ready commercial application I could now earn millions with? Certainly not. The original software had years of refinement, edge case handling, and\u2014this is the most decisive and important point\u2014<em>domain expertise<\/em> baked in. What we built in a weekend was maybe 10% of that functionality. But as absolutely impressive as it was that it worked, and that we got it running in the time we had, it was the <em>critical<\/em> 10%: the time study capture module that my mom absolutely needed to complete her assignment.<\/p>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"1000\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/Zeitaufnahme.webm\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/Zeitaufnahme.webm<\/a><\/video><\/div>\n<p>She used it for the remaining days of her trip. And it did what we envisioned it to do\u2014absolutely perfectly and reliably. Not <em>a single<\/em> crash in any of her time study recordings. The CSV exports worked. The timing data was accurate. The industrial laundry got their REFA-certified time studies. The workers got fair performance baselines. And Deutsche Bahn eventually got my mom back home\u2014though I suspect the return journey had its own adventures.<\/p>\n<p>WinForms Expert Agent saved the day. Well, actually, the week.<\/p>\n<h2>Are Developers Still Needed?<\/h2>\n<p>So here\u2019s the question everyone asks: Does this work so well that developers will no longer be needed?<\/p>\n<p>I think the question itself doesn\u2019t make sense. I\u2019d rather ask: Is the definition of a software developer from last year still the same as it will be next year? That one I can answer: absolutely not. What it will exactly look like, I don\u2019t know.<\/p>\n<p>But whatever that definition will be\u2014I\u2019m equally convinced that yes, developers will still be needed. Depending on our level of bringing out-of-the-box thinking and creativity to the table, more than ever.<\/p>\n<p>What\u2019s happening, FWIW, is that we\u2019re lifting our execution level one meta-layer up. We\u2019re becoming conductors rather than instrumentalists\u2014but conductors still need to understand the music deeply, or the orchestra produces noise instead of symphony. This change, I\u2019m convinced, will be disruptive\u2014and will also provide enormous new chances. It will shift the industry completely, and it will not leave a single work approach unturned.<\/p>\n<p>This isn\u2019t unprecedented. It\u2019s remarkably similar to what happened with the advent of the first compiler\u2014the Formula Translator, which most of us know by its short name: Fortran. There\u2019s a beautifully done documentary on YouTube by Coding Shorts called <a href=\"https:\/\/youtu.be\/5yhuyl-O3wE?si=vkN6CuhKv4UBCSlI\">The Untold Story of Fortran<\/a>. Highly recommended. It shows: back then, \u201creal programmers\u201d insisted that no machine could ever write assembly code as efficiently as a human. They were wrong about efficiency. But they were right that someone still needed to understand what the code should <em>do<\/em>.<\/p>\n<p>History doesn\u2019t just repeat itself\u2014it rhymes. Knowing this helps navigate the transition with less anxiety.<\/p>\n<h2>The Evidence Question<\/h2>\n<p>So, my mom obviously is not your typical 82-year-old mom. They say ADHD is hereditary \u2014 I know for sure I am ADHD, my bosses know that for sure and so do my colleagues. My mom never had an official diagnosis, and I doubt she will try to get one at 82. But there is more than enough evidence she is. Positively put, she talks more with \u201cChatty\u201d (that\u2019s what she calls it) than many of my colleagues. And that she\u2019s better in Excel than I am, or that my Adriana and I call <em>her<\/em> when we have questions about specific iPhone or Watch features \u2014 go figure. But for this reason, she now also knows how comparatively easy it is for me to add new features. Which, as it turns out, is not necessarily information you want to share with your 82-year-old mom.<\/p>\n<p>To be perfectly frank, while she was using the improvised software back in December, we had another meeting, and I even had to amend something manually. We had yet another meeting just recently, in which we added a bit of functionality, and she is considering \u2014 for another gig in April (you did not really think she had retired in February, did you?) \u2014 to actually use this new version now <em>on purpose<\/em>.<\/p>\n<p><img data-opt-id=1517723362  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/InfoCollage.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Collage showing a video call between Klaus and his mom alongside a WhatsApp conversation about the time study software\" \/><\/p>\n<p>But she also very quickly got into the general mindset of prompt-driven development. She trapped me the other day in a WhatsApp discussion about the performance features, and pulled the same trick she\u2019d used in the first version: documenting everything in Excel. But it was difficult for her to remember, so defining this in a special way during the recording makes her life way easier. When I said, however, \u201cMom \u2014 I am really busy,\u201d she replied: \u201cH\u00e4, du brauchst doch den WhatsApp Screenshot nur Chatty zu geben, und dann macht doch Chatty die \u00c4nderungen, oder nicht?\u201d \u2014 Sure, she was right, there was no escape. I did exactly that. Well, I still did it with my approach to sync the change request prompts \u2014 but she was correct. I took the WhatsApp screenshot and the screenshot of our Teams meeting summary, and the new version of the Time Study software was in the making 15 minutes later.<\/p>\n<p><img data-opt-id=28969841  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/ChangeRequestViaWhatsApp.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot of the WhatsApp conversation used as a change request input for Copilot\" \/><\/p>\n<p>Already during the planning that Copilot derived from those screenshots, it became clear \u2014 this pretty much looked like a new version of the software that would work after the very first attempt, straight from the get-go.<\/p>\n<p><img data-opt-id=705725910  data-opt-src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/02\/PlanningTheNewChange.webp\"  decoding=\"async\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"Screenshot of Copilot's planning output generated from the WhatsApp and Teams meeting screenshots\" \/><\/p>\n<p>Flashback 3 months: When my mom was finally set to complete her work and did her job, she unfortunately caught something \u2014 and no, not a software bug, though those exist too \u2014 and had to leave somewhat early. But she had the important things she came for anyway. And when she was finally back home, some days later I had time to finish that Dara O\u2019Briain comedy special\u2014the one where he \u201ctalks funny in London.\u201d And somewhere in his routine about misinformation and conspiracy theories, he made a point that stuck with me.<\/p>\n<p>He was describing people who believe things without evidence, and the response they give when challenged: \u201cDo you have any evidence for that?\u201d And they go, \u201cOh\u2026 there\u2019s more to life than evidence.\u201d Dara paused. Then: \u201cGet in the fu\u2014\u201d<\/p>\n<p>And at that exact moment, my phone rang. Germany country code.<\/p>\n<p>It was my mom, calling to say thank you. The client was happy. The assignment was complete. The data was solid.<\/p>\n<p>Here\u2019s the thing about working with LLMs: they\u2019re remarkably capable of filling in gaps. But gaps filled with plausible-sounding nonsense are still nonsense. The transcript cleanup worked because I verified it against what I remembered. The code generation worked because I tested it. The final app worked because my mom\u2014the actual domain expert\u2014validated every output against reality.<\/p>\n<p>LLMs don\u2019t have a conscience. They are not sentient. They don\u2019t have a stake in being truthful. They optimize for plausibility, not accuracy. That\u2019s not a bug; it\u2019s the architecture. Which means the responsibility for truth stays exactly where it always was: with us.<\/p>\n<p>\u201cThere\u2019s more to life than evidence\u201d is a great line for comedy. It\u2019s a terrible approach to software engineering.<\/p>\n<p>Keep your antennas up. Verify everything. And when an LLM gives you an answer that seems too convenient, ask yourself: would this survive contact with an 82-year-old REFA consultant standing in an industrial laundry at 6 AM?<\/p>\n<p>If yes\u2014ship it.<\/p>\n<p>Happy coding, and good vibrations!<\/p>\n<p>PS: No Copilot-generated EM-dashes have been harmed or killed in the editing process of this blog post.<\/p>\n<p>The post <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/the-dongle-died-at-midnight\/\">The Dongle Died at Midnight \u2013 WinForms Agent Saved my German Mom\u2019s Business Trip<\/a> appeared first on <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\">.NET Blog<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>An 82-year-old German industrial engineer, a 22-year-old UI framework, and an AI that finally understands WinForms Designer serialization walk into [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3499,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[7],"tags":[],"class_list":["post-3498","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=3498"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3498\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/3499"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=3498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=3498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=3498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}