Every build I take starts with three typed fields
An executive director fills in five boxes on a form, presses one button, and two business days later a five page report about their own website lands in their inbox. That is the whole engagement from their side. Nobody gets on a call. Nobody scopes anything.
I build products under Compound Labs that have nothing to do with each other, and the thing I keep noticing is that all of them answer the same four questions in code: what I take in, what I hand back, how long it takes, what it costs. Here is what each of those actually looks like, in the files.
What I take in
The intake is the smallest set of facts that fully determines the deliverable, and not one field more.
CivicBinder's request form in web/src/app/request/RequestForm.tsx asks for an entity name, an entity website and a work email. Role and notes are there and optional. QuorumFile, which produces HUD policy adoption documents for housing agencies, takes three fields at checkout: a participant code, an agency name, and a dropdown for exempt status. DoseTrace's follow up email describes its intake as the wholesaler list and the headcount, "about 15 minutes of work". CertScope asks for a product name, a short description and a listing link per item, plus test reports and HTS codes if the buyer happens to have them.
The interesting part is what the code does when a field is missing. In civicbinder/src/fulfill.mjs, the entity name is deliberately not allowed to fall back to the name of the governing body, even though that string is sitting right there and would read fine on a cover page. A blank has to look like a blank. An unusable website field throws and stops the run rather than cleaning up a guess into something plausible.
QuorumFile goes further and overrules the buyer. The participant code is looked up against HUD's own roster, and the roster answer wins over whatever the buyer selected, because the roster is a record and the dropdown is an opinion. Which document set they get, and what they pay, both follow from that lookup:
const amount = programType ? priceFor(programType) * 100 : SINGLE_DOCUMENT;
// priceFor() and these constants must agree; assert rather than let them drift silently.
if (amount !== SINGLE_DOCUMENT && amount !== BOTH_DOCUMENTS) {
return NextResponse.json(
{ error: "Pricing misconfigured." },
{ status: 500 },
);
}

What I hand back
A file with a name on it. For CivicBinder the paid deliverable is runs/<host>/readiness-binder.pdf, attached to an email as <Entity>-Readiness-Binder.pdf. Inside it: a cover carrying that entity's compliance date, remediation phases bucketed by severity with target months one, three and six from the scan date, evidence screenshots with numbered markers on the actual page, and policy and statement templates that ship with [date of adoption] left in brackets on purpose, because a board fills that in, not me.
The five commands that turn two typed fields into that PDF are one block:
run('node', ['src/crawl-scan.mjs', `https://${domain}`, '150']);
run('python3', ['src/pdf_census.py', `runs/${domain}/findings.json`, '100']);
run('node', ['src/summarize.mjs', `runs/${domain}`]);
run('node', ['src/evidence.mjs', `runs/${domain}`, '4']);
run('node', binderArgs);
Not every deliverable is a document. CoverCheck reads a vendor's certificate of insurance and hands back a drafted chase email to that vendor's insurance agent, and app/src/lib/covercheck/mail.ts refuses to send any message whose status is not approved. StarReply drafts a reply to a public review in the owner's voice, and on a one or two star review it has no autonomous setting at all. LeadGrade hands back a ranked queue rather than a form dump.
The pattern I would defend: the deliverable is a thing you can forward to somebody else. A dashboard someone has to log into and interpret is not a deliverable, it is homework.

How long it takes
The clock starts when the intake is complete, not when the money moves. CivicBinder's confirmation screen says the preliminary report arrives usually within two business days, and it says that on the frame the button is pressed. CertScope, DoseTrace and QuorumFile all quote three business days from the moment the buyer sends the list back. QuorumFile's contact form promises a human reads it usually the same day and always within one business day.
There is one thing between the finished artifact and the send. Before a binder is emailed, a headless reviewer reads every page of the generated PDF and looks at the evidence screenshots, checking that the entity name is right on the cover, that the counts in section one match the scan data, and that every screenshot actually shows visible markers. A screenshot with no markers is a fail. On a fail the pipeline gets one repair attempt and then re review, never a loop, because that is the path with somebody's money on it. A fulfilment that fails is not retried on a timer either. It goes to a person.

What it costs
One integer, in one module, with no imports in it.
CoverCheck's app/src/lib/prices.ts holds amountCents: 1500, which is fifteen dollars a month, flat, unlimited vendors and communities. DoseTrace's binder is 9900. CertScope's table is 2900 for a single item, 9900 for up to ten, 24900 for up to forty. QuorumFile is 99 dollars for one document and 199 for the combined set. CivicBinder's binder is 299 or 499 depending on population, with a 19 dollar monthly rescan.
Those modules import nothing on purpose. The pricing page, the structured data in the page head and the checkout route all need the same number, and the checkout route can only be loaded inside the framework while the pricing derivations run under plain Node. A module with no dependencies is the only file all three can reach. The alternative is the same figure typed in three places, which agrees on the day it is written and on no day after.
Four questions, answered in files rather than on a call. A municipal website scan, a HUD policy pack, a children's product certificate, a pharmacy record binder and an insurance chase email share no code and no buyer, and the shape of the engagement is identical in every one.
https://civicbinder.org/dv