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.
- 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.
- 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.
- 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.
- 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.