screenshots, recording, presentation artifacts, validate visually. Supplementary Daytona screenshots and optional videos after testkit validation.
61
71%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.opencode/skills/daytona-recording-artifacts/SKILL.mdUse this skill to collect supplementary presentation artifacts for a Daytona UI
journey. Pass/fail evidence comes from an @openwork/testkit spec and its
ambient tape; use daytona-flow-validator and run-tests before declaring a
verdict. Custom screenshots or recordings never replace the tape.
Follow prove-a-pr for the repository-wide agent-first and human-verification contract.
For presentation, use a browseable HTML page with named PNG screenshots for each step. This is easy to review and works on any device, but is not the verdict artifact.
Use video (MP4) only when the proof requires motion: streaming text, loading spinners, animations, drag-and-drop, or real-time interactions that a static frame cannot capture. When video is used, embed it inside the frame-by-frame HTML page alongside the static frames.
First run the relevant evals/specs/**/*.test.ts through run-tests. The spec
imports test from @openwork/testkit; screenshots and validation claims are
recorded ambiently in its tape. Use publish-evidence for that existing tape,
then create the custom index here only if useful.
daytona exec "$SANDBOX" -- 'bash -lc "mkdir -p /workspace/proof-frames; nohup python3 -m http.server 8090 --directory /workspace/proof-frames >/dev/null 2>&1 &"'At each important state, capture a browser_screenshot locally and upload
it to the sandbox with a numbered name like 01-auth-landing.png,
02-org-filled.png, etc.
Generate a browseable index.html with all frames as labeled images in a
responsive grid. Include the branch, commit, and sandbox name.
Get the public URL:
FRAMES_URL=$(daytona preview-url "$SANDBOX" -p 8090 2>/dev/null | grep -v "^time=")
echo "${FRAMES_URL}/index.html"${FRAMES_URL}/01-auth-landing.png./daytona-artifacts is unavailableThe preferred path is test-on-daytona.sh --artifacts-volume, which mounts and
serves /daytona-artifacts. If that path is unavailable or not writable, do not
stop at local screenshots. Use /workspace/proof-frames as a fallback:
daytona exec "$SANDBOX" -- 'bash -lc "mkdir -p /workspace/proof-frames; nohup python3 -m http.server 8090 --bind 0.0.0.0 --directory /workspace/proof-frames >/tmp/proof-frames-http.log 2>&1 &"'Upload the generated index.html and PNG frames there, then verify every file is
non-zero before sharing:
daytona exec "$SANDBOX" -- 'bash -lc "ls -lh /workspace/proof-frames && curl -s -I http://127.0.0.1:8090/index.html | sed -n \"1,8p\""'
daytona preview-url "$SANDBOX" -p 8090If you use this fallback, say so in the PR/eval report because the files are not on the persistent artifacts volume.
Embed short MP4 clips in the same proof directory when the step involves:
Reference them from the HTML index alongside the static frames.
A useful Daytona recording should look like a person using the product, even though CDP is driving the browser or Electron window.
browser_snapshot, browser_click, and browser_fill wherever possible.The reusable Daytona volume is:
openwork-eval-artifacts:/daytona-artifactsThe helper serves it on port 8090 when --artifacts-volume or
--record-video is used.
Expected layout:
/daytona-artifacts/recordings
/daytona-artifacts/screenshots
/daytona-artifacts/validationFor screenshots and validation notes without video:
bash .devcontainer/test-on-daytona.sh [branch-or-commit] --artifacts-volumeFor full human-review evidence:
bash .devcontainer/test-on-daytona.sh [branch-or-commit] --record-video --recording-name <name>--record-video implies --artifacts-volume.
Capture a persistent screenshot from the Daytona display:
daytona exec "$SANDBOX" -- 'bash .devcontainer/capture-daytona-screenshot.sh'Use this after important states: welcome screen, workspace created, settings connected, task response visible, error state reproduced, or final success.
Before sharing any screenshot URL, follow daytona-flow-validator and inspect
the saved PNG itself. Confirm the visible image shows the claimed state and is
not covered by a native picker, modal, toast, desktop window, or unrelated
overlay. If the screenshot does not match, recapture and inspect a replacement.
Always stop with the helper so ffmpeg finalizes the MP4 cleanly:
daytona exec "$SANDBOX" -- 'bash .devcontainer/stop-daytona-recording.sh'Do not use kill -9; it can corrupt the file.
After stopping, verify the recording exists and has duration:
daytona exec "$SANDBOX" -- 'ls -lh /daytona-artifacts/recordings'
daytona exec "$SANDBOX" -- 'ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 /daytona-artifacts/recordings/<name>.mp4'If the duration is near zero, missing, or the file is absent, the recording is not usable evidence.
Get the artifacts base URL:
ARTIFACTS_URL=$(daytona preview-url "$SANDBOX" -p 8090 2>/dev/null | grep -v "^time=")Then append paths:
echo "${ARTIFACTS_URL}/recordings/<name>.mp4"
echo "${ARTIFACTS_URL}/screenshots/<name>.png"Artifact proxy URLs are not permanent. If the sandbox stops, the old
daytonaproxy URL will fail even when files still exist in
/daytona-artifacts. Restart the sandbox and artifact server, then generate a
fresh URL:
daytona sandbox start "$SANDBOX"
daytona exec "$SANDBOX" -- 'bash -lc '\''cd /daytona-artifacts && nohup python3 -m http.server 8090 --bind 0.0.0.0 > /tmp/daytona-artifacts-http.log 2>&1 &'\'''
daytona exec "$SANDBOX" -- 'curl -s -I http://127.0.0.1:8090/recordings/<name>.mp4 | sed -n "1,8p"'
daytona preview-url "$SANDBOX" -p 8090Only share the refreshed URL after the local curl -I returns 200 OK with a
non-zero Content-Length.
Use before/after recordings for UI regressions or design changes:
bash .devcontainer/test-on-daytona.sh dev --record-video --recording-name my-feature-before
daytona exec "$SANDBOX" -- 'bash .devcontainer/stop-daytona-recording.sh'
daytona exec "$SANDBOX" -- "bash -lc 'cd /workspace && git fetch origin feat/my-branch:feat/my-branch && git checkout feat/my-branch'"
daytona exec "$SANDBOX" -- "bash -lc 'cd /workspace && DISPLAY=:99 .devcontainer/start-daytona-recording.sh --detach --output /daytona-artifacts/recordings/my-feature-after.mp4'"
daytona exec "$SANDBOX" -- 'bash .devcontainer/stop-daytona-recording.sh'Use these layers in order of priority:
Do not report success from a recording or custom screenshot alone. The testkit tape must contain the assertions and validated takes for the claimed behavior.
Do not use a video as the primary demo if most of the flow happened through hidden automation. In that case, mark the artifact as supplementary and rely on the tape-backed spec for the verdict.
If you discover invalid evidence after the fact, do not reuse the same URL as if it were valid. Produce new frames with new names and explain in the PR/comment that the earlier artifact was superseded.
7b76a2b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.