Skip to content

Spec schema

spec.yaml is the single source of truth for a GenLabZ project. It defines what the student builds, how it is evaluated, and how it is cleaned up. Every field is validated by the SDK on load.

Project (top-level)

FieldTypeRequiredDefaultDescription
idstrUnique kebab-case identifier
titlestrProject title
summarystrOne-liner for catalog cards (~150 chars, plain text)
purposestrAuthor-facing pedagogical intent (not student-facing)
overviewstrStudent-facing introduction; supports markdown. Overridden by content/overview.md if present
outcomeslist[str]Learning outcomes (min 1)
objectiveslist[Objective]Goal-oriented groupings of steps (min 1)
schema_versionstr"1.0"Schema format version
versionstr"1.0"Project content version
statusstrdraft / published / archived
difficultystrbeginner / intermediate / advanced
durationintEstimated minutes to complete
tagslist[str]Searchable tags
prerequisiteslist[str]What students need before starting
thumbnailstrPath to thumbnail image in images/
recapstrCompletion summary; supports markdown. Overridden by content/recap.md if present
next_stepslist[NextStep]Suggested follow-on projects and resources
referenceslist[Reference]Source material links
platformPlatformPlatform-specific configuration

Objective

A goal-oriented grouping of steps.

FieldTypeRequiredDescription
idstrTwo-digit zero-padded identifier, e.g. "01"
titlestrObjective title
descriptionstrWhat this objective achieves; supports markdown. Overridden by content/{objective_id}.md if present
stepslist[Step]Steps to achieve this objective (min 1)
referenceslist[Reference]Relevant documentation links

Step

A discrete, testable action within an objective.

FieldTypeRequiredDescription
idstrTwo-digit zero-padded identifier within the objective, e.g. "01"
titlestrStep title
instructionslist[str]Student-facing guidance — what to do, not how (min 1)
inputslist[str]Handle names from prior steps this step depends on
outputslist[Output]Resource handles produced by this step

Output

A resource handle declared as an output of a step.

FieldTypeRequiredDescription
namestrHandle name — must follow {OO}_{SS}_{resource_name} format
typestrCloudFormation resource type (e.g. AWS::S3::Bucket) or "string"
descriptionstrHuman-readable description of the resource

See Handle wiring for naming rules and how handles flow through the test runner.

Reference

An external link attached to a project, objective, or step.

FieldTypeRequiredDescription
titlestrHuman-readable link title
urlstrValid HTTP/HTTPS URL
typestrsource / documentation / tutorial

NextStep

A suggested follow-on after completing the project.

FieldTypeRequiredDescription
titlestrWhat to do next
typestrproject / tutorial / documentation
refstrInternal project ID (for GenLabZ projects)
urlstrExternal URL (for non-GenLabZ resources)
descriptionstrWhy this is a good next step; supports markdown

Platform

Platform-specific configuration. Currently only AWS is defined.

platform:
aws:
services: [s3, lambda]
regions: [us-east-1]
iam_policy:
- effect: Allow
actions: [s3:CreateBucket]
resources: ["arn:aws:s3:::*"]
FieldTypeDescription
aws.serviceslist[str]AWS service identifiers used by the project
aws.regionslist[str]AWS regions the project targets
aws.iam_policylist[IAMStatement]IAM policy statements required for the sandbox role

IAMStatement

FieldTypeRequiredDescription
effectstr"Allow" or "Deny"
actionslist[str]IAM actions (min 1), e.g. s3:CreateBucket
resourceslist[str]Resource ARNs (min 1)

Enumerated values

status

ValueMeaning
draftWork in progress — not visible to students
publishedLive and available to students
archivedNo longer active — hidden from catalog

difficulty

ValueMeaning
beginnerMinimal prior AWS experience required
intermediateComfortable with core AWS services
advancedDeep AWS knowledge expected

Reference type

ValueMeaning
sourcePrimary source material
documentationOfficial service documentation
tutorialStep-by-step guide

Markdown fields

These fields support markdown formatting and are rendered to students:

  • overview — project introduction
  • recap — completion summary
  • objective.description — objective narrative
  • next_steps[].description — why a follow-on is worth doing

Keep summary plain text — it appears on catalog cards where markdown is not rendered.

Content files

Content files in content/ override the corresponding spec field when present. Both are rendered as Markdown. A minimal project works fine with just spec fields; content files add richness when you want more control over formatting, length, or images.

Spec fieldContent file pathOverrides when present
overviewcontent/overview.mdYes — file wins over spec field
recapcontent/recap.mdYes — file wins over spec field
objective.descriptioncontent/{objective_id}.mdYes — file wins over spec field
step.instructionscontent/{objective_id}_{step_id}.mdYes — file wins over spec field

The resolution rule is consistent: when a content file exists for a scope, it takes precedence over the corresponding inline spec field. When neither exists, the field is treated as empty. See Content files for the full authoring guide.

Complete example

schema_version: "1.0"
id: s3-static-website
version: "1.0"
title: "Host a Static Website on S3"
summary: "Create an S3 bucket and configure it to serve a static website"
purpose: "Learn how to use S3 for static web hosting with public access"
overview: |
Deploy a static website using **Amazon S3** for hosting. This project covers:
- Creating and configuring an S3 bucket
- Enabling static website hosting with an index document
- Writing a bucket policy for public read access
By the end, you'll have a live website served directly from S3.
outcomes:
- "Create and configure an S3 bucket for static website hosting"
- "Write and apply an S3 bucket policy for public access"
status: draft
difficulty: beginner
duration: 30
tags: ["s3", "static-website", "beginner"]
prerequisites: []
platform:
aws:
services: ["s3"]
regions: ["us-east-1"]
iam_policy:
- effect: Allow
actions: [s3:CreateBucket, s3:PutBucketWebsite, s3:PutObject, s3:PutBucketPolicy]
resources: ["arn:aws:s3:::*"]
references:
- title: "S3 Static Website Hosting"
url: "https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html"
type: documentation
objectives:
- id: "01"
title: "Create and configure the S3 bucket"
description: |
Set up an S3 bucket with static website hosting enabled.
This objective covers bucket creation with a unique name and
configuring the **index document** for website hosting.
steps:
- id: "01"
title: "Create the S3 bucket"
instructions:
- "Create a new S3 bucket with a unique name"
- "The bucket name must be globally unique — use a random suffix"
outputs:
- name: "01_01_bucket"
type: "AWS::S3::Bucket"
description: "The S3 bucket for hosting"
- id: "02"
title: "Enable static website hosting"
instructions:
- "Configure the bucket for static website hosting"
- "Set index.html as the index document"
inputs:
- "01_01_bucket"
outputs:
- name: "01_02_website_url"
type: "string"
description: "The website endpoint URL"
- id: "02"
title: "Configure public access"
description: |
Add a bucket policy to allow public read access to the website.
You'll write an IAM policy document that grants `s3:GetObject`
to all principals on the bucket's objects.
steps:
- id: "01"
title: "Apply a public read bucket policy"
instructions:
- "Create a bucket policy that allows s3:GetObject for all principals"
- "Apply the policy to the bucket created in objective 01"
inputs:
- "01_01_bucket"
outputs:
- name: "02_01_policy"
type: "AWS::S3::BucketPolicy"
description: "Public read policy on the bucket"
references:
- title: "S3 Bucket Policy Examples"
url: "https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html"
type: documentation
next_steps:
- title: "Add CloudFront distribution"
type: project
description: "Serve your S3 website through CloudFront for HTTPS and global edge caching."