The Prompting of: The Foldable Tractatus

I analyzed all 191 prompts I used to "vibe-code" an app

Marco Giancotti,

Six rectangular geometric patterns in red, black, and gray on cream paper: triangles, hexagonal cells, leaf shapes, and zigzag weaves
TL;DR

In August I published the Foldable Tractatus, an open-source web app that lets you wade through Ludwig Wittgenstein's first book in a very unusual way. Today I'm releasing all the prompts I used to build it with AI, plus a detailed analysis of the process.

Spoiler: AI output does not have to be slop.

I'm interested in AI only as a tool to enhance thought. Unfortunately, almost all of the discourse about the power of LLMs is about how to use them to avoid having to think: the amazing things these new models can one-shot (i.e. create with just one brief initial prompt), the loops and the graphs and the factories... everything is publicized as a way to hand off as much of the work as possible to a bunch of GPUs in the cloud, then sit back and wait for the magic to happen.

None of those techniques is bad in itself (I use most of them!), but I think the way we talk about them is giving a lot of people the wrong impression. I suspect this is part of the reason why researchers find people becoming lazier with their thoughts 1, losing their skills 2, or never learning them in the first place 3. If you only emphasize "long-horizon" performance and hands-off results, of course people will—very wrongly—believe that mental atrophy is an inevitable side effect of using AI for work. They will also become frustrated when all they get is slop.

Here I want to contribute to the debate in a different way. I'll share with you real, unabridged data about what it's like to work with AI in a way that I think is effective, healthy, and without the dreaded feebleminding effects. You won't learn programming by using AI like this, but you will exercise your mind on some very useful general-purpose skills. This is what I call the Anti-Magic Effect: good work with AI actually requires skill and effort.

I don't mean this as a showcase of the "ideal" or "right" way to prompt. I'm sure AI coding experts will find much to improve in my process. I mean it as a lead-by-example attempt at getting other practitioners to share their work in the same way. Anyone can get something out of an LLM, but apparently very few can get anything worth sharing with others. So let's talk about it.

I also took this as an opportunity to put two of my thinking tools to work: the "goals as mountains" metaphor from Purpose from First Principles and my Anatomy of Augmented Thought (AAT) framing. They helped me ask interesting questions about the process.

What I Did and How

Before we look at all the pretty charts, some meta-information.

You can find the prompts I used to build the Foldable Tractatus here. That's all 191 of them, in easily browsable form and enriched with metadata. You can also download them as text files on the GitHub repo.

From the start, I meant the creation of this app to be a case study of AI prompting. Because I want this to be useful to non-programmers first and foremost, I set myself some constraints:

  • I never looked at the source code written by the models.
  • I only used $20/month subscriptions to Claude and ChatGPT. I could have used the much more expensive plans, but then most non-engineers wouldn't have been able to relate. Besides, $20 is more than enough for a small project like this.
  • I also deliberately avoided using ultra-customized scaffolding, harness setups, and frameworks. I use those for my other projects, and they do pay off very well, but this case study is about the mental side of things, the human involvement, not tooling optimization.
  • I didn't put much weight on code quality, which is probably the main weakness of this test, but that, again, is out of scope here. I did, however, emphasize keeping user data private and secure.
  • Although I was unfamiliar with some of the tools (the then-new Claude Design, Val Town, and a few others), I did use my programming and product management experience to make the process smoother and more successful. A newbie would have to learn these the hard way in projects like this, via study or trial and error. If you read my prompts, you'll see that none of it is arcane, and that this is another demonstration that using AI well does make you learn.

But the most important constraint, the one that makes all of this meaningful, is that I didn't stop working until the result was very close to what I wanted, based on my own judgment and taste. This is not an example of "wow look what this thing can make on its own!", it's "wow look how much faster and better I can do my job with it!"

Four interlocking geometric patterns in shades of blue with coral and white triangles: diagonal steps, zigzags, T-shapes, and sawtooth bands
Four geometric compositions, André Durenceau

