EXAMPLE / Contracts

Write your first contract

Follow user.create from an email schema to a typed handler. Start with the smallest maintained example.

Source walkthroughBeginner
PATTERN EXPLORER

Follow the pattern. Inspect its limits.

Explore the source walkthrough, its evidence and the choices you would make in your own application.

SOURCE WALKTHROUGHRead the operation in its authored order
Choose a point to look closer
01 / Source walkthrough

Describe the input

Read UserInput in src/contracts/user.ts. The schema has one required EmailAddress field. The command uses the schema for both input and output.

An exploration of the inspected source; no example is executed here.

1 / 4

The situation.

A small user.create command accepts one required email address. Its current handler returns the same email. This gives you a compact place to understand the contract and handler boundary before adding storage or authentication.

What you will learn

  • Give an operation a stable key and version.
  • Describe the accepted input and returned output in the same contract.
  • Connect a typed handler without assuming the metadata implements the business operation.
LOCAL ILLUSTRATION

Start with a required input.

This form illustrates an email-shaped input and echo result. It does not run ContractSpec’s schema library or create an account.

Enter a synthetic email address to inspect the illustrative result.

Follow the operation.

  1. 01

    Describe the input

    Read UserInput in src/contracts/user.ts. The schema has one required EmailAddress field. The command uses the schema for both input and output.

  2. 02

    Name the operation

    Inspect the user.create key, version 1.0.0, owner, goal, and anonymous authentication policy. These describe the operation and its boundary.

  3. 03

    Follow the handler

    Open src/handlers/user-input.handler.ts. HandlerForOperationSpec derives the handler shape from CreateUser. The implementation returns input.email; it does not create a persisted account.

  4. 04

    Inspect and adapt the starter

    Read the package smoke fixture and validation script. Replace the echo handler with your own behavior, then test that behavior and the contract boundary together.

What the source demonstrates.

  • The maintained source declares user.create with a required email input and a typed output.
  • The handler is typed from the operation specification.
  • A source smoke fixture checks starter metadata and feature registration.

What it does not establish.

  • A database account is created or an email is sent.
  • This example exposes an MCP tool: its manifest disables MCP.
  • This starter implements an approval gate, persistence, or production authentication.

Bring it into your environment.

Use the exact source context and prerequisites below. A source walkthrough is not a verified public-package installation recipe.

  • Access to the inspected source repository and a checkout at the cited revision.
  • The repository's Bun workspace dependencies and required generated package exports. These instructions were inspected; the examples were not executed in this review.

Working directory: examples/minimal

PACKAGE-LOCAL COMMANDS
bun run smoke
bun run validate

The smoke fixture checks metadata and feature wiring; validation checks the contract. Neither is an account-creation integration test.

Commands and source inspected; not executed here.

Read the related guide →

Make the pattern your own.

  • Keep the operation key and version intentional as behavior changes.
  • Add persistence in a handler or port with explicit tests.
  • Use the approval fixture or draft-and-send story when learning governed writes.
SOURCE CONTEXT

Inspect the evidence.

Reviewed 2026-10-27 · b67c376f

Pinned source links require repository access; publication and anonymous package availability were not checked for this example.

Declared maturity
stable
Catalogue registration
Registered
Inline preview
No generated inline UI preview registered
Execution in this review
Not rerun
Production qualification
Not assessed
Your view

Make room for your context.

Shape the presentation around this moment. You can change it whenever you need.

Your context

The different parts of you

Choose a starting point

A useful mix of context, visuals and gentle guidance.

Tune each dimension
Each dimension can change independently. Product permissions and available actions stay unchanged.

Support the way you begin and return

Tune your support

Reading comfort

Choose your language

Interface language changes text only. Markets, prices and workflows keep their own settings.

Translation coverage

Original source

Navigation151
Graph616
Categories378
Portfolio833
Examples2,035
Source preview1,542

More translations will be added as content is reviewed.

This preference is saved on this browser.

Search the website

Useful starting points

No results. Try a shorter phrase, an operation name or another search area.

A LITTLE ROOM TO EXPLORE

Find something to explore.

Open a closer look on this page, try a different perspective, or follow the detail into its own page.

How previews and controls work
01

Look before you leave

Hover a link or focus it with Tab to see a preview. Clicking the original link or pressing Enter always opens its destination.

02

Stay with the context

Move into the preview to explore its sections. Use Alt + ↓ from a focused link to enter it with the keyboard. Escape closes it.

03

Open the possibilities

Disclosure rows, perspective choices and highlighted controls reveal more. Your view changes reading comfort and the context you explore.

A separate button for a closer look

Show small preview buttons beside links where there is room. Tap the eye to inspect, or tap the link to go straight there. This choice stays in this tab.

No browsing history is collected. Reduced motion follows your device and Your view.