Production qualification runbook
Use this runbook after local qualification passes for the exact commit you intend to release. Run one provider at a time in an isolated environment. Every paid run must have a stable run ID, an explicit spending decision, preserved evidence, and independently verified cleanup.What each evidence boundary proves
Do not convert one successful provider run into an “any model, any cloud” claim.
Operator and automation responsibilities
An automation agent must not receive secrets in chat. Put credentials in restricted files outside
the repository and provide only their paths and non-secret resource identifiers. The agent can read
those files from the authorized workstation, but evidence and terminal summaries must never print
their contents.
Phase 0 — Freeze one candidate
Start from a clean worktree. Qualification evidence is commit-addressed and cannot be reused after a source change.git status --short must print nothing. Record the full commit in the release issue. If a fix is
required, commit it, discard the old qualification result, and restart from the new commit.
Create a private credential workspace outside the repository:
INFERCRANE_V1_API_KEY_FILE. Do not reuse a personal API key or
a production application key.
Phase 1 — Complete all non-paid evidence
Run the commit-bound local product gate first:FAILED or locally runnable NOT_RUN gates. Review the report at:
Phase 2 — Prepare immutable runtime specifications
AWS, GCP, and Kubernetes use the portable provider runner. Prepare a private directory containing:- an immutable model commit rather than
main; - an OCI image pinned by
sha256digest; - a runtime/version combination you intend to advertise;
- the exact provider, region, and accelerator configured in the provider environment;
minReplicas: 1andmaxReplicas: 1unless that provider/runtime scaling combination is being qualified explicitly;- bounded request and shutdown behavior.
INFERCRANE_V1_* variables name the portable harness contract; they do not
select an old InferCrane release.
Phase 3 — RunPod qualification
Prepare
- Use an isolated RunPod project with a known balance and no unrelated InferCrane resources.
- Create a restricted RunPod API key with only the Pod and Serverless permissions required by the suite.
- Create an immutable vLLM Serverless template and record its template ID.
- Confirm the selected secure GPU has stock. Low stock is a provider constraint, not a reason to create duplicate runs.
- Save the key outside the repository:
Read-only preflight
Paid qualification
INFERCRANE_V2_QUALIFICATION_RUN_ID. Do not generate another ID.
If cleanup must be invoked explicitly, retain the parent ID and clean each child run:
Phase 4 — AWS EC2 BYOC qualification
Infrastructure you must prepare
- an isolated AWS account or dedicated test environment;
- a federated source identity that can assume one narrow InferCrane control-plane role;
- an external ID and least-privilege EC2 describe/run/tag/terminate permissions;
- a private subnet and security group;
- a route from the qualification host to private worker port
8000; - a qualified GPU AMI containing NVIDIA drivers, Docker, and AWS CLI v2;
- an instance profile that can read only the worker secret;
- the shared worker key stored in AWS Secrets Manager;
- sufficient GPU instance quota and capacity in the selected Availability Zone;
- a cost budget/alarm and run ownership tags.
Private files
Copy.env.production.example and .env.aws.example into one private file outside the repository,
replace every placeholder, and restrict it:
AWS_CONFIG_DIR at a read-only AWS CLI configuration directory. The
runner assumes INFERCRANE_AWS_ROLE_ARN; it does not persist the resulting STS credentials.
Run
Phase 5 — GCP Compute BYOC qualification
Infrastructure you must prepare
- an isolated GCP project with Compute Engine and Secret Manager enabled;
- a dedicated gcloud configuration using user federation, Workload Identity Federation, or service account impersonation rather than a downloadable service-account key where possible;
- a least-privilege control identity and a separate worker service account;
- an isolated VPC/subnet and firewall rule for worker port
8000; - a route from the qualification host to the worker’s private address;
- a qualified immutable VM image and digest-pinned runtime images;
- the shared worker key in Secret Manager;
- regional GPU quota and verified zone availability;
- a billing budget/alert and run labels.
gcloud from the InferCrane container and mounts
GCLOUD_CONFIG_DIR read-only. Confirm the selected configuration is active before starting.
Private files and run
Copy.env.production.example and .env.gcp.example into one restricted private environment file,
then set:
Phase 6 — GPU Kubernetes or KServe qualification
Start with the local API boundaries
Real cluster prerequisites
- an isolated cluster or dedicated namespace and GPU node pool;
- NVIDIA drivers and device plugin verified independently;
- a trusted restricted kubeconfig and explicit context;
- namespace-scoped InferCrane provider RBAC;
- the runtime service account and shared worker Secret;
- digest-pinned runtime images accessible by the cluster;
- model storage/download access;
- KServe installed separately only when testing
kservemode; - a network and DNS path from the qualification control plane to
<service>.<namespace>.svc:8000.
.svc addresses. Run the qualifier from
a host/container environment connected to cluster DNS and the service CIDR, or deploy the
qualification control plane inside that cluster. A normal laptop kubeconfig proves Kubernetes API
access but usually does not make ClusterIP services reachable.
Review and apply the namespaced manifests:
.env.production.example and .env.kubernetes.example into one restricted private file and
set the exact context, namespace, workload API, image digest, GPU resource, and product label:
deployment mode, inspect run-owned Deployments, Services, ReplicaSets, Pods, PVCs, Jobs, and
events. For kserve mode, also inspect the parent InferenceService, its current UID/generation and
its operator-owned descendants. The namespace must contain no run-owned resources after cleanup.
Resume, failure, and cleanup rules
- Keep the same run ID after Ctrl-C, SSH loss, laptop sleep, credential refresh, or a control-plane restart.
- Do not erase
.infercrane/, the acceptance PostgreSQL volume, or provider labels while cleanup is incomplete. - A provider capacity or image-pull failure is a failed qualification even when cleanup succeeds.
- Never manually delete a resource until its ownership labels, run ID, and persisted external ID match the failed run.
- Cleanup success never changes a failed test into a passed test.
- If the source commit changes, start a new qualification ID and preserve the old report.
INFERCRANE_ACCEPTANCE_RUN_ID. Passed stages are commit-bound and skipped; incomplete work resumes,
and the exit trap retries cleanup.
Final human review
Complete these checks after all automated and provider gates:- install the release archive or Homebrew formula on a clean machine;
- run
infercrane init,doctor, deploy/adopt, request, status/watch, inspect, explain, and delete; - close and reopen the terminal during a durable operation and reattach by operation ID;
- review terminal layout at narrow and wide sizes;
- review hosted Mintlify links, code-copy behavior, light/dark mode, and mobile layout;
- review the private console’s authentication, endpoint switching, monitoring freshness, partial states, responsive layout, and authorization denial paths;
- independently confirm provider-console zero inventory;
- revoke or disable temporary qualification credentials.
Final release decision
- every local gate is
PASSEDfor the exact commit; - scheduled fuzz/soak/network/Kubernetes evidence is green on the same lineage;
- every provider/runtime combination advertised as qualified has real evidence;
- every paid run has zero independently confirmed run-owned resources;
- human installation and UX review is complete;
- all remaining gaps are stated as limitations rather than hidden behind an aggregate score.