Skip to content

The Build and Operator planes

A plane is the set of Verbs one kind of principal acts through. You build through the Build plane, and run Customers and money through the Operator plane, over the API, the CLI or MCP.

Every console act is a Verb first

Calls cross the seam inward and Events cross it outward. Filled: inside the product. A console renders these Verbs and keeps no state of its own.

Four planes share the one decision. Each console renders one or more of them and invents nothing. If a console needs a state, a move or a reason that no plane holds, the platform is missing a capability.

PlaneWho acts through itSpecified in
BuildYou, your team and your coding agentBuild, below
OperatorYou, your staff and your operator agentsOperator, below
CustomerEach Customer's members and agentsThe developer portal
SupplySuppliers, workers and their agentsSupply, booking and fulfilment

Capability families

The Build plane

FamilyVerbsWhat they do
ProductsProduct.create, Product.list, Product.archiveStart a product from a template, list yours, and archive one with its record kept
Check and planCheck.run, Plan.createEvery Problem and every breaking change, with price and margin per Verb, before anything serves
Deploy and roll backDeploy.create, Rollback.createPublish a Version to every Interface at once, or move them all back
VersionsVersion.list, Version.deprecate, Version.retireWhat each Key, run and case is pinned to; a deprecation with its window; retirement once nothing is pinned
EnvironmentsEnvironment.promoteThe move from Test to Live, which a person approves
SecretsSecret.set, Secret.rotate, Secret.deleteA Source's credentials, outside the file and never shown
DomainsDomain.add, Domain.verify, Domain.removeYour Domains for the API, the site, the portal and the docs, beside the free Host
ExtensionsExtension.list, Extension.getEach Customer's extension, and the line that holds one
Your teamTeammate.invite, Teammate.remove, Teammate.assign, Token.create, Token.revokeWho on your team builds or operates, under which Role, and tokens for CI and agents

The Operator plane

FamilyVerbsWhat they do
CustomersCustomer.list, Customer.search, Customer.getEach Customer's plan, usage, spend, region, extension, members and open disputes
Plans and creditsSubscription.change, Subscription.cancel, Credit.grant, Coupon.createA plan change, a cancellation, credits or a coupon, each at the Offer's prices
Refunds and disputesRefund.grant, Refund.decline, Dispute.answerRefunds outside the published rule, decided by the person you name; disputes answered with the receipt and the call record
Payouts and the sales recordPayout.list, Payout.get, Sale.list, Sale.exportEvery payout to you and to each supplier, and every sale, refund, fee and tax line behind it
Support accessSupportGrant.request, SupportGrant.end, SupportGrant.readsTime-boxed access a Customer consents to, and every read made inside it
IncidentsIncident.open, Incident.update, Incident.resolvePosts to the status page on your Domain and to every Watch
Calls and evidenceCall.get, Call.replay, Log.follow, Trace.getAny call by its request id, replayed against its Version; logs as they happen; a trace across every hop
Brakes and approvalsBrake.release, Approval.grant, Approval.declineA held run released, or a move held for a person decided
Customer operationsCustomer.provision, Customer.suspend, Customer.restore, Customer.move, Customer.offboard, Customer.eraseEach with its reason and its Event, and the Customer told
SuppliersSupplier.verify, Supplier.pause, Supplier.removeWho may sell in a Marketplace or a Service API, and a stop with the record kept
KeysKey.revokeA leaked Key revoked, and its holder told

The Operator plane sees each Customer's account, plan, usage and money. It never reads inside a Customer's Namespace without a support grant.

A refund the published rule allows needs no plane: it is paid with no person. The planes hold what needs you. A support desk, a sales funnel and the company's books run outside the product, on its Events and through these Verbs.

Lifecycles and states

ThingStatesWhat moves it
A deploypending, then done or refusedDeploy.create; a refused deploy changes nothing that serves
A Versionlive, superseded, deprecated, retiredThe next deploy, a deprecation with its window, and retirement when nothing is pinned
An environmenttest, then liveEnvironment.promote, approved by a person
A Domainadded, verifying, verified, removedOne DNS record verifies it; the free Host keeps answering throughout
A teammateinvited, active, removedYou or an admin on your team; a removal ends every token they made
A Customer accountinvited, active, past_due, suspended, closed, erasedSign-up, Stripe, and the Customer operations; a restore returns suspended to active
A support grantrequested, then consented or declined; a consented grant is active, then endedThe Customer's admin consents; the time box, the Customer or you end it
A Refundrequested, granted or declined, paidThe published rule with no person, or the approver you name
A Disputeopened, answered, then upheld or deniedThe Customer opens it with the receipt; you answer with the call record and terms
A Payoutearned, pending, paid, or reversedStripe's schedule; a refund or an upheld dispute reverses its line
An incidentinvestigating, identified, monitoring, resolvedA failing check opens it; each update posts to the status page and to Watches
A brakearmed, tripped, held, then released or resetA cap reached before a call runs; a person releases it, or the period resets it
A supplierapplied, verifying, verified, paused, removedVerification, then you or the supplier

Each row is the same state the Customer, the supplier or the buyer sees on its own side. Each move writes its Event and its actor: a person under a Role, or an agent under a mandate.

What you declare, what the platform does

You declareThe platform does
Your team's Roles: who builds, who operates, and which Verbs each may callApplies them to every plane Verb on every Interface; a missing Role answers 403 role_required
Approvals on operator moves: a refund above an amount, an erase, the move to LiveHolds the move, sends the Approval URL, and runs it once on the grant
What your agents may do aloneRequires a mandate on every agent call, and holds the moves you reserve for a person
How long support access lasts, and what it may readAsks the Customer's admin to consent, opens the grant for that long, and records every read
Nothing elseEvery plane Verb on the API, the CLI and MCP; an Event for every act; the evidence of every decision

Example

Pipeline's team splits support from finance, holds refunds above $100 for finance, and caps support access at two hours of reads.

definition.ts
25 lines
import { define } from 'apis.dev'

/** Deals for each Customer, kicked off when won. */
export default define({
  name: 'pipeline', domain: 'pipeline.apis.dev',
  Company: { name: 'string', domain: 'url!#', deals: '<-Deal.company' },
  Deal: {
    title: 'string', amount: 'decimal(12,2)', company: '->Company.deals',
    stage: { open: [], qualify: 'opened', win: 'qualified', lose: ['opened', 'qualified'] },
  },
  offer: {
    Free: { month: 0, seats: 1, includes: { 'Deal.open': 25 } },
    Team: { month: 49, seats: 5, seat: 9, includes: { 'Deal.open': 1000 } },
    'Deal.open': 0.001,
  },
  operate: {
    team: {                                               // your staff, not your Customers' members
      support: ['Customer.get', 'SupportGrant.request', 'Incident.update'],
      finance: ['Refund.grant', 'Credit.grant', 'Payout.list'],
    },
    approve: { 'Refund.grant': { above: 100, by: 'finance' }, 'Customer.erase': { by: 'owner' } },
    agents:  { approve: ['Customer.suspend'] },           // an operator agent's suspension waits for a person
    support: { for: '2h', see: ['Company', 'Deal'] },     // read-only, and only with consent
  },
})

The operator agent asks Acme for access to look into a refused move. Nothing is read until Acme's admin consents.

Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/products/pipeline/customers/cus_Acme/support-grants/grant_1
X-Action-Id: act_31
X-Cost: price=0, currency="USD"
X-Request-Id: req_2a7d90c4e1b35f68a0c2

{
  "id": "grant_1",
  "customer": "cus_Acme",
  "see": ["Company", "Deal"],
  "for": "2h",
  "status": "requested",
  "reason": "Deal.win refused with wrong_state since 09:00",
  "consent": "https://pipeline.apis.dev/consents/grant_1",
  "mandate": ["you", "agent_ops"]
}

That is POST https://apis.dev/v1/products/pipeline/customers/cus_Acme/support-grants, npx apis.dev support request cus_Acme --for 2h in the CLI, and requestSupportGrant over MCP. Acme's admin consents on the link or through the API, and each read lands in Acme's audit log as it happens.

Contracts with the other subsystems

SubsystemWhat the planes take from itWhat the planes give back
Definition and compileCheck, plan, deploy, rollback, the DigestEvery deploy as a Verb with its actor, a person or an agent under a mandate
Identity, access and policyYour team's Roles, operator mandates, approvals, consentEvery plane act through the one decision; support access as a grant the Customer holds
Model and recordsEach Customer's account, Namespace and viewsReads across your Customers' accounts, never inside a Namespace without a grant
Data and SourcesEach Source's health and licence termsA Source's failure opened as an incident, with its trace
RuntimeThe gate, Actions, EventsEvery plane act through the same gate; held runs to release
WorkQueues, cases, suppliersSupplier verification and pauses; a stuck task reassigned
CommerceSubscriptions, refunds, disputes, payouts, the sales recordRefunds outside the rule, credits and plan changes, each at the Offer's prices
Interfaces and distributionThe status page, the changelog, the portalIncident posts and deprecation notices on your Domain; the same states the portal shows
Trust and operationsIncidents, brakes, the proof record, Customer operationsThe Verbs that move each, and the evidence of who moved it

What your team and your Customers meet

  • Your coding agent. It writes the file, checks, plans, deploys and rolls back through the Build plane, under a token or mandate you give it.
  • Your operator agent. It sees a Customer turn past_due, reads the account and proposes a suspension, which waits for a person. A refund above $100 waits for finance.
  • Your staff. Each sees only the Verbs their Role holds, in any console or the CLI, and every act carries their name.
  • Customers. Your support team reads nothing without its consent. A suspension names its reason and its cure, and every change you make shows in its portal as an Event.
  • A supplier. A pause or a removal names its reason, and its payouts and track record are kept.
  • Any console. It renders the planes and invents nothing: no state, no move and no reason of its own.

Every act a console offers is a Verb first, so the product runs the same whether a person clicks or an agent calls.