{"id":46,"date":"2026-06-16T10:18:22","date_gmt":"2026-06-16T01:18:22","guid":{"rendered":"https:\/\/sr-works.net\/blog-en\/?p=46"},"modified":"2026-06-16T10:18:22","modified_gmt":"2026-06-16T01:18:22","slug":"when-i-had-ai-write-requirements-it-took-5-revisions","status":"publish","type":"post","link":"https:\/\/sr-works.net\/blog-en\/when-i-had-ai-write-requirements-it-took-5-revisions\/","title":{"rendered":"When I Had AI Write Requirements, It Took 5 Revisions"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>This article was originally written in Japanese and translated into English with AI assistance. Please note that some expressions may carry nuances from the original Japanese.<\/em><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\ud83c\uddef\ud83c\uddf5 \u65e5\u672c\u8a9e\u7248\u306f\u3053\u3061\u3089 \/ <a href=\"https:\/\/note.com\/sr_works\/n\/n0f0cc5460cfb\">Japanese version<\/a><\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Series: DataMigrator Development Journal (Part 2)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Last time, I wrote about how, in order to escape data-migration hell, I decided to build a tool to solve that hell myself. This time is the next step: the stage of deciding &#8220;so what, exactly, am I going to build?&#8221; It&#8217;s a record of someone with zero programming experience attempting what&#8217;s called a requirements definition, together with AI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To get to the point: the first version (Rev.0) ended up being almost entirely rewritten. From there I went through five more revisions before finally reaching a state where I could think, &#8220;Okay, this looks ready to move on to design.&#8221; You might assume that since I was working with AI, a perfect requirements document would pop out on the first try \u2014 but that wasn&#8217;t the case at all, and that&#8217;s the theme of this installment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Is a Requirements Definition, Anyway?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m a little embarrassed to admit it, but before I started development, the term &#8220;requirements definition&#8221; was something I&#8217;d only vaguely heard of. How it differs from a &#8220;specification,&#8221; how it differs from a &#8220;design document&#8221; \u2014 honestly, I don&#8217;t think I could have explained any of it cleanly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To put it simply in my own current understanding, a requirements definition is the work of deciding, in words, &#8220;what to build and what not to build.&#8221; &#8220;How to build it&#8221; comes one step later (that&#8217;s design), and the concrete code comes at the very end. The order goes requirements \u2192 design \u2192 implementation, gradually raising the resolution stage by stage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even when you have AI do the development in the style called vibe coding, if this &#8220;what to build&#8221; is fuzzy, what the AI produces comes out fuzzy too. Sure, the human only has to give instructions in plain language \u2014 but if that language is vague, you end up with a mountain of rework. This is one of the parts where, even leaning on AI, the human still has to do the thinking.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, to begin with, I used an AI system other than Claude to write up Rev.0 of the requirements document. The reason I started with a different AI was simply that I&#8217;d had a project going on over there earlier, and in the flow of things I just kept writing with that same AI. There was no deeper meaning to it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rev.0 Had Sky-High Resolution on the Problem Alone<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rev.0 of the requirements document was packed with the concrete hardships I&#8217;d experienced during data migration. What traps lay in moving files between the iMac and the MacBook Pro. The macOS-specific issue of purgeable space. The matter of iCloud-synced placeholders whose actual contents hadn&#8217;t been downloaded. How invisible files like <code>.DS_Store<\/code> become noise. How <code>rsync<\/code> spits out tens of thousands of log lines you can&#8217;t read. How a multi-terabyte hash comparison takes who-knows-how-many hours.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reading it back, it was certainly a document that conveyed &#8220;this person really did struggle.&#8221; But flip that around, and you could just as easily say it was &#8220;a memo of grievances with a feature list stapled on&#8221; \u2014 the solution side was quite rough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, the processing flow was laid out in a straight line: &#8220;GUI input \u2192 pre-check \u2192 rsync \u2192 analysis \u2192 judgment \u2192 copy \u2192 output.&#8221; At a glance it looks tidy, but what if rsync fails? What if the NAS disconnects partway? What if you run out of space? What if the user cancels midway? \u2014 these &#8220;things go wrong&#8221; branches were almost entirely absent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once Rev.0 was more or less written, the worry &#8220;is this actually any good?&#8221; welled up. I have no experience to judge quality myself, so my only option was to have someone review it. So, even though it was technically a separate project, I decided to ask Claude to review it too.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">&#8220;High Resolution on the Problem, but a Rough Solution&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When I pasted in Rev.0 and asked for a review, the overall verdict that came back was exactly that: &#8220;The resolution on the problem is very high, but the resolution on the solution is still rough.&#8221; The wording was gentle, but in essence it meant &#8220;you can see the problem clearly, but the part about how to solve it is hazy.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The specific points Claude raised were, roughly, as follows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, there was no definition of the target user. Whether the user is an engineer or a general user completely changes the UI you should build and the granularity of error handling \u2014 that was the point. My own attitude had been more like &#8220;as long as I can use it, that&#8217;s fine,&#8221; but I was told that if I had any intention of selling it, who uses it is the single most important thing. Fair enough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next, the reliance on rsync was too heavy. The rsync bundled with macOS is an old version with idiosyncratic log output, and it behaves differently from the newer rsync you install via Homebrew. The developer can&#8217;t control which rsync version is in the user&#8217;s environment. And if you&#8217;re going to distribute it as a commercial tool, making users install rsync separately isn&#8217;t realistic. \u2014 These were all things I only noticed once they were pointed out. It was simply that I happened to be using rsync on my own machine, so I&#8217;d written everything around rsync without really thinking about it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There was also the point that priorities and the scope of an MVP (minimum viable product) weren&#8217;t defined. Rev.0 had a lot of features lined up, but &#8220;which to build first and which to put off&#8221; hadn&#8217;t been decided. For someone with zero programming experience like me, trying to build every feature all at once is an almost guaranteed path to collapse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Error handling, test strategy, the performance problem of hash comparison, how to handle iCloud placeholders \u2014 these &#8220;things you&#8217;ll struggle with once you start building&#8221; were almost entirely missing from Rev.0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Incidentally, my mood when I got this review is a little hard to put into words, but it was something like a messy blend of &#8220;yeah, I figured,&#8221; a slight deflation at &#8220;I never could have caught this myself,&#8221; and the relief of &#8220;but I&#8217;m glad it was pointed out.&#8221; I knew from books that there&#8217;s apparently a &#8220;review culture&#8221; in the programming world, but I think this was the first time I&#8217;d experienced firsthand an AI giving me a genuine, proper review.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">From Rev.1 to Rev.5 \u2014 What Changed Across Five Revisions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">From here it became a back-and-forth of critiques and fixes. I&#8217;d reflect the feedback in Rev.1, ask for another review, and the next round of feedback would come out. Reflect that, and the next round would come out again. I repeated this up to Rev.5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As for the big changes: first, I broke free of the rsync dependency. In its place, I switched to an original comparison method that completes using only Python&#8217;s standard library. Concretely, it&#8217;s a three-stage approach: first narrow down candidates by file name and size, then quickly narrow further using a hash of just the first few kilobytes of a file (called a partial hash, apparently), and finally confirm with a full hash. With this method, even with 100,000 files, the number you actually take a full hash of works out to just a few hundred to a few thousand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next, the structure of three modes solidified. The original Rev.0 was vaguely &#8220;a tool to compare and tidy up,&#8221; but over the course of the revisions it split into three: an Exploration mode, a Quick mode, and a Full-inspection mode. Exploration mode is for getting a bird&#8217;s-eye view of the whole disk to grasp &#8220;what is where&#8221;; Quick mode finds duplicate candidates fast; Full-inspection mode takes its time to judge with certainty. The idea is that users pick the mode according to their own situation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also defined the user tiers in three levels: Tier A (general users who don&#8217;t know rsync), Tier B (intermediate, who understand concepts like hashing and diff comparison), and Tier C (advanced, who understand even file-system behavior). And I settled on the policy: &#8220;design the UI so that Tier A never gets lost, while giving the internal design robustness that can withstand even Tier C.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And \u2014 this is something I&#8217;d like to devote a whole article to later \u2014 the design philosophy of &#8220;never delete files&#8221; also solidified during these revisions. Even when it finds duplicate files, this tool never presses a &#8220;delete&#8221; button. Instead, it moves them to a quarantine folder called &#8220;removed.&#8221; If the user later thinks &#8220;actually, I want that back,&#8221; they can restore it. Guaranteeing this &#8220;reversibility&#8221; was my top priority, because I myself feared accidental deletion more than anything.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Having the AI Critique Me Was the Requirements Definition<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Looking back after five revisions, the work I was doing felt less like &#8220;writing a requirements document&#8221; and more like &#8220;having the AI critique me, and answering those critiques.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;d have Claude read the rough draft I, the human, had written, have it point out the problems, give my own answers to those points, and reflect them in the document \u2014 that was the cycle I kept turning. The AI didn&#8217;t write the requirements document all by itself. The closest description is that the AI functioned as an excellent critic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you have AI write something, it tends to become &#8220;an agreeable partner who goes along with anything.&#8221; But for &#8220;finding the holes&#8221; work like a requirements definition, a partner who tells you the hard-to-hear things is actually more valuable. If you explicitly ask &#8220;please review this strictly,&#8221; the AI duly switches into a sharp-tongued mode. Not letting it flatter you may be one of the knacks for using it well.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also \u2014 this is something I noticed only after writing all the way to Rev.5 \u2014 once the document&#8217;s volume passed a certain point, the other AI I&#8217;d been using started handling it unreliably. Whether it was that it couldn&#8217;t read the whole document, it would forget things it had supposedly decided in the first half, or it would dredge up issues that had already been resolved, with increasing frequency. This is a matter of a technical constraint called the &#8220;AI&#8217;s context window,&#8221; which I&#8217;ll write about in a bit more detail next time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Around this time, I began to think seriously about switching over to Claude in earnest. There are several reasons, but it would get long, so I&#8217;ll save it for next time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Next Time<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Next time, I&#8217;ll talk about the second half of the requirements work \u2014 the road from Rev.6 to Rev.7. How I decided to &#8220;switch&#8221; from the other AI to Claude, how Claude&#8217;s &#8220;Project Knowledge&#8221; feature helped, and the story of &#8220;clean deferral&#8221; \u2014 handing off issues that couldn&#8217;t be settled during requirements to the next phase as &#8220;Appendix C.&#8221; In the end, the requirements document became a document of over thirty chapters. When I started writing Rev.0, I never imagined someone with zero programming experience would end up compiling such a document together with AI.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">About Soul Resonant Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Soul Resonant Works is a solo venture developing seven local AI systems. Starting from zero programming experience, the development is progressing through collaboration with AI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83c\udf10 Soul Resonant Works:<br>\u2192 <a href=\"https:\/\/sr-works.net\/en\/index.html\">https:\/\/sr-works.net\/en\/index.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udcdd This blog publishes the entire development process as a serialized journal.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>If you found this article useful, please share it.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article was originally written in Japanese and translated into English with AI assistance. Please note that some expressions may carry nuances from the original Japanese. \ud83c\uddef\ud83c\uddf5 \u65e5\u672c\u8a9e\u7248\u306f\u3053\u3061\u3089 \/ Japanese version Series: DataMigrator Development Journal (Part 2) Last time, I wrote about how, in order to escape data-migration hell, I decided to build a tool [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-46","post","type-post","status-publish","format-standard","hentry","category-ai-development-journal"],"_links":{"self":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts\/46","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/comments?post=46"}],"version-history":[{"count":2,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts\/46\/revisions"}],"predecessor-version":[{"id":48,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts\/46\/revisions\/48"}],"wp:attachment":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/media?parent=46"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/categories?post=46"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/tags?post=46"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}