For the curious & savvy, this is the software stack I used to build the app. Unless otherwise noted, it was all proposed by the AI.

  • Frontend: Vite (first time for me) + React 19 single-page app, written in TypeScript.
  • Backend: Val Town (my request—but they're shutting down soon 🤕), with Hono for routing and SQLite for storage.
  • Rendering: KaTeX for math, self-hosted fonts, and build-time prerender for SEO.
  • Testing: Vitest with jsdom. Backend tests with an in-memory @libsql/client. Playwright for the AI's checks.
  • Hosting: Vercel (my request).
  • Styling: plain CSS.
  • Analytics: self-hosted Plausible, no tracking (my request).
  • License: MIT, source code here.

For the actual work, I used a sequence of AI tools, switching as the project moved from phase to phase: first the claude.ai chat interface, then Claude Design (it has since been assimilated into Claude chat), and finally VS Code with Claude Code and a little bit of OpenAI Codex. The models involved were Claude Fable 5 (it was part of the $20 sub at the time), Claude Opus 4.8 & 5, Claude Sonnet 5, and GPT 5.6 Sol and Luna.

Over the past few years I've used large language models to build many projects, both bigger and smaller than the Foldable Tractatus, but this was the first time I stopped to dissect my process closely. This may not be the optimal way to do things, but it is a real-world project built with a well-tested process that has worked well for me.

So what do the numbers say?

Table of Contents

The Process in Numbers

The first thing you'll notice when looking at the transcripts is that this was definitely not a one-shot job. I could have given the AI a few lines summarizing what I wanted, looked out the window for thirty minutes, and found in front of me a working app. It would have done roughly what I asked it to do (as interpreted by the AI), it might have been somewhat useful, and it would have been terrible. Publishing something like that would have been irresponsible and extremely lazy of me—worthy of the S-slur (the AI kind!).

The point of using AI, in my opinion, is to do things faster and better than without it. Expecting a quick prompt or two to complete the job is what I call the Magic Wand Illusion. You get speed, and that's all you get.

Instead, I had a clear idea in my mind of how I wanted this app to work, and clear standards for the kind of UX, style, and level of polish it should have. I knew what it should not include. And I had a clear user persona in mind: the curious student or lover of philosophy who wants to read and navigate the book on their own terms. I conveyed this information to the model in not one but 191 prompts and answered 47 questions from the AI, for a total of 9,487 human-typed words. That's almost 4 hours of typing if I assume a measured typing speed of about 40 words per minute (slow because it includes a lot of thinking).

Based on my past experience, and the fact that I'm not an expert at frontend engineering, I estimate that making the app myself would have taken at least ten times as long, and possibly much more if I got stuck in a couple of unfamiliar design ruts. The core build alone, about a third of the app, would have taken me 40 to 80 hours (more on this estimate in Algorithmic Work Is Where It Shines, below).

Me, prompting
4 h
Me, if building alone
≥ 40 h, estimate
AI, working
13.6 h

These prompts were spread over 33 sessions in five distinct phases, from the initial specification to the final polish. The AI worked for a total of 13.6 hours. I stopped only when I had an app very close to the one I wanted.

Words I typed, by session
The number of human-input words across all 33 sessions. I split the second phase, 'Design', into many small sessions because these were very token-heavy iterations on design mockups.
Time the LLM worked, by session
The sessions looked very different from the point of view of the AI. Unlike me, it didn't have to work much in the first two phases, but was quite busy in the last 3 ones, when it had to build the actual app.

1 - Specification Phase

The first phase, "Specification", consisted of only one session, with a couple of huge prompts. Prompt 1, the very first in the project, had 758 words and contained my initial concept for the app. I dictated it by voice and had a Whisper voice-to-text model transcribe it. If you're curious, here is the full text:

Session 1Prompt 1SpecificationHuman: 758 words · ~19 min · 1 file
Summary: Lay out a detailed feature wishlist for a foldable-tree Tractatus reader app and ask whether the plan is feasible and what could be added or improved.
I want your help to plan the specification in detail for a web app that I want to build, titled "The Foldable Tractatus". The idea is that this page will contain the whole of Ludwig Wittenstein's Tractatus Logico Philosophicus, the whole book using a public domain or Creative Commons proper license that we are allowed to use. However, this web app will leverage the book's own structure, which is a nested tree of statements. At the root level, the book has only a few statements, maybe < 10. And then under each statement are several levels of deeper statements going more and more in detail. And this web app would display it as a foldable tree, like a foldable structure, similar to how you can fold code in a code editor. By default, the book starts fully folded. Then the user can click on a little button next to a statement to unfold a single level below it. So they can gradually unfold the parts that they want to dig deeper into. And of course they can re-fold it. Also, there should be global buttons to fold everything and unfold everything. This is the basic functionality. However, I want to enrich this web app with a lot more functionality. First, one function that I want to implement is the ability to pin statements. Next to each statement, there should be another button that allows the user to pin the message, the text, so that when they fold everything with the global button, only the pinned messages remain visible, alongside the root-level messages. This means that the user can read the book just on the parts that they want in a way that avoids the noise of other unrelated statements. The second feature is that the whole state of the book, of the features that I mentioned already, and also of future features, it should be shareable with others, so it should be embedded in the URL because there is no backend, there is no database, it's all browser-side, but to make it shareable, it should be able to be encoded in the URL. Third, the user should be able to annotate any statement, so to add comments to the statements for their own reference. So as they read the book, they can add comments that help them keep track of what is meant and what they thought about it. Fourth, there should be an export system that allows the user to export a markdown file containing all the the pinned statements and the relative comments and annotations. Fifth, the web app should internally index every single technical term used by the author in the text. And the user should be able to click on any of those terms and somehow be able to find and reach or less visualize in a compact way all the occurrences of that same term. Currently my vague idea on this front is that maybe the user could click on a word to select it and that will highlight maybe with little dots or something that is not too cumbersome or too in your face, highlight across the structure, folded or not, where the same term occurs. And also there should be the option to automatically pin all the messages where that same term is being used. Of course, this part needs to be done carefully because we need to decide whether to replace the previous pinned structure or just add to it, or perhaps give the user the choice between these two approaches. This is a design question that needs to be clarified. Going back to the part about encoding state in the URL, I guess there is a limit in how much information can be put in the URL, especially with the annotations. This might be not really feasible if the user puts many, many annotations. They might not fit in the URL. I'm wondering what a solution might be to achieve a shareability. But one thing I'm sure is that the user should be able to undo and redo changes using the browser's functionality. So the state should be able to be recovered at least in the same session. And I think that's pretty much what I have in mind in terms of functionality. We are not ready to discuss the design yet. Does that sound feasible? Do you see major obstacles in this? And do you have ideas to do something even better or maybe very useful additions for someone who is reading the tractatus in this enhanced way?
question askedresearchdecisionfeature designedLLM: Opus 4.8 · Claude Web · 3 min 16 s

I only began this process after mulling over the idea for this app for a few weeks. This allowed me to constrain the design very strictly from the start, and based on previous experience I expect this saved me a considerable amount of firefighting time after the feature was built. We'll see in the Purpose Analysis section that, already at this early stage, about two thirds of the app's final specification was settled.

Also note that at this stage I focused exclusively on what the final product should look like and do from the point of view of the user. No UI design choices, and almost zero technical details. Specifying them this early on would have constrained the model too much and prevented some healthy exploration in later phases, after the product requirements had solidified.

2 - Design Phase

After those first few specification prompts, I moved on to the "Design" phase.

I could have attempted to build the thing directly, letting the LLM choose the look and feel of the app on its own. I do this occasionally when I really don't care about UI/UX, and usually live to regret it anyway. If I didn't like how the app was built, I would have had to either ask it to redo it from scratch (potentially many times, slot-machine style), or spend a few frustrating hours painstakingly pointing out all of the things I wanted fixed, and waiting for it to fix them one by one. I mean, I would have had to do that much more than I actually did, which is saying something.

I found it easier to do the design work upfront instead, in quick visual iterations. Then the AI doesn't have to worry about technical aspects like correct logic and security, and it's able to work faster and with fewer errors (this is standard product management common sense for humans as well!). In this case I did all the design inside Claude Design, a relatively new tool at the time.

In this phase I typed a total of 2,837 words (~1.2h of thinking-typing) across 19 short sessions, 72 prompts, and 25 questionnaire answers, which led to 2.3 hours of LLM work. That's not a great AI-to-human effort ratio (less than 2×), but it paid off in the later stages. Some of those prompts were long lists of very detailed point-by-point change requests, like the following one, where I reviewed some wildly different directions proposed by Claude for the high-level design (the "1a", "1b"... labels refer to visual options shown on the canvas by the AI):

Session 2Prompt 8DesignHuman: 166 words · ~4 min
Summary: Gives detailed feedback on the six wireframe variants (accepting some, rejecting the spine rail, tweaking the count tags and peek option) and adds new requirements: a collapsible left panel with boxless floating annotation text, renaming 'Paths' to 'Saved pin-sets', and a new save/name/delete pin-set feature capped at 5 custom slots plus 3 built-in.
1a: good basis for the overall structure. 1b: okay, but i wouldn't repeat the word in the count tags. "9" instead of "picture x9". There can be a tooltip on hover: "9 occurrences of "picture" 1c: nope, I don't like the spine rail. Keep the 1a structure. 1d vs 1e: I choose 1e, but remove the "n more before/after" 1f: Looks good on mobile. Other thoughts I had seeing these first wireframes: a. It should be possible to unclutter the UI when the user wants to focus on reading. The left panel should be collapsible, becoming almost invisible. The notes should be not have any boxes or anything, just the text floating over the background in smaller font than the main text. b. Rename "Paths" to "Saved pin-sets" c. New key feature: it should be possible to save the current pin set under "Saved pin-sets". Maximum 5 pin-sets can be saved (plus 3 that are built into the app from the beginning. User can name/rename/delete/overwrite them.
decisionfeature rejectedUX improvedfeature designedLLM: Fable 5 · Claude Design · 1 min 28 s · +124 −1

3 - Implementation and Polish Phases

Thanks to all the upfront work of the previous two phases, actually building the thing was relatively smooth and painless. In the "Implementation" phase, the AI built and tested the actual code: all the logic, the interactions, and the data-handling infrastructure. Although I typed some 2,375 words in this phase (more than the average length of an Aether Mug post!), they were of a very different nature from those of the Specification and Design steps. Rather than writing prompts about what to build, I was mostly explaining what to fix. I'd test each build carefully in all its functions and note down everything that I wanted changed, removed, or corrected. Rinse and repeat. The final "Polish" phase was just more of this, focused on the finer details.

Session 23Prompt 97ImplementationHuman: 264 words · ~7 min · 1 image
Summary: Report seven distinct bugs/UX problems found in testing (sidebar layout shift, blank PDF export, dropdown z-index, missing confirmation toasts, unclear share affordance, missing overwrite confirmation, and a question about Val Town share behavior) and ask them to be fixed.
A quick test revealed these problems you should fix now: 1. The main section containing the statements should be fixed horizontally. Instead, when I collapse and expand the left sidebar (which changes in width in the process), the whole section gets shifted left and right. It should be the other way around: fixed horizontal position of the main body, and the sidebar flushed against it. 2. The markdown export works, but the PDF (print preview) comes out completely blank. 3. As shown in the image, the dropdown fails to cover some other UI elements. It should be at the top of the z ladder. This issue was already fixed in the design files. 4. Saving a new named thread, renaming it, overwriting it, or deleting it should all trigger confirmation toasts. 5. Saving a new named thread closes the dropdown, but there is no indication that this can be shared with others, or how. 6. When activating a thread (either preset or saved), a confirmation dialog must be shown, because it would overwrite existing pins. This is present in the reference design files, and you already implemented it for the "Pin only these" action when a word is selected. If the spec fails to mention that the same modal is necessary at thread selection, update the spec. 7. I used the "Share" function with some pins but no notes, and it worked in another browser: I could see the same pins. However, nothing was created on Val Town. Is this the correct behavior? I have some more, but for now focus on resolving these.
Dark presets menu with three preset threads and a text field. Parts of the statement tree overlap its right edge.
bug fixedUX improvedfeature builtdocs writtenquestion askedLLM: Fable 5 · Claude Code · 17 min 29 s · +572 −140

4 - Content Phase

The "Content" phase is where I imported the actual contents of the book in their entirety. Until then, I had done all the work with a small subset of Wittgenstein's propositions: enough to get a feel for what the completed product would look like, but few enough to avoid wasting tons of tokens every time the model decided to read that file.

The Content phase is also when I had the AI create an index of all technical terms used in the book, to power the "click and highlight all occurrences" feature. I did most of this using OpenAI Codex instead of Claude (I just felt like changing for a while). Index-making is the kind of task that can be parallelized, which is what I did:

Session 29Prompt 151ContentHuman: 97 words · ~2 min
Summary: Build the hand-curated technical-terms index for the book in a worktree, using several parallel subagents that avoid duplicating each other's entries, comprehensively covering the author's framework terms and treating qualified terms (e.g. "atomic facts") as separate entries from their base terms.
work on the following task in a worktree. The app is almost complete. One thing that is missing is the hand-curated index of technical terms. You should now create that index using a suitable number of parallel subagents, but avoiding double work (e.g. two subagents listing the same word twice). The list should be comprehensive. All terms that the author uses to build his framework should be included. Often he uses composite/qualified terms, like "atomic facts". These should be taken as single index entries. So, for example, there should be separate entries for "facts" and "atomic facts".
processconstraintdecisionresearchdocs writtenquestion answeredLLM: GPT-5.6 Sol · Codex · 7 min 31 s

GPT 5.6 Sol sent out a small crowd of subagents, each with its own task:

  • 1 to figure out the best data architecture for the index
  • 1 to decide the structure of the indexing work
  • 1 to set up the supporting infrastructure
  • 3 to identify the actual index terms, each focusing on a different range of propositions, avoiding duplicates via a central file
  • 1 to review the index built this way, which gave three rounds of feedback reports to the other agents until they had fixed all issues

Overall Trends

In total, across all phases, my prompts produced 666 outcomes distributed across five categories: Deciding, Building, Fixing, Checking (i.e. verifying that things work as desired), and Support work (i.e. things that facilitate the other categories but don't end up in the final product, like engineering docs, tooling setup, solution research, etc.). The distribution of outcomes in each phase was different.

What each phase produced
DecidingBuildingFixingCheckingSupport work
Specification
68%26%
38
Design
52%18%12%15%
233
Implementation
14%26%12%39%
152
Content
21%12%22%34%
157
Polish
16%28%12%14%30%
86
Every one of the 666 recorded outcomes, sorted into five kinds of work. Two thirds of the specification phase and half of the design phase was deciding things. In the three phases that followed, the deciding was largely over.

This chart shows a few interesting things. First, the split is not so clean: there was a steady number of new decisions even during implementation, and there was a fair amount of building in the Design phase, when the look and feel of the app was prototyped. This mix of doing and planning across the whole project means there was a perpetual feedback loop, and it's a sign of a healthy product development process, AI or not. Waterfall is dead.

Second, something that strikes me as very AI-specific is the sheer amount of Support work. My prompts led to as many of these outcomes as to actual building outcomes! This shows how much effort I had to spend scaffolding, harnessing, constraining, and steering the models to keep them on track and under control.

As I explained in the AAT post, the algorithmic work of writing code with an LLM is the quick and easy part. It's the metacognitive and reflective work that consumes a much larger share of the human's brain cycles 4. I'll return to more AAT insights later on.

Purpose Analysis

A software development project, like many human endeavors, is a control process. Whether you start with a plan or not, the work is a constant loop of observing reality, finding how it differs from the desired goal state, and gradually applying corrections, repeated over and over until there is nothing significant left to correct.

Can we see that in the data? Yes, very clearly. I had an AI analyze all outcomes and catalog all those that corrected previous outcomes. Some of these corrections were reversals of previous actions or decisions, others were replacements with something better or different, others still were fixes to previously-introduced flaws. This gives us a list of 125 ranges: the lifetime of each mistaken or superseded outcome has a clear start and end, as shown in this chart.

Lifetime of corrected elements
Point at a bar to read one correction, press to keep it, or step through the columns.
Each of the 125 corrections done throughout the development of the Foldable Tractatus. Hover and click around for more info.

There is so much information in this chart! I'll unpack it briefly.

One thing that immediately jumps out is that, while some of those elements lasted a long time before being corrected, most were rather short-lived: a sign of the feedback loop doing its job.

Next, try hovering over the various phase names at the top of this last chart: it will spotlight the items that were corrected in that phase (if they're currently ordered by start) or those that were started in that phase (if they're ordered by correction). This reveals a few things:

  1. Nothing that was introduced in the Specification phase needed a correction beyond the Implementation phase. These were the high-level foundations of the idea, and they mostly held up.
  2. The value of the Design phase is evident from the large number of iterations visible there. All those cycles of making and remaking would have cost more time and tokens if delayed until a later phase. In fact, 48 out of 51 of the Design-phase elements that needed a correction were fixed within that phase itself. The Design held up against the reality test that came after it.
  3. 28% of all the issues on the chart were created during the Implementation phase. Despite all the preparatory work of the previous steps, Fable 5 made a few mistakes. But some of those items were not the model's fault—they were me changing my mind when I finally got to interact with the built product. I never stopped replanning the details, as the "Signs of human engagement" chart further below will show more clearly.

At one point in the essay Purpose from First Principles, I use the metaphor of climbing a mountain to represent any teleological process: the peak is the goal, and your way there is never a straight line but a series of steep and flat segments passing through intermediate bases. Where the metaphor is unrealistic is replanning: a mountain has a fixed height that you can't control, but in a generic purposeful undertaking you can usually update your plan and even your goal based on new information.

You can see the goal of the Foldable Tractatus grow in this "burnup" chart:

Climbing a growing mountain
Point anywhere in the chart to read one prompt, click to keep it, or step through the prompts that decided or built something.
prompt 2 · specification · decided 54.7% · built 0.0% · still to go 54.7%
entered the goal — A hand-curated term index, and no click-any-word concordance
entered the goal — Annotations are private and persist locally between sessions
entered the goal — Annotations never travel in a shareable link
entered the goal — Cross-references open an in-place preview rather than jumping away
entered the goal — Every statement is individually deep-linkable
entered the goal — In-app undo/redo that never hijacks the browser Back button
entered the goal — Keyboard navigation with arrows and j/k
entered the goal — No bilingual German/English presentation
entered the goal — No focus/zoom-into-subtree as a distinct mode
entered the goal — No level-skipping: a descendant always shows its ancestor chain
entered the goal — No oversized annotations-in-the-link sharing
entered the goal — Ogden 1922 translation, English only
entered the goal — Pin a term's occurrences with an explicit replace-vs-add choice
entered the goal — Sharing offers pins-only or pins-and-notes
entered the goal — The app ships curated reading paths as named preset pin-sets
76 properties of the finished app, weighted by how much of the product each one carries. 'Decided' is the share already intended at that prompt, 'built' the share that existed.

The red "decided" line is the goal state as defined at that point in the process—the "height of the mountain" that kept growing as I decided on more things to build. Here 100% represents the final result that I accepted as done (see the Appendix for details on this process). The blue "built" line, on the other hand, shows when those same elements were actually implemented in code, including the prototype designs from Claude Design that made it to the end product mostly unchanged.

This chart is telling us a few things. One is that there are several "plateau" periods in both lines: steps, sometimes dozens, in which nothing was decided or built. A few of them were indeed trial and error, with decisions walked back. But in most of them productive work did happen: setting up the process and infrastructure, planning, verifying, and other tasks that build nothing visible to the end user.

Specification. Let's focus on the upward movements of the "decided" line next. You'll notice that the line doesn't start at zero, but at around 30%: my very first prompt already defined about a third of the app's final state, including three of its four most central features. Two more exchanges with the AI brought it to 66%, and by the end of the Specification phase the fraction reached 68%. This shows right away that the human input dominated the conceptual work.

Design. That is not to say that the AI did not participate in the creative process. You can see it in action in the Design phase, where several significant decisions were added to the pile, raising the mountain's height from 68% to 91%—almost a quarter of the final "design weight" added not from my own independent inventions, but from design proposals the model made and I reviewed, selected, and tweaked. We'll get back to this point.

The "built" line remains entirely flat for the first 8 prompts: during the first turns of Design, while I explained my concept for the app, nothing was built except a quick-and-dirty wireframe that was later thrown away. Several of the first steps were the AI interviewing me about my design preferences and constraints. Building started when the LLM made the first design prototypes, among which were those that eventually made it into the final version, and by the end of Design, 49% of everything—the visual part—was already built.

Four geometric patterns in teal, lime green, and orange on cream paper: slanted bands, vertical stripes, chevrons, and interlocking triangles
Four geometric compositions, André Durenceau

Implementation. Not surprisingly, during the Implementation phase there were few decisions and a lot of building. In a few steps, Claude brought the app from being only a visual dummy to being 86% built. The vast majority of the value had been built by that point. The app was already distinctly recognizable, albeit buggy and incomplete. As we'll see later on, it was at the beginning of this phase that the LLM really shone.

Final stages. After prompt 84, progress slowed down again, continuing with another 107 prompts (more than half of the total!) of debugging and polishing, which resulted in only the last 14% of the app being built. In the final stretch, between around prompt 137 and the final prompt 191, both the "decided" and "built" lines flatten almost entirely. A lot of "invisible" work happened there. With those last 55 prompts, the outcomes included:

  • 11 devil-in-the-details decisions with small overall weight;
  • 27 verification and 22 tooling steps;
  • 13 bug reports and 16 bug fixes;
  • 13 content, 11 UX-improvement, and 7 accessibility outcomes;
  • 6 corrections of plain AI mistakes;
  • 13 process, 9 plans or dev docs and 7 research outcomes;
  • probably some backtracking and removing that my data couldn't fully capture.

In a general goal-oriented process, the amount of this kind of fine zeroing-in on the goal state depends on how much you care about getting it just right. Given that the Foldable Tractatus is, even now, far from perfect, I could have continued for a long time, but decided at prompt 191 that I had reached "good enough" for a product like this.

How Did I Apply My Own Advice from "Anatomy of Augmented Thought"?

In my Anatomy of Augmented Thought (AAT) study I made several precise statements about how to work well with an LLM on complex tasks, so I tried to see what insights about them I could glean from my prompting data.

Unfortunately, even with the rather comprehensive record I kept of the project, some things about the AAT framework can't be directly observed in it:

  • One of the three axes of AAT, "Mode", distinguishes the kinds of thinking being done: autonomous (instinctive), algorithmic, and reflective. Since the differences between these happen mostly in the human's head before writing a prompt, I couldn't get hard quantitative data from the session transcripts. We can say something about the AI's algorithmic work, though.
  • Mental fatigue can't be measured from the transcripts.
  • Since I did not include the AI responses in my analysis, any information about the AI's "thinking types" is indirect.

What I could interpret to some extent in the available data is the "Phase" axis (divergent vs convergent work).

So, how did this project reflect my delegation guidance? Here is the table from the AAT post:

The delegation grid from Anatomy of Augmented Thought.
The delegation grid from Anatomy of Augmented Thought.

Things One Should NOT Delegate

Never Delegate Final Decisions

I followed this AAT principle quite closely, and you can see the deliberate split between the AI's exploration of options—a divergent act—and my choosing among them—a convergent act.

Especially in the Design phase, I gave detailed feedback about the elements I wanted to cherry-pick and mix from different design directions explored by the agent. For example, when Fable 5 proposed these two panel variants...

Side-panel variants 1a ("Option 1 — Minimal list") and 1b ("Option 2 — Design-system elements"), as Claude Design rendered them
Side-panel variants 1a ("Option 1 — Minimal list") and 1b ("Option 2 — Design-system elements"), as Claude Design rendered them

...my feedback was detailed:

Session 6Prompt 32DesignHuman: 102 words · ~3 min
Summary: Create a fused option (mostly based on 1a) that pulls in specific elements from 1b: search box, export dropdown options, saved-threads dropdown per wireframe, a collapsed 'More' section, a rename, and relocating the occurrence-count tag
Okay, I want a fusion of the two, but mostly 1a. Using 1a as basis, Add these elements from 1b: - Add the search box above Fold all - Export dropdown should show the Markdown and PDF export options. - The Saved threads dropdown should follow what was decided in the wireframe. - After the Saved threads section, there should be a default-to-folded "More" section, which contains Share state and Export. - Rename Share state to just Share - I'm thinking the word tag with "N occurrences" might not belong to the side panel. Maybe floating below it? Make this as 1c.
decisionfeature designedLLM: Fable 5 · Claude Design · 2 min 40 s · +274 −10

That's not to say that I never listened to the LLM. I was satisfied right away with many of the basic elements in those panel prototypes, for example. In many cases (17, to be exact) the AI used the "Q&A" tool to ask me a multiple-choice question, with one of the options marked as "Recommended". In 11 of those I went with the recommended choice, effectively confirming the model's proposed decision.

I took the AI's recommendation in 11 of 17 questions
Took the recommended option
11
Chose something else
3
Took it, with a change
1
Questioned the question
1
Handed the choice back
1
Every multiple-choice question from Claude Code and Codex that marked one option as Recommended.

It's easy to fall into the trap of not reading the options at all, avoid thinking about your own independent options, and simply accepting all "Recommended" items. I see novices doing that often, and it's more likely to happen when you're tired 5.

Some recent studies 67 claimed that using AI leads people to erroneously feel like they made the calls while the model silently pulled the strings. I think this is true in many cases, but my records tell a different story. With the data I have, I could make a considerably more neutral estimate of decision and idea ownership.

Who took the app decisions
The finished app 100%
I decided 99%
The AI decided alone 1%
...based on my idea 57%
...based on the AI's idea 42%
My pick from its options, with my caveats or changes 8%
Single-choice AI proposals, adopted with my caveats or changes 14%
My pick from its options, unchanged 20%
The finished app100%
I decided99%
The AI decided alone1%
...based on my idea57%
...based on the AI's idea42%
My pick from its options, with my caveats or changes8%
Single-choice AI proposals, adopted with my caveats or changes14%
My pick from its options, unchanged20%
The 76 properties of the finished app, weighted by importance as in the climb chart. Background defaults are not counted.

You could argue that only 57% of the app (the "...based on my idea" branch) is genuinely mine, and that the decisions labeled "...based on the AI's idea" show me being led by the AI. There is some truth in that, but I think the story is more complicated here.

On the one hand, the AI may have constrained the search space and failed to surface other possibilities that I could have discovered with more effort. On the other hand, as I show repeatedly in this post, I did exercise my freedom to reject or modify the AI's suggestions. Even when I accepted an LLM's idea, nearly half the time I did so with qualifications, as in the following cases:

  • "...keyboard navigation sounds great. I would also use the up and down arrows to move."
  • "Peek display: I approve your four-state model, at least tentatively."
  • "I love your idea for how to use Val Town… My only remaining question is security: can this be abused?"

The end result is that almost every aspect of the final product was due to my own, human decisions. Only about 1% of the importance-weighted features of the Foldable Tractatus can be traced to something the AI decided autonomously.

Loading verification...

This is close to the ideal split suggested by AAT, where the LLM diverges algorithmically (options uncovered through search and mechanical recombination) and the human converges reflectively (applying taste and expert judgment to pinpoint one decision). Maybe the litmus test is this: did the human have and consider the opportunity to choose differently? If the answer is "no", then the human cannot claim real ownership of that aspect, and thinking otherwise would be a harmful bias.

All in all, I would probably not have built the app without the help of AI: it would have taken me too long, and given me too many headaches. At the same time, I can safely claim that what the app is and what it does is overwhelmingly my own responsibility and creation.

Never Delegate Verification

The data shows that I remained in the driver's seat through most of the process. There are many recorded cases of me explicitly pointing out mistakes introduced by the agent, and cases in which I changed my mind, altering or reverting decisions I had previously made.

Signs of human engagement
Specification
I changed my mind. Prompt 2. I replaced click-any-word highlighting with a hand-curated term index.
I changed my mind. Prompt 2. I moved bilingual display and subtree zoom to the non-goals.
I changed my mind. Prompt 6. I dropped Markdown in notes when I saw what it would cost.
Design
I changed my mind. Prompt 11. I had asked for “radically invisible” margin notes. Once I saw them, I made them more visible.
The AI decided, I overruled it. Prompt 18. The AI applied my “recede to 24%” rule to the whole panel. I meant only part of it.
I changed my mind. Prompt 23. I rejected two rounds of undo/redo links that the AI had built exactly as I asked.
The AI decided, I overruled it. Prompt 24. The AI chose where Undo and Redo sat in the panel. I moved them under Unfold all.
I changed my mind. Prompt 30. I had asked for a near-invisible collapsed panel. After using it, I found it too hard to find.
The AI decided, I overruled it. Prompt 31. The AI built bespoke panel elements. I asked it to use the design system instead.
The AI decided, I overruled it. Prompt 38. The AI put notes inline under each statement. I wanted them in a right-hand margin.
The AI decided, I overruled it. Prompt 50. Two departures from the spec: a confirm dialog in place of the undo toast, and a PDF export option.
The AI decided, I overruled it. Prompt 53. The AI used text hints for folded branches. I restored the bare numbers from the wireframes.
I changed my mind. Prompt 60. I flagged the Export menu as off-spec, though I had asked for it myself.
The AI decided, I overruled it. Prompt 61. The AI put runtime logic on the design backlog. I removed it as out of scope.
The AI decided, I overruled it. Prompt 65. The AI invented cross-references. I limited them to Wittgenstein’s own citations.
I changed my mind. Prompt 73. I cut JSON export, because I had scrapped import.
Implementation
The AI decided, I overruled it. Prompt 80. The AI wrote prose about the design instead of handing over the design files.
The AI decided, I overruled it. Prompt 116. The AI tested against a local stand-in backend. I wanted tests against the live one.
The AI decided, I overruled it. Prompt 121. The AI built for desktop only. I reported three defects on mobile.
Content
The AI decided, I overruled it. Prompt 124. On a phone, notes saved silently when you tapped elsewhere. I saw that nobody would find it.
I changed my mind. Prompt 124. I asked how notes get saved on a phone, then dropped the AI’s “Done” button: “Never mind about that for now.”
I changed my mind. Prompt 135. I gave up the source’s ready-made concept index, to keep the licence clean.
The AI decided, I overruled it. Prompt 147. After following a cross-reference, there was no way back.
The AI decided, I overruled it. Prompt 166. The AI counted term occurrences too naively. I stopped it before it deleted anything.
Polish
The AI decided, I overruled it. Prompt 177. The AI used the browser’s term for an in-app feature. I wanted the two kept apart.
I changed my mind. Prompt 188. I dropped three accessibility-audit findings: two colour issues as cosmetic, and the risk of blocked web fonts.
Point at or tap a dot to read what happened, or step through them in order.
The AI decided, I overruled it · 15
I changed my mind · 11
Times when I either overruled an LLM action or changed my mind while working.

But were my corrections timely, or did I delay them too much—perhaps out of laziness or distraction—causing more work than necessary down the road? A software bug gets more costly as the project continues: like a house of cards, building lots of functionality on top of an undetected bug can lead to a lot of rework to fix it later. Was I diligent enough on this front?

Well, the app might still have bugs and issues that no one has reported yet, and those would all be my fault. During the process, though, the picture seems more positive.

Sometimes I was proactive, catching agent mistakes as soon as the agent began making them, like in Prompt 166, when it was working on the book's glossary:

Session 27Prompt 166ContentHuman: 51 words · ~1 min
careful. the search should also catch plural/singular variants. In some cases, like in 2.04, a word like "existent" is correctly matching "existence of atomic facts" on its own, because the adjective refers to atomic facts. I like this and want to keep this, so avoid eliminating such cases via naive counts.
correctionconstraintcontentverificationdecisionLLM: Opus 4.8 · Claude Code · 8 min 12 s · +118 −38

Even when correcting after the fact, I couldn't find significant cases in which a correction was clearly due to my inattention in a previous step. The only examples hinting at my own negligence were minor things that could have been fixed earlier, but were safe enough to postpone: things like the ideal color contrast of some interface elements (Prompt 188), small mobile glitches (Prompt 138), and a junk project file that would have remained invisible to the end user in any case (Prompt 180).

Things You CAN Delegate

You Can Mostly Delegate Divergent Work

As I've mentioned already, I let the AI do most of the divergent work.

92% convergent8% divergent
Approximate shares of 680 segments of my inputs, from a semantic analysis of each segment.

The challenge is preventing the agent from converging on its own without my permission. I often did this by asking Claude to offer multiple disparate options for me to look at:

Session 9Prompt 45DesignHuman: 26 words · ~39 s
I want to test other colors for the highlights. In a small file, experiment with 5 different highlight color variants, still in line with the theme.
feature designedprocessLLM: Fable 5 · Claude Design · no timing
Session 6Prompt 31DesignHuman: 51 words · ~1 min
Summary: Save the current style as Option 1, then build a second option that actually uses the previously defined but unused design-system elements
Okay, let's save this style as Option 1. Now I want to explore Option 2 in which you actually use the elements defined in the design system. I see that you haven't used several of those elements that were meant for this panel, and I'd like to see them in use.
processfeature designedcorrectionLLM: Fable 5 · Claude Design · 4 min 43 s · +115 −0

As I mentioned in the decision breakdown, some 28% (in weight) of all decisions, while arguably "belonging" to me as the one who selected and qualified them, were options explored by the model. And we already saw in the climb chart that this process, in which the AI produces options and the human selects and improves them, was effective in the Design phase. This kind of AI-powered brainstorming was even more influential in the initial Specification, where a couple of steps (Prompts 2 and 3) allowed me to make decisions worth more than one third of the whole product.

In case you're curious, these are the three most valuable AI ideas that I adopted:

  1. The choice to make the app English-only rather than bilingual.
  2. The approach to displaying the folding state of statements. I approved it "at least tentatively" but it survived to the end.
  3. The idea to hand-curate the glossary instead of making every word clickable.

Algorithmic Work Is Where It Shines

According to AAT, the kind of thinking that is most appropriate to hand over to an LLM is the algorithmic—the mechanical, pattern-based, predictable-and-boring kind.

From Anatomy of Augmented Thought: when a task is mostly algorithmic, the time that the LLM saves far outweighs the extra reflection it demands.
From Anatomy of Augmented Thought: when a task is mostly algorithmic, the time that the LLM saves far outweighs the extra reflection it demands.

Three prompts near the beginning of the Implementation phase produced 4,000 lines of code—over a third of the entire codebase—in around one hour of AI work. This included a multitude of automated tests the model wrote to verify its code worked. In some cases, the AI was able to boost its own speed many times over by "fanning out" subagents to work in parallel, like Codex did when building the index.

To make a rough comparison, I estimated how long it would have taken me to do, on my own, the work that Claude did in the very prolific prompts 82–84. I studied each of the 12 implementation milestones the AI used and made educated guesses with PERT times ("optimistic", "most likely", and "pessimistic"), and got a range of 40 to 80 hours, or 7 to 13 workdays. Claude did it in about 60 minutes—some 50 times faster!

This estimate is extremely approximate, but the fact that this quintessentially algorithmic task was the most impressive acceleration in the whole pipeline seems solid enough.

Conclusions - Coming to Terms with the Anti-Magic Effect

If you found my development process interesting, you might take away lessons like the following:

  • Try to do as much upfront deciding and designing as you can before ever talking to the AI.
  • Be ready to remain vigilant throughout, looking to uncover bugs and wrong directions as early as possible.
  • Never stop acting like a designer, imagining the experience from the point of view of the user and steering in that direction.
  • Let the AI run wild with the divergent exploration, but make the choices yourself.
  • If you do the above things well, the model will blaze through the implementation work; but do your due diligence, because most of the problems enter the project in that phase.
Four bold geometric patterns in red, black, and white: elongated hexagons, slanted stripes, diamond lattice, and crosses
Four geometric compositions, André Durenceau

If you've read until this point, perhaps you'll agree that working in this manner does something to mitigate the oft-quoted pitfalls of LLM use, like cognitive atrophy (you're thinking constantly and hard!), lack of ownership of the output 8 (it's yours because you obstinately make all the important decisions!), and deskilling (it might not teach you to program, but it will teach you to build well!).

Of course, how useful all of this is will depend on the scale and type of project you apply it to. For small, quick-and-dirty solutions, the process showcased above is overkill. When you have no strong preferences and "barely works" is enough for you and all recipients, then a few lazy prompts might just do the job. On the opposite end of the spectrum are the very complex and high-stakes projects, like apps involving payments or databases holding many people's valuable data, where the process as I outlined it here won't cut it on its own. More preparation and design, and much more testing and verification will be necessary. I suspect that projects like that are still best left to human domain experts.

But I think the Foldable Tractatus represents an underrated project category in the AI age: that of mid-sized, low-to-medium-stakes products. It's what you'll have on your hands if you want a highly custom app, dashboard, or automation: not so large-scale that you'll need extra-high reliability, security, and code quality, and not trivial enough to outsource to the AI wholesale. Yet so many cool things are possible in this range! It is perhaps the category that most non-engineers will be interested in as AI coding tools become more accessible. That's why I decided it would be worth a few hours of analysis.

If you only take home a single point from this post, I hope it is the point I started with, which I call the Anti-Magic Effect: productive human-AI "centaur" cognition is possible, but it doesn't look anything like what the marketers want you to think. Far from being the keyboard equivalent of flicking a magic wand, the task should and will be difficult for you, it will be tiring, and it will require a great deal of your input all throughout. And, despite all appearances, that is good news for us humans. ●

Loading verification...

Appendix: How I Measured the Climb

The goal was to estimate the design and implementation progress at every step of the project for the burnup chart. This required some meaningful way to break down and quantify the app. Here is how I did it.

First, I listed the properties of the finished app by looking at the finished app itself (its README, code, and commits) rather than at the conversations. That way, a property counts even if nobody wrote it down: for example, I never asked for a mobile layout, because it was a given, but with this method it still shows up in the list. Each property had to be something a user could notice. "A view can be shared as a link" is a property; how the link encodes the view is not. To control the granularity, I grouped details more coarsely than "move this by a few pixels," and more finely than "the control panel's design."

Next, I checked every decision in the transcripts against the finished app. Each surviving decision, whether mine or the AI's, either joined an existing property or became a new one. This gave 76 properties. For each, I found the input where it was first settled and the step where it was first built. A Claude Design prototype counts as built if its look or behavior lasted into the app.

Each property got an importance rating from 1 (e.g. the favicon) to 5 (e.g. the foldable tree concept), answering: "If this were missing, how much less of the intended product would there be?"

The scale, here, is non-linear: after some calibration of my intuition, I determined that each of those five levels has a weight of roughly twice the one below, so a level-5 property counts as much as sixteen level-1s. An AI classifier (TypeSafe's Jev) matched the decisions to properties and rated their importance; then I corrected the matches and the dates by hand. This took a lot of trial and error, cross-checking the verdicts of different models and my own, as well as tuning the evaluation prompt.

Without the weights I estimated in this manner, I would have to count all properties as equally important, which is not very realistic. In the unweighted case, the share of properties decided by the end of Specification drops from 68% to 43%, but 82% of them were still decided before the first line of app code. In other words, the point I made in the analysis—that much of the app's design was decided by me very early on—still holds.

One limitation: I could only trace what made it into the final product. Decisions I later removed or reversed would make the "decided" line dip, but the chart can't show them.

Comments

Loading comments...

References

Footnotes

  1. Kosmyna, N., Hauptmann, E., Yuan, Y. T., Situ, J., Liao, X.-H., Beresnitzky, A. V., Braunstein, I., & Maes, P. (2025). Your Brain on ChatGPT: Accumulation of Cognitive Debt when Using an AI Assistant for Essay Writing Task. arXiv:2506.08872. https://arxiv.org/abs/2506.08872. ↩

  2. Ferdman, A. (2025). AI deskilling is a structural problem. AI & Society, 41(4). https://doi.org/10.1007/s00146-025-02686-z. ↩

  3. Liu, G., Christian, B., Dumbalska, T., Bakker, M. A., & Dubey, R. (2026). AI Assistance Reduces Persistence and Hurts Independent Performance. arXiv:2604.04721. https://arxiv.org/abs/2604.04721. ↩

  4. Tankelevitch, L., Kewenig, V., Simkute, A., Scott, A. E., Sarkar, A., Sellen, A., & Rintel, S. (2024). The Metacognitive Demands and Opportunities of Generative AI. Proceedings of the 2024 CHI Conference on Human Factors in Computing Systems, Article 680, 1–24. https://doi.org/10.1145/3613904.3642902. ↩

  5. Wiehler, A., Branzoli, F., Adanyeguh, I., Mochel, F., & Pessiglione, M. (2022). A neuro-metabolic account of why daylong cognitive work alters the control of economic decisions. Current Biology, 32(16), 3564–3575. https://doi.org/10.1016/j.cub.2022.07.010. ↩

  6. Lane, J. N., et al. (2025). The Narrative AI Advantage? A Field Experiment on AI-Augmented Evaluations of Early-Stage Innovations. Harvard Business School Working Paper, 25-001. https://www.hbs.edu/ris/Publication%20Files/25-001_8ebbe0cb-2a19-453c-9014-1e301e8dd2fb.pdf. ↩

  7. Lopez-Lopez, E., Abels, C. M., Lorenz-Spreen, P., Lewandowsky, S., & Herzog, S. M. (2026). Boosting metacognition in entangled human-AI interaction to navigate cognitive-behavioral drift. arXiv:2602.01959. https://arxiv.org/abs/2602.01959. ↩

  8. Qin, P., et al. (2025). Timing Matters: How Using LLMs at Different Timings Influences Writers' Perceptions and Ideation Outcomes in AI-Assisted Ideation. https://dl.acm.org/doi/10.1145/3706598.3713146. ↩

Cover image:

Six geometric compositions, André Durenceau

Thinking tools in this post:

Full list (opens in a new tab)