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: 3

This 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.

FieldTypeCLI behaviour
slug, titlestringRequired by validation and persisted by the current push API. No slug format or uniqueness rule is checked here.
description, difficulty, estimatedTime, tagsstring / number / arrayOptional in local validation and persisted by the current push API.
iconstringOptional. The current handler stores it as imageUrl when imageUrl is absent.
ai_fixobjectOptional 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, cleanupScriptsbundle-derivedBuilt from config.yml and lab files, then persisted by the current push API.
labType, accessTier, freePreview, selfHostedHints, basePoints, timeBonusMaxPct, comingSoon, isBeta, ribbonmixedAccepted 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, instructorEmailsmixedAccepted 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, cleanupScriptsJSON/runtimeRuntime or bundle-computed fields, not lab.yml author inputs.
published, featured, developersunsupportedNo 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

FieldTypeCLI behaviour
versionstringRequired by validation: non-empty. The validator does not require a particular version value.
virtualmachines[].name, image, machine_typestringOptional and accepted. No VM field is validator-required and no image or machine-type allowlist is enforced here.
virtualmachines[].environmentmap[string]stringAccepted 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[].countnumberAccepted. 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[].policystringOne required policy choice per AWS account entry: a named policy or inline_policy.
aws_accounts[].inline_policyobjectThe 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_dynamicmixedAccepted and serialized, but not used by the traced checkout or Terraform-variable generation path.
gcp_projects, azure_subscriptionsarraysAccepted 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