Atmos Asciicast Authoring
Defaults
- Use shared cast defaults when the host project supports YAML includes or reusable workflow configuration. Keep terminal settings such as
rate,width, andheighttogether instead of repeating them on every cast step. - Keep simulated input defaults such as prompt text, cursor behavior, typing rate, and jitter together with the cast defaults when the project has several recordings.
- Use
type: castwithmode: stepsfor deterministic command demos that need exit-code propagation. - Use
mode: sessiononly when the demo must show typed input, prompts, key presses, or terminal timing. - When a
mode: stepsdemo logically enters a generated or nested directory, add a synthetictype: simulatecd <directory>before the first command shown there. Keep every real child step'sworking_directoryexplicit: simulated input does not change subprocess state. - Keep ad hoc local recordings in the XDG cache via
--cast; do not commit cache recordings. - Store committed casts wherever the host project keeps documentation assets.
Fixture Policy
- Prefer small deterministic fixtures owned by the documentation example.
- Do not reuse unrelated product examples or test fixtures just to make a recording easier.
- Keep demo output stable: no local absolute paths, hostnames, real account IDs, secrets, random IDs, or live timestamps.
Authoring Checklist
- Identify the exact command sequence and fixture data that the audience should learn from.
- Add or update the workflow/custom command that regenerates the cast when the host project supports that pattern.
- Regenerate the
.castinto the project-approved documentation asset location. - Run its Starlark validator, then review the cast as plain text for secrets, local paths, unstable timestamps, noisy logs, and project-specific assumptions.
- Embed or link the cast using the host project's documentation conventions.
- Prefer committing only
.castfiles unless the host project explicitly documents additional generated artifacts.
Prefer first-class workflow steps over shell output for recorded narration. For example, use type: toast for short status messages instead of printf in a recorded shell step.
Validate casts with Starlark
Prefer an embedded Starlark step for new cast validators and when revising existing
Python validators. Use fs.read_file, json.decode, regex, and fail to validate
the actual recording without adding a Python runtime dependency. Keep reusable
assertions in a .star module and load it from per-demo validators.
For example, save this as scripts/validate-cast.star, with the step's working
directory set to the project root:
def validate(path):lines = fs.read_file(path).splitlines()if not lines:fail("empty cast: " + path)header = json.decode(lines[0])if header.get("version") not in [2, 3]:fail("unsupported cast version")events = [json.decode(line) for line in lines[1:] if line.strip()]text = "".join([event[2] for event in events if event[1] in ["o", "e"]])plain = regex.replace(r"\x1b\[[0-?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)", "", text)if "expected result" not in plain:fail("cast is missing the expected result")ui.success("Cast validated")validate("recordings/demo.cast")
Replace the example's path and expected result with the demo's actual evidence. Attach it after the cast and required cleanup, on the normal success path:
- type: scriptname: validateinterpreter: starlarkscript: !include scripts/validate-cast.star
Check forbidden secrets and machine-specific paths in the reconstructed text, including values split across events. Check ANSI styling against raw text and content against stripped text. For demos that intentionally fail, assert the expected failure rather than rejecting all error output. Run the validator after regeneration and still review playback for pacing and layout.
Boundaries
- Do not include internal Atmos development workflows in this Agent Skill.
- Do not reference Claude skills or assume a sync relationship with them.
- Do not hard-code Cloud Posse website paths or internal demo fixture locations in community guidance.