Skip to content

Tenant Reference

The flat lookup, not the story: every literal fact you might need to copy a value out of, rather than read a narrative about. Tenant concepts's five pages explain what each thing is and why it's shaped that way; the task guides explain how to act on it; this page is where you come back for the exact state, threshold, or default once you already know the shape.

Billing lifecycle + grace

The five states of your tenant's billing lifecycle are decided exclusively by the control plane's own reconciler sweep, never by a webhook handler directly:

StateEntered whenGrace before escalating
provisioningSigned up via GitHub OAuth; no completed Stripe Checkout yet.None
activeStripe reports the subscription trialing or active (the trial itself counts as covered).None
past-dueA payment fails; including a card-required trial that expires with no successful charge.7 days, then escalates to suspended.
suspendedpast-due's grace elapses with no recovery.14 days, then escalates to decommissioning.
decommissioningsuspended's grace elapses, or you cancel explicitly from the Billing Portal while active (skipping past-due/suspended entirely).Terminal in v1; no path back; see Close your account.

past-due/suspended recover straight back to active the moment Stripe reports the subscription covered again (updating your card in the Billing Portal); see Manage billing.

Stack Plans

All new trials start on Standard. Prices are monthly in USD before applicable tax. Plan Changes are available only while Stripe reports an active subscription.

PlanPriceHosted resourcesRun CapReserve CapWatched Projects Cap
Standard$402 shared vCPU, 4 GB memory, 40 GB storage113
Plus$504 shared vCPU, 8 GB memory, 80 GB storage316
Pro$608 shared vCPU, 16 GB memory, 160 GB storage5212

See Manage Billing for proration, eligibility, and what moves during a Plan Change.

The two quotas

The two v1 quotas have a sharp boundary: one flows to your Stack's own admission gate, while the other never leaves the control plane. See Quotas for why each is enforced where it is.

QuotaDefaultEnforced
Concurrent-Run cap (stacks.run_cap)1Your Stack's own admission gate; rendered into desired state, applied by your Dispatcher.
Watched-Projects cap (stacks.watched_projects_cap)3Control-plane-side only; never rendered to your Stack; checked when a Project is registered.

Export-archive contents

Every entry the Export Your Data download bundles, in the order it's written, starts with a manifest so its contents are checkable from the archive alone:

EntryContents
manifest.jsonWhat's inside and why; generation time, the journal's size, and one row per bundled Thread (its id, Project, issue, and size).
journal.dbA raw, unencrypted copy of your Stack's own append-only Event journal; unlike the automatic backup, no encryption step, since this is you pulling your own data over your own already-authenticated session.
bundles/<threadId>.bundleOne fetchable git bundle per Thread currently holding an Unshipped attempt; commits that never reached your remote, recoverable independent of the Thread or its Workspace still existing.

Credential kinds

The full closed set of Credential kinds POST /credentials/:name accepts is keyed by named Credential rather than inferred from its Provider. See Auth & Consent for why the consent column below is shaped the way it is.

KindConsent requiredInjected as
oauth_tokenYesClaude's CLAUDE_CODE_OAUTH_TOKEN; your own personal subscription.
auth_fileYesCodex's uploaded ~/.codex/auth.json; your own personal subscription.
api_keyNoClaude's ANTHROPIC_API_KEY, Codex's auth.json OPENAI_API_KEY field, or an OpenRouter key for OpenCode. Metered inference is charged on top of the flat hosted fee; a solo tenant usually saves money with a subscription kind where one is available.

Each Provider accepts only these kinds:

ProviderAccepted kindsSubscription Credential
Claudeoauth_token, api_keyYes, oauth_token.
Codexauth_file, api_keyYes, auth_file.
OpenCode (OpenRouter)api_key onlyNone. OpenCode holds no subscription Credential.

Credential Runtime Profile

Each Credential stores one optional model and effort pair for each activity:

ActivityWork coveredBlank model or effort
Intake + WayfinderIntake Sessions and all Wayfinder workUses the Provider's declared default.
DispatchOrdinary dispatched RunsUses the Provider's declared default.

An explicit model or effort supplied for one Run or session takes precedence over the selected Credential's value. Zozo binds the resolved values when it creates a Thread. A fallback Credential brings its own profile, so fallback selection may change model and effort as well as billing identity.

Credential identity and deletion

A named Credential keeps the Provider it was created with. Provisioning the same name again can rotate its authentication material, including its kind, when the Provider is unchanged. Moving that name to another Provider requires a new Credential name.

Remove current routes first

The Dashboard blocks deletion while a Project's current intake or dispatch Credential Route names the Credential as its Primary or Fallback. The response lists every Project, activity, and route position that must be changed.

Historical Thread bindings don't block deletion permanently. When no current configuration names the Credential, the Dashboard reports how many historical Threads will become non-resumable and requires a separate confirmation before deleting it.

Label Vocabulary

Label Reference lists every Control and Classification Label, its meaning, and its effect on a dispatch pick.

Blocked means one thing

A native GitHub dependency; a blocking edge added through GitHub's own issue-relationship UI; and a ## Blocked by reference written in the issue body resolve to the exact same verdict: either both gate a dispatch pick, or, once every blocker either source names has closed, both release it. Neither form means something the other doesn't.

Docs for Zozo: a coding-agent harness.