Client
It’s like Harvest but for retainers. Agencies sell 40 hours a month and we track the hours.
A principal architect interrogates your idea — pushing back, cutting v1 down, naming what breaks. You leave with the blueprint and the prompt that builds the prototype.
Example section · Retainer · swipe to pan
The interview is bounded on purpose. Depth past the boundary costs you a decision, not an insight — so each bay gets settled and left behind.
Who has this problem, and what does solving it look like in a number?
The path from arriving to getting value, walked end to end.
The objects a database would need, and who is allowed to read them.
Auth, payments, third parties, and everything that fails at 3am.
What ships in v1, what waits, and what gets cut for good.
An intake form records what you already believe. This does the opposite: it finds the assumption holding up your plan and pulls on it, then proposes the cheaper shape.
Example exchange · turn 2
Client
It’s like Harvest but for retainers. Agencies sell 40 hours a month and we track the hours.
Architect
Harvest measures work as it happens. A retainer is something else: a prepaid balance granted on the 1st that expires on the 31st. Nobody has ever argued about the stopwatch — they argue about what happened to the eleven hours they didn’t use.
So the entity is an allotment with an expiry, and a draw against it. Which means v1 doesn’t need a timer at all: the account lead types one number a week. No start/stop UI, no browser extension, no idle detection — call it two weeks off the build.
The question that decides the schema: when the month turns, do leftover hours expire, roll over, or partially roll?
One is written for you. One is written for the machine that builds it. They are never the same document.
Sent to your inbox
Executive summary, the core loop, what v1 contains and what it deliberately leaves out, the data underneath, the architecture, and what could go wrong.
# Retainer ## What v1 contains - **Hours drawn against a monthly allotment** — the account lead types one number a week. This is the only figure the client and the agency currently disagree about. - **Client-facing balance page** — read-only, shows granted, drawn, remaining, and the expiry date. Removes the recurring email thread without any write path for the client. ## What v1 deliberately leaves out - **Live timers** — nobody disputes elapsed time, they dispute the rollover rule. Timers cost weeks and settle nothing.
Example output
Held for your build
Schema, server functions, route tree, screen-by-screen states, seed data, and a build order. Dense on purpose — a coding agent reads it once and starts.
## Domain model ```sql CREATE TABLE allotment ( id TEXT PRIMARY KEY, client_id TEXT NOT NULL REFERENCES client(id), hours REAL NOT NULL, granted_at INTEGER NOT NULL, expires_at INTEGER NOT NULL ); CREATE INDEX allotment_open ON allotment(client_id, expires_at); ``` Remaining is `allotment.hours - SUM(draw.hours)`, never a stored column — a corrected draw has to move the balance with it. ## Build order 1. Schema + seed three clients and the current month's allotments.
Example output
When you want the prototype built from the prompt, reply to the report or write to hello@implement.sh.