A few days ago, I argued that software development is entering a phase in which code generation is no longer the primary bottleneck.
AI can produce implementations, tests, documentation and infrastructure at a speed that fundamentally changes the economics of software development. But someone still has to define the product, design the system, verify the result and take responsibility for what goes into production.
MobileChords became a practical test of that thesis.
On the morning of July 10, 2026, the project consisted of little more than one sentence:
A platform for musicians with a chord finder for guitar and piano.
By the evening, the application was running in production with a tested music engine, two interactive operating modes, hundreds of statically generated routes and assets, automated deployment and a launch Lighthouse result of 99/100/100/100.
The interesting part was not simply that the product was built quickly.
The interesting part was how the work changed when implementation capacity became abundant.
A Deliberately Bounded Product
MobileChords was designed as a focused tool rather than a general music platform.
The core concept was simple:
- select a chord and see it on guitar and piano,
- understand each note by its harmonic function,
- play the chord directly in the browser,
- or enter notes manually and let the system identify the chord.
Guitar and piano were to be treated as equal representations of the same harmonic structure. A selected guitar voicing should immediately appear on the piano keyboard. Notes entered on the piano should be reflected on the guitar fretboard.
The system also needed to recognize inversions such as C/E, distinguish chord qualities and generate useful guitar voicings rather than merely listing mathematically valid note combinations.
This was a small product, but not a trivial one.
It combined domain logic, interactive visualization, algorithmic search, audio playback, mobile usability, static content generation, search-engine optimization and production deployment.
There was no team and no dedicated budget. Under conventional conditions, it would have been a typical side project that remained unfinished for months.
Instead, it became an experiment in structured AI-native delivery.
Two AI Tools, Two Different Responsibilities
The workflow succeeded because the AI systems were not treated as one vaguely defined virtual developer.
They had distinct roles.
Claude as Product and Design Partner
Claude in the chat environment was used to clarify the product concept, challenge assumptions and define scope.
Before the actual application existed, we developed a clickable HTML prototype containing a working chord engine. It already included:
- guitar voicing search,
- chord detection based on pitch-class sets,
- chord inversions,
- piano visualization,
- guitar visualization,
- and audio playback through the Web Audio API.
This prototype was not disposable visual decoration.
It became an executable reference model.
The core algorithms were tested independently with Node. Known musical cases were verified before the production implementation began. C major had to produce familiar open voicings. F major had to include the expected barre shape. Symmetrical structures such as diminished seventh chords had to be recognized correctly.
From this prototype, a formal specification was written for the repository. It defined scope, architecture, milestones and acceptance criteria.
The AI was therefore not asked to begin with an instruction such as:
Build me a chord website.
It received an already constrained problem with verified reference behavior.
That distinction was crucial.
Claude Code as Implementation Agent
Claude Code worked inside the repository and implemented the production application.
The specification and prototype served as its working basis. Development was divided into five milestones:
- the reusable chord engine,
- the chord finder,
- the reverse chord identifier,
- the static chord and SEO pages,
- production polish and deployment readiness.
Each milestone had defined acceptance criteria and its own Git branch.
The implementation agent was allowed to generate substantial amounts of code, but it was not allowed to decide independently whether a milestone was complete.
The Human Role: Architect, Product Owner and Reviewer
My role was no longer primarily to type implementation code.
I defined the product boundaries, reviewed architectural decisions, tested the application in the browser and decided whether each milestone was ready to merge.
This became the central operating model:
AI generates implementation capacity. The human controls direction, quality and release decisions.
That is not human-free software development.
It is software development with a different distribution of work.
The Prototype Became an Executable Specification
One of the most valuable lessons from the project was the importance of building a functional prototype before delegating the production implementation.
Traditional specifications are often ambiguous. Written requirements describe expected behavior, but they leave numerous details open to interpretation.
An executable prototype removes much of that ambiguity.
It demonstrates:
- how inputs behave,
- how outputs are represented,
- how edge cases are handled,
- which algorithms are acceptable,
- and which domain assumptions have already been validated.
The prototype did not dictate every production detail. Claude Code was still free to improve structure, naming and implementation quality.
But it established a behavioral baseline.
This substantially reduced the risk of receiving a polished implementation of the wrong product.
In AI-assisted development, executable specifications may become more important than ever. When code production is fast, ambiguity becomes comparatively expensive.
Architecture Before Implementation
The production system was organized as a pnpm monorepo.
The domain logic lives in packages/chord-engine, implemented as pure TypeScript without runtime dependencies. The web application lives separately in apps/web and uses Next.js for the user interface and static generation.
This separation was deliberate.
The chord engine should not depend on React, Next.js, the browser DOM or a particular deployment platform. It should be reusable by:
- the interactive web application,
- the statically generated chord pages,
- future command-line tools,
- and a possible native or hybrid mobile application.
The engine was therefore treated as a small domain package rather than as logic embedded inside UI components.
Vitest tests covered the verified musical behavior from the prototype. The web layer consumed the package but did not own the underlying music theory.
This is a relatively simple architectural decision, but it illustrates an important principle of AI-assisted development:
The faster code can be generated, the more important it becomes to define where that code is allowed to live.
Without explicit boundaries, an AI agent can produce a working application very quickly while quietly creating coupling that becomes expensive later.
Development in Five Milestones
Milestone 1: The Chord Engine
The prototype algorithms were ported into the standalone TypeScript package.
The engine handles chord definitions, pitch classes, interval structures, inversions, guitar tuning, fretboard positions and voicing generation.
The acceptance criteria were not invented during implementation. They came from the previously verified reference cases.
This made the milestone measurable: the engine was complete when it reproduced the expected behavior through automated tests.
Milestones 2 and 3: Finder and Identifier
The first user-facing mode was the conventional chord finder.
A user selects a root note and chord type, browses suitable guitar voicings, sees the equivalent notes on a piano keyboard and can play the chord directly in the browser.
The second mode reversed the process.
Users can select frets or piano keys, and the engine analyzes the resulting pitch-class set. It proposes matching chords and identifies inversions based on the bass note.
The cross-instrument synchronization became one of the product’s defining features. Input on the guitar is immediately visible on the piano, and piano input is reflected on the guitar.
This does more than display the same chord twice. It exposes the underlying relationship between instrumental shapes and harmonic structure.
Milestone 4: Static Growth Infrastructure
The next milestone transformed the application from a single interactive tool into a discoverable content platform.
For every combination of twelve root notes and nineteen supported chord types, the build generates a dedicated chord page.
That produces 228 chord pages containing:
- chord tones,
- harmonic functions,
- guitar voicings,
- piano visualization,
- explanatory text,
- related chords,
- metadata,
- and individual Open Graph images.
These pages form the organic acquisition strategy for MobileChords.
Search queries such as “C sharp minor 7 guitar chord” or “B flat diminished piano chord” express clear intent. A dedicated page can answer that intent while also introducing visitors to the interactive finder.
Static generation keeps the pages fast, indexable and inexpensive to operate.
Milestone 5: Productization and Deployment
The final milestone covered everything that separates a local application from an actual product:
- curated guitar shape overrides,
- responsive behavior,
- mobile interaction,
- Open Graph typography,
- sitemap generation,
- privacy information,
- imprint,
- build configuration,
- Vercel deployment,
- and Cloudflare DNS.
The deployment pipeline is intentionally uneventful.
A push to the main branch triggers a new production build. The application itself has no backend database, no user accounts and no server-side chord calculations. The engine runs entirely in the browser.
That keeps the operational model small and understandable.
Where the AI-Generated Solution Was Wrong
The project would be less useful as a case study if it only reported successful metrics.
Several problems demonstrated exactly where human judgment remained necessary.
Mathematically Correct, Practically Wrong Voicings
The guitar voicing algorithm initially favored shapes using all six strings.
From a scoring perspective, this seemed reasonable. More sounding strings often create a fuller chord and offer multiple representations of the required notes.
But the scoring model caused the familiar open A minor shape, x02210, to lose against a more unusual six-string voicing.
All automated tests passed.
The generated voicing was musically valid. It simply was not what a guitarist, especially a beginner, would expect to see first.
This is an important class of error.
The implementation satisfied the formal model but violated an implicit user expectation.
The solution was a curated override layer for common guitar shapes. The algorithm remains responsible for broad voicing generation, while established conventional shapes receive explicit priority.
The decision was documented in an Architecture Decision Record and protected by additional tests.
AI optimized the objective it had been given. The missing requirement was not musical correctness, but cultural familiarity.
Mobile Simulation Is Not Mobile Use
Desktop review did not expose several interaction problems.
On a narrow device, horizontal scrolling caused the guitar string labels to disappear from view. In piano-input mode, the relevant interaction surface could sit below the fold.
Neither issue involved a complex algorithm. Both significantly affected usability.
They became obvious when the application was used with a thumb on a mobile screen.
Responsive CSS and browser simulation are useful, but they do not fully replace physical interaction. Human review remained necessary because the quality problem existed at the level of experience rather than syntax or functional correctness.
Production Includes the Unglamorous Parts
The AI could build a sophisticated chord engine faster than the surrounding product could be finalized.
The remaining work included:
- legal pages,
- operator information,
- DNS configuration,
- SSL interaction between Cloudflare and the hosting platform,
- monorepo settings during the Vercel import,
- metadata,
- favicon behavior,
- and deployment verification.
None of these tasks was individually difficult.
Together, they form the gap between “the application runs” and “the product is available”.
This is easy to underestimate in AI demonstrations. Generating code is only one part of software delivery.
Governance Was More Important Than Prompting
The repository contains conventional engineering artifacts:
- a specification,
- Architecture Decision Records,
- milestone acceptance criteria,
- automated tests,
- and a handover document.
The handover file records the current state, completed work, known gaps and next steps after each milestone.
This solved a practical problem with agent-based development: sessions are temporary.
A new Claude Code session does not need the entire conversational history. It begins by reading the repository instructions, specification, architectural decisions and current handover.
The project context therefore lives in version-controlled artifacts rather than in the memory of an AI conversation.
This is a much more reliable model.
If AI agents work in sessions, then professional AI-assisted development requires professional handovers.
Prompting alone is not governance.
Repository structure, tests, architectural rules and explicit completion criteria are governance.
What This Case Study Does Not Prove
Building MobileChords in one day does not prove that every software product can now be built in one day.
The project had several favorable characteristics:
- it was a greenfield application,
- the domain was bounded,
- the core behavior could be tested deterministically,
- no legacy migration was required,
- there were no external enterprise integrations,
- no authentication system was needed,
- no payment processing was involved,
- and the operational architecture was intentionally simple.
A regulated enterprise platform with historical data, complex authorization, organizational dependencies and legacy interfaces would produce a very different result.
The lesson is therefore not that engineering effort has disappeared.
The lesson is that, under suitable conditions, implementation throughput can increase so dramatically that other constraints become dominant.
The New Bottleneck Was Verification
During the project, implementation was rarely the limiting factor.
The limiting factor was how quickly I could:
- inspect the result,
- test the user experience,
- validate the architecture,
- identify incorrect assumptions,
- make decisions,
- and approve the next milestone.
That is a significant change.
Traditional software projects often wait for implementation capacity. AI-native projects may increasingly wait for verification capacity.
This changes which skills matter most.
The scarce resource is no longer the ability to produce another plausible component. The scarce resource is the ability to determine whether that component belongs in the system.
Architecture, domain knowledge, product judgment, testing strategy and operational awareness become more valuable rather than less.
The Result
At the end of the day, MobileChords had:
- five completed milestones,
- 41 automated tests,
- 228 generated chord pages,
- individual Open Graph assets,
- 466 generated routes and build artifacts,
- a launch Lighthouse result of 99/100/100/100,
- automatic production deployment,
- and a reusable TypeScript domain engine.
The platform is now live at www.mobilechords.com.
It requires no account, stores no user data and performs its chord analysis entirely in the browser.
The next phase will be driven by observation rather than speculation. Search Console data will show which chords and queries attract visitors. That evidence can then guide further development, including enharmonic spelling, alternate tunings, chord progressions and a future mobile application using the same domain engine.
Conclusion: AI Did Not Remove the Engineering
MobileChords was not created by entering one perfect prompt.
It emerged from a controlled sequence:
- define the product,
- constrain the scope,
- build and verify a reference prototype,
- extract an executable specification,
- define the architecture,
- divide delivery into reviewable milestones,
- let AI generate implementation,
- test each result,
- correct hidden assumptions,
- and release only after human approval.
AI did not remove the work.
It moved the work.
Less time was spent typing implementation details. More time was spent defining behavior, reviewing outcomes, resolving trade-offs and deciding what was ready for production.
That is the practical meaning of AI-native software delivery.
AI can generate the implementation.
But architecture, product judgment and responsibility still have an owner.
Explore the result at www.mobilechords.com.
Editor’s note: Appropriately, this article was also written with assistance from an AI system. The experience, architectural decisions and responsibility for the published result remain human.
0 Comments