Skip to main content
A Replay Environment runs your real agent harness, not a reconstruction of it, in a sandbox where outbound network is denied. Databases and queues run as disposable local services, external APIs are answered by emulators or recorded fixtures, and model calls go to an approved inference lane. To build one, Moda needs your code. moda harness register collects it, shows you exactly what it collected, and uploads it. This is the runnable counterpart to moda registry, which describes your agents, prompts, and tools. Do both. A registration links to the registry harness version that was current when you registered.

Preview the bundle

A dry run uploads nothing and needs no API key. It prints:
  • Included: file and byte counts by category (source, lockfiles, package manifests, deploy config, containers, migrations, tests, prompts, and so on).
  • Excluded: every path left out, with the reason. The contents of these paths never leave your machine.
  • Git-ignored but present: other ignored paths, by name only, in case a build needs them.
  • Environment variables: every name found in code and example files, with a proposed classification. Values are never read.
  • Runtimes, dependencies, and migrations: what the harness runs on, the services it calls with the adapter Moda proposes for each, and the migrations it would run.
  • Gaps, and what Moda will still need from you.
The manifest and dependency map are written to a temporary directory named in the report, so you can read exactly what would be sent.

What is collected

The bundle is the whole git repository the harness lives in, including uncommitted and untracked files. The policy is to take more than a build needs: Moda can shrink a bundle later, but it can’t recover files that were never sent.

Declare how it runs

Tell Moda how the harness starts and which env vars route its model calls. Pass env var names, never values.
--entry takes everything after -- as the command, so put it last. --entry="node dist/server.js" also works.

Register

Run the same command without --dry-run. The CLI uploads the bundle, manifest, and dependency map straight to Moda’s object storage on short-lived presigned URLs (your API key is not sent with them). Moda then checks each upload’s sha256 and size, analyzes it, and prints the registration id, status, and a dashboard link.

The checklist

Open the registration in the dashboard to work through what Moda still needs:
  • Env var classifications: confirm or correct each proposed classification (secret, config, dependency_endpoint, model_endpoint, model_credential). Only names Moda could not classify block.
  • Dependency adapters: approve or reject the adapter proposed for each dependency (a real local engine, a provider emulator, a receipt-compiled simulator, a recorded fixture, or remote staging), or pick another.
  • Migrations: approve running them against a disposable database.
  • Entrypoint and model routing: when they were not declared and could not be detected.
  • Gaps: things the detector knows it could not resolve, and, after a smoke boot, files, env vars, or network calls the harness needed but did not have.
Decisions are kept when Moda re-analyzes the same registration.

Have your coding agent do it

moda registry prompt prints the brief for your coding agent. Its last part runs moda harness register --dry-run, reviews the exclusions and gaps with you, declares the entrypoint and model routing, and registers once you approve.