Project structure

A lab is a Git directory with a marker. The agent never sees the workstation filesystem path.

Marker .eve-iac.yml

version: 1
mode: create          # create | import | load  (default create)
topology: topology.yml
eve:
  lab: /IaC/my-lab.unl
Mode Source Managed lab Mutation
create none eve.lab (clients write /IaC/<slug>.unl) full
import source.lab immutable working copy, default /IaC/<basename>.unl managed only
load existing lab that lab lifecycle + live link quality/suspend + console + inspect; no deploy/reconcile/destroy

Never mutate source_lab. A client-supplied lab path does not establish ownership. Import records the managed path and does not create that lab; deploy does.

On the workstation, labs live under IaC/<name>/. IaC/ is a container, not a lab.

Payload sent to the agent

Packed fields typically include lab, yaml, files, manifest, state, source. dir and out are rejected. LOAD may send only manifest.

Python: pack_lab("./my-lab") builds that payload. The CLI uses the same helper.

Sidecars

File Commit? Role
.eve-iac-state.json no IaC key → EVE numeric id
.eve-iac-source.json no IMPORT only
.eve-iac/oob/ no OOB SSH files for one agent session. OOB SSH
.eve-iac/inventory/ no Generated Ansible or Netmiko inventory. Inventory export

Send them back on later mutating/console calls. They are not identity in YAML.

configs/

Startup-config library blobs. configsets.<set>.<node> maps a node to a file. nodes.<node>.configset is the independent boot selector (none = EVE config=0). Listing a path in the library does not select it for boot.

default is the built-in EVE store (config id 1). It is not a named library, even when the YAML also has Solved. Named sets start at id 2. Reconcile creates a named set YAML adds, including an empty one, and deletes a named set YAML removes. default and none are not deleted.