What vmlab validate checks

Generated Markdown for references/fact_validate_checks.md.

Open book page Back to the skill graph

# What `vmlab validate` checks

`vmlab validate` performs schema + semantic checks with no side effects. It verifies:

| Check | Detail |
| --- | --- |
| WCL schema | The file conforms to the vmlab schema |
| Template refs | Exist in the store, or a registry ref is given with explicit `arch` |
| NIC segments | Every NIC's segment is declared |
| Static IPs | Inside the declared subnet; no duplicate static IPs or MACs |
| Dependencies | No `depends_on` cycles |
| Scripts | Provision/handler files exist AND compile (full wscript type-check) |
| Scratch VMs | Have `arch` + `profile` + `disk` |
| Secure boot | `secure_boot = true` needs UEFI: rejected when firmware resolves to SeaBIOS (or, on x86, to nothing — SeaBIOS is QEMU's default). Resolved VM > template > profile, and the error names the layer each value came from |
| Events | Every `on` event name is known, and `targets` is only declared on machine-scoped events (`vm.*` / `container.*` / `snapshot.*`) |
| Playbooks | The folder and its `playbook.wcl` exist; `var` names are WCL identifiers, and no name is declared twice within one `playbook` block |
| Shares | A machine declaring an SMB-capable share (`transport` `smb` or the default `auto`) has a NIC on a segment |
| Logins | On a Windows-family profile every `login` has a `password`; on a Linux-family one none declares `elevated`; labels are unique per machine and at most one sets `default = true` (§19.2). A profile that names no family (`custom`, or a registry template's) triggers neither family rule |

## Related

- [lab {} block]../references/entity_labs.md

- [vm {} block]../references/entity_vms.md

- [Provisions & event handlers]../references/concept_provisions.md

- [The vmlab.wcl schema]../references/fact_schema_reference.md

[← Back to SKILL.md]../SKILL.md