> ## Documentation Index
> Fetch the complete documentation index at: https://infercrane.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Development and testing

> Fast local feedback, provider contracts, Docker qualification, and paid acceptance boundaries.

# Development and testing

InferCrane separates product correctness from provider availability. Most changes must be proven
without credentials, GPUs, or network access. Real infrastructure is reserved for provider
qualification of a frozen release candidate.

## Fast loop

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
make dev-check
```

This runs repository verification and the provider lifecycle contracts. It is the default command
while editing and writes full logs under `.infercrane/dev-check/RUN_ID/` while keeping terminal
output compact.

Passport signing is opt-in in development. Generate a permission-restricted key and inject only its
file path into the control-plane process:

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
infercrane passport keygen
export INFERCRANE_PASSPORT_SIGNING_KEY_FILE="$HOME/.config/infercrane/passport-signing-key"
```

## Full local qualification

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
make dev-check-full
```

The full command creates an isolated Docker Compose project on an available host port and runs:

* race-enabled repository and provider-contract tests;
* generated OpenAPI drift, Python/TypeScript SDK, GitHub Action, and real Terraform protocol tests;
* the containerized test suite with temporary PostgreSQL;
* buffered, streaming, tool-call, and structured-output gateway checks;
* worker-loss and control-plane restart recovery;
* production Compose configuration validation; and
* Mintlify build, links, and accessibility checks.

The project and volumes are removed on success, failure, interruption, and termination. Each run
uses a filesystem lock so two local qualification stacks cannot silently interfere.

Full automation qualification requires Terraform 1.15.8 on `PATH` or at
`.infercrane/tools/terraform`. It exercises the actual Plugin Protocol against a hermetic control
API; it never provisions cloud resources.

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
make test-automation       # generated clients, packages, action, provider schema
make test-automation-full  # also real Terraform CRUD/import/interruption acceptance
```

## Provider contract

Every elastic provider adapter must prove deterministic identity, replay-safe ensure/adoption,
observation, and idempotent deletion. Every serverless adapter must additionally prove native
zero-worker configuration and adoption after a lost create response. These tests run through the
adapter's public boundary, not private helper functions:

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
make test-provider-contracts
```

Passing the local contract registers an implementation; it does not advertise production support.
A provider becomes qualified only after its API canary and complete real-infrastructure lifecycle
evidence are recorded for the exact release commit.

## Paid qualification

Paid commands require `--approve-paid-resources` and acquire one repository-wide paid-run lock.
They refuse concurrent execution, persist the owning PID and run ID, capture sanitized provider
inventory on failure, and clean only resources owned by that acceptance run.

Use the smallest applicable stage. Do not repeat elastic qualification to debug a serverless
template:

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
./scripts/release-acceptance.sh preflight
./scripts/release-acceptance.sh elastic --approve-paid-resources
./scripts/release-acceptance.sh serverless --approve-paid-resources
./scripts/release-acceptance.sh cleanup
```

See [release acceptance](/release-acceptance) for the frozen-RC gates. Provider fakes establish
control-plane correctness; they never substitute for final cloud evidence.

## Automated release proof

The release orchestrator runs the complete local package gates and emits a machine-readable
manifest:

```bash theme={"theme":{"light":"github-light-default","dark":"vesper"}}
make qualify-local
# .infercrane/qualification/COMMIT/qualification.json
```

For a clean frozen commit, `make qualify-rc` adds independently resumable elastic qualification,
serverless qualification, elastic faults, and serverless faults. A passed stage is reused only for
the same clean commit. Each provider stage has its own acceptance run ID, cleanup, report, and
zero-inventory proof, so a later failure does not repeat earlier paid work.
