Skip to content

Commit ff2cfd3

Browse files
committed
init blog post
1 parent d4cbc49 commit ff2cfd3

3 files changed

Lines changed: 187 additions & 1 deletion

File tree

‎apps/website/astro.config.mjs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ const classes = {
99
summaryClass: "cursor-pointer font-bold text-[1.25rem]",
1010
detailsClass: "mt-[2.5rem]",
1111
iframeClass: "border-none w-full h-[360px] overflow-y-hidden",
12+
ctaClass: "my-12 rounded-lg border-l-4 border-primary bg-primary/5 p-6",
13+
ctaTitleClass: "text-xl font-semibold text-foreground mb-3",
1214
};
1315

1416
const remarkPlugin = createRemarkPlugin(classes);
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
---
2+
title: "Your AI Prototype Is Not a Product"
3+
description: "AI prototypes help teams validate ideas quickly, but they are not production-ready software. Learn how CTOs and engineering teams can turn AI-generated prototypes into secure, maintainable products."
4+
createdAt: 1773156448016
5+
updatedAt: 1773156448016
6+
authors: ["david"]
7+
category: "AI"
8+
editors: ["velimir"]
9+
abstract: "AI prototypes are powerful discovery tools, but shipping them as products creates expensive problems later. The real job is to extract the intent, keep the useful signals, and rebuild with production standards in mind."
10+
image: "/images/you-should-not-measure-developer-productivity-response-to-mckinsey.png"
11+
draft: false
12+
---
13+
14+
Your founder shows up with a working app built over a weekend.
15+
16+
App works, even the UI looks decent. Everyone claps. 👏👏👏
17+
18+
Then engineering opens the codebase; witness the fastest mood souring ever.
19+
20+
AI has changed the front end of product development fast. Getting from idea to something clickable used to take weeks. Now it can take days, often just hours. That's genuinely useful. The problem starts when teams confuse **"we have a working prototype"** with **"we have a product we can ship."** Not the same thing!
21+
22+
And if you are a CTO or engineering leader, managing that gap is becoming part of the job.
23+
24+
## Contents
25+
26+
## Prototypes got cheaper. Engineering did not.
27+
28+
For a long time, the bottleneck was getting from idea to something visible. You had an idea, then wireframes, then designs, then handoff, then tickets, then implementation. That bottleneck is smaller now.
29+
30+
Getting to a prototype is no longer in the hard part. The hard part is turning that prototype into software your team can actually own.
31+
32+
That means software that is secure, maintainable, testable, observable, consistent with your stack, safe to deploy, and understandable by people other than the single person who prompted it into existence.
33+
34+
## But... But it already works
35+
36+
Yes. Kind of. It's s trap.
37+
38+
A vibecoded prototype often works in the same way a movie set looks like a real building. From the right angle, everything is there. Open the wrong door and you are staring at plywood.
39+
40+
You will often find things like:
41+
42+
- duplicated business logic
43+
- inconsistent naming and data shapes
44+
- auth rules that only work in the happy path
45+
- placeholder persistence pretending to be a real data model
46+
- components that look reusable but aren’t
47+
- generated code that no one on the team would have written on purpose
48+
49+
A prototype is supposed to prove movement. It is supposed to make the idea visible. It is supposed to help people react to something real instead of debating a vague concept for three weeks. That is incredibly valuable. But don't forget it is still a prototype, its sole job is to reveal intent.
50+
51+
## Prototypes were never about the code
52+
53+
When a founder or product person builds an app with AI, the most valuable thing they have produced is usually **not** the generated codebase. It's the intent hidden inside it.
54+
55+
That includes:
56+
57+
- what users are trying to do
58+
- which workflows matter
59+
- what language the business uses
60+
- which edge cases showed up early
61+
- which assumptions changed during the process
62+
- where the product got more complicated than expected
63+
64+
That information is pur gold. And in a lot of cases, the prompt history is just as useful as the prototype itself. Because prompts contain the missing "why."
65+
66+
Why was this step added?
67+
Why was that role introduced?
68+
Why does this page need that action?
69+
Why did this flow get split in two?
70+
71+
That is useful product and domain knowledge. That is what engineering cares about. Keep the prototype, keep the prompt history too, but please don't confuse either of them for your production system.
72+
73+
## Extract the Intent
74+
75+
The right workflow is not:
76+
77+
**prototype -> clean up a few things -> ship**
78+
79+
It is much closer to:
80+
81+
**prototype -> extract intent -> rebuild properly -> validate behavior**
82+
83+
In the short term, this is slower than shipping the generated output directly, but in the medium term, it is usually much faster than inheriting a mess your team now has to maintain.
84+
85+
Because once prototype shortcuts make it into production, they become expensive liabilities. They show up later as impossible migrations, brittle integrations, weird bugs, frontend complexity that keeps multiplying, and engineers quietly avoiding entire parts of the codebase.
86+
87+
You can move quickly with AI, I mean you should move quickly with AI. But you still need to decide what counts as source material and what counts as source of truth. For any production systems, the source of truth still needs to be your architecture, your standards, your tests, your delivery pipeline, and your operational model.
88+
89+
::cta Engineering leaders: want AI speed with predictability and team alignment?
90+
91+
[Shared Context Engineering](https://sce.crocoder.dev/) is our approach for helping teams turn AI prototypes into real products by making AI agents reliably follow your team's domain knowledge, engineering decisions, and established way of building software.
92+
93+
If you want AI-assisted delivery without drift, rework, or inconsistent output across engineers, [contact us](/contact).
94+
95+
::endcta
96+
97+
## What should Engineering take from the prototype
98+
99+
The real value is in extracting what actually matters: the core ideas, the useful patterns, and the parts that proved the concept works. A prototype was always a discovery tool. The job of Engineering is to identify the signals hidden in the noise, then rebuild it properly with production standards in mind.
100+
101+
So, what should engineering look out for?
102+
103+
### Core user flows
104+
105+
Forget whether the implementation is good. Look at the behavior.
106+
107+
What is the happy path? What are the critical steps? Where are the handoffs? Which states matter?
108+
109+
That gives engineering something much more useful than a pile of screens.
110+
111+
### Domain concepts
112+
113+
What entities actually exist in the system?
114+
115+
Users? Teams? Projects? Bookings? Reports? Permissions? Statuses?
116+
117+
AI tools often generate vague or inconsistent structures, but they still reveal what the system is trying to model.
118+
119+
### Contracts and boundaries
120+
121+
Where should the frontend stop and the backend begin?
122+
123+
What API calls need to exist? What data shapes should be stable? What permissions must be enforced server-side?
124+
125+
Engineering needs to redraw those boundaries.
126+
127+
### Roles and permissions
128+
129+
Who can do what?
130+
131+
Prototypes often imply authorization rules without implementing them properly. That does not make the rules useless. It means they need to be made explicit.
132+
133+
### Edge cases
134+
135+
Where did the generator or prompter keep correcting behavior?
136+
137+
Those corrections usually point to the parts where the original idea first met real-world constraints.
138+
139+
Those are the signals engineering should catch early.
140+
141+
## A good prototype should make engineering smarter
142+
143+
A good prototype should not save engineering from thinking, it rather gives engineering better material to think with.
144+
145+
It helps the team answer the important questions earlier:
146+
147+
- Is this workflow worth building?
148+
- Are we solving the right problem?
149+
- Which states actually matter?
150+
- What is missing from the domain model?
151+
- Where will users get confused?
152+
- Which parts are easy to fake, but hard to operationalize?
153+
154+
That is incredibly useful, but again only if the team treats the prototype as evidence, not as a finished product.
155+
156+
## TL;DR
157+
158+
AI has made product discovery much faster. What it has not done is remove the need for architecture, standards, testing, security, and ownership. If anything, those matter more now.
159+
160+
Teams can generate "almost software" at a much higher speed, but still someone has still responsibility to decide what is actually ready to become a real product.
161+
162+
An AI prototype can be useful, but it is still not a product.

‎packages/remark-plugin/index.ts‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ function remark({
66
detailsClass,
77
summaryClass,
88
iframeClass,
9+
ctaClass,
10+
ctaTitleClass,
911
}: {
1012
titleClass: string;
1113
detailsClass: string;
1214
summaryClass: string;
1315
iframeClass: string;
16+
ctaClass: string;
17+
ctaTitleClass: string;
1418
}) {
1519
return () => {
1620
return (tree: Node) => {
@@ -86,7 +90,25 @@ function remark({
8690
if (!node.children || node.children.length !== 1) return;
8791
const textNode = node.children[0];
8892

89-
// non h title rule
93+
94+
if (textNode.type === "text" && textNode.value.startsWith("::cta ")) {
95+
console.log("Found CTA:", textNode.value);
96+
const ctaTitle = textNode.value.substring("::cta ".length);
97+
const node = {
98+
type: "html",
99+
value: `<aside class="${ctaClass}"><span class="${ctaTitleClass}">${ctaTitle}</span>`,
100+
};
101+
parent.children.splice(index, 1, node);
102+
}
103+
104+
if (textNode.type === "text" && textNode.value.startsWith("::endcta")) {
105+
const node = {
106+
type: "html",
107+
value: `</aside>`,
108+
};
109+
parent.children.splice(index, 1, node);
110+
}
111+
90112
if (textNode.type === "text" && textNode.value.startsWith("::title ")) {
91113
const titleText = textNode.value.substring("::title ".length);
92114
const titleNode = {

0 commit comments

Comments
 (0)