Creating Labs
lab.yml & config.yml
The accepted authoring fields and the validation the POV CLI actually performs.
lab.yml Example
slug: "kubernetes-pods-lab"
title: "Kubernetes: Pods and Deployments"
description: |
Explore Kubernetes Pods and Deployments through hands-on exercises.
difficulty: "intermediate"
estimatedTime: 45
tags:
- "kubernetes"
- "containers"
ai_fix:
enabled: true
max_attempts: 3This example contains fields retained by the current pov push request. Puzzle and access metadata are intentionally omitted because this push path does not persist them.
lab.yml Fields and Current Push
The validator requires only non-empty slug and title. The CLI sends a wider bundle than the current lab create request accepts, so accepted authoring fields do not necessarily persist.
| Field | Type | CLI behaviour |
|---|---|---|
slug, title | string | Required by validation and persisted by the current push API. No slug format or uniqueness rule is checked here. |
description, difficulty, estimatedTime, tags | string / number / array | Optional in local validation and persisted by the current push API. |
icon | string | Optional. The current handler stores it as imageUrl when imageUrl is absent. |
ai_fix | object | Optional and persisted as aiFixConfig. Omitted means enabled: true and max_attempts: 3 in the bundle; max_attempts is validated as 0–10 when the block is present. |
config, tasks, setupScripts, cleanupScripts | bundle-derived | Built from config.yml and lab files, then persisted by the current push API. |
labType, accessTier, freePreview, selfHostedHints, basePoints, timeBonusMaxPct, comingSoon, isBeta, ribbon | mixed | Accepted by the CLI bundle but discarded by the current push API. labType: puzzle still enables local puzzle validation: one task, positive timelimit, free or premium accessTier, known difficulty, and non-negative basePoints. |
teaser, estimatedLaunchTime, category, subcategory, prerequisites, structuredPrerequisites, id, course, owner, ownerEmail, instructors, instructorEmails | mixed | Accepted by the bundle but not represented by the current lab create request, so the current push path discards them. |
popularityScore, sessionCount, difficultyRank, tasks, config, createdAt, updatedAt, setupScripts, cleanupScripts | JSON/runtime | Runtime or bundle-computed fields, not lab.yml author inputs. |
published, featured, developers | unsupported | No corresponding lab bundle field; these unknown YAML keys are ignored. |
config.yml Example
version: "3"
virtualmachines:
- name: "ubuntu-1"
image: "ubuntu2024"
machine_type: "medium"
environment:
EXAMPLE_SETTING: "value"
aws_accounts:
- count: 1
policy: "ReadOnlyAccess"At the top level, only a non-empty version is required; each configured AWS entry has its own policy validation. VM names select script filenames such as setup-ubuntu-1.
config.yml Fields
| Field | Type | CLI behaviour |
|---|---|---|
version | string | Required by validation: non-empty. The validator does not require a particular version value. |
virtualmachines[].name, image, machine_type | string | Optional and accepted. No VM field is validator-required and no image or machine-type allowlist is enforced here. |
virtualmachines[].environment | map[string]string | Accepted by the bundle. The traced Terraform-variable generation does not emit this map, so it is not a proven VM environment-injection mechanism. |
aws_accounts[].count | number | Accepted. The pool-manager provisioner sums counts as entered and checks out pooled AWS accounts only when the total is greater than zero; live capacity is UNVERIFIED. |
aws_accounts[].policy | string | One required policy choice per AWS account entry: a named policy or inline_policy. |
aws_accounts[].inline_policy | object | The alternative required policy choice. Version, a non-empty Statement list, Effect Allow or Deny, Action, and Resource are validated. |
aws_accounts[].provisioning_strategy, max_pool_accounts, fallback_to_dynamic | mixed | Accepted and serialized, but not used by the traced checkout or Terraform-variable generation path. |
gcp_projects, azure_subscriptions | arrays | Accepted optional cloud-request blocks. Their exact accepted fields and runtime use are documented on Infrastructure Options. |
AI Assistant
The bundle stores the effective ai_fix configuration. If the block is absent it supplies enabled: true and max_attempts: 3.
ai_fix:
enabled: true
max_attempts: 3