Runbook

How a commit becomes a row.

Lattice is the hybrid pipeline: GitHub → Vercel → Stripe → Supabase. The upgrade rule is older than any of those names — keep the contract, swap the node.

  1. 01

    GitHub is the source rail

    Every change starts as a commit. Preview deploys bind to the branch; production binds to main. Do not let another tool become a second source of truth.

  2. 02

    Vercel is the ship rail

    The project watches the repo. A READY production deploy is the only signal Stripe and Supabase should treat as “live.” Preview URLs stay ephemeral.

  3. 03

    Stripe is the money rail

    Checkout and invoices emit webhooks. The lattice never asks the client whether a charge succeeded — invoice.paid is the event. 2027 stablecoin settlement must emit the same shape.

  4. 04

    Supabase is the memory rail

    pipeline_events, customers_mirror, deploy_log. Unowned demo rows are for the pulse; production binds the project and scopes by user. Vector Mesh adds a column, not a second database.

Rules for 2027

  • Speak Protocol 1.0

    A node is an id, a kind, capabilities, and events. If a 2027 vendor cannot emit git.push, deploy.prod, pay.webhook, or db.query, it does not dock — it waits.

  • Beside, then replace

    Dock next to the 2026 node. Dual-run. Cut traffic when the new rail is boring. Never rip Stripe out the week USDC settles.

  • One bus

    The ship pulse is the integration test. If a new node does not appear in the pulse, it is not in the lattice.

Adapter Protocol 1.0

type LatticeNode = {
  id: string
  kind: "source" | "deploy" | "payments" | "data" | …
  generation: 2026 | 2027
  protocol: "1.0"
  capabilities: Array<"git.push" | "deploy.prod" | "pay.webhook" | "db.query" | …>
  beside?: string   // strangler host
  replaces?: string // only after dual-run
}

When a 2027 product appears — whatever it is actually called — wrap it in this shape and dock it in the bay. The command plane does not care about the logo.