CustomLabs
Handbook / 03

How do we get from a working notebook to a deployable service?

Build

A working prototype and a production service are different projects with different scopes — the gap between them is usually a bigger lift than the prototype itself, and it's the stage most timelines quietly underestimate.

Guide

What actually happens at this stage

A notebook proves the idea works on the cases you tried. It has no error handling, no retries, no monitoring, no cost controls, no deployment story, and often no clear boundary between "the model's job" and "the surrounding code's job." None of that is a criticism of the prototype — a notebook that did all of that would have taken too long to prove anything. The build stage is where that gap gets closed on purpose, as its own scoped piece of work with its own budget and timeline, not as an afterthought tacked onto the end of the prototype phase.

The single highest-leverage habit to bring from prototype to production is structured output. Free-form text is fine for a demo where a human reads every response; a production system needs the model's output to be parseable by code every single time, which means constraining it to a schema — JSON, an enum, a typed object — and validating it, not just asking nicely for the right shape and hoping. A wrongly-shaped response breaks whatever comes next in the chain, and "the model usually gets the format right" is not a property a production system can depend on.

Guardrails are the second habit, and they belong in the design of the service, not bolted on after an incident. Content filters, schema validation, permission scoping on anything the system can act on, and a human-approval gate on anything irreversible — these are deliberate additions, not something a model comes with by default. The scope of what a production build actually needs here follows directly from what the system is allowed to touch: a system that only reads and summarizes needs far less than one that can send an email or issue a refund.

Ingest is where notebook-to-production work most often gets underscoped, particularly for anything involving retrieval or a knowledge base. A notebook typically loads a fixed snapshot of data once; a production system has to handle that snapshot going stale the moment a source document changes. Change-data-capture ingest — subscribing to actual change events instead of re-crawling on a timer — is the fix, and it's worth building before launch rather than after the first support ticket about an AI citing a policy that was deleted months ago.

The honest way to know this stage is done is not "it works on my machine" or even "it works in staging" — it's that the system has retries with a defined ceiling, an error path that's distinguishable from a success path, monitoring that would tell you it broke before a user does, and a human checkpoint on anything that can't be cleanly undone. A prototype that skips straight to a launch date without this stage isn't ahead of schedule; it's carrying the cost forward to whichever week it breaks in production instead.

Mistake

The common mistake

The most common mistake at this stage is treating it as a smaller, faster version of the original prototype work rather than a distinct phase with its own scope — which is exactly how a "two more weeks" estimate turns into two more months, because error handling, retries, and ingest freshness were never actually budgeted for.

Done

How do you know this stage is finished?

  • Every model call that feeds downstream code returns a validated, schema-constrained output — not free-form text parsed with hope.
  • Guardrails (content filters, permission scoping, human approval on irreversible actions) are sized to what the system is actually allowed to touch.
  • Ingest handles a source document changing or being deleted, not just its state at the last crawl.
  • Retries have a defined ceiling and a distinguishable error path, not a silent retry loop or a swallowed failure.
  • Monitoring would surface a break before a user reports it.
Sources

What backs this up

Insights

Case studies

Patterns

Glossary

  • Notebook-to-Production

    The term for the gap itself — and why it's usually bigger than the original prototype.

  • Structured Output

    The single highest-leverage habit to bring from prototype to production.

  • Guardrails

    What has to be added deliberately, because no model ships with it by default.

More

  • The Agentic Delivery Playbook

    The operating model for the build stage itself, once the work is a fleet of coding agents rather than one engineer.

Questions

Questions on this stage

What comes up before and during build.

01 Why is notebook-to-production usually a bigger lift than the prototype?

Because the prototype only had to prove the idea works on the cases you tried it on. Production needs error handling, retries, monitoring, cost controls, and a deployment story the notebook never needed — and all of that is real, scopeable work, not polish.

02 What's the highest-leverage thing to fix first?

Structured output. Constrain and validate every model response that feeds downstream code to a defined schema — a wrongly-shaped response breaks the next step, and "usually right" isn't a production guarantee.

03 How much guardrail work do we actually need?

Scope it to what the system can touch. A read-only summarizer needs far less than a system that can send messages or issue refunds — match the guardrail budget to the blast radius, not to a fixed checklist.

Not sure where you are in this?

A Ship Audit checks your actual system against every stage of this handbook and hands back a written, prioritized plan.

Book a Ship Audit

navigate select esc